* B2B-36: add dashboard cards * B2B-36: add dashboard cards * card variants, some improvements, gen db types * add menus to home page * update db types * remove unnecessary card variant --------- Co-authored-by: Helena <helena@Helenas-MacBook-Pro.local>
45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
const RouteMatchingEnd = z
|
|
.union([z.boolean(), z.function().args(z.string()).returns(z.boolean())])
|
|
.default(false)
|
|
.optional();
|
|
|
|
const Divider = z.object({
|
|
divider: z.literal(true),
|
|
});
|
|
|
|
const RouteSubChild = z.object({
|
|
label: z.string(),
|
|
path: z.string(),
|
|
Icon: z.custom<React.ReactNode>().optional(),
|
|
end: RouteMatchingEnd,
|
|
renderAction: z.custom<React.ReactNode>().optional(),
|
|
});
|
|
|
|
const RouteChild = z.object({
|
|
label: z.string(),
|
|
path: z.string(),
|
|
Icon: z.custom<React.ReactNode>().optional(),
|
|
end: RouteMatchingEnd,
|
|
children: z.array(RouteSubChild).default([]).optional(),
|
|
collapsible: z.boolean().default(false).optional(),
|
|
collapsed: z.boolean().default(false).optional(),
|
|
renderAction: z.custom<React.ReactNode>().optional(),
|
|
});
|
|
|
|
const RouteGroup = z.object({
|
|
label: z.string().optional(),
|
|
collapsible: z.boolean().optional(),
|
|
collapsed: z.boolean().optional(),
|
|
children: z.array(RouteChild),
|
|
renderAction: z.custom<React.ReactNode>().optional(),
|
|
});
|
|
|
|
export const NavigationConfigSchema = z.object({
|
|
style: z.enum(['custom', 'sidebar', 'header']).default('custom'),
|
|
sidebarCollapsed: z.boolean().optional(),
|
|
sidebarCollapsedStyle: z.enum(['offcanvas', 'icon', 'none']).default('icon'),
|
|
routes: z.array(z.union([RouteGroup, Divider])),
|
|
});
|