@cryptlex/web-components 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -13
- package/dist/components/data-table/column-picker.es.js +3 -4
- package/dist/components/data-table/column-picker.es.js.map +1 -1
- package/dist/components/data-table/data-table.es.js +84 -83
- package/dist/components/data-table/data-table.es.js.map +1 -1
- package/dist/components/data-table/page-size.es.js +5 -5
- package/dist/components/data-table/page-size.es.js.map +1 -1
- package/dist/components/data-table/paginator.es.js +25 -31
- package/dist/components/data-table/paginator.es.js.map +1 -1
- package/dist/components/data-table/table-actions.es.js +26 -27
- package/dist/components/data-table/table-actions.es.js.map +1 -1
- package/dist/components/data-table/table-commons.es.js +5 -4
- package/dist/components/data-table/table-commons.es.js.map +1 -1
- package/dist/components/data-table/table-content.es.js +34 -31
- package/dist/components/data-table/table-content.es.js.map +1 -1
- package/dist/components/data-table/table-filter.es.js +42 -45
- package/dist/components/data-table/table-filter.es.js.map +1 -1
- package/dist/components/key-value-card/key-value-card.es.js +17 -14
- package/dist/components/key-value-card/key-value-card.es.js.map +1 -1
- package/dist/components/sidebar/app-layout.es.js +11 -15
- package/dist/components/sidebar/app-layout.es.js.map +1 -1
- package/dist/components/sidebar/breadcrumb.es.js +2 -3
- package/dist/components/sidebar/breadcrumb.es.js.map +1 -1
- package/dist/components/sidebar/nav-main.es.js +18 -18
- package/dist/components/sidebar/nav-main.es.js.map +1 -1
- package/dist/components/static-data-table/data-table.es.js +14 -14
- package/dist/components/static-data-table/data-table.es.js.map +1 -1
- package/dist/components/ui/accordion.es.js +9 -9
- package/dist/components/ui/accordion.es.js.map +1 -1
- package/dist/components/ui/avatar.es.js +16 -16
- package/dist/components/ui/avatar.es.js.map +1 -1
- package/dist/components/ui/badge.es.js +5 -24
- package/dist/components/ui/badge.es.js.map +1 -1
- package/dist/components/ui/breadcrumb.es.js +10 -10
- package/dist/components/ui/breadcrumb.es.js.map +1 -1
- package/dist/components/ui/button.es.js +17 -18
- package/dist/components/ui/button.es.js.map +1 -1
- package/dist/components/ui/calendar.es.js +8 -8
- package/dist/components/ui/calendar.es.js.map +1 -1
- package/dist/components/ui/card.es.js +21 -21
- package/dist/components/ui/card.es.js.map +1 -1
- package/dist/components/ui/chart.es.js +76 -102
- package/dist/components/ui/chart.es.js.map +1 -1
- package/dist/components/ui/checkbox.es.js +13 -19
- package/dist/components/ui/checkbox.es.js.map +1 -1
- package/dist/components/ui/command.es.js +4 -4
- package/dist/components/ui/command.es.js.map +1 -1
- package/dist/components/ui/copy-button.es.js +20 -34
- package/dist/components/ui/copy-button.es.js.map +1 -1
- package/dist/components/ui/dialog.es.js +32 -32
- package/dist/components/ui/dialog.es.js.map +1 -1
- package/dist/components/ui/drawer.es.js +2 -2
- package/dist/components/ui/drawer.es.js.map +1 -1
- package/dist/components/ui/dropdown-menu.es.js +74 -82
- package/dist/components/ui/dropdown-menu.es.js.map +1 -1
- package/dist/components/ui/input-otp.es.js +17 -17
- package/dist/components/ui/input-otp.es.js.map +1 -1
- package/dist/components/ui/input.es.js +7 -7
- package/dist/components/ui/input.es.js.map +1 -1
- package/dist/components/ui/link-button.es.js +6 -6
- package/dist/components/ui/link-button.es.js.map +1 -1
- package/dist/components/ui/mutli-select.es.js +52 -52
- package/dist/components/ui/mutli-select.es.js.map +1 -1
- package/dist/components/ui/navigation-menu.es.js +34 -34
- package/dist/components/ui/navigation-menu.es.js.map +1 -1
- package/dist/components/ui/pagination.es.js +38 -38
- package/dist/components/ui/pagination.es.js.map +1 -1
- package/dist/components/ui/password-input.es.js +13 -13
- package/dist/components/ui/password-input.es.js.map +1 -1
- package/dist/components/ui/radio-group.es.js +11 -11
- package/dist/components/ui/radio-group.es.js.map +1 -1
- package/dist/components/ui/search-input.es.js +11 -11
- package/dist/components/ui/search-input.es.js.map +1 -1
- package/dist/components/ui/select.es.js +31 -49
- package/dist/components/ui/select.es.js.map +1 -1
- package/dist/components/ui/sheet.es.js +17 -17
- package/dist/components/ui/sheet.es.js.map +1 -1
- package/dist/components/ui/sidebar.es.js +2 -3
- package/dist/components/ui/sidebar.es.js.map +1 -1
- package/dist/components/ui/table-page-layout.es.js +2 -2
- package/dist/components/ui/table-page-layout.es.js.map +1 -1
- package/dist/components/ui/table.es.js +37 -37
- package/dist/components/ui/table.es.js.map +1 -1
- package/dist/components/ui/tabs.es.js +2 -2
- package/dist/components/ui/tabs.es.js.map +1 -1
- package/dist/components/ui/tooltip.es.js +8 -8
- package/dist/components/ui/tooltip.es.js.map +1 -1
- package/dist/index.es.d.ts +29 -54
- package/dist/index.es.js +253 -256
- package/dist/utils/index.es.js.map +1 -1
- package/lib/index.css +24 -5
- package/lib/tailwind.preset.css +52 -40
- package/lib/tokens.css +0 -9
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-filter.es.js","sources":["../../../lib/components/data-table/table-filter.tsx"],"sourcesContent":["import {\n COMPARISON_OPERATOR_LABELS,\n FILTER_COMPARISON_OPERATORS,\n getResourceDisplayName,\n OPERATORS_FOR_FILTER_TYPE,\n type FilterableProperties,\n type FilterablePropertyType,\n} from '@/components/data-table/table-utils';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@/components/ui/form';\nimport { Input } from '@/components/ui/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { cn } from '@/utils';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { format } from 'date-fns';\nimport { FilterIcon, X } from 'lucide-react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport z from 'zod';\nconst filterSchema = z.object({\n // For identifing a filter for updation and deletion\n id: z.string().min(1, 'Field is required'),\n property: z.string().min(1, 'Field is required.'),\n operator: z.enum(FILTER_COMPARISON_OPERATORS, {\n errorMap: () => ({ message: 'Invalid comparison operator' }),\n }),\n value: z.string().min(1, 'Field is required.'),\n});\nexport type FilterFormType = z.infer<typeof filterSchema>;\n\ninterface TableFilterProps {\n filterableProperties: FilterableProperties<any>;\n filters: FilterFormType[];\n onFiltersChange: (filters: FilterFormType[]) => void;\n}\n\nexport const TableFilter = ({\n filterableProperties,\n filters,\n onFiltersChange,\n}: TableFilterProps) => {\n const [editingFilter, setEditingFilter] = useState<string | null>(null);\n const [isAddingFilter, setIsAddingFilter] = useState(false);\n const getFilterLabel = (filter: FilterFormType): string => {\n const property = getResourceDisplayName(filter.property, 'admin-portal');\n const operatorLabel = COMPARISON_OPERATOR_LABELS[filter.operator];\n const value = filter.value;\n return `${property} ${operatorLabel} ${value}`;\n };\n\n const removeFilter = (id: string) => {\n onFiltersChange(filters.filter((filter) => filter.id !== id));\n };\n\n interface FilterFormProps {\n filter?: FilterFormType;\n }\n const FilterForm = ({ filter }: FilterFormProps) => {\n const form = useForm<FilterFormType>({\n resolver: zodResolver(filterSchema),\n defaultValues: {\n property: filter?.property || '',\n // TODO: Add dynamic default operator as per property type\n operator: filter?.operator || 'eq',\n value: filter?.value || '',\n id: filter?.id || `filter-${Date.now()}-${Math.random().toString(36)}`,\n },\n mode: 'all',\n });\n\n const watchProperty = form.watch('property');\n const handleSubmit = (values: FilterFormType) => {\n const newFilter: FilterFormType = {\n ...values,\n operator: values.operator,\n };\n\n if (filter) {\n // Update existing filter\n onFiltersChange(filters.map((f) => (f.id === filter.id ? newFilter : f)));\n setEditingFilter(null);\n } else {\n // Add new filter\n onFiltersChange([...filters, newFilter]);\n setIsAddingFilter(false);\n }\n };\n\n const handleClose = () => {\n if (filter) {\n setEditingFilter(null);\n } else {\n setIsAddingFilter(false);\n }\n };\n\n return (\n <Form {...form}>\n <form onSubmit={form.handleSubmit(handleSubmit)} className=\"flex flex-col gap-2 min-w-60\">\n <FormField\n control={form.control}\n name=\"property\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Property</FormLabel>\n <Select\n onValueChange={field.onChange}\n defaultValue={field.value}\n disabled={!!filter}\n >\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent autoFocus>\n {Object.entries(filterableProperties).map(([key]) => (\n <SelectItem key={key} value={key}>\n {getResourceDisplayName(key, 'admin-portal')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {watchProperty && (\n <>\n <FormField\n control={form.control}\n name=\"operator\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Comparison</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n {filterableProperties[watchProperty] &&\n OPERATORS_FOR_FILTER_TYPE[filterableProperties[watchProperty]].map(\n (op) => (\n <SelectItem key={op} value={op}>\n {COMPARISON_OPERATOR_LABELS[op]}\n </SelectItem>\n ),\n )}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n {filterableProperties[watchProperty] && (\n <ValueField\n control={form.control}\n propertyType={filterableProperties[watchProperty]}\n />\n )}\n </>\n )}\n\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleClose}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\">\n Apply Filter\n </Button>\n </div>\n </form>\n </Form>\n );\n };\n\n return (\n <div className=\"flex items-center py-2 justify-between gap-4\">\n <div className=\"flex flex-wrap gap-2 items-center\">\n {filters.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No filters active. Add a filter to refine the results.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2 items-center\">\n <p className=\"text-sm text-muted-foreground\">Active Filters:</p>\n <div className=\"flex flex-wrap gap-2 items-center\">\n {filters.map((filter, index) => {\n return (\n <div key={filter.id} className=\"flex items-center gap-2\">\n <div className=\"flex items-center\">\n <Popover\n open={editingFilter === filter.id}\n onOpenChange={(open) => {\n if (!open) setEditingFilter(null);\n }}\n >\n <PopoverTrigger>\n <Badge\n onClick={() => setEditingFilter(filter.id)}\n variant=\"default\"\n className=\"cursor-pointer h-7\"\n >\n {getFilterLabel(filter)}\n </Badge>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto\" align=\"start\">\n <FilterForm filter={filter} />\n </PopoverContent>\n </Popover>\n <Button\n icon={X}\n variant=\"destructive\"\n className=\"h-7 -ml-0.5\"\n size=\"icon\"\n onClick={() => removeFilter(filter.id)}\n />\n </div>\n {index < filters.length - 1 && (\n <span className=\"text-sm text-muted-foreground\">and</span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n <Popover open={isAddingFilter} onOpenChange={setIsAddingFilter}>\n <PopoverTrigger asChild>\n <Button icon={FilterIcon} variant=\"outline\" />\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-4\" align=\"start\">\n <FilterForm />\n </PopoverContent>\n </Popover>\n </div>\n );\n};\ninterface ValueFieldProps {\n control: any;\n propertyType: FilterablePropertyType;\n}\nconst ValueField = ({ control, propertyType }: ValueFieldProps) => {\n switch (propertyType) {\n case 'boolean':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n <SelectItem value=\"true\">True</SelectItem>\n <SelectItem value=\"false\">False</SelectItem>\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n case 'objectDate':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem className=\"flex flex-col\">\n <FormLabel>Value</FormLabel>\n <Popover>\n <PopoverTrigger asChild>\n <FormControl>\n <Button\n variant=\"outline\"\n className={cn(\n 'w-full pl-3 text-left font-normal',\n !field.value && 'text-muted-foreground',\n )}\n >\n {field.value ? (\n format(new Date(field.value), 'PPP')\n ) : (\n <span>Pick a date</span>\n )}\n </Button>\n </FormControl>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={field.value ? new Date(field.value) : undefined}\n onSelect={(date) => {\n if (date) {\n field.onChange(date.toISOString()); // Convert date to ISO\n }\n }}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n case 'role':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n <SelectItem value=\"user\">User</SelectItem>\n <SelectItem value=\"organization-admin\">Organization Admin</SelectItem>\n <SelectItem value=\"reseller-admin\">Reseller Admin</SelectItem>\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n case 'number':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <FormControl>\n <Input {...field} type=\"number\" />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n default:\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <FormControl>\n <Input {...field} type=\"text\" />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n }\n};\n"],"names":["filterSchema","z","FILTER_COMPARISON_OPERATORS","TableFilter","filterableProperties","filters","onFiltersChange","editingFilter","setEditingFilter","useState","isAddingFilter","setIsAddingFilter","getFilterLabel","filter","property","getResourceDisplayName","operatorLabel","COMPARISON_OPERATOR_LABELS","value","removeFilter","id","FilterForm","form","useForm","zodResolver","watchProperty","handleSubmit","values","newFilter","f","handleClose","jsx","Form","jsxs","FormField","field","FormItem","FormLabel","Select","FormControl","SelectTrigger","SelectValue","SelectContent","key","SelectItem","FormMessage","Fragment","OPERATORS_FOR_FILTER_TYPE","op","ValueField","Button","index","Popover","open","PopoverTrigger","Badge","PopoverContent","X","FilterIcon","control","propertyType","cn","format","Calendar","date","Input"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table-filter.es.js","sources":["../../../lib/components/data-table/table-filter.tsx"],"sourcesContent":["import {\n COMPARISON_OPERATOR_LABELS,\n FILTER_COMPARISON_OPERATORS,\n getResourceDisplayName,\n OPERATORS_FOR_FILTER_TYPE,\n type FilterableProperties,\n type FilterablePropertyType,\n} from '@/components/data-table/table-utils';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@/components/ui/form';\nimport { Input } from '@/components/ui/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { cn } from '@/utils';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { format } from 'date-fns';\nimport { FilterIcon, X } from 'lucide-react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport z from 'zod';\nconst filterSchema = z.object({\n // For identifing a filter for updation and deletion\n id: z.string().min(1, 'Field is required'),\n property: z.string().min(1, 'Field is required.'),\n operator: z.enum(FILTER_COMPARISON_OPERATORS, {\n errorMap: () => ({ message: 'Invalid comparison operator' }),\n }),\n value: z.string().min(1, 'Field is required.'),\n});\nexport type FilterFormType = z.infer<typeof filterSchema>;\n\ninterface TableFilterProps {\n filterableProperties: FilterableProperties<any>;\n filters: FilterFormType[];\n onFiltersChange: (filters: FilterFormType[]) => void;\n}\n\nexport const TableFilter = ({\n filterableProperties,\n filters,\n onFiltersChange,\n}: TableFilterProps) => {\n const [editingFilter, setEditingFilter] = useState<string | null>(null);\n const [isAddingFilter, setIsAddingFilter] = useState(false);\n const getFilterLabel = (filter: FilterFormType): string => {\n const property = getResourceDisplayName(filter.property, 'admin-portal');\n const operatorLabel = COMPARISON_OPERATOR_LABELS[filter.operator];\n const value = filter.value;\n return `${property} ${operatorLabel} ${value}`;\n };\n\n const removeFilter = (id: string) => {\n onFiltersChange(filters.filter((filter) => filter.id !== id));\n };\n\n interface FilterFormProps {\n filter?: FilterFormType;\n }\n const FilterForm = ({ filter }: FilterFormProps) => {\n const form = useForm<FilterFormType>({\n resolver: zodResolver(filterSchema),\n defaultValues: {\n property: filter?.property || '',\n // TODO: Add dynamic default operator as per property type\n operator: filter?.operator || 'eq',\n value: filter?.value || '',\n id: filter?.id || `filter-${Date.now()}-${Math.random().toString(36)}`,\n },\n mode: 'all',\n });\n\n const watchProperty = form.watch('property');\n const handleSubmit = (values: FilterFormType) => {\n const newFilter: FilterFormType = {\n ...values,\n operator: values.operator,\n };\n\n if (filter) {\n // Update existing filter\n onFiltersChange(filters.map((f) => (f.id === filter.id ? newFilter : f)));\n setEditingFilter(null);\n } else {\n // Add new filter\n onFiltersChange([...filters, newFilter]);\n setIsAddingFilter(false);\n }\n };\n\n const handleClose = () => {\n if (filter) {\n setEditingFilter(null);\n } else {\n setIsAddingFilter(false);\n }\n };\n\n return (\n <Form {...form}>\n <form onSubmit={form.handleSubmit(handleSubmit)} className=\"flex flex-col gap-2 min-w-60\">\n <FormField\n control={form.control}\n name=\"property\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Property</FormLabel>\n <Select\n onValueChange={field.onChange}\n defaultValue={field.value}\n disabled={!!filter}\n >\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent autoFocus>\n {Object.entries(filterableProperties).map(([key]) => (\n <SelectItem key={key} value={key}>\n {getResourceDisplayName(key, 'admin-portal')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {watchProperty && (\n <>\n <FormField\n control={form.control}\n name=\"operator\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Comparison</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n {filterableProperties[watchProperty] &&\n OPERATORS_FOR_FILTER_TYPE[filterableProperties[watchProperty]].map(\n (op) => (\n <SelectItem key={op} value={op}>\n {COMPARISON_OPERATOR_LABELS[op]}\n </SelectItem>\n ),\n )}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n {filterableProperties[watchProperty] && (\n <ValueField\n control={form.control}\n propertyType={filterableProperties[watchProperty]}\n />\n )}\n </>\n )}\n\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleClose}>\n Cancel\n </Button>\n <Button type=\"submit\" size=\"sm\">\n Apply Filter\n </Button>\n </div>\n </form>\n </Form>\n );\n };\n\n return (\n <div className=\"flex items-center py-2 justify-between gap-4\">\n <div className=\"flex flex-wrap gap-2 items-center\">\n {filters.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No filters active. Add a filter to refine the results.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2 items-center\">\n <p className=\"text-sm text-muted-foreground\">Active Filters:</p>\n <div className=\"flex flex-wrap gap-2 items-center\">\n {filters.map((filter, index) => {\n return (\n <div key={filter.id} className=\"flex items-center gap-2\">\n <div className=\"flex items-center\">\n <Popover\n open={editingFilter === filter.id}\n onOpenChange={(open) => {\n if (!open) setEditingFilter(null);\n }}\n >\n <PopoverTrigger>\n <Badge\n onClick={() => setEditingFilter(filter.id)}\n >\n {getFilterLabel(filter)}\n </Badge>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto\" align=\"start\">\n <FilterForm filter={filter} />\n </PopoverContent>\n </Popover>\n <Button\n icon={X}\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => removeFilter(filter.id)}\n />\n </div>\n {index < filters.length - 1 && (\n <span className=\"text-sm text-muted-foreground\">and</span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n <Popover open={isAddingFilter} onOpenChange={setIsAddingFilter}>\n <PopoverTrigger asChild>\n <Button icon={FilterIcon} variant=\"outline\" />\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-4\" align=\"start\">\n <FilterForm />\n </PopoverContent>\n </Popover>\n </div>\n );\n};\ninterface ValueFieldProps {\n control: any;\n propertyType: FilterablePropertyType;\n}\nconst ValueField = ({ control, propertyType }: ValueFieldProps) => {\n switch (propertyType) {\n case 'boolean':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n <SelectItem value=\"true\">True</SelectItem>\n <SelectItem value=\"false\">False</SelectItem>\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n case 'objectDate':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem className=\"flex flex-col\">\n <FormLabel>Value</FormLabel>\n <Popover>\n <PopoverTrigger asChild>\n <FormControl>\n <Button\n variant=\"outline\"\n className={cn(\n 'w-full pl-3 text-left font-normal',\n !field.value && 'text-muted-foreground',\n )}\n >\n {field.value ? (\n format(new Date(field.value), 'PPP')\n ) : (\n <span>Pick a date</span>\n )}\n </Button>\n </FormControl>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={field.value ? new Date(field.value) : undefined}\n onSelect={(date) => {\n if (date) {\n field.onChange(date.toISOString()); // Convert date to ISO\n }\n }}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n case 'role':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n <SelectItem value=\"user\">User</SelectItem>\n <SelectItem value=\"organization-admin\">Organization Admin</SelectItem>\n <SelectItem value=\"reseller-admin\">Reseller Admin</SelectItem>\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n case 'number':\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <FormControl>\n <Input {...field} type=\"number\" />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n\n default:\n return (\n <FormField\n control={control}\n name=\"value\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>Value</FormLabel>\n <FormControl>\n <Input {...field} type=\"text\" />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n );\n }\n};\n"],"names":["filterSchema","z","FILTER_COMPARISON_OPERATORS","TableFilter","filterableProperties","filters","onFiltersChange","editingFilter","setEditingFilter","useState","isAddingFilter","setIsAddingFilter","getFilterLabel","filter","property","getResourceDisplayName","operatorLabel","COMPARISON_OPERATOR_LABELS","value","removeFilter","id","FilterForm","form","useForm","zodResolver","watchProperty","handleSubmit","values","newFilter","f","handleClose","jsx","Form","jsxs","FormField","field","FormItem","FormLabel","Select","FormControl","SelectTrigger","SelectValue","SelectContent","key","SelectItem","FormMessage","Fragment","OPERATORS_FOR_FILTER_TYPE","op","ValueField","Button","index","Popover","open","PopoverTrigger","Badge","PopoverContent","X","FilterIcon","control","propertyType","cn","format","Calendar","date","Input"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsxs as
|
|
1
|
+
import { jsxs as e, jsx as t } from "react/jsx-runtime";
|
|
2
2
|
import { Badge as c } from "../ui/badge.es.js";
|
|
3
3
|
import "../ui/accordion.es.js";
|
|
4
4
|
import "../ui/avatar.es.js";
|
|
@@ -10,7 +10,7 @@ import "../ui/chart.es.js";
|
|
|
10
10
|
import "../ui/checkbox.es.js";
|
|
11
11
|
import "@radix-ui/react-collapsible";
|
|
12
12
|
import "../ui/command.es.js";
|
|
13
|
-
import { CopyButton as
|
|
13
|
+
import { CopyButton as x } from "../ui/copy-button.es.js";
|
|
14
14
|
import "../ui/dialog.es.js";
|
|
15
15
|
import "../ui/drawer.es.js";
|
|
16
16
|
import "../ui/dropdown-menu.es.js";
|
|
@@ -18,7 +18,7 @@ import "../ui/form.es.js";
|
|
|
18
18
|
import "../ui/input.es.js";
|
|
19
19
|
import "../ui/input-otp.es.js";
|
|
20
20
|
import "../ui/label.es.js";
|
|
21
|
-
import { Link as
|
|
21
|
+
import { Link as u } from "@tanstack/react-router";
|
|
22
22
|
import "lucide-react";
|
|
23
23
|
import "../ui/mutli-select.es.js";
|
|
24
24
|
import "../ui/navigation-menu.es.js";
|
|
@@ -37,37 +37,40 @@ import "../ui/table.es.js";
|
|
|
37
37
|
import "../ui/tabs.es.js";
|
|
38
38
|
import "../ui/tooltip.es.js";
|
|
39
39
|
import { FormatDate as w } from "../data-table/table-utils/date.es.js";
|
|
40
|
-
const ir = ({ data:
|
|
40
|
+
const ir = ({ data: n, label: m, fields: s }) => {
|
|
41
41
|
const a = (p, r) => {
|
|
42
42
|
if (p.transform)
|
|
43
43
|
return p.transform(r);
|
|
44
|
-
if (
|
|
44
|
+
if (r == null)
|
|
45
45
|
return "-";
|
|
46
46
|
switch (p.type) {
|
|
47
47
|
case "link":
|
|
48
|
-
return /* @__PURE__ */ t(
|
|
48
|
+
return /* @__PURE__ */ t(u, { to: r, children: r });
|
|
49
49
|
case "copyButton":
|
|
50
|
-
return /* @__PURE__ */
|
|
50
|
+
return /* @__PURE__ */ e("span", { className: "flex items-center gap-2", children: [
|
|
51
|
+
r,
|
|
52
|
+
/* @__PURE__ */ t(x, { value: r })
|
|
53
|
+
] });
|
|
51
54
|
case "date":
|
|
52
55
|
return /* @__PURE__ */ t("span", { children: w(r) });
|
|
53
56
|
case "yesno":
|
|
54
57
|
return /* @__PURE__ */ t("span", { children: r ? "Yes" : "No" });
|
|
55
58
|
case "badge":
|
|
56
|
-
return /* @__PURE__ */ t("div", { className: "flex flex-wrap gap-1", children: Array.isArray(r) ? r.map((o, i) => /* @__PURE__ */ t(c, {
|
|
59
|
+
return /* @__PURE__ */ t("div", { className: "flex flex-wrap gap-1", children: Array.isArray(r) ? r.map((o, i) => /* @__PURE__ */ t(c, { children: typeof o == "object" ? (o == null ? void 0 : o.name) || (o == null ? void 0 : o.id) : o }, i)) : r });
|
|
57
60
|
case "boolean":
|
|
58
61
|
return /* @__PURE__ */ t("span", { children: r.toString() });
|
|
59
62
|
default:
|
|
60
63
|
return /* @__PURE__ */ t("span", { children: r });
|
|
61
64
|
}
|
|
62
65
|
};
|
|
63
|
-
return /* @__PURE__ */
|
|
64
|
-
/* @__PURE__ */ t(d, { children: /* @__PURE__ */ t(f, { children:
|
|
65
|
-
/* @__PURE__ */ t(h, { children: /* @__PURE__ */ t("div", { className: "flex flex-col gap-2", children:
|
|
66
|
+
return /* @__PURE__ */ e(l, { children: [
|
|
67
|
+
/* @__PURE__ */ t(d, { children: /* @__PURE__ */ t(f, { children: m }) }),
|
|
68
|
+
/* @__PURE__ */ t(h, { children: /* @__PURE__ */ t("div", { className: "flex flex-col gap-2", children: n ? s.map((p) => {
|
|
66
69
|
const r = p.accessor ? p.accessor.split(".").reduce(
|
|
67
70
|
(o, i) => o && i in o ? o[i] : void 0,
|
|
68
|
-
|
|
71
|
+
n
|
|
69
72
|
) : null;
|
|
70
|
-
return /* @__PURE__ */
|
|
73
|
+
return /* @__PURE__ */ e(
|
|
71
74
|
"div",
|
|
72
75
|
{
|
|
73
76
|
className: "flex w-full flex-col md:flex-row justify-between first:pt-0 last:pb-0",
|
|
@@ -78,7 +81,7 @@ const ir = ({ data: e, label: s, fields: n }) => {
|
|
|
78
81
|
},
|
|
79
82
|
p.display
|
|
80
83
|
);
|
|
81
|
-
}) :
|
|
84
|
+
}) : s.map((p, r) => /* @__PURE__ */ t(y, { className: "h-12 w-full" }, r)) }) })
|
|
82
85
|
] });
|
|
83
86
|
};
|
|
84
87
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-value-card.es.js","sources":["../../../lib/components/key-value-card/key-value-card.tsx"],"sourcesContent":["import { Badge } from '@/components/ui/badge';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CopyButton,\n FormatDate,\n Skeleton,\n} from '@/index';\nimport { Link } from '@tanstack/react-router';\n\n// Utility type to handle nested keys (dot notation) in any object\ntype NestedKeyOf<T> = T extends object\n ? {\n
|
|
1
|
+
{"version":3,"file":"key-value-card.es.js","sources":["../../../lib/components/key-value-card/key-value-card.tsx"],"sourcesContent":["import { Badge } from '@/components/ui/badge';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CopyButton,\n FormatDate,\n Skeleton,\n} from '@/index';\nimport { Link } from '@tanstack/react-router';\n\n// Utility type to handle nested keys (dot notation) in any object\ntype NestedKeyOf<T> = T extends object\n ? {\n [K in keyof T]: K extends string | number\n ? `${K & string}` | `${K & string}.${NestedKeyOf<T[K]>}`\n : never;\n }[keyof T]\n : never;\n\n// DisplayField type that works with nested keys\nexport type DisplayField<T> = {\n display: string;\n accessor: NestedKeyOf<T>;\n type?: 'text' | 'badge' | 'boolean' | 'date' | 'yesno' | 'copyButton' | 'link'; // Field types\n transform?: (value: any) => React.ReactNode;\n};\n\nexport interface KeyValueCardProps<T> {\n data: T; // Ensure data is of type T\n label: string;\n fields: DisplayField<T>[];\n className?: string;\n}\n\nexport const KeyValueCard = <T extends {}>({ data, label, fields }: KeyValueCardProps<T>) => {\n const renderValue = (field: DisplayField<T>, value: any) => {\n if (field.transform) {\n return field.transform(value);\n }\n if (value === undefined || value === null) {\n return '-';\n }\n switch (field.type) {\n case 'link':\n return <Link to={value}>{value}</Link>;\n case 'copyButton':\n return <span className='flex items-center gap-2'>{value}<CopyButton value={value} /></span>;\n case 'date':\n return <span>{FormatDate(value)}</span>;\n case 'yesno':\n return <span>{value ? 'Yes' : 'No'}</span>;\n case 'badge':\n return (\n <div className=\"flex flex-wrap gap-1\">\n {Array.isArray(value)\n ? value.map((item, index) => (\n <Badge key={index}>\n {typeof item === 'object' ? item?.name || item?.id : item}\n </Badge>\n ))\n : value}\n </div>\n );\n\n case 'boolean':\n return <span>{value.toString()}</span>;\n default:\n return <span>{value}</span>;\n }\n };\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>{label}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-col gap-2\">\n {data\n ? fields.map((field) => {\n // TODO: improve this\n const value = field.accessor\n ? field.accessor\n .split('.')\n .reduce(\n (obj, key) => (obj && key in obj ? obj[key] : undefined),\n data as Record<string, any>,\n )\n : null;\n\n return (\n <div\n key={field.display}\n className=\"flex w-full flex-col md:flex-row justify-between first:pt-0 last:pb-0\"\n >\n <p className=\"text-sm flex w-full justify-start col-span-1\">{field.display}</p>\n <div className=\"text-sm flex w-full justify-start text-wrap break-all\">\n {renderValue(field, value)}\n </div>\n </div>\n );\n })\n : fields.map((_, index) => <Skeleton key={index} className=\"h-12 w-full\" />)}\n </div>\n </CardContent>\n </Card>\n );\n};\n"],"names":["KeyValueCard","data","label","fields","renderValue","field","value","jsx","Link","jsxs","CopyButton","FormatDate","item","index","Badge","Card","CardHeader","CardTitle","CardContent","obj","key","_","Skeleton"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCO,MAAMA,KAAe,CAAe,EAAE,MAAAC,GAAM,OAAAC,GAAO,QAAAC,QAAmC;AACrF,QAAAC,IAAc,CAACC,GAAwBC,MAAe;AAC1D,QAAID,EAAM;AACD,aAAAA,EAAM,UAAUC,CAAK;AAE1B,QAAuBA,KAAU;AAC5B,aAAA;AAET,YAAQD,EAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAQ,gBAAAE,EAAAC,GAAA,EAAK,IAAIF,GAAQ,UAAMA,GAAA;AAAA,MACjC,KAAK;AACI,eAAA,gBAAAG,EAAC,QAAK,EAAA,WAAU,2BAA2B,UAAA;AAAA,UAAAH;AAAA,UAAM,gBAAAC,EAACG,KAAW,OAAAJ,EAAc,CAAA;AAAA,QAAA,GAAE;AAAA,MACtF,KAAK;AACH,eAAQ,gBAAAC,EAAA,QAAA,EAAM,UAAWI,EAAAL,CAAK,GAAE;AAAA,MAClC,KAAK;AACH,eAAQ,gBAAAC,EAAA,QAAA,EAAM,UAAQD,IAAA,QAAQ,MAAK;AAAA,MACrC,KAAK;AAED,eAAA,gBAAAC,EAAC,OAAI,EAAA,WAAU,wBACZ,UAAA,MAAM,QAAQD,CAAK,IAChBA,EAAM,IAAI,CAACM,GAAMC,wBAChBC,GACE,EAAA,UAAA,OAAOF,KAAS,YAAWA,KAAA,gBAAAA,EAAM,UAAQA,KAAA,gBAAAA,EAAM,MAAKA,EAD3C,GAAAC,CAEZ,CACD,IACCP,EACN,CAAA;AAAA,MAGJ,KAAK;AACH,eAAQ,gBAAAC,EAAA,QAAA,EAAM,UAAMD,EAAA,SAAA,GAAW;AAAA,MACjC;AACS,eAAA,gBAAAC,EAAC,UAAM,UAAMD,EAAA,CAAA;AAAA,IAAA;AAAA,EAE1B;AAEA,2BACGS,GACC,EAAA,UAAA;AAAA,IAAA,gBAAAR,EAACS,GACC,EAAA,UAAA,gBAAAT,EAACU,GAAW,EAAA,UAAAf,EAAM,CAAA,GACpB;AAAA,IACA,gBAAAK,EAACW,GACC,EAAA,UAAA,gBAAAX,EAAC,OAAI,EAAA,WAAU,uBACZ,UACGN,IAAAE,EAAO,IAAI,CAACE,MAAU;AAEtB,YAAMC,IAAQD,EAAM,WAChBA,EAAM,SACL,MAAM,GAAG,EACT;AAAA,QACC,CAACc,GAAKC,MAASD,KAAOC,KAAOD,IAAMA,EAAIC,CAAG,IAAI;AAAA,QAC9CnB;AAAA,MAAA,IAEF;AAGF,aAAA,gBAAAQ;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAF,EAAC,KAAE,EAAA,WAAU,gDAAgD,UAAAF,EAAM,SAAQ;AAAA,8BAC1E,OAAI,EAAA,WAAU,yDACZ,UAAYD,EAAAC,GAAOC,CAAK,EAC3B,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QANKD,EAAM;AAAA,MAOb;AAAA,IAEH,CAAA,IACCF,EAAO,IAAI,CAACkB,GAAGR,MAAW,gBAAAN,EAAAe,GAAA,EAAqB,WAAU,cAAA,GAAjBT,CAA+B,CAAE,EAC/E,CAAA,EACF,CAAA;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
2
2
|
import { BreadCrumbs as p } from "./breadcrumb.es.js";
|
|
3
3
|
import { SideBar as l } from "./sidebar.es.js";
|
|
4
|
-
import { SidebarProvider as
|
|
4
|
+
import { SidebarProvider as c, SidebarTrigger as a } from "../ui/sidebar.es.js";
|
|
5
5
|
import "../ui/accordion.es.js";
|
|
6
6
|
import { Avatar as n, AvatarImage as d, AvatarFallback as f } from "../ui/avatar.es.js";
|
|
7
|
-
import "
|
|
7
|
+
import { logout as h } from "../../utils/index.es.js";
|
|
8
8
|
import "../ui/breadcrumb.es.js";
|
|
9
9
|
import "../ui/button.es.js";
|
|
10
10
|
import "../ui/calendar.es.js";
|
|
@@ -13,16 +13,15 @@ import "../ui/chart.es.js";
|
|
|
13
13
|
import "../ui/checkbox.es.js";
|
|
14
14
|
import "@radix-ui/react-collapsible";
|
|
15
15
|
import "../ui/command.es.js";
|
|
16
|
-
import {
|
|
16
|
+
import { LogOutIcon as s } from "lucide-react";
|
|
17
17
|
import "react";
|
|
18
18
|
import "../ui/dialog.es.js";
|
|
19
19
|
import "../ui/drawer.es.js";
|
|
20
|
-
import { DropdownMenu as
|
|
20
|
+
import { DropdownMenu as v, DropdownMenuTrigger as x, DropdownMenuContent as g, DropdownMenuItem as N } from "../ui/dropdown-menu.es.js";
|
|
21
21
|
import "../ui/form.es.js";
|
|
22
22
|
import "../ui/input.es.js";
|
|
23
23
|
import "../ui/input-otp.es.js";
|
|
24
24
|
import "../ui/label.es.js";
|
|
25
|
-
import { logout as N } from "../../utils/index.es.js";
|
|
26
25
|
import { Outlet as b } from "@tanstack/react-router";
|
|
27
26
|
import "../ui/mutli-select.es.js";
|
|
28
27
|
import "../ui/navigation-menu.es.js";
|
|
@@ -37,15 +36,15 @@ import "sonner";
|
|
|
37
36
|
import "../ui/table.es.js";
|
|
38
37
|
import "../ui/tabs.es.js";
|
|
39
38
|
import "../ui/tooltip.es.js";
|
|
40
|
-
function
|
|
39
|
+
function mr({ data: e, user: o }) {
|
|
41
40
|
var t, m;
|
|
42
|
-
return /* @__PURE__ */ r("div", { className: "h-dvh flex", children: /* @__PURE__ */ i(
|
|
41
|
+
return /* @__PURE__ */ r("div", { className: "h-dvh flex", children: /* @__PURE__ */ i(c, { children: [
|
|
43
42
|
/* @__PURE__ */ r(l, { data: e }),
|
|
44
43
|
/* @__PURE__ */ i("div", { className: "flex flex-col h-screen w-full overflow-auto", children: [
|
|
45
44
|
/* @__PURE__ */ i("header", { className: "h-[7vh] sticky top-0 bg-card flex items-center justify-between p-4 pl-0 border-b z-10", children: [
|
|
46
|
-
/* @__PURE__ */ r("div", { className: "flex gap-1 items-center", children: /* @__PURE__ */ r(
|
|
47
|
-
/* @__PURE__ */ i(
|
|
48
|
-
/* @__PURE__ */ r(
|
|
45
|
+
/* @__PURE__ */ r("div", { className: "flex gap-1 items-center", children: /* @__PURE__ */ r(a, {}) }),
|
|
46
|
+
/* @__PURE__ */ i(v, { children: [
|
|
47
|
+
/* @__PURE__ */ r(x, { asChild: !0, children: /* @__PURE__ */ r("div", { className: "cursor-pointer", children: /* @__PURE__ */ i(n, { className: "justify-center items-center", children: [
|
|
49
48
|
/* @__PURE__ */ r(
|
|
50
49
|
d,
|
|
51
50
|
{
|
|
@@ -58,10 +57,7 @@ function er({ data: e, user: o }) {
|
|
|
58
57
|
(m = o == null ? void 0 : o.lastName) == null ? void 0 : m.charAt(0)
|
|
59
58
|
] })
|
|
60
59
|
] }) }) }),
|
|
61
|
-
/* @__PURE__ */ r(
|
|
62
|
-
/* @__PURE__ */ r(h, {}),
|
|
63
|
-
" Logout"
|
|
64
|
-
] }) })
|
|
60
|
+
/* @__PURE__ */ r(g, { children: /* @__PURE__ */ r(N, { icon: s, onClick: () => h(), children: "Logout" }) })
|
|
65
61
|
] })
|
|
66
62
|
] }),
|
|
67
63
|
/* @__PURE__ */ i("div", { className: "flex-1 flex flex-col overflow-auto", children: [
|
|
@@ -72,6 +68,6 @@ function er({ data: e, user: o }) {
|
|
|
72
68
|
] }) });
|
|
73
69
|
}
|
|
74
70
|
export {
|
|
75
|
-
|
|
71
|
+
mr as AppLayout
|
|
76
72
|
};
|
|
77
73
|
//# sourceMappingURL=app-layout.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-layout.es.js","sources":["../../../lib/components/sidebar/app-layout.tsx"],"sourcesContent":["import { BreadCrumbs } from '@/components/sidebar/breadcrumb';\nimport type { NavItem } from '@/components/sidebar/nav-main';\nimport { SideBar } from '@/components/sidebar/sidebar';\nimport { SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar';\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n logout,\n} from '@/index';\nimport { Outlet } from '@tanstack/react-router';\nimport {
|
|
1
|
+
{"version":3,"file":"app-layout.es.js","sources":["../../../lib/components/sidebar/app-layout.tsx"],"sourcesContent":["import { BreadCrumbs } from '@/components/sidebar/breadcrumb';\nimport type { NavItem } from '@/components/sidebar/nav-main';\nimport { SideBar } from '@/components/sidebar/sidebar';\nimport { SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar';\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n logout,\n} from '@/index';\nimport { Outlet } from '@tanstack/react-router';\nimport { LogOutIcon } from 'lucide-react';\n\nexport interface AppLayoutProps {\n data: NavItem[]; // Navigation items\n user?: {\n firstName?: string;\n lastName?: string;\n logoUrl?: string;\n }; // Optional user information\n}\n\nexport function AppLayout({ data, user }: AppLayoutProps) {\n return (\n <div className=\"h-dvh flex\">\n <SidebarProvider>\n {/* Sidebar */}\n <SideBar data={data} />\n\n {/* Main Content */}\n <div className=\"flex flex-col h-screen w-full overflow-auto\">\n {/* Header */}\n <header className=\"h-[7vh] sticky top-0 bg-card flex items-center justify-between p-4 pl-0 border-b z-10\">\n {/* Sidebar Trigger */}\n <div className=\"flex gap-1 items-center\">\n <SidebarTrigger />\n </div>\n\n {/* User Dropdown */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <div className=\"cursor-pointer\">\n <Avatar className=\"justify-center items-center\">\n <AvatarImage\n src={user?.logoUrl ?? 'https://app.dev.cryptlex.com/favicon.ico'}\n alt=\"icon\"\n />\n <AvatarFallback>\n {user?.firstName?.charAt(0)}\n {user?.lastName?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n </div>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent>\n <DropdownMenuItem icon={LogOutIcon} onClick={() => logout()}>Logout</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </header>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 flex flex-col overflow-auto\">\n <div className=\"p-4 pb-0\">\n <BreadCrumbs />\n </div>\n <div className=\"flex-1 p-4 pt-2\">\n <Outlet />\n </div>\n </div>\n </div>\n </SidebarProvider>\n </div>\n );\n}\n"],"names":["AppLayout","data","user","jsx","SidebarProvider","SideBar","jsxs","SidebarTrigger","DropdownMenu","DropdownMenuTrigger","Avatar","AvatarImage","AvatarFallback","_a","_b","DropdownMenuContent","DropdownMenuItem","LogOutIcon","logout","BreadCrumbs","Outlet"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BO,SAASA,GAAU,EAAE,MAAAC,GAAM,MAAAC,KAAwB;;AACxD,SACG,gBAAAC,EAAA,OAAA,EAAI,WAAU,cACb,4BAACC,GAEC,EAAA,UAAA;AAAA,IAAA,gBAAAD,EAACE,KAAQ,MAAAJ,GAAY;AAAA,IAGrB,gBAAAK,EAAC,OAAI,EAAA,WAAU,+CAEb,UAAA;AAAA,MAAC,gBAAAA,EAAA,UAAA,EAAO,WAAU,yFAEhB,UAAA;AAAA,QAAA,gBAAAH,EAAC,OAAI,EAAA,WAAU,2BACb,UAAA,gBAAAA,EAACI,IAAe,CAAA,GAClB;AAAA,0BAGCC,GACC,EAAA,UAAA;AAAA,UAAC,gBAAAL,EAAAM,GAAA,EAAoB,SAAO,IAC1B,UAAC,gBAAAN,EAAA,OAAA,EAAI,WAAU,kBACb,UAAA,gBAAAG,EAACI,GAAO,EAAA,WAAU,+BAChB,UAAA;AAAA,YAAA,gBAAAP;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,MAAKT,KAAA,gBAAAA,EAAM,YAAW;AAAA,gBACtB,KAAI;AAAA,cAAA;AAAA,YACN;AAAA,8BACCU,GACE,EAAA,UAAA;AAAA,eAAMC,IAAAX,KAAA,gBAAAA,EAAA,cAAA,gBAAAW,EAAW,OAAO;AAAA,eACxBC,IAAAZ,KAAA,gBAAAA,EAAM,aAAN,gBAAAY,EAAgB,OAAO;AAAA,YAAC,EAC3B,CAAA;AAAA,UAAA,EACF,CAAA,EACF,CAAA,GACF;AAAA,UAEA,gBAAAX,EAACY,GACC,EAAA,UAAA,gBAAAZ,EAACa,GAAiB,EAAA,MAAMC,GAAY,SAAS,MAAMC,EAAA,GAAU,UAAA,SAAM,CAAA,EACrE,CAAA;AAAA,QAAA,EACF,CAAA;AAAA,MAAA,GACF;AAAA,MAGA,gBAAAZ,EAAC,OAAI,EAAA,WAAU,sCACb,UAAA;AAAA,QAAA,gBAAAH,EAAC,OAAI,EAAA,WAAU,YACb,UAAA,gBAAAA,EAACgB,IAAY,CAAA,GACf;AAAA,0BACC,OAAI,EAAA,WAAU,mBACb,UAAA,gBAAAhB,EAACiB,KAAO,EACV,CAAA;AAAA,MAAA,EACF,CAAA;AAAA,IAAA,EACF,CAAA;AAAA,EAAA,EAAA,CACF,EACF,CAAA;AAEJ;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx as t, jsxs as a } from "react/jsx-runtime";
|
|
2
2
|
import "../ui/accordion.es.js";
|
|
3
3
|
import "../ui/avatar.es.js";
|
|
4
|
-
import "../ui/badge.es.js";
|
|
5
4
|
import { Breadcrumb as s, BreadcrumbList as u, BreadcrumbItem as d, BreadcrumbLink as c, BreadcrumbSeparator as h } from "../ui/breadcrumb.es.js";
|
|
6
5
|
import "../ui/button.es.js";
|
|
7
6
|
import "../ui/calendar.es.js";
|
|
@@ -41,7 +40,7 @@ function B() {
|
|
|
41
40
|
return r.push({ name: p, path: `${n}/${p}` }), r;
|
|
42
41
|
}, []) };
|
|
43
42
|
}
|
|
44
|
-
function
|
|
43
|
+
function Z({}) {
|
|
45
44
|
const { breadcrumb_routes: i } = B();
|
|
46
45
|
return /* @__PURE__ */ t(s, { children: /* @__PURE__ */ t(u, { children: i.map((o, m) => {
|
|
47
46
|
const r = m === i.length - 1;
|
|
@@ -52,7 +51,7 @@ function rr({}) {
|
|
|
52
51
|
}) }) });
|
|
53
52
|
}
|
|
54
53
|
export {
|
|
55
|
-
|
|
54
|
+
Z as BreadCrumbs,
|
|
56
55
|
B as useBreadCrumbs
|
|
57
56
|
};
|
|
58
57
|
//# sourceMappingURL=breadcrumb.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumb.es.js","sources":["../../../lib/components/sidebar/breadcrumb.tsx"],"sourcesContent":["import {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbSeparator,\n} from '@/index';\nimport { Link, useLocation } from '@tanstack/react-router';\nimport React from 'react';\nexport function useBreadCrumbs() {\n const current = useLocation();\n\n const routeHistory = current.pathname.split('/').filter((x) => x && x.length > 0);\n\n const breadcrumb_routes = routeHistory.reduce((acc: { name: string; path: string }[], route) => {\n const prev_path = acc[acc.length - 1]?.path ?? '';\n acc.push({ name: route, path: `${prev_path}/${route}` });\n return acc;\n }, []);\n return { breadcrumb_routes };\n}\n\ninterface BreadCrumbsProps {}\n\nexport function BreadCrumbs({}: BreadCrumbsProps) {\n const { breadcrumb_routes } = useBreadCrumbs();\n\n return (\n <Breadcrumb>\n <BreadcrumbList>\n {breadcrumb_routes.map((crumb, index) => {\n const isLast = index === breadcrumb_routes.length - 1;\n return (\n <React.Fragment key={crumb.path}>\n <BreadcrumbItem>\n {isLast ? (\n crumb.name.split('-').join(' ')\n ) : (\n <BreadcrumbLink asChild>\n <Link to={crumb.path}>{crumb.name.split('-').join(' ')}</Link>\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator />}\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n"],"names":["useBreadCrumbs","useLocation","x","acc","route","prev_path","_a","BreadCrumbs","breadcrumb_routes","jsx","Breadcrumb","BreadcrumbList","crumb","index","isLast","jsxs","React","BreadcrumbItem","BreadcrumbLink","Link","BreadcrumbSeparator"],"mappings":"
|
|
1
|
+
{"version":3,"file":"breadcrumb.es.js","sources":["../../../lib/components/sidebar/breadcrumb.tsx"],"sourcesContent":["import {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbSeparator,\n} from '@/index';\nimport { Link, useLocation } from '@tanstack/react-router';\nimport React from 'react';\nexport function useBreadCrumbs() {\n const current = useLocation();\n\n const routeHistory = current.pathname.split('/').filter((x) => x && x.length > 0);\n\n const breadcrumb_routes = routeHistory.reduce((acc: { name: string; path: string }[], route) => {\n const prev_path = acc[acc.length - 1]?.path ?? '';\n acc.push({ name: route, path: `${prev_path}/${route}` });\n return acc;\n }, []);\n return { breadcrumb_routes };\n}\n\ninterface BreadCrumbsProps {}\n\nexport function BreadCrumbs({}: BreadCrumbsProps) {\n const { breadcrumb_routes } = useBreadCrumbs();\n\n return (\n <Breadcrumb>\n <BreadcrumbList>\n {breadcrumb_routes.map((crumb, index) => {\n const isLast = index === breadcrumb_routes.length - 1;\n return (\n <React.Fragment key={crumb.path}>\n <BreadcrumbItem>\n {isLast ? (\n crumb.name.split('-').join(' ')\n ) : (\n <BreadcrumbLink asChild>\n <Link to={crumb.path}>{crumb.name.split('-').join(' ')}</Link>\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator />}\n </React.Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n"],"names":["useBreadCrumbs","useLocation","x","acc","route","prev_path","_a","BreadCrumbs","breadcrumb_routes","jsx","Breadcrumb","BreadcrumbList","crumb","index","isLast","jsxs","React","BreadcrumbItem","BreadcrumbLink","Link","BreadcrumbSeparator"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASO,SAASA,IAAiB;AAU/B,SAAO,EAAE,mBATOC,EAAY,EAEC,SAAS,MAAM,GAAG,EAAE,OAAO,CAACC,MAAMA,KAAKA,EAAE,SAAS,CAAC,EAEzC,OAAO,CAACC,GAAuCC,MAAU;;AAC9F,UAAMC,MAAYC,IAAAH,EAAIA,EAAI,SAAS,CAAC,MAAlB,gBAAAG,EAAqB,SAAQ;AAC3C,WAAAH,EAAA,KAAK,EAAE,MAAMC,GAAO,MAAM,GAAGC,CAAS,IAAID,CAAK,GAAA,CAAI,GAChDD;AAAA,EACT,GAAG,EAAE,EACsB;AAC7B;AAIgB,SAAAI,EAAY,CAAA,GAAsB;AAC1C,QAAA,EAAE,mBAAAC,EAAkB,IAAIR,EAAe;AAG3C,SAAA,gBAAAS,EAACC,KACC,UAAC,gBAAAD,EAAAE,GAAA,EACE,YAAkB,IAAI,CAACC,GAAOC,MAAU;AACjC,UAAAC,IAASD,MAAUL,EAAkB,SAAS;AAElD,WAAA,gBAAAO,EAACC,EAAM,UAAN,EACC,UAAA;AAAA,MAAA,gBAAAP,EAACQ,GACE,EAAA,UAAAH,IACCF,EAAM,KAAK,MAAM,GAAG,EAAE,KAAK,GAAG,IAE7B,gBAAAH,EAAAS,GAAA,EAAe,SAAO,IACrB,UAAC,gBAAAT,EAAAU,GAAA,EAAK,IAAIP,EAAM,MAAO,UAAAA,EAAM,KAAK,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE,CAAA,EACzD,CAAA,GAEJ;AAAA,MACC,CAACE,KAAU,gBAAAL,EAACW,GAAoB,CAAA,CAAA;AAAA,IAAA,EAAA,GAVdR,EAAM,IAW3B;AAAA,EAAA,CAEH,GACH,EACF,CAAA;AAEJ;"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { jsx as e, jsxs as r } from "react/jsx-runtime";
|
|
2
2
|
import { Collapsible as S, CollapsibleTrigger as x, CollapsibleContent as C } from "../ui/collapsible.es.js";
|
|
3
|
-
import { useSidebar as v, SidebarGroup as m, SidebarMenu as M, SidebarMenuItem as p, SidebarMenuButton as u, SidebarMenuSub as
|
|
3
|
+
import { useSidebar as v, SidebarGroup as m, SidebarMenu as M, SidebarMenuItem as p, SidebarMenuButton as u, SidebarMenuSub as y, SidebarMenuSubItem as z, SidebarMenuSubButton as P } from "../ui/sidebar.es.js";
|
|
4
4
|
import { useMatches as k, Link as b } from "@tanstack/react-router";
|
|
5
|
-
import { ChevronRight as
|
|
6
|
-
import { useState as
|
|
7
|
-
function
|
|
8
|
-
const { setOpen: f } = v(), [
|
|
9
|
-
|
|
5
|
+
import { ChevronRight as w } from "lucide-react";
|
|
6
|
+
import { useState as $, useEffect as j } from "react";
|
|
7
|
+
function W({ items: i }) {
|
|
8
|
+
const { setOpen: f } = v(), [d, h] = $(null), s = k(), o = s.length > 0 ? s[s.length - 1].pathname : "", n = (l) => l.children ? l.children.some((a) => o.startsWith(a.path)) : !1, g = (l) => o.startsWith(l.path) || n(l);
|
|
9
|
+
j(() => {
|
|
10
10
|
i.forEach((l) => {
|
|
11
|
-
n(l) &&
|
|
11
|
+
n(l) && h(l.label);
|
|
12
12
|
});
|
|
13
13
|
}, [o]);
|
|
14
14
|
const N = (l) => {
|
|
15
|
-
|
|
15
|
+
h((a) => a === l ? null : l);
|
|
16
16
|
}, c = `
|
|
17
17
|
w-full rounded-md px-2 py-1.5
|
|
18
18
|
transition-colors duration-200
|
|
@@ -26,7 +26,7 @@ function G({ items: i }) {
|
|
|
26
26
|
S,
|
|
27
27
|
{
|
|
28
28
|
asChild: !0,
|
|
29
|
-
open:
|
|
29
|
+
open: d === l.label || n(l),
|
|
30
30
|
className: "group/collapsible w-full",
|
|
31
31
|
children: /* @__PURE__ */ r(p, { children: [
|
|
32
32
|
/* @__PURE__ */ e(x, { asChild: !0, children: /* @__PURE__ */ r(
|
|
@@ -36,21 +36,21 @@ function G({ items: i }) {
|
|
|
36
36
|
onClick: () => {
|
|
37
37
|
f(!0), N(l.label);
|
|
38
38
|
},
|
|
39
|
-
className:
|
|
39
|
+
className: `cursor-pointer ${c} ${g(l) ? t : ""}`,
|
|
40
40
|
children: [
|
|
41
|
-
l.icon && /* @__PURE__ */ e(l.icon, { className: "
|
|
41
|
+
l.icon && /* @__PURE__ */ e(l.icon, { className: "size-4" }),
|
|
42
42
|
/* @__PURE__ */ e("span", { className: "flex-1", children: l.label }),
|
|
43
43
|
/* @__PURE__ */ e(
|
|
44
|
-
|
|
44
|
+
w,
|
|
45
45
|
{
|
|
46
|
-
className: `
|
|
46
|
+
className: `size-4 transition-transform duration-200 ${d === l.label || n(l) ? "rotate-90" : ""}`
|
|
47
47
|
}
|
|
48
48
|
)
|
|
49
49
|
]
|
|
50
50
|
}
|
|
51
51
|
) }),
|
|
52
|
-
/* @__PURE__ */ e(C, { children: /* @__PURE__ */ e(
|
|
53
|
-
(a) => a.display && /* @__PURE__ */ e(
|
|
52
|
+
/* @__PURE__ */ e(C, { children: /* @__PURE__ */ e(y, { className: "w-full flex flex-col gap-1", children: l.children.map(
|
|
53
|
+
(a) => a.display && /* @__PURE__ */ e(z, { children: /* @__PURE__ */ e(P, { asChild: !0, children: /* @__PURE__ */ r(
|
|
54
54
|
b,
|
|
55
55
|
{
|
|
56
56
|
to: a.path,
|
|
@@ -59,7 +59,7 @@ function G({ items: i }) {
|
|
|
59
59
|
className: t
|
|
60
60
|
},
|
|
61
61
|
children: [
|
|
62
|
-
a.icon && /* @__PURE__ */ e(a.icon, { className: "
|
|
62
|
+
a.icon && /* @__PURE__ */ e(a.icon, { className: "size-4" }),
|
|
63
63
|
/* @__PURE__ */ e("span", { children: a.label })
|
|
64
64
|
]
|
|
65
65
|
}
|
|
@@ -77,7 +77,7 @@ function G({ items: i }) {
|
|
|
77
77
|
className: t
|
|
78
78
|
},
|
|
79
79
|
children: [
|
|
80
|
-
l.icon && /* @__PURE__ */ e(l.icon, { className: "
|
|
80
|
+
l.icon && /* @__PURE__ */ e(l.icon, { className: "size-4" }),
|
|
81
81
|
/* @__PURE__ */ e("span", { children: l.label })
|
|
82
82
|
]
|
|
83
83
|
}
|
|
@@ -85,6 +85,6 @@ function G({ items: i }) {
|
|
|
85
85
|
) }) });
|
|
86
86
|
}
|
|
87
87
|
export {
|
|
88
|
-
|
|
88
|
+
W as NavMain
|
|
89
89
|
};
|
|
90
90
|
//# sourceMappingURL=nav-main.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-main.es.js","sources":["../../../lib/components/sidebar/nav-main.tsx"],"sourcesContent":["import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';\nimport {\n SidebarGroup,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n useSidebar,\n} from '@/components/ui/sidebar';\nimport { Link, useMatches } from '@tanstack/react-router';\nimport { ChevronRight, type LucideIcon } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nexport type NavItem = {\n path: string;\n label: string;\n display: boolean;\n icon: LucideIcon;\n children?: { path: string; label: string; icon: LucideIcon; display: boolean }[];\n};\n\nexport function NavMain({ items }: { items: NavItem[] }) {\n const { setOpen } = useSidebar();\n const [openItem, setOpenItem] = useState<string | null>(null);\n const matches = useMatches();\n const currentPath = matches.length > 0 ? matches[matches.length - 1].pathname : '';\n\n const isChildActive = (item: NavItem) => {\n if (!item.children) return false;\n return item.children.some((child) => currentPath.startsWith(child.path));\n };\n\n const isParentActive = (item: NavItem) => {\n return currentPath.startsWith(item.path) || isChildActive(item);\n };\n\n // Set initial open state based on active paths\n useEffect(() => {\n items.forEach((item) => {\n if (isChildActive(item)) {\n setOpenItem(item.label);\n }\n });\n }, [currentPath]); // Re-run when path changes\n\n const handleToggle = (title: string) => {\n setOpenItem((prev) => (prev === title ? null : title));\n };\n\n const commonLinkStyles = `\n w-full rounded-md px-2 py-1.5\n transition-colors duration-200\n hover:bg-neutral-4 focus-visible:bg-neutral-4\n text-neutral-10 hover:text-neutral-10\n no-underline\n flex items-center gap-2\n `;\n\n const activeStyles = `bg-neutral-4 font-bold`;\n\n return (\n <SidebarGroup>\n <SidebarMenu className=\"flex flex-col gap-1\">\n {items.map((item) =>\n item.children && item.display && item.children.length > 0 ? (\n <Collapsible\n key={item.label}\n asChild\n open={openItem === item.label || isChildActive(item)}\n className=\"group/collapsible w-full\"\n >\n <SidebarMenuItem>\n <CollapsibleTrigger asChild>\n <SidebarMenuButton\n tooltip={item.label}\n onClick={() => {\n setOpen(true);\n handleToggle(item.label);\n }}\n className={
|
|
1
|
+
{"version":3,"file":"nav-main.es.js","sources":["../../../lib/components/sidebar/nav-main.tsx"],"sourcesContent":["import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';\nimport {\n SidebarGroup,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n useSidebar,\n} from '@/components/ui/sidebar';\nimport { Link, useMatches } from '@tanstack/react-router';\nimport { ChevronRight, type LucideIcon } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nexport type NavItem = {\n path: string;\n label: string;\n display: boolean;\n icon: LucideIcon;\n children?: { path: string; label: string; icon: LucideIcon; display: boolean }[];\n};\n\nexport function NavMain({ items }: { items: NavItem[] }) {\n const { setOpen } = useSidebar();\n const [openItem, setOpenItem] = useState<string | null>(null);\n const matches = useMatches();\n const currentPath = matches.length > 0 ? matches[matches.length - 1].pathname : '';\n\n const isChildActive = (item: NavItem) => {\n if (!item.children) return false;\n return item.children.some((child) => currentPath.startsWith(child.path));\n };\n\n const isParentActive = (item: NavItem) => {\n return currentPath.startsWith(item.path) || isChildActive(item);\n };\n\n // Set initial open state based on active paths\n useEffect(() => {\n items.forEach((item) => {\n if (isChildActive(item)) {\n setOpenItem(item.label);\n }\n });\n }, [currentPath]); // Re-run when path changes\n\n const handleToggle = (title: string) => {\n setOpenItem((prev) => (prev === title ? null : title));\n };\n\n const commonLinkStyles = `\n w-full rounded-md px-2 py-1.5\n transition-colors duration-200\n hover:bg-neutral-4 focus-visible:bg-neutral-4\n text-neutral-10 hover:text-neutral-10\n no-underline\n flex items-center gap-2\n `;\n\n const activeStyles = `bg-neutral-4 font-bold`;\n\n return (\n <SidebarGroup>\n <SidebarMenu className=\"flex flex-col gap-1\">\n {items.map((item) =>\n item.children && item.display && item.children.length > 0 ? (\n <Collapsible\n key={item.label}\n asChild\n open={openItem === item.label || isChildActive(item)}\n className=\"group/collapsible w-full\"\n >\n <SidebarMenuItem>\n <CollapsibleTrigger asChild>\n <SidebarMenuButton\n tooltip={item.label}\n onClick={() => {\n setOpen(true);\n handleToggle(item.label);\n }}\n className={`cursor-pointer ${commonLinkStyles} ${isParentActive(item) ? activeStyles : ''}`}\n >\n {item.icon && <item.icon className=\"size-4\" />}\n <span className=\"flex-1\">{item.label}</span>\n <ChevronRight\n className={`size-4 transition-transform duration-200 ${openItem === item.label || isChildActive(item) ? 'rotate-90' : ''\n }`}\n />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub className=\"w-full flex flex-col gap-1\">\n {item.children.map(\n (subItem) =>\n subItem.display && (\n <SidebarMenuSubItem key={subItem.label}>\n <SidebarMenuSubButton asChild>\n <Link\n to={subItem.path}\n className={commonLinkStyles}\n activeProps={{\n className: activeStyles,\n }}\n >\n {subItem.icon && <subItem.icon className=\"size-4\" />}\n <span>{subItem.label}</span>\n </Link>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n ),\n )}\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n ) : (\n item.display && (\n <SidebarMenuItem key={item.label}>\n <SidebarMenuButton asChild tooltip={item.label}>\n <Link\n to={item.path}\n className={commonLinkStyles}\n activeProps={{\n className: activeStyles,\n }}\n >\n {item.icon && <item.icon className=\"size-4\" />}\n <span>{item.label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )\n ),\n )}\n </SidebarMenu>\n </SidebarGroup>\n );\n}\n"],"names":["NavMain","items","setOpen","useSidebar","openItem","setOpenItem","useState","matches","useMatches","currentPath","isChildActive","item","child","isParentActive","useEffect","handleToggle","title","prev","commonLinkStyles","activeStyles","SidebarGroup","jsx","SidebarMenu","Collapsible","SidebarMenuItem","CollapsibleTrigger","jsxs","SidebarMenuButton","ChevronRight","CollapsibleContent","SidebarMenuSub","subItem","SidebarMenuSubItem","SidebarMenuSubButton","Link"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Badge as
|
|
3
|
-
import { Table as
|
|
4
|
-
import { getResourceDisplayName as u, getValueFromData as
|
|
5
|
-
function b({ accessors: d, data: o, affectedData:
|
|
6
|
-
return /* @__PURE__ */
|
|
7
|
-
/* @__PURE__ */ e(
|
|
1
|
+
import { jsxs as i, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { Badge as h } from "../ui/badge.es.js";
|
|
3
|
+
import { Table as g, TableHeader as x, TableRow as c, TableCell as a, TableBody as f } from "../ui/table.es.js";
|
|
4
|
+
import { getResourceDisplayName as u, getValueFromData as y } from "../data-table/table-utils/constants.es.js";
|
|
5
|
+
function b({ accessors: d, data: o, affectedData: n }) {
|
|
6
|
+
return /* @__PURE__ */ i(g, { children: [
|
|
7
|
+
/* @__PURE__ */ e(x, { className: "text-left align-middle sticky top-0 z-10 bg-card", children: /* @__PURE__ */ i(c, { children: [
|
|
8
8
|
d.map((r) => /* @__PURE__ */ e(
|
|
9
9
|
a,
|
|
10
10
|
{
|
|
@@ -13,16 +13,16 @@ function b({ accessors: d, data: o, affectedData: t }) {
|
|
|
13
13
|
},
|
|
14
14
|
String(r)
|
|
15
15
|
)),
|
|
16
|
-
|
|
16
|
+
n && /* @__PURE__ */ e(a, { className: "px-4 py-2 text-left text-sm font-medium cursor-pointer whitespace-nowrap bg-card", children: "Affected" })
|
|
17
17
|
] }) }),
|
|
18
|
-
/* @__PURE__ */ e(
|
|
18
|
+
/* @__PURE__ */ e(f, { children: o.map((r, m) => /* @__PURE__ */ i(c, { children: [
|
|
19
19
|
d.map((l) => {
|
|
20
|
-
const
|
|
21
|
-
return Array.isArray(
|
|
20
|
+
const p = r[l];
|
|
21
|
+
return Array.isArray(p) ? /* @__PURE__ */ e(a, { className: "flex gap-4", children: p.map((t, s) => /* @__PURE__ */ e(h, { children: (t == null ? void 0 : t.name) || t }, s)) }, String(l)) : /* @__PURE__ */ e(a, { children: y(r, l) }, String(l));
|
|
22
22
|
}),
|
|
23
|
-
|
|
24
|
-
] },
|
|
25
|
-
] })
|
|
23
|
+
n && /* @__PURE__ */ e(a, { children: n.includes(r) ? /* @__PURE__ */ e("span", { className: "text-success-foreground", children: "✔" }) : /* @__PURE__ */ e("span", { className: "text-destructive-foreground", children: "✖" }) })
|
|
24
|
+
] }, m)) })
|
|
25
|
+
] });
|
|
26
26
|
}
|
|
27
27
|
export {
|
|
28
28
|
b as StaticDataTable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.es.js","sources":["../../../lib/components/static-data-table/data-table.tsx"],"sourcesContent":["import { getResourceDisplayName, getValueFromData } from '@/components/data-table';\nimport { Badge } from '@/components/ui/badge';\nimport { Table, TableBody, TableCell, TableHeader, TableRow } from '@/components/ui/table';\n\n\nexport interface StaticDataTableProps<T> {\n accessors: (keyof T)[];\n data: T[];\n affectedData?: T[];\n}\n\nexport function StaticDataTable<T>({ accessors, data, affectedData }: StaticDataTableProps<T>) {\n return (\n <
|
|
1
|
+
{"version":3,"file":"data-table.es.js","sources":["../../../lib/components/static-data-table/data-table.tsx"],"sourcesContent":["import { getResourceDisplayName, getValueFromData } from '@/components/data-table';\nimport { Badge } from '@/components/ui/badge';\nimport { Table, TableBody, TableCell, TableHeader, TableRow } from '@/components/ui/table';\n\n\nexport interface StaticDataTableProps<T> {\n accessors: (keyof T)[];\n data: T[];\n affectedData?: T[];\n}\n\nexport function StaticDataTable<T>({ accessors, data, affectedData }: StaticDataTableProps<T>) {\n return (\n <Table>\n <TableHeader className=\"text-left align-middle sticky top-0 z-10 bg-card\">\n <TableRow>\n {accessors.map((accessor) => (\n <TableCell\n key={String(accessor)}\n className=\"px-4 py-2 text-left text-sm font-medium cursor-pointer whitespace-nowrap bg-card\"\n >\n {getResourceDisplayName(String(accessor), 'admin-portal')}\n </TableCell>\n ))}\n {affectedData && (\n <TableCell className=\"px-4 py-2 text-left text-sm font-medium cursor-pointer whitespace-nowrap bg-card\">\n Affected\n </TableCell>\n )}\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.map((item, index) => (\n <TableRow key={index}>\n {accessors.map((accessor) => {\n const value = item[accessor];\n // Handle arrays (e.g., userGroups) with badges\n if (Array.isArray(value)) {\n return (\n <TableCell key={String(accessor)} className=\"flex gap-4\">\n {value.map((subItem, subIndex) => (\n <Badge key={subIndex}>{subItem?.name || subItem}</Badge>\n ))}\n </TableCell>\n );\n }\n // Handle other data types\n return (\n <TableCell key={String(accessor)}>{getValueFromData(item, accessor)}</TableCell>\n );\n })}\n {affectedData && (\n <TableCell>\n {affectedData.includes(item) ? (\n <span className=\"text-success-foreground\">✔</span>\n ) : (\n <span className=\"text-destructive-foreground\">✖</span>\n )}\n </TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n"],"names":["StaticDataTable","accessors","data","affectedData","Table","jsx","TableHeader","jsxs","TableRow","accessor","TableCell","getResourceDisplayName","TableBody","item","index","value","subItem","subIndex","Badge","getValueFromData"],"mappings":";;;;AAWO,SAASA,EAAmB,EAAE,WAAAC,GAAW,MAAAC,GAAM,cAAAC,KAAyC;AAC7F,2BACGC,GACC,EAAA,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAY,EAAA,WAAU,oDACrB,UAAA,gBAAAC,EAACC,GACE,EAAA,UAAA;AAAA,MAAUP,EAAA,IAAI,CAACQ,MACd,gBAAAJ;AAAA,QAACK;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAET,UAAuBC,EAAA,OAAOF,CAAQ,GAAG,cAAc;AAAA,QAAA;AAAA,QAHnD,OAAOA,CAAQ;AAAA,MAAA,CAKvB;AAAA,MACAN,KACC,gBAAAE,EAACK,GAAU,EAAA,WAAU,oFAAmF,UAExG,WAAA,CAAA;AAAA,IAAA,EAAA,CAEJ,EACF,CAAA;AAAA,IACA,gBAAAL,EAACO,KACE,UAAKV,EAAA,IAAI,CAACW,GAAMC,wBACdN,GACE,EAAA,UAAA;AAAA,MAAUP,EAAA,IAAI,CAACQ,MAAa;AACrB,cAAAM,IAAQF,EAAKJ,CAAQ;AAEvB,eAAA,MAAM,QAAQM,CAAK,sBAElBL,GAAiC,EAAA,WAAU,cACzC,UAAMK,EAAA,IAAI,CAACC,GAASC,wBAClBC,GAAsB,EAAA,WAAAF,KAAA,gBAAAA,EAAS,SAAQA,EAA5B,GAAAC,CAAoC,CACjD,EAHa,GAAA,OAAOR,CAAQ,CAI/B,IAKF,gBAAAJ,EAACK,KAAkC,UAAiBS,EAAAN,GAAMJ,CAAQ,EAAlD,GAAA,OAAOA,CAAQ,CAAqC;AAAA,MAAA,CAEvE;AAAA,MACAN,KACE,gBAAAE,EAAAK,GAAA,EACE,YAAa,SAASG,CAAI,IACxB,gBAAAR,EAAA,QAAA,EAAK,WAAU,2BAA0B,eAAC,IAE3C,gBAAAA,EAAC,UAAK,WAAU,+BAA8B,cAAC,CAAA,EAEnD,CAAA;AAAA,IAAA,EAzBW,GAAAS,CA2Bf,CACD,EACH,CAAA;AAAA,EAAA,GACF;AAEJ;"}
|