@k3-universe/react-kit 0.0.27 → 0.0.29
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/.storybook/main.ts +1 -1
- package/.storybook/preview.ts +18 -10
- package/biome.json +10 -0
- package/dist/index.js +2319 -1227
- package/dist/kit/builder/auth/AuthProvider.d.ts +36 -0
- package/dist/kit/builder/auth/AuthProvider.d.ts.map +1 -0
- package/dist/kit/builder/auth/adapter.d.ts +14 -0
- package/dist/kit/builder/auth/adapter.d.ts.map +1 -0
- package/dist/kit/builder/auth/client-adapters.d.ts +149 -0
- package/dist/kit/builder/auth/client-adapters.d.ts.map +1 -0
- package/dist/kit/builder/auth/components.d.ts +119 -0
- package/dist/kit/builder/auth/components.d.ts.map +1 -0
- package/dist/kit/builder/auth/hooks.d.ts +158 -0
- package/dist/kit/builder/auth/hooks.d.ts.map +1 -0
- package/dist/kit/builder/auth/index.d.ts +11 -0
- package/dist/kit/builder/auth/index.d.ts.map +1 -0
- package/dist/kit/builder/auth/permission-checker.d.ts +31 -0
- package/dist/kit/builder/auth/permission-checker.d.ts.map +1 -0
- package/dist/kit/builder/auth/storage.d.ts +17 -0
- package/dist/kit/builder/auth/storage.d.ts.map +1 -0
- package/dist/kit/builder/auth/token-manager.d.ts +9 -0
- package/dist/kit/builder/auth/token-manager.d.ts.map +1 -0
- package/dist/kit/builder/auth/types.d.ts +183 -0
- package/dist/kit/builder/auth/types.d.ts.map +1 -0
- package/dist/kit/builder/data-table/components/DataTable.d.ts +2 -1
- package/dist/kit/builder/data-table/components/DataTable.d.ts.map +1 -1
- package/dist/kit/builder/data-table/components/DataTableColumnHeader.d.ts +2 -2
- package/dist/kit/builder/data-table/components/DataTableColumnHeader.d.ts.map +1 -1
- package/dist/kit/builder/data-table/components/DataTablePagination.d.ts +2 -1
- package/dist/kit/builder/data-table/components/DataTablePagination.d.ts.map +1 -1
- package/dist/kit/builder/data-table/components/DataTableViewOptions.d.ts +1 -1
- package/dist/kit/builder/data-table/components/DataTableViewOptions.d.ts.map +1 -1
- package/dist/kit/builder/data-table/types.d.ts.map +1 -1
- package/dist/kit/builder/dialog/index.d.ts +1 -1
- package/dist/kit/builder/dialog/index.d.ts.map +1 -1
- package/dist/kit/builder/dialog/provider.d.ts +0 -1
- package/dist/kit/builder/dialog/provider.d.ts.map +1 -1
- package/dist/kit/builder/form/components/FormBuilder.d.ts.map +1 -1
- package/dist/kit/builder/form/components/FormBuilderActions.d.ts.map +1 -1
- package/dist/kit/builder/form/components/FormBuilderContext.d.ts.map +1 -1
- package/dist/kit/builder/form/components/FormBuilderField.d.ts +1 -1
- package/dist/kit/builder/form/components/FormBuilderField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/ArrayField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/ArrayField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/AutocompleteField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/AutocompleteField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/CheckboxField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/CheckboxField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DateField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DateField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DatePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DatePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DateRangePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DateRangePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DateTimePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DateTimePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DateTimeRangePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DateTimeRangePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/FileField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/FileField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/MonthPickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/MonthPickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/MonthRangePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/MonthRangePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/NumberField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/NumberField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/ObjectField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/RadioField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/RadioField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/SelectField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/SelectField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/SwitchField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/SwitchField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/TextField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/TextField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/TextareaField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/TextareaField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/TimePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/TimePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/TimeRangePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/TimeRangePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/index.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/types.d.ts.map +1 -1
- package/dist/kit/builder/form/components/sectionNodes.d.ts.map +1 -1
- package/dist/kit/builder/form/hooks/useFormBuilder.d.ts.map +1 -1
- package/dist/kit/builder/form/types.d.ts.map +1 -1
- package/dist/kit/builder/form/utils/section-factories.d.ts.map +1 -1
- package/dist/kit/builder/page/Page.d.ts.map +1 -1
- package/dist/kit/builder/page/index.d.ts.map +1 -1
- package/dist/kit/builder/section/SectionBuilder.d.ts +1 -1
- package/dist/kit/builder/section/SectionBuilder.d.ts.map +1 -1
- package/dist/kit/builder/section/SectionContainer.d.ts +14 -0
- package/dist/kit/builder/section/SectionContainer.d.ts.map +1 -0
- package/dist/kit/builder/stack-dialog/context.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/hooks.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/index.d.ts +3 -3
- package/dist/kit/builder/stack-dialog/index.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/provider.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/renderer.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/types.d.ts +1 -1
- package/dist/kit/builder/stack-dialog/types.d.ts.map +1 -1
- package/dist/kit/components/autocomplete/Autocomplete.d.ts +1 -1
- package/dist/kit/components/autocomplete/Autocomplete.d.ts.map +1 -1
- package/dist/kit/components/autocomplete/types.d.ts.map +1 -1
- package/dist/kit/components/datepicker/DatePicker.d.ts.map +1 -1
- package/dist/kit/components/datepicker/DateRangePicker.d.ts.map +1 -1
- package/dist/kit/components/datetimepicker/DateTimePicker.d.ts.map +1 -1
- package/dist/kit/components/datetimepicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/kit/components/datetimepicker/index.d.ts.map +1 -1
- package/dist/kit/components/fileuploader/FileUploader.d.ts.map +1 -1
- package/dist/kit/components/fileuploader/types.d.ts +2 -2
- package/dist/kit/components/forminfo/FormInfoError.d.ts.map +1 -1
- package/dist/kit/components/login/Login.d.ts +1 -1
- package/dist/kit/components/login/Login.d.ts.map +1 -1
- package/dist/kit/components/monthpicker/MonthInput.d.ts.map +1 -1
- package/dist/kit/components/monthpicker/MonthPicker.d.ts.map +1 -1
- package/dist/kit/components/monthpicker/MonthRangeInput.d.ts.map +1 -1
- package/dist/kit/components/monthpicker/MonthRangePicker.d.ts.map +1 -1
- package/dist/kit/components/timepicker/TimePicker.d.ts.map +1 -1
- package/dist/kit/components/timepicker/TimeRangePicker.d.ts.map +1 -1
- package/dist/kit/components/timepicker/index.d.ts.map +1 -1
- package/dist/kit/layouts/admin/components/AdminLayout.d.ts.map +1 -1
- package/dist/kit/layouts/admin/components/ThemeToggle.d.ts.map +1 -1
- package/dist/kit/layouts/admin/hooks/menu.d.ts.map +1 -1
- package/dist/kit/layouts/admin/providers/AdminMenuProvider.d.ts +1 -1
- package/dist/kit/layouts/admin/providers/AdminMenuProvider.d.ts.map +1 -1
- package/dist/shadcn/hooks/use-mobile.d.ts.map +1 -1
- package/dist/shadcn/ui/accordion.d.ts +2 -2
- package/dist/shadcn/ui/accordion.d.ts.map +1 -1
- package/dist/shadcn/ui/alert-dialog.d.ts +4 -4
- package/dist/shadcn/ui/alert-dialog.d.ts.map +1 -1
- package/dist/shadcn/ui/alert.d.ts +4 -4
- package/dist/shadcn/ui/alert.d.ts.map +1 -1
- package/dist/shadcn/ui/aspect-ratio.d.ts +1 -1
- package/dist/shadcn/ui/aspect-ratio.d.ts.map +1 -1
- package/dist/shadcn/ui/avatar.d.ts +2 -2
- package/dist/shadcn/ui/avatar.d.ts.map +1 -1
- package/dist/shadcn/ui/badge.d.ts +2 -2
- package/dist/shadcn/ui/badge.d.ts.map +1 -1
- package/dist/shadcn/ui/breadcrumb.d.ts +8 -8
- package/dist/shadcn/ui/breadcrumb.d.ts.map +1 -1
- package/dist/shadcn/ui/button.d.ts +2 -2
- package/dist/shadcn/ui/button.d.ts.map +1 -1
- package/dist/shadcn/ui/calendar.d.ts +2 -2
- package/dist/shadcn/ui/calendar.d.ts.map +1 -1
- package/dist/shadcn/ui/card.d.ts +8 -8
- package/dist/shadcn/ui/card.d.ts.map +1 -1
- package/dist/shadcn/ui/carousel.d.ts +5 -5
- package/dist/shadcn/ui/carousel.d.ts.map +1 -1
- package/dist/shadcn/ui/chart.d.ts +7 -7
- package/dist/shadcn/ui/chart.d.ts.map +1 -1
- package/dist/shadcn/ui/checkbox.d.ts +2 -2
- package/dist/shadcn/ui/checkbox.d.ts.map +1 -1
- package/dist/shadcn/ui/collapsible.d.ts +1 -1
- package/dist/shadcn/ui/collapsible.d.ts.map +1 -1
- package/dist/shadcn/ui/command.d.ts +2 -2
- package/dist/shadcn/ui/command.d.ts.map +1 -1
- package/dist/shadcn/ui/context-menu.d.ts +4 -4
- package/dist/shadcn/ui/context-menu.d.ts.map +1 -1
- package/dist/shadcn/ui/dialog.d.ts +4 -4
- package/dist/shadcn/ui/dialog.d.ts.map +1 -1
- package/dist/shadcn/ui/drawer.d.ts +3 -3
- package/dist/shadcn/ui/drawer.d.ts.map +1 -1
- package/dist/shadcn/ui/dropdown-menu.d.ts +4 -4
- package/dist/shadcn/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/shadcn/ui/form.d.ts +5 -5
- package/dist/shadcn/ui/form.d.ts.map +1 -1
- package/dist/shadcn/ui/hover-card.d.ts +2 -2
- package/dist/shadcn/ui/hover-card.d.ts.map +1 -1
- package/dist/shadcn/ui/input-otp.d.ts +4 -4
- package/dist/shadcn/ui/input-otp.d.ts.map +1 -1
- package/dist/shadcn/ui/input.d.ts +2 -2
- package/dist/shadcn/ui/input.d.ts.map +1 -1
- package/dist/shadcn/ui/label.d.ts +2 -2
- package/dist/shadcn/ui/label.d.ts.map +1 -1
- package/dist/shadcn/ui/menubar.d.ts +4 -4
- package/dist/shadcn/ui/menubar.d.ts.map +1 -1
- package/dist/shadcn/ui/navigation-menu.d.ts +2 -2
- package/dist/shadcn/ui/navigation-menu.d.ts.map +1 -1
- package/dist/shadcn/ui/pagination.d.ts +6 -6
- package/dist/shadcn/ui/pagination.d.ts.map +1 -1
- package/dist/shadcn/ui/popover.d.ts +2 -2
- package/dist/shadcn/ui/popover.d.ts.map +1 -1
- package/dist/shadcn/ui/progress.d.ts +2 -2
- package/dist/shadcn/ui/progress.d.ts.map +1 -1
- package/dist/shadcn/ui/radio-group.d.ts +2 -2
- package/dist/shadcn/ui/radio-group.d.ts.map +1 -1
- package/dist/shadcn/ui/resizable.d.ts +2 -2
- package/dist/shadcn/ui/resizable.d.ts.map +1 -1
- package/dist/shadcn/ui/scroll-area.d.ts +2 -2
- package/dist/shadcn/ui/scroll-area.d.ts.map +1 -1
- package/dist/shadcn/ui/select.d.ts +3 -3
- package/dist/shadcn/ui/select.d.ts.map +1 -1
- package/dist/shadcn/ui/separator.d.ts +2 -2
- package/dist/shadcn/ui/separator.d.ts.map +1 -1
- package/dist/shadcn/ui/sheet.d.ts +5 -5
- package/dist/shadcn/ui/sheet.d.ts.map +1 -1
- package/dist/shadcn/ui/sidebar.d.ts +26 -26
- package/dist/shadcn/ui/sidebar.d.ts.map +1 -1
- package/dist/shadcn/ui/skeleton.d.ts +1 -1
- package/dist/shadcn/ui/skeleton.d.ts.map +1 -1
- package/dist/shadcn/ui/slider.d.ts +2 -2
- package/dist/shadcn/ui/slider.d.ts.map +1 -1
- package/dist/shadcn/ui/sonner.d.ts.map +1 -1
- package/dist/shadcn/ui/switch.d.ts +2 -2
- package/dist/shadcn/ui/switch.d.ts.map +1 -1
- package/dist/shadcn/ui/table.d.ts +9 -9
- package/dist/shadcn/ui/table.d.ts.map +1 -1
- package/dist/shadcn/ui/tabs.d.ts +2 -2
- package/dist/shadcn/ui/tabs.d.ts.map +1 -1
- package/dist/shadcn/ui/textarea.d.ts +2 -2
- package/dist/shadcn/ui/textarea.d.ts.map +1 -1
- package/dist/shadcn/ui/toggle-group.d.ts +2 -2
- package/dist/shadcn/ui/toggle-group.d.ts.map +1 -1
- package/dist/shadcn/ui/toggle.d.ts +2 -2
- package/dist/shadcn/ui/toggle.d.ts.map +1 -1
- package/dist/shadcn/ui/tooltip.d.ts +2 -2
- package/dist/shadcn/ui/tooltip.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -1
- package/src/kit/builder/auth/AuthProvider.tsx +131 -0
- package/src/kit/builder/auth/adapter.ts +436 -0
- package/src/kit/builder/auth/client-adapters.ts +398 -0
- package/src/kit/builder/auth/components.tsx +221 -0
- package/src/kit/builder/auth/hooks.ts +237 -0
- package/src/kit/builder/auth/index.ts +134 -0
- package/src/kit/builder/auth/permission-checker.ts +150 -0
- package/src/kit/builder/auth/storage.ts +366 -0
- package/src/kit/builder/auth/token-manager.ts +55 -0
- package/src/kit/builder/auth/types.ts +393 -0
- package/src/kit/builder/data-table/components/DataTable.tsx +216 -82
- package/src/kit/builder/data-table/components/DataTableColumnHeader.tsx +9 -5
- package/src/kit/builder/data-table/components/DataTablePagination.tsx +49 -27
- package/src/kit/builder/data-table/components/DataTableViewOptions.tsx +13 -4
- package/src/kit/builder/data-table/types.ts +18 -3
- package/src/kit/builder/dialog/index.ts +5 -1
- package/src/kit/builder/dialog/provider.tsx +56 -27
- package/src/kit/builder/form/components/FormBuilder.tsx +10 -14
- package/src/kit/builder/form/components/FormBuilderActions.tsx +1 -1
- package/src/kit/builder/form/components/FormBuilderContext.tsx +13 -6
- package/src/kit/builder/form/components/FormBuilderField.tsx +70 -20
- package/src/kit/builder/form/components/fields/ArrayField.tsx +148 -62
- package/src/kit/builder/form/components/fields/AutocompleteField.tsx +53 -18
- package/src/kit/builder/form/components/fields/CheckboxField.tsx +20 -11
- package/src/kit/builder/form/components/fields/DateField.tsx +17 -6
- package/src/kit/builder/form/components/fields/DatePickerField.tsx +15 -10
- package/src/kit/builder/form/components/fields/DateRangePickerField.tsx +20 -15
- package/src/kit/builder/form/components/fields/DateTimePickerField.tsx +16 -11
- package/src/kit/builder/form/components/fields/DateTimeRangePickerField.tsx +23 -17
- package/src/kit/builder/form/components/fields/FileField.tsx +10 -5
- package/src/kit/builder/form/components/fields/MonthPickerField.tsx +18 -11
- package/src/kit/builder/form/components/fields/MonthRangePickerField.tsx +23 -17
- package/src/kit/builder/form/components/fields/NumberField.tsx +9 -4
- package/src/kit/builder/form/components/fields/ObjectField.tsx +12 -7
- package/src/kit/builder/form/components/fields/RadioField.tsx +32 -14
- package/src/kit/builder/form/components/fields/SelectField.tsx +26 -11
- package/src/kit/builder/form/components/fields/SwitchField.tsx +20 -11
- package/src/kit/builder/form/components/fields/TextField.tsx +11 -5
- package/src/kit/builder/form/components/fields/TextareaField.tsx +9 -4
- package/src/kit/builder/form/components/fields/TimePickerField.tsx +16 -11
- package/src/kit/builder/form/components/fields/TimeRangePickerField.tsx +23 -17
- package/src/kit/builder/form/components/fields/index.ts +21 -21
- package/src/kit/builder/form/components/fields/types.ts +15 -11
- package/src/kit/builder/form/components/sectionNodes.tsx +63 -40
- package/src/kit/builder/form/hooks/useFormBuilder.ts +83 -34
- package/src/kit/builder/form/types.ts +173 -148
- package/src/kit/builder/form/utils/section-factories.ts +4 -1
- package/src/kit/builder/form/utils/transformers.ts +4 -4
- package/src/kit/builder/form/utils/validations.ts +1 -1
- package/src/kit/builder/page/Page.tsx +26 -6
- package/src/kit/builder/page/index.ts +1 -1
- package/src/kit/builder/section/SectionBuilder.tsx +252 -127
- package/src/kit/builder/section/SectionContainer.tsx +85 -0
- package/src/kit/builder/stack-dialog/context.ts +10 -4
- package/src/kit/builder/stack-dialog/hooks.ts +4 -3
- package/src/kit/builder/stack-dialog/index.ts +5 -11
- package/src/kit/builder/stack-dialog/provider.tsx +11 -11
- package/src/kit/builder/stack-dialog/renderer.tsx +23 -26
- package/src/kit/builder/stack-dialog/types.ts +18 -18
- package/src/kit/components/autocomplete/Autocomplete.tsx +631 -549
- package/src/kit/components/autocomplete/types.ts +17 -17
- package/src/kit/components/datepicker/DatePicker.tsx +33 -9
- package/src/kit/components/datepicker/DateRangePicker.tsx +159 -87
- package/src/kit/components/datetimepicker/DateTimePicker.tsx +136 -30
- package/src/kit/components/datetimepicker/DateTimeRangePicker.tsx +257 -67
- package/src/kit/components/datetimepicker/index.ts +3 -3
- package/src/kit/components/fileuploader/FileUploader.tsx +315 -180
- package/src/kit/components/fileuploader/index.ts +3 -3
- package/src/kit/components/fileuploader/types.ts +3 -3
- package/src/kit/components/forminfo/FormInfoError.tsx +26 -11
- package/src/kit/components/login/Login.tsx +13 -4
- package/src/kit/components/monthpicker/MonthInput.tsx +13 -4
- package/src/kit/components/monthpicker/MonthPicker.tsx +12 -11
- package/src/kit/components/monthpicker/MonthRangeInput.tsx +29 -8
- package/src/kit/components/monthpicker/MonthRangePicker.tsx +23 -21
- package/src/kit/components/timepicker/TimePicker.tsx +19 -11
- package/src/kit/components/timepicker/TimeRangePicker.tsx +106 -29
- package/src/kit/components/timepicker/index.ts +3 -3
- package/src/kit/layouts/admin/components/AdminLayout.tsx +53 -24
- package/src/kit/layouts/admin/components/ThemeToggle.tsx +3 -9
- package/src/kit/layouts/admin/hooks/menu.ts +11 -5
- package/src/kit/layouts/admin/providers/AdminMenuProvider.tsx +59 -39
- package/src/kit/layouts/admin/types/index.ts +1 -1
- package/src/kit/themes/base.css +1 -1
- package/src/kit/themes/clean-slate.css +40 -32
- package/src/kit/themes/default.css +34 -24
- package/src/kit/themes/minimal-modern.css +37 -29
- package/src/kit/themes/spotify.css +56 -39
- package/src/shadcn/hooks/use-mobile.ts +13 -11
- package/src/shadcn/lib/utils.ts +2 -2
- package/src/shadcn/ui/accordion.tsx +14 -14
- package/src/shadcn/ui/alert-dialog.tsx +29 -29
- package/src/shadcn/ui/alert.tsx +20 -20
- package/src/shadcn/ui/aspect-ratio.tsx +4 -4
- package/src/shadcn/ui/avatar.tsx +13 -13
- package/src/shadcn/ui/badge.tsx +16 -16
- package/src/shadcn/ui/breadcrumb.tsx +28 -28
- package/src/shadcn/ui/button.tsx +23 -23
- package/src/shadcn/ui/calendar.tsx +82 -78
- package/src/shadcn/ui/card.tsx +27 -27
- package/src/shadcn/ui/carousel.tsx +93 -93
- package/src/shadcn/ui/chart.tsx +103 -103
- package/src/shadcn/ui/checkbox.tsx +9 -9
- package/src/shadcn/ui/collapsible.tsx +6 -6
- package/src/shadcn/ui/command.tsx +36 -36
- package/src/shadcn/ui/context-menu.tsx +40 -40
- package/src/shadcn/ui/dialog.tsx +28 -28
- package/src/shadcn/ui/drawer.tsx +30 -30
- package/src/shadcn/ui/dropdown-menu.tsx +41 -41
- package/src/shadcn/ui/form.tsx +48 -47
- package/src/shadcn/ui/hover-card.tsx +11 -11
- package/src/shadcn/ui/input-otp.tsx +23 -23
- package/src/shadcn/ui/input.tsx +9 -9
- package/src/shadcn/ui/label.tsx +8 -8
- package/src/shadcn/ui/menubar.tsx +47 -47
- package/src/shadcn/ui/navigation-menu.tsx +33 -33
- package/src/shadcn/ui/pagination.tsx +28 -28
- package/src/shadcn/ui/popover.tsx +12 -12
- package/src/shadcn/ui/progress.tsx +8 -8
- package/src/shadcn/ui/radio-group.tsx +11 -11
- package/src/shadcn/ui/resizable.tsx +14 -14
- package/src/shadcn/ui/scroll-area.tsx +15 -15
- package/src/shadcn/ui/select.tsx +34 -34
- package/src/shadcn/ui/separator.tsx +9 -9
- package/src/shadcn/ui/sheet.tsx +36 -36
- package/src/shadcn/ui/sidebar.tsx +227 -227
- package/src/shadcn/ui/skeleton.tsx +5 -5
- package/src/shadcn/ui/slider.tsx +12 -12
- package/src/shadcn/ui/sonner.tsx +11 -11
- package/src/shadcn/ui/switch.tsx +9 -9
- package/src/shadcn/ui/table.tsx +32 -32
- package/src/shadcn/ui/tabs.tsx +14 -14
- package/src/shadcn/ui/textarea.tsx +7 -7
- package/src/shadcn/ui/toggle-group.tsx +17 -17
- package/src/shadcn/ui/toggle.tsx +16 -16
- package/src/shadcn/ui/tooltip.tsx +11 -11
- package/src/stories/FileUploader.stories.tsx +23 -4
- package/src/stories/kit/builder/DataTable.Basic.stories.tsx +14 -4
- package/src/stories/kit/builder/DataTable.Filters.stories.tsx +36 -14
- package/src/stories/kit/builder/DataTable.Pagination.stories.tsx +3 -2
- package/src/stories/kit/builder/DataTable.SelectionAndActions.stories.tsx +18 -4
- package/src/stories/kit/builder/DataTable.Sorting.stories.tsx +18 -7
- package/src/stories/kit/builder/Dialog.stories.tsx +19 -13
- package/src/stories/kit/builder/Form.ArrayLayouts.stories.tsx +40 -16
- package/src/stories/kit/builder/Form.Autocomplete.stories.tsx +34 -22
- package/src/stories/kit/builder/Form.Basic.stories.tsx +38 -6
- package/src/stories/kit/builder/Form.Complex.stories.tsx +356 -111
- package/src/stories/kit/builder/Form.DateTime.stories.tsx +12 -8
- package/src/stories/kit/builder/Form.Dynamic.stories.tsx +695 -132
- package/src/stories/kit/builder/Form.Files.stories.tsx +37 -26
- package/src/stories/kit/builder/Form.MultipleFormBuilder.stories.tsx +46 -42
- package/src/stories/kit/builder/Form.Pickers.stories.tsx +12 -8
- package/src/stories/kit/builder/Form.Simple.stories.tsx +15 -6
- package/src/stories/kit/builder/Form.Time.stories.tsx +12 -8
- package/src/stories/kit/builder/Page.stories.tsx +32 -6
- package/src/stories/kit/builder/Section.stories.tsx +58 -11
- package/src/stories/kit/components/Autocomplete.stories.tsx +55 -22
- package/src/stories/kit/components/DatePicker.stories.tsx +80 -13
- package/src/stories/kit/components/DateRangePicker.stories.tsx +52 -11
- package/src/stories/kit/components/Login.stories.tsx +8 -2
- package/src/stories/kit/components/MonthPicker.stories.tsx +26 -6
- package/src/stories/kit/components/MonthRangePicker.stories.tsx +24 -5
- package/src/stories/kit/components/TimePicker.stories.tsx +18 -16
- package/src/stories/kit/components/TimeRangePicker.stories.tsx +18 -12
- package/src/stories/kit/layouts/admin/AdminLayout.Basic.stories.tsx +29 -6
- package/src/stories/kit/layouts/admin/AdminLayout.Collapsible.stories.tsx +26 -5
- package/src/stories/kit/layouts/admin/AdminLayout.Complex.stories.tsx +101 -18
- package/src/stories/kit/layouts/admin/AdminLayout.CustomSidebarHeaderComponent.stories.tsx +18 -4
- package/src/stories/kit/layouts/admin/AdminLayout.CustomSidebarTitleAndIcon.stories.tsx +17 -4
- package/src/stories/kit/layouts/admin/AdminLayout.HeaderSlots.stories.tsx +28 -6
- package/src/stories/shadcn/ui/Accordion.stories.tsx +33 -10
- package/src/stories/shadcn/ui/AlertDialog.stories.tsx +3 -1
- package/src/stories/shadcn/ui/Button.stories.tsx +3 -1
- package/src/stories/shadcn/ui/Calendar.stories.tsx +6 -1
- package/src/stories/shadcn/ui/Card.stories.tsx +11 -2
- package/src/stories/shadcn/ui/Checkbox.stories.tsx +11 -3
- package/src/stories/shadcn/ui/Collapsible.stories.tsx +12 -5
- package/src/stories/shadcn/ui/ContextMenu.stories.tsx +12 -4
- package/src/stories/shadcn/ui/Dialog.stories.tsx +15 -3
- package/src/stories/shadcn/ui/Drawer.stories.tsx +5 -2
- package/src/stories/shadcn/ui/DropdownMenu.stories.tsx +15 -5
- package/src/stories/shadcn/ui/Form.stories.tsx +5 -2
- package/src/stories/shadcn/ui/HoverCard.stories.tsx +8 -2
- package/src/stories/shadcn/ui/Input.stories.tsx +3 -1
- package/src/stories/shadcn/ui/InputOtp.stories.tsx +9 -2
- package/src/stories/shadcn/ui/Menubar.stories.tsx +21 -7
- package/src/stories/shadcn/ui/NavigationMenu.stories.tsx +30 -5
- package/src/stories/shadcn/ui/Popover.stories.tsx +8 -2
- package/src/stories/shadcn/ui/Resizable.stories.tsx +17 -5
- package/src/stories/shadcn/ui/ScrollArea.stories.tsx +54 -2
- package/src/stories/shadcn/ui/Select.stories.tsx +7 -1
- package/src/stories/shadcn/ui/Sheet.stories.tsx +2 -1
- package/src/stories/shadcn/ui/Sidebar.stories.tsx +13 -2
- package/src/stories/shadcn/ui/Sonner.stories.tsx +12 -2
- package/src/stories/shadcn/ui/Table.stories.tsx +86 -27
- package/src/stories/shadcn/ui/Tabs.stories.tsx +9 -2
- package/src/stories/shadcn/ui/Textarea.stories.tsx +3 -1
- package/src/stories/shadcn/ui/Toggle.stories.tsx +10 -2
- package/src/stories/shadcn/ui/Tooltip.stories.tsx +6 -1
- package/tsconfig.json +1 -5
- package/tsconfig.tsbuildinfo +1 -0
- package/eslint.config.mjs +0 -19
|
@@ -15,13 +15,29 @@ import {
|
|
|
15
15
|
import { Loader2, RefreshCw } from 'lucide-react';
|
|
16
16
|
import * as React from 'react';
|
|
17
17
|
import { cn } from '../../../../shadcn/lib/utils';
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
Accordion,
|
|
20
|
+
AccordionContent,
|
|
21
|
+
AccordionItem,
|
|
22
|
+
AccordionTrigger,
|
|
23
|
+
} from '../../../../shadcn/ui/accordion';
|
|
19
24
|
import { Button } from '../../../../shadcn/ui/button';
|
|
20
25
|
import { Checkbox } from '../../../../shadcn/ui/checkbox';
|
|
21
26
|
import { Skeleton } from '../../../../shadcn/ui/skeleton';
|
|
22
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
Table,
|
|
29
|
+
TableBody,
|
|
30
|
+
TableCell,
|
|
31
|
+
TableHead,
|
|
32
|
+
TableHeader,
|
|
33
|
+
TableRow,
|
|
34
|
+
} from '../../../../shadcn/ui/table';
|
|
23
35
|
import { FormBuilder, type FormBuilderSectionConfig } from '../../form';
|
|
24
|
-
import type {
|
|
36
|
+
import type {
|
|
37
|
+
DataTableAction,
|
|
38
|
+
DataTableBatchAction,
|
|
39
|
+
DataTableFiltersProp,
|
|
40
|
+
} from '../types';
|
|
25
41
|
import { DataTablePagination } from './DataTablePagination';
|
|
26
42
|
import { DataTableViewOptions } from './DataTableViewOptions';
|
|
27
43
|
|
|
@@ -39,6 +55,7 @@ export interface DataTableProps<TData, TValue> {
|
|
|
39
55
|
rowCount?: number;
|
|
40
56
|
pagination?: boolean;
|
|
41
57
|
paginationState?: PaginationState;
|
|
58
|
+
paginationVariant?: 'full' | 'compact';
|
|
42
59
|
onPaginationChange?: (newState: PaginationState) => void;
|
|
43
60
|
columnVisibility?: boolean;
|
|
44
61
|
columnVisibilityState?: VisibilityState;
|
|
@@ -79,6 +96,7 @@ export function DataTable<TData, TValue>({
|
|
|
79
96
|
onColumnFiltersChange,
|
|
80
97
|
rowCount,
|
|
81
98
|
pagination,
|
|
99
|
+
paginationVariant = 'full',
|
|
82
100
|
onPaginationChange,
|
|
83
101
|
paginationState,
|
|
84
102
|
columnVisibility,
|
|
@@ -100,51 +118,68 @@ export function DataTable<TData, TValue>({
|
|
|
100
118
|
filterTitle,
|
|
101
119
|
filterShowActionsSeparator,
|
|
102
120
|
}: DataTableProps<TData, TValue>) {
|
|
103
|
-
const [rowSelection, setRowSelection] = React.useState<
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const [
|
|
107
|
-
|
|
121
|
+
const [rowSelection, setRowSelection] = React.useState<
|
|
122
|
+
Record<string, boolean>
|
|
123
|
+
>({});
|
|
124
|
+
const [internalSortingState, setInternalSortingState] =
|
|
125
|
+
React.useState<SortingState>([]);
|
|
126
|
+
const [internalFiltersState, setInternalFiltersState] =
|
|
127
|
+
React.useState<ColumnFiltersState>([]);
|
|
128
|
+
const [internalPaginationState, setInternalPaginationState] =
|
|
129
|
+
React.useState<PaginationState>({ pageIndex: 0, pageSize: 10 });
|
|
130
|
+
const [internalVisibilityState, setInternalVisibilityState] =
|
|
131
|
+
React.useState<VisibilityState>({});
|
|
108
132
|
|
|
109
133
|
const effectiveSortingState = sortingState ?? internalSortingState;
|
|
110
134
|
const effectiveFiltersState = columnFiltersState ?? internalFiltersState;
|
|
111
|
-
const effectiveVisibilityState =
|
|
135
|
+
const effectiveVisibilityState =
|
|
136
|
+
columnVisibilityState ?? internalVisibilityState;
|
|
112
137
|
const effectivePaginationState = paginationState ?? internalPaginationState;
|
|
113
138
|
|
|
114
139
|
const isPaginationEnabled = pagination;
|
|
115
|
-
const isManualPaginationEnabled =
|
|
140
|
+
const isManualPaginationEnabled =
|
|
141
|
+
paginationState !== undefined && onPaginationChange !== undefined;
|
|
116
142
|
const isSortingEnabled = sorting;
|
|
117
143
|
const isColumnFiltersEnabled = columnFilters;
|
|
118
144
|
const isColumnVisibilityEnabled = columnVisibility;
|
|
119
145
|
|
|
120
146
|
// Build selection-aware columns by injecting a selection column at the start
|
|
121
|
-
const selectionColumn = React.useMemo<ColumnDef<TData, unknown>>(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
147
|
+
const selectionColumn = React.useMemo<ColumnDef<TData, unknown>>(
|
|
148
|
+
() => ({
|
|
149
|
+
id: '__select',
|
|
150
|
+
header: ({ table }) => (
|
|
151
|
+
<Checkbox
|
|
152
|
+
checked={
|
|
153
|
+
table.getIsAllPageRowsSelected() ||
|
|
154
|
+
(table.getIsSomePageRowsSelected() && 'indeterminate')
|
|
155
|
+
}
|
|
156
|
+
onCheckedChange={(val) => table.toggleAllPageRowsSelected(!!val)}
|
|
157
|
+
aria-label="Select all"
|
|
158
|
+
/>
|
|
159
|
+
),
|
|
160
|
+
cell: ({ row }) => (
|
|
161
|
+
<Checkbox
|
|
162
|
+
checked={row.getIsSelected()}
|
|
163
|
+
onCheckedChange={(val) => row.toggleSelected(!!val)}
|
|
164
|
+
aria-label="Select row"
|
|
165
|
+
onClick={(e) => e.stopPropagation()}
|
|
166
|
+
/>
|
|
167
|
+
),
|
|
168
|
+
enableSorting: false,
|
|
169
|
+
enableHiding: false,
|
|
170
|
+
size: 32,
|
|
171
|
+
minSize: 32,
|
|
172
|
+
maxSize: 32,
|
|
173
|
+
}),
|
|
174
|
+
[],
|
|
175
|
+
);
|
|
144
176
|
|
|
145
177
|
const renderedColumns = React.useMemo(
|
|
146
|
-
() =>
|
|
147
|
-
|
|
178
|
+
() =>
|
|
179
|
+
selectable
|
|
180
|
+
? [selectionColumn as unknown as ColumnDef<TData, TValue>, ...columns]
|
|
181
|
+
: columns,
|
|
182
|
+
[selectable, selectionColumn, columns],
|
|
148
183
|
);
|
|
149
184
|
|
|
150
185
|
const table = useReactTable({
|
|
@@ -166,23 +201,49 @@ export function DataTable<TData, TValue>({
|
|
|
166
201
|
manualPagination: isManualPaginationEnabled,
|
|
167
202
|
enableSorting: isSortingEnabled,
|
|
168
203
|
enableColumnFilters: isColumnFiltersEnabled,
|
|
169
|
-
onSortingChange: isSortingEnabled
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
204
|
+
onSortingChange: isSortingEnabled
|
|
205
|
+
? (updater) => {
|
|
206
|
+
const next =
|
|
207
|
+
typeof updater === 'function'
|
|
208
|
+
? (updater as (old: SortingState) => SortingState)(
|
|
209
|
+
effectiveSortingState,
|
|
210
|
+
)
|
|
211
|
+
: updater;
|
|
212
|
+
setInternalSortingState(next);
|
|
213
|
+
onSortingChange?.(next);
|
|
214
|
+
}
|
|
215
|
+
: undefined,
|
|
216
|
+
onColumnFiltersChange: isColumnFiltersEnabled
|
|
217
|
+
? (updater) => {
|
|
218
|
+
const next =
|
|
219
|
+
typeof updater === 'function'
|
|
220
|
+
? (updater as (old: ColumnFiltersState) => ColumnFiltersState)(
|
|
221
|
+
effectiveFiltersState,
|
|
222
|
+
)
|
|
223
|
+
: updater;
|
|
224
|
+
setInternalFiltersState(next);
|
|
225
|
+
onColumnFiltersChange?.(next);
|
|
226
|
+
}
|
|
227
|
+
: undefined,
|
|
228
|
+
onPaginationChange: isPaginationEnabled
|
|
229
|
+
? (updater) => {
|
|
230
|
+
const next =
|
|
231
|
+
typeof updater === 'function'
|
|
232
|
+
? (updater as (old: PaginationState) => PaginationState)(
|
|
233
|
+
effectivePaginationState,
|
|
234
|
+
)
|
|
235
|
+
: updater;
|
|
236
|
+
setInternalPaginationState(next);
|
|
237
|
+
onPaginationChange?.(next);
|
|
238
|
+
}
|
|
239
|
+
: undefined,
|
|
240
|
+
onColumnVisibilityChange: (updater) => {
|
|
241
|
+
const next =
|
|
242
|
+
typeof updater === 'function'
|
|
243
|
+
? (updater as (old: VisibilityState) => VisibilityState)(
|
|
244
|
+
effectiveVisibilityState,
|
|
245
|
+
)
|
|
246
|
+
: updater;
|
|
186
247
|
setInternalVisibilityState(next);
|
|
187
248
|
onColumnVisibilityChange?.(next);
|
|
188
249
|
},
|
|
@@ -198,16 +259,25 @@ export function DataTable<TData, TValue>({
|
|
|
198
259
|
}, [onTable, table]);
|
|
199
260
|
|
|
200
261
|
// Selected rows convenience
|
|
201
|
-
const selectedRows = table
|
|
262
|
+
const selectedRows = table
|
|
263
|
+
.getSelectedRowModel()
|
|
264
|
+
.rows.map((r) => r.original as TData);
|
|
202
265
|
|
|
203
266
|
// Safe action arrays to avoid array literal defaults in props
|
|
204
267
|
const safeActions = React.useMemo(() => actions ?? [], [actions]);
|
|
205
|
-
const safeBatchActions = React.useMemo(
|
|
268
|
+
const safeBatchActions = React.useMemo(
|
|
269
|
+
() => batchActions ?? [],
|
|
270
|
+
[batchActions],
|
|
271
|
+
);
|
|
206
272
|
|
|
207
273
|
// Skeleton row keys (avoid using array index as key)
|
|
208
274
|
const skeletonRowKeys = React.useMemo(
|
|
209
|
-
() =>
|
|
210
|
-
|
|
275
|
+
() =>
|
|
276
|
+
Array.from(
|
|
277
|
+
{ length: Math.max(3, effectivePaginationState.pageSize ?? 10) },
|
|
278
|
+
() => Math.random().toString(36).slice(2),
|
|
279
|
+
),
|
|
280
|
+
[effectivePaginationState.pageSize],
|
|
211
281
|
);
|
|
212
282
|
|
|
213
283
|
// Standard actions state
|
|
@@ -218,10 +288,17 @@ export function DataTable<TData, TValue>({
|
|
|
218
288
|
|
|
219
289
|
// Render a button from action definition
|
|
220
290
|
const renderActionButton = (action: DataTableAction, key: React.Key) => {
|
|
221
|
-
if (action.element)
|
|
291
|
+
if (action.element)
|
|
292
|
+
return <React.Fragment key={key}>{action.element}</React.Fragment>;
|
|
222
293
|
const content = (
|
|
223
294
|
<div className="flex items-center gap-x-2">
|
|
224
|
-
{action.icon &&
|
|
295
|
+
{action.icon && (
|
|
296
|
+
<span
|
|
297
|
+
className={cn(action.iconPosition === 'right' ? 'order-last' : '')}
|
|
298
|
+
>
|
|
299
|
+
{action.icon}
|
|
300
|
+
</span>
|
|
301
|
+
)}
|
|
225
302
|
{action.label}
|
|
226
303
|
</div>
|
|
227
304
|
);
|
|
@@ -239,12 +316,26 @@ export function DataTable<TData, TValue>({
|
|
|
239
316
|
);
|
|
240
317
|
};
|
|
241
318
|
|
|
242
|
-
const renderBatchButton = (
|
|
243
|
-
|
|
244
|
-
|
|
319
|
+
const renderBatchButton = (
|
|
320
|
+
action: DataTableBatchAction<TData>,
|
|
321
|
+
key: React.Key,
|
|
322
|
+
) => {
|
|
323
|
+
if (action.element)
|
|
324
|
+
return <React.Fragment key={key}>{action.element}</React.Fragment>;
|
|
325
|
+
const onClick = () =>
|
|
326
|
+
action.onClick?.({
|
|
327
|
+
selectedRows,
|
|
328
|
+
clearSelection: () => table.resetRowSelection(),
|
|
329
|
+
});
|
|
245
330
|
const content = (
|
|
246
331
|
<div className="flex items-center gap-x-2">
|
|
247
|
-
{action.icon &&
|
|
332
|
+
{action.icon && (
|
|
333
|
+
<span
|
|
334
|
+
className={cn(action.iconPosition === 'right' ? 'order-last' : '')}
|
|
335
|
+
>
|
|
336
|
+
{action.icon}
|
|
337
|
+
</span>
|
|
338
|
+
)}
|
|
248
339
|
{action.label}
|
|
249
340
|
</div>
|
|
250
341
|
);
|
|
@@ -268,18 +359,27 @@ export function DataTable<TData, TValue>({
|
|
|
268
359
|
|
|
269
360
|
return (
|
|
270
361
|
<div className={cn('space-y-3', className)}>
|
|
271
|
-
{formFilters
|
|
362
|
+
{formFilters?.length ? (
|
|
272
363
|
effectiveFilterWrapper === 'accordion' ? (
|
|
273
364
|
<div className="rounded-md border border-border">
|
|
274
|
-
<Accordion
|
|
365
|
+
<Accordion
|
|
366
|
+
type="single"
|
|
367
|
+
collapsible
|
|
368
|
+
className="w-full"
|
|
369
|
+
defaultValue="filters"
|
|
370
|
+
>
|
|
275
371
|
<AccordionItem value="filters">
|
|
276
|
-
<AccordionTrigger className="px-4 py-3 border-b border-border text-md">
|
|
372
|
+
<AccordionTrigger className="px-4 py-3 border-b border-border text-md">
|
|
373
|
+
{effectiveFilterTitle}
|
|
374
|
+
</AccordionTrigger>
|
|
277
375
|
<AccordionContent className="px-4 pb-4 pt-5">
|
|
278
376
|
<FormBuilder
|
|
279
377
|
key={JSON.stringify(formFilterValues ?? {})}
|
|
280
378
|
sections={formFilters as FormBuilderSectionConfig[]}
|
|
281
379
|
defaultValues={formFilterValues}
|
|
282
|
-
onSubmit={data =>
|
|
380
|
+
onSubmit={(data) =>
|
|
381
|
+
onFormFilterChange?.(data as Record<string, unknown>)
|
|
382
|
+
}
|
|
283
383
|
onReset={() => onFormFilterChange?.({})}
|
|
284
384
|
showActions
|
|
285
385
|
submitLabel="Apply"
|
|
@@ -296,7 +396,9 @@ export function DataTable<TData, TValue>({
|
|
|
296
396
|
key={JSON.stringify(formFilterValues ?? {})}
|
|
297
397
|
sections={formFilters as FormBuilderSectionConfig[]}
|
|
298
398
|
defaultValues={formFilterValues}
|
|
299
|
-
onSubmit={data =>
|
|
399
|
+
onSubmit={(data) =>
|
|
400
|
+
onFormFilterChange?.(data as Record<string, unknown>)
|
|
401
|
+
}
|
|
300
402
|
onReset={() => onFormFilterChange?.({})}
|
|
301
403
|
showActions
|
|
302
404
|
submitLabel="Apply"
|
|
@@ -309,7 +411,9 @@ export function DataTable<TData, TValue>({
|
|
|
309
411
|
key={JSON.stringify(formFilterValues ?? {})}
|
|
310
412
|
sections={formFilters as FormBuilderSectionConfig[]}
|
|
311
413
|
defaultValues={formFilterValues}
|
|
312
|
-
onSubmit={data =>
|
|
414
|
+
onSubmit={(data) =>
|
|
415
|
+
onFormFilterChange?.(data as Record<string, unknown>)
|
|
416
|
+
}
|
|
313
417
|
onReset={() => onFormFilterChange?.({})}
|
|
314
418
|
showActions
|
|
315
419
|
submitLabel="Apply"
|
|
@@ -319,11 +423,17 @@ export function DataTable<TData, TValue>({
|
|
|
319
423
|
)
|
|
320
424
|
) : null}
|
|
321
425
|
{/* Actions Bar */}
|
|
322
|
-
{(safeActions.length ||
|
|
426
|
+
{(safeActions.length ||
|
|
427
|
+
showStandardActions ||
|
|
428
|
+
(selectable &&
|
|
429
|
+
table.getSelectedRowModel().rows.length > 0 &&
|
|
430
|
+
safeBatchActions.length)) && (
|
|
323
431
|
<div className="rounded-md p-2 mt-6">
|
|
324
432
|
<div className="flex items-center justify-between">
|
|
325
433
|
<div className="flex items-center gap-2">
|
|
326
|
-
{selectable &&
|
|
434
|
+
{selectable &&
|
|
435
|
+
table.getSelectedRowModel().rows.length > 0 &&
|
|
436
|
+
safeBatchActions.map((a) => renderBatchButton(a, a.key))}
|
|
327
437
|
</div>
|
|
328
438
|
<div className="flex items-center gap-2">
|
|
329
439
|
{showStandardActions && onRefresh && (
|
|
@@ -335,7 +445,10 @@ export function DataTable<TData, TValue>({
|
|
|
335
445
|
className="h-8"
|
|
336
446
|
title="Refresh"
|
|
337
447
|
>
|
|
338
|
-
<RefreshCw
|
|
448
|
+
<RefreshCw
|
|
449
|
+
className={cn('h-4 w-4', loading && 'animate-spin')}
|
|
450
|
+
/>{' '}
|
|
451
|
+
Refresh
|
|
339
452
|
</Button>
|
|
340
453
|
)}
|
|
341
454
|
{isColumnVisibilityEnabled ? (
|
|
@@ -346,7 +459,10 @@ export function DataTable<TData, TValue>({
|
|
|
346
459
|
</div>
|
|
347
460
|
</div>
|
|
348
461
|
)}
|
|
349
|
-
<div
|
|
462
|
+
<div
|
|
463
|
+
className="relative overflow-hidden rounded-md border border-border"
|
|
464
|
+
aria-busy={loading || undefined}
|
|
465
|
+
>
|
|
350
466
|
{loading && (
|
|
351
467
|
<div className="pointer-events-none absolute inset-0 z-10 flex items-start justify-end p-2">
|
|
352
468
|
<span className="inline-flex items-center gap-2 rounded bg-background/80 px-2 py-1 text-xs shadow-sm ring-1 ring-border">
|
|
@@ -356,13 +472,16 @@ export function DataTable<TData, TValue>({
|
|
|
356
472
|
)}
|
|
357
473
|
<Table>
|
|
358
474
|
<TableHeader>
|
|
359
|
-
{table.getHeaderGroups().map(headerGroup => (
|
|
475
|
+
{table.getHeaderGroups().map((headerGroup) => (
|
|
360
476
|
<TableRow key={headerGroup.id}>
|
|
361
|
-
{headerGroup.headers.map(header => (
|
|
477
|
+
{headerGroup.headers.map((header) => (
|
|
362
478
|
<TableHead key={header.id}>
|
|
363
479
|
{header.isPlaceholder
|
|
364
480
|
? null
|
|
365
|
-
: flexRender(
|
|
481
|
+
: flexRender(
|
|
482
|
+
header.column.columnDef.header,
|
|
483
|
+
header.getContext(),
|
|
484
|
+
)}
|
|
366
485
|
</TableHead>
|
|
367
486
|
))}
|
|
368
487
|
</TableRow>
|
|
@@ -380,23 +499,35 @@ export function DataTable<TData, TValue>({
|
|
|
380
499
|
</TableRow>
|
|
381
500
|
))
|
|
382
501
|
) : table.getRowModel().rows?.length ? (
|
|
383
|
-
table.getRowModel().rows.map(row => (
|
|
502
|
+
table.getRowModel().rows.map((row) => (
|
|
384
503
|
<TableRow
|
|
385
504
|
key={row.id}
|
|
386
505
|
data-state={row.getIsSelected() && 'selected'}
|
|
387
|
-
className={cn(
|
|
388
|
-
|
|
506
|
+
className={cn(
|
|
507
|
+
onRowClick && 'cursor-pointer hover:bg-muted/50',
|
|
508
|
+
)}
|
|
509
|
+
onClick={
|
|
510
|
+
onRowClick
|
|
511
|
+
? () => onRowClick(row.original as TData)
|
|
512
|
+
: undefined
|
|
513
|
+
}
|
|
389
514
|
>
|
|
390
|
-
{row.getVisibleCells().map(cell => (
|
|
515
|
+
{row.getVisibleCells().map((cell) => (
|
|
391
516
|
<TableCell key={cell.id}>
|
|
392
|
-
{flexRender(
|
|
517
|
+
{flexRender(
|
|
518
|
+
cell.column.columnDef.cell,
|
|
519
|
+
cell.getContext(),
|
|
520
|
+
)}
|
|
393
521
|
</TableCell>
|
|
394
522
|
))}
|
|
395
523
|
</TableRow>
|
|
396
524
|
))
|
|
397
525
|
) : (
|
|
398
526
|
<TableRow>
|
|
399
|
-
<TableCell
|
|
527
|
+
<TableCell
|
|
528
|
+
colSpan={table.getVisibleLeafColumns().length}
|
|
529
|
+
className="h-24 text-center"
|
|
530
|
+
>
|
|
400
531
|
{emptyText}
|
|
401
532
|
</TableCell>
|
|
402
533
|
</TableRow>
|
|
@@ -406,7 +537,10 @@ export function DataTable<TData, TValue>({
|
|
|
406
537
|
</div>
|
|
407
538
|
|
|
408
539
|
{isPaginationEnabled && (
|
|
409
|
-
<DataTablePagination
|
|
540
|
+
<DataTablePagination
|
|
541
|
+
table={table}
|
|
542
|
+
paginationVariant={paginationVariant}
|
|
543
|
+
/>
|
|
410
544
|
)}
|
|
411
545
|
</div>
|
|
412
546
|
);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { type Column } from '@tanstack/react-table';
|
|
1
|
+
import type { Column } from '@tanstack/react-table';
|
|
3
2
|
import { ArrowDown, ArrowUp, ChevronsUpDown, EyeOff } from 'lucide-react';
|
|
4
3
|
import { cn } from '../../../../shadcn/lib/utils';
|
|
5
4
|
import { Button } from '../../../../shadcn/ui/button';
|
|
@@ -10,9 +9,10 @@ import {
|
|
|
10
9
|
DropdownMenuSeparator,
|
|
11
10
|
DropdownMenuTrigger,
|
|
12
11
|
} from '../../../../shadcn/ui/dropdown-menu';
|
|
12
|
+
import type { HTMLAttributes } from 'react';
|
|
13
13
|
|
|
14
14
|
export interface DataTableColumnHeaderProps<TData, TValue>
|
|
15
|
-
extends
|
|
15
|
+
extends HTMLAttributes<HTMLDivElement> {
|
|
16
16
|
column: Column<TData, TValue>;
|
|
17
17
|
label?: string;
|
|
18
18
|
}
|
|
@@ -23,7 +23,7 @@ export function DataTableColumnHeader<TData, TValue>({
|
|
|
23
23
|
className,
|
|
24
24
|
}: DataTableColumnHeaderProps<TData, TValue>) {
|
|
25
25
|
label = (column.columnDef.meta as { label?: string })?.label ?? label;
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
if (!column.getCanSort()) {
|
|
28
28
|
return <div className={cn(className)}>{label}</div>;
|
|
29
29
|
}
|
|
@@ -32,7 +32,11 @@ export function DataTableColumnHeader<TData, TValue>({
|
|
|
32
32
|
<div className={cn('flex items-center gap-2', className)}>
|
|
33
33
|
<DropdownMenu>
|
|
34
34
|
<DropdownMenuTrigger asChild>
|
|
35
|
-
<Button
|
|
35
|
+
<Button
|
|
36
|
+
variant="ghost"
|
|
37
|
+
size="sm"
|
|
38
|
+
className="data-[state=open]:bg-accent -ml-3 h-8"
|
|
39
|
+
>
|
|
36
40
|
<span>{label}</span>
|
|
37
41
|
{column.getIsSorted() === 'desc' ? (
|
|
38
42
|
<ArrowDown className="ml-2 size-4" />
|
|
@@ -1,40 +1,62 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { Table } from '@tanstack/react-table';
|
|
2
|
+
import {
|
|
3
|
+
ChevronLeft,
|
|
4
|
+
ChevronRight,
|
|
5
|
+
ChevronsLeft,
|
|
6
|
+
ChevronsRight,
|
|
7
|
+
} from 'lucide-react';
|
|
3
8
|
import { Button } from '../../../../shadcn/ui/button';
|
|
4
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
Select,
|
|
11
|
+
SelectContent,
|
|
12
|
+
SelectItem,
|
|
13
|
+
SelectTrigger,
|
|
14
|
+
SelectValue,
|
|
15
|
+
} from '../../../../shadcn/ui/select';
|
|
5
16
|
|
|
6
17
|
export interface DataTablePaginationProps<TData> {
|
|
7
18
|
table: Table<TData>;
|
|
19
|
+
paginationVariant?: 'full' | 'compact';
|
|
8
20
|
}
|
|
9
21
|
|
|
10
|
-
export function DataTablePagination<TData>({
|
|
11
|
-
|
|
22
|
+
export function DataTablePagination<TData>({
|
|
23
|
+
table,
|
|
24
|
+
paginationVariant = 'full',
|
|
25
|
+
}: DataTablePaginationProps<TData>) {
|
|
26
|
+
const pagination = table.getState().pagination ?? {
|
|
27
|
+
pageIndex: 0,
|
|
28
|
+
pageSize: 10,
|
|
29
|
+
};
|
|
12
30
|
|
|
13
31
|
return (
|
|
14
32
|
<div className="flex items-center justify-between px-2">
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
<div className="flex items-center space-x-6 lg:space-x-8">
|
|
20
|
-
<div className="flex items-center space-x-2">
|
|
21
|
-
<p className="text-sm font-medium">Rows per page</p>
|
|
22
|
-
<Select
|
|
23
|
-
value={`${pagination.pageSize}`}
|
|
24
|
-
onValueChange={(value) => table.setPageSize(Number(value))}
|
|
25
|
-
>
|
|
26
|
-
<SelectTrigger className="h-8 w-[70px]">
|
|
27
|
-
<SelectValue placeholder={pagination.pageSize} />
|
|
28
|
-
</SelectTrigger>
|
|
29
|
-
<SelectContent side="top">
|
|
30
|
-
{[10, 20, 25, 30, 40, 50].map((pageSize) => (
|
|
31
|
-
<SelectItem key={pageSize} value={`${pageSize}`}>
|
|
32
|
-
{pageSize}
|
|
33
|
-
</SelectItem>
|
|
34
|
-
))}
|
|
35
|
-
</SelectContent>
|
|
36
|
-
</Select>
|
|
33
|
+
{paginationVariant === 'full' && (
|
|
34
|
+
<div className="text-muted-foreground flex-1 text-sm">
|
|
35
|
+
{table.getFilteredSelectedRowModel().rows.length} of{' '}
|
|
36
|
+
{table.getFilteredRowModel().rows.length} row(s) selected.
|
|
37
37
|
</div>
|
|
38
|
+
)}
|
|
39
|
+
<div className="flex items-center space-x-6 lg:space-x-8">
|
|
40
|
+
{paginationVariant === 'full' && (
|
|
41
|
+
<div className="flex items-center space-x-2">
|
|
42
|
+
<p className="text-sm font-medium">Rows per page</p>
|
|
43
|
+
<Select
|
|
44
|
+
value={`${pagination.pageSize}`}
|
|
45
|
+
onValueChange={(value) => table.setPageSize(Number(value))}
|
|
46
|
+
>
|
|
47
|
+
<SelectTrigger className="h-8 w-[70px]">
|
|
48
|
+
<SelectValue placeholder={pagination.pageSize} />
|
|
49
|
+
</SelectTrigger>
|
|
50
|
+
<SelectContent side="top">
|
|
51
|
+
{[10, 20, 25, 30, 40, 50].map((pageSize) => (
|
|
52
|
+
<SelectItem key={pageSize} value={`${pageSize}`}>
|
|
53
|
+
{pageSize}
|
|
54
|
+
</SelectItem>
|
|
55
|
+
))}
|
|
56
|
+
</SelectContent>
|
|
57
|
+
</Select>
|
|
58
|
+
</div>
|
|
59
|
+
)}
|
|
38
60
|
<div className="flex w-[100px] items-center justify-center text-sm font-medium">
|
|
39
61
|
Page {pagination.pageIndex + 1} of {table.getPageCount()}
|
|
40
62
|
</div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Table } from '@tanstack/react-table';
|
|
2
2
|
import { Settings2 } from 'lucide-react';
|
|
3
3
|
import { Button } from '../../../../shadcn/ui/button';
|
|
4
4
|
import {
|
|
@@ -10,11 +10,19 @@ import {
|
|
|
10
10
|
DropdownMenuTrigger,
|
|
11
11
|
} from '../../../../shadcn/ui/dropdown-menu';
|
|
12
12
|
|
|
13
|
-
export function DataTableViewOptions<TData>({
|
|
13
|
+
export function DataTableViewOptions<TData>({
|
|
14
|
+
table,
|
|
15
|
+
}: {
|
|
16
|
+
table: Table<TData>;
|
|
17
|
+
}) {
|
|
14
18
|
return (
|
|
15
19
|
<DropdownMenu>
|
|
16
20
|
<DropdownMenuTrigger asChild>
|
|
17
|
-
<Button
|
|
21
|
+
<Button
|
|
22
|
+
variant="outline"
|
|
23
|
+
size="sm"
|
|
24
|
+
className="ml-auto hidden h-8 lg:flex"
|
|
25
|
+
>
|
|
18
26
|
<Settings2 className="mr-2 size-4" /> View
|
|
19
27
|
</Button>
|
|
20
28
|
</DropdownMenuTrigger>
|
|
@@ -32,7 +40,8 @@ export function DataTableViewOptions<TData>({ table }: { table: Table<TData> })
|
|
|
32
40
|
checked={column.getIsVisible()}
|
|
33
41
|
onCheckedChange={(value) => column.toggleVisibility(!!value)}
|
|
34
42
|
>
|
|
35
|
-
{(column?.columnDef.meta as { label?: string })?.label ??
|
|
43
|
+
{(column?.columnDef.meta as { label?: string })?.label ??
|
|
44
|
+
column.id}
|
|
36
45
|
</DropdownMenuCheckboxItem>
|
|
37
46
|
);
|
|
38
47
|
})}
|
|
@@ -9,7 +9,13 @@ export interface DataTableAction {
|
|
|
9
9
|
label?: React.ReactNode; // string or component
|
|
10
10
|
icon?: React.ReactNode;
|
|
11
11
|
iconPosition?: IconPosition;
|
|
12
|
-
variant?:
|
|
12
|
+
variant?:
|
|
13
|
+
| 'default'
|
|
14
|
+
| 'destructive'
|
|
15
|
+
| 'outline'
|
|
16
|
+
| 'secondary'
|
|
17
|
+
| 'ghost'
|
|
18
|
+
| 'link';
|
|
13
19
|
disabled?: boolean;
|
|
14
20
|
onClick?: () => void | Promise<void>;
|
|
15
21
|
// If provided, this element will be rendered directly instead of constructing a Button
|
|
@@ -21,9 +27,18 @@ export interface DataTableBatchAction<TData = unknown> {
|
|
|
21
27
|
label?: React.ReactNode;
|
|
22
28
|
icon?: React.ReactNode;
|
|
23
29
|
iconPosition?: IconPosition;
|
|
24
|
-
variant?:
|
|
30
|
+
variant?:
|
|
31
|
+
| 'default'
|
|
32
|
+
| 'destructive'
|
|
33
|
+
| 'outline'
|
|
34
|
+
| 'secondary'
|
|
35
|
+
| 'ghost'
|
|
36
|
+
| 'link';
|
|
25
37
|
disabled?: boolean;
|
|
26
38
|
// Receives selected rows and helpers
|
|
27
|
-
onClick?: (args: {
|
|
39
|
+
onClick?: (args: {
|
|
40
|
+
selectedRows: TData[];
|
|
41
|
+
clearSelection: () => void;
|
|
42
|
+
}) => void | Promise<void>;
|
|
28
43
|
element?: React.ReactNode;
|
|
29
44
|
}
|