@simplysm/solid 13.0.69 → 13.0.70
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 +168 -195
- package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
- package/dist/components/data/calendar/Calendar.js +15 -2
- package/dist/components/data/calendar/Calendar.js.map +2 -2
- package/dist/components/data/kanban/KanbanContext.js +2 -2
- package/dist/components/data/kanban/KanbanContext.js.map +1 -1
- package/dist/components/data/list/List.d.ts +8 -8
- package/dist/components/data/list/ListContext.d.ts +1 -1
- package/dist/components/data/list/ListItem.d.ts +15 -15
- package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.js +6 -4
- package/dist/components/data/sheet/DataSheet.js.map +2 -2
- package/dist/components/data/sheet/DataSheetConfigDialog.js +8 -8
- package/dist/components/data/sheet/DataSheetConfigDialog.js.map +1 -1
- package/dist/components/data/sheet/types.d.ts +4 -4
- package/dist/components/data/sheet/types.d.ts.map +1 -1
- package/dist/components/disclosure/Collapse.d.ts +4 -4
- package/dist/components/disclosure/Dialog.d.ts +24 -24
- package/dist/components/disclosure/Dialog.d.ts.map +1 -1
- package/dist/components/disclosure/Dialog.js +7 -2
- package/dist/components/disclosure/Dialog.js.map +2 -2
- package/dist/components/disclosure/DialogContext.d.ts +25 -25
- package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogContext.js +1 -1
- package/dist/components/disclosure/DialogContext.js.map +1 -1
- package/dist/components/disclosure/DialogInstanceContext.d.ts +7 -7
- package/dist/components/disclosure/DialogInstanceContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogProvider.d.ts +3 -3
- package/dist/components/disclosure/Dropdown.d.ts +24 -24
- package/dist/components/disclosure/Tabs.js +1 -1
- package/dist/components/disclosure/Tabs.js.map +1 -1
- package/dist/components/disclosure/dialogZIndex.d.ts +7 -7
- package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.js +19 -16
- package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
- package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
- package/dist/components/features/crud-sheet/CrudSheet.js +34 -28
- package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
- package/dist/components/features/data-select-button/DataSelectButton.d.ts +14 -14
- package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
- package/dist/components/features/data-select-button/DataSelectButton.js +27 -9
- package/dist/components/features/data-select-button/DataSelectButton.js.map +2 -2
- package/dist/components/features/permission-table/PermissionTable.d.ts +3 -3
- package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
- package/dist/components/features/permission-table/PermissionTable.js +6 -2
- package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelect.d.ts +12 -12
- package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelect.js +8 -2
- package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +10 -10
- package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts +23 -13
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js +219 -58
- package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts +15 -0
- package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts.map +1 -0
- package/dist/components/features/shared-data/SharedDataSelectListContext.js +27 -0
- package/dist/components/features/shared-data/SharedDataSelectListContext.js.map +6 -0
- package/dist/components/feedback/Progress.d.ts +1 -1
- package/dist/components/feedback/Progress.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContainer.d.ts +2 -2
- package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContext.d.ts +11 -11
- package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContext.js +1 -1
- package/dist/components/feedback/busy/BusyContext.js.map +1 -1
- package/dist/components/feedback/busy/BusyProvider.d.ts +6 -6
- package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBanner.js +7 -3
- package/dist/components/feedback/notification/NotificationBanner.js.map +2 -2
- package/dist/components/feedback/notification/NotificationBell.js +2 -2
- package/dist/components/feedback/notification/NotificationBell.js.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.d.ts +22 -22
- package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.js +1 -1
- package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
- package/dist/components/feedback/notification/NotificationProvider.d.ts +5 -5
- package/dist/components/feedback/notification/NotificationProvider.js +1 -1
- package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
- package/dist/components/feedback/print/PrintContext.js +1 -1
- package/dist/components/feedback/print/PrintContext.js.map +1 -1
- package/dist/components/form-control/DropdownTrigger.styles.d.ts +1 -1
- package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
- package/dist/components/form-control/ThemeToggle.d.ts +7 -7
- package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
- package/dist/components/form-control/ThemeToggle.js +3 -3
- package/dist/components/form-control/checkbox/Checkbox.js +1 -1
- package/dist/components/form-control/checkbox/CheckboxGroup.js +1 -1
- package/dist/components/form-control/checkbox/Radio.js +1 -1
- package/dist/components/form-control/checkbox/RadioGroup.js +1 -1
- package/dist/components/form-control/color-picker/ColorPicker.d.ts +12 -12
- package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/components/form-control/color-picker/ColorPicker.js +2 -2
- package/dist/components/form-control/combobox/Combobox.d.ts +22 -22
- package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/form-control/combobox/Combobox.js +2 -2
- package/dist/components/form-control/combobox/ComboboxContext.d.ts +4 -4
- package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
- package/dist/components/form-control/combobox/ComboboxContext.js +1 -1
- package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
- package/dist/components/form-control/combobox/ComboboxItem.d.ts +3 -3
- package/dist/components/form-control/combobox/ComboboxItem.d.ts.map +1 -1
- package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +14 -14
- package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/form-control/date-range-picker/DateRangePicker.js +20 -9
- package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
- package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
- package/dist/components/form-control/editor/EditorToolbar.js +65 -20
- package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
- package/dist/components/form-control/editor/RichTextEditor.d.ts +6 -6
- package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
- package/dist/components/form-control/editor/RichTextEditor.js +1 -1
- package/dist/components/form-control/editor/editor.css +5 -5
- package/dist/components/form-control/field/DatePicker.d.ts +22 -22
- package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DatePicker.js +4 -4
- package/dist/components/form-control/field/DatePicker.js.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.d.ts +21 -21
- package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.js +4 -4
- package/dist/components/form-control/field/DateTimePicker.js.map +1 -1
- package/dist/components/form-control/field/FieldPlaceholder.d.ts +1 -1
- package/dist/components/form-control/field/FieldPlaceholder.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.d.ts +23 -23
- package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.js +4 -4
- package/dist/components/form-control/field/NumberInput.js.map +1 -1
- package/dist/components/form-control/field/TextInput.d.ts +25 -25
- package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
- package/dist/components/form-control/field/TextInput.js +5 -5
- package/dist/components/form-control/field/TextInput.js.map +1 -1
- package/dist/components/form-control/field/Textarea.d.ts +19 -19
- package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
- package/dist/components/form-control/field/Textarea.js +4 -4
- package/dist/components/form-control/field/Textarea.js.map +1 -1
- package/dist/components/form-control/field/TimePicker.d.ts +20 -20
- package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/TimePicker.js +4 -4
- package/dist/components/form-control/field/TimePicker.js.map +1 -1
- package/dist/components/form-control/numpad/Numpad.d.ts +11 -11
- package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.d.ts +26 -26
- package/dist/components/form-control/select/Select.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.js +34 -23
- package/dist/components/form-control/select/Select.js.map +2 -2
- package/dist/components/form-control/select/SelectContext.d.ts +7 -7
- package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
- package/dist/components/form-control/select/SelectContext.js +1 -1
- package/dist/components/form-control/select/SelectContext.js.map +1 -1
- package/dist/components/form-control/select/SelectItem.d.ts +4 -4
- package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
- package/dist/components/form-control/state-preset/StatePreset.js +8 -8
- package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
- package/dist/components/layout/FormTable.js +4 -4
- package/dist/components/layout/sidebar/Sidebar.d.ts +5 -5
- package/dist/components/layout/sidebar/SidebarContainer.d.ts +11 -11
- package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarContainer.js +6 -1
- package/dist/components/layout/sidebar/SidebarContainer.js.map +2 -2
- package/dist/components/layout/sidebar/SidebarContext.d.ts +7 -7
- package/dist/components/layout/sidebar/SidebarContext.js +1 -1
- package/dist/components/layout/sidebar/SidebarContext.js.map +1 -1
- package/dist/components/layout/sidebar/SidebarMenu.d.ts +11 -11
- package/dist/components/layout/sidebar/SidebarUser.d.ts +14 -14
- package/dist/components/layout/topbar/Topbar.d.ts +6 -6
- package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
- package/dist/components/layout/topbar/Topbar.js +11 -6
- package/dist/components/layout/topbar/Topbar.js.map +2 -2
- package/dist/components/layout/topbar/TopbarContainer.d.ts +6 -6
- package/dist/components/layout/topbar/TopbarContext.js +2 -2
- package/dist/components/layout/topbar/TopbarContext.js.map +1 -1
- package/dist/components/layout/topbar/TopbarMenu.d.ts +11 -11
- package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarMenu.js +5 -1
- package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
- package/dist/components/layout/topbar/TopbarUser.d.ts +9 -9
- package/dist/directives/ripple.d.ts +5 -5
- package/dist/helpers/createAppStructure.d.ts.map +1 -1
- package/dist/helpers/createAppStructure.js +4 -1
- package/dist/helpers/createAppStructure.js.map +1 -1
- package/dist/helpers/createSlotComponent.d.ts +3 -3
- package/dist/helpers/mergeStyles.d.ts +8 -8
- package/dist/hooks/createControllableSignal.d.ts +10 -10
- package/dist/hooks/createControllableStore.d.ts +6 -6
- package/dist/hooks/createIMEHandler.d.ts +7 -7
- package/dist/hooks/createMountTransition.d.ts +4 -4
- package/dist/hooks/createSelectionGroup.js +1 -1
- package/dist/hooks/createSelectionGroup.js.map +1 -1
- package/dist/hooks/createSlotSignal.d.ts +2 -2
- package/dist/hooks/useLocalStorage.d.ts +11 -11
- package/dist/hooks/useLogger.d.ts +1 -1
- package/dist/hooks/useLogger.d.ts.map +1 -1
- package/dist/hooks/useLogger.js +1 -1
- package/dist/hooks/useLogger.js.map +1 -1
- package/dist/hooks/useRouterLink.d.ts +10 -10
- package/dist/hooks/useRouterLink.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/ClipboardProvider.d.ts +5 -5
- package/dist/providers/ConfigContext.d.ts +6 -6
- package/dist/providers/ConfigContext.js +2 -2
- package/dist/providers/ConfigContext.js.map +1 -1
- package/dist/providers/ErrorLoggerProvider.d.ts +3 -3
- package/dist/providers/LoggerContext.d.ts +13 -13
- package/dist/providers/PwaUpdateProvider.d.ts +4 -4
- package/dist/providers/PwaUpdateProvider.js +2 -2
- package/dist/providers/PwaUpdateProvider.js.map +1 -1
- package/dist/providers/ServiceClientContext.d.ts +8 -8
- package/dist/providers/ServiceClientContext.d.ts.map +1 -1
- package/dist/providers/ServiceClientContext.js +1 -1
- package/dist/providers/ServiceClientContext.js.map +1 -1
- package/dist/providers/ServiceClientProvider.d.ts +6 -6
- package/dist/providers/ServiceClientProvider.js +7 -7
- package/dist/providers/ServiceClientProvider.js.map +1 -1
- package/dist/providers/SyncStorageContext.d.ts +14 -14
- package/dist/providers/SystemProvider.d.ts.map +1 -1
- package/dist/providers/SystemProvider.js +21 -16
- package/dist/providers/SystemProvider.js.map +2 -2
- package/dist/providers/ThemeContext.d.ts +20 -20
- package/dist/providers/ThemeContext.d.ts.map +1 -1
- package/dist/providers/ThemeContext.js +1 -1
- package/dist/providers/ThemeContext.js.map +1 -1
- package/dist/providers/i18n/I18nContext.d.ts +44 -0
- package/dist/providers/i18n/I18nContext.d.ts.map +1 -0
- package/dist/providers/i18n/I18nContext.js +73 -0
- package/dist/providers/i18n/I18nContext.js.map +6 -0
- package/dist/providers/i18n/I18nContext.types.d.ts +28 -0
- package/dist/providers/i18n/I18nContext.types.d.ts.map +1 -0
- package/dist/providers/i18n/I18nContext.types.js +1 -0
- package/dist/providers/i18n/I18nContext.types.js.map +6 -0
- package/dist/providers/i18n/i18nUtils.d.ts +18 -0
- package/dist/providers/i18n/i18nUtils.d.ts.map +1 -0
- package/dist/providers/i18n/i18nUtils.js +25 -0
- package/dist/providers/i18n/i18nUtils.js.map +6 -0
- package/dist/providers/i18n/locales/en.d.ts +163 -0
- package/dist/providers/i18n/locales/en.d.ts.map +1 -0
- package/dist/providers/i18n/locales/en.js +165 -0
- package/dist/providers/i18n/locales/en.js.map +6 -0
- package/dist/providers/i18n/locales/ko.d.ts +163 -0
- package/dist/providers/i18n/locales/ko.d.ts.map +1 -0
- package/dist/providers/i18n/locales/ko.js +165 -0
- package/dist/providers/i18n/locales/ko.js.map +6 -0
- package/dist/providers/shared-data/SharedDataChangeEvent.d.ts +4 -4
- package/dist/providers/shared-data/SharedDataContext.d.ts +28 -28
- package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataContext.js +1 -1
- package/dist/providers/shared-data/SharedDataContext.js.map +1 -1
- package/dist/providers/shared-data/SharedDataProvider.d.ts +9 -9
- package/dist/providers/shared-data/SharedDataProvider.js +4 -4
- package/dist/providers/shared-data/SharedDataProvider.js.map +1 -1
- package/package.json +8 -8
- package/src/components/data/calendar/Calendar.tsx +10 -4
- package/src/components/data/kanban/Kanban.tsx +14 -14
- package/src/components/data/kanban/KanbanContext.ts +3 -3
- package/src/components/data/list/List.tsx +10 -10
- package/src/components/data/list/ListContext.ts +1 -1
- package/src/components/data/list/ListItem.styles.ts +8 -8
- package/src/components/data/list/ListItem.tsx +15 -15
- package/src/components/data/sheet/DataSheet.styles.ts +22 -22
- package/src/components/data/sheet/DataSheet.tsx +52 -48
- package/src/components/data/sheet/DataSheetColumn.tsx +1 -1
- package/src/components/data/sheet/DataSheetConfigDialog.tsx +9 -9
- package/src/components/data/sheet/sheetUtils.ts +7 -7
- package/src/components/data/sheet/types.ts +16 -16
- package/src/components/disclosure/Collapse.tsx +11 -11
- package/src/components/disclosure/Dialog.tsx +60 -57
- package/src/components/disclosure/DialogContext.ts +26 -26
- package/src/components/disclosure/DialogInstanceContext.ts +7 -7
- package/src/components/disclosure/DialogProvider.tsx +5 -5
- package/src/components/disclosure/Dropdown.tsx +64 -64
- package/src/components/disclosure/Tabs.tsx +1 -1
- package/src/components/disclosure/dialogZIndex.ts +11 -11
- package/src/components/display/Echarts.tsx +4 -4
- package/src/components/features/address/AddressSearch.tsx +2 -2
- package/src/components/features/crud-detail/CrudDetail.tsx +18 -16
- package/src/components/features/crud-detail/CrudDetailAfter.tsx +1 -1
- package/src/components/features/crud-detail/CrudDetailBefore.tsx +1 -1
- package/src/components/features/crud-detail/CrudDetailTools.tsx +1 -1
- package/src/components/features/crud-sheet/CrudSheet.tsx +39 -37
- package/src/components/features/crud-sheet/CrudSheetColumn.tsx +1 -1
- package/src/components/features/crud-sheet/CrudSheetFilter.tsx +1 -1
- package/src/components/features/crud-sheet/CrudSheetHeader.tsx +1 -1
- package/src/components/features/crud-sheet/CrudSheetTools.tsx +1 -1
- package/src/components/features/data-select-button/DataSelectButton.tsx +34 -32
- package/src/components/features/permission-table/PermissionTable.tsx +22 -19
- package/src/components/features/shared-data/SharedDataSelect.tsx +22 -20
- package/src/components/features/shared-data/SharedDataSelectButton.tsx +10 -10
- package/src/components/features/shared-data/SharedDataSelectList.tsx +245 -48
- package/src/components/features/shared-data/SharedDataSelectListContext.ts +39 -0
- package/src/components/feedback/Progress.tsx +1 -1
- package/src/components/feedback/busy/BusyContainer.tsx +6 -6
- package/src/components/feedback/busy/BusyContext.ts +12 -12
- package/src/components/feedback/busy/BusyProvider.tsx +6 -6
- package/src/components/feedback/notification/NotificationBanner.tsx +3 -1
- package/src/components/feedback/notification/NotificationBell.tsx +4 -4
- package/src/components/feedback/notification/NotificationContext.ts +28 -28
- package/src/components/feedback/notification/NotificationProvider.tsx +9 -9
- package/src/components/feedback/print/PrintContext.ts +1 -1
- package/src/components/form-control/Button.tsx +1 -1
- package/src/components/form-control/DropdownTrigger.styles.ts +1 -1
- package/src/components/form-control/Invalid.tsx +5 -5
- package/src/components/form-control/ThemeToggle.tsx +10 -10
- package/src/components/form-control/checkbox/Checkbox.styles.ts +8 -8
- package/src/components/form-control/checkbox/Checkbox.tsx +2 -2
- package/src/components/form-control/checkbox/CheckboxGroup.tsx +1 -1
- package/src/components/form-control/checkbox/Radio.tsx +2 -2
- package/src/components/form-control/checkbox/RadioGroup.tsx +1 -1
- package/src/components/form-control/color-picker/ColorPicker.tsx +17 -17
- package/src/components/form-control/combobox/Combobox.tsx +55 -55
- package/src/components/form-control/combobox/ComboboxContext.ts +5 -5
- package/src/components/form-control/combobox/ComboboxItem.tsx +3 -3
- package/src/components/form-control/date-range-picker/DateRangePicker.tsx +40 -26
- package/src/components/form-control/editor/EditorToolbar.tsx +52 -50
- package/src/components/form-control/editor/RichTextEditor.tsx +16 -16
- package/src/components/form-control/editor/editor.css +5 -5
- package/src/components/form-control/field/DatePicker.tsx +39 -39
- package/src/components/form-control/field/DateTimePicker.tsx +38 -38
- package/src/components/form-control/field/Field.styles.ts +11 -11
- package/src/components/form-control/field/FieldPlaceholder.tsx +1 -1
- package/src/components/form-control/field/NumberInput.tsx +63 -63
- package/src/components/form-control/field/TextInput.tsx +48 -48
- package/src/components/form-control/field/Textarea.tsx +32 -32
- package/src/components/form-control/field/TimePicker.tsx +37 -37
- package/src/components/form-control/numpad/Numpad.tsx +26 -26
- package/src/components/form-control/select/Select.tsx +84 -84
- package/src/components/form-control/select/SelectContext.ts +8 -8
- package/src/components/form-control/select/SelectItem.tsx +5 -5
- package/src/components/form-control/state-preset/StatePreset.tsx +13 -13
- package/src/components/layout/FormTable.tsx +4 -4
- package/src/components/layout/sidebar/Sidebar.tsx +8 -8
- package/src/components/layout/sidebar/SidebarContainer.tsx +19 -17
- package/src/components/layout/sidebar/SidebarContext.ts +8 -8
- package/src/components/layout/sidebar/SidebarMenu.tsx +19 -19
- package/src/components/layout/sidebar/SidebarUser.tsx +14 -14
- package/src/components/layout/topbar/Topbar.tsx +15 -13
- package/src/components/layout/topbar/TopbarContainer.tsx +6 -6
- package/src/components/layout/topbar/TopbarContext.ts +2 -2
- package/src/components/layout/topbar/TopbarMenu.tsx +18 -16
- package/src/components/layout/topbar/TopbarUser.tsx +9 -9
- package/src/directives/ripple.ts +8 -8
- package/src/helpers/createAppStructure.ts +12 -6
- package/src/helpers/createSlotComponent.ts +4 -4
- package/src/helpers/mergeStyles.ts +11 -11
- package/src/hooks/createControllableSignal.ts +11 -11
- package/src/hooks/createControllableStore.ts +8 -8
- package/src/hooks/createIMEHandler.ts +7 -7
- package/src/hooks/createMountTransition.ts +4 -4
- package/src/hooks/createSelectionGroup.tsx +1 -1
- package/src/hooks/createSlotSignal.ts +2 -2
- package/src/hooks/useLocalStorage.ts +13 -13
- package/src/hooks/useLogger.ts +2 -2
- package/src/hooks/useRouterLink.ts +15 -15
- package/src/index.ts +4 -3
- package/src/providers/ClipboardProvider.tsx +19 -19
- package/src/providers/ConfigContext.tsx +8 -8
- package/src/providers/ErrorLoggerProvider.tsx +3 -3
- package/src/providers/LoggerContext.tsx +13 -13
- package/src/providers/PwaUpdateProvider.tsx +6 -6
- package/src/providers/ServiceClientContext.ts +9 -9
- package/src/providers/ServiceClientProvider.tsx +15 -15
- package/src/providers/SyncStorageContext.tsx +15 -15
- package/src/providers/SystemProvider.tsx +15 -12
- package/src/providers/ThemeContext.tsx +26 -26
- package/src/providers/i18n/I18nContext.tsx +129 -0
- package/src/providers/i18n/I18nContext.types.ts +30 -0
- package/src/providers/i18n/i18nUtils.ts +38 -0
- package/src/providers/i18n/locales/en.ts +161 -0
- package/src/providers/i18n/locales/ko.ts +161 -0
- package/src/providers/shared-data/SharedDataChangeEvent.ts +4 -4
- package/src/providers/shared-data/SharedDataContext.ts +29 -29
- package/src/providers/shared-data/SharedDataProvider.tsx +21 -21
- package/src/styles/patterns.styles.ts +6 -6
- package/src/styles/tokens.styles.ts +5 -5
- package/tailwind.config.ts +1 -1
- package/tailwind.css +4 -4
- package/tests/components/data/List.spec.tsx +689 -0
- package/tests/components/data/Pagination.spec.tsx +336 -0
- package/tests/components/data/Table.spec.tsx +55 -0
- package/tests/components/data/kanban/Kanban.selection.spec.tsx +213 -0
- package/tests/components/data/sheet/DataSheet.spec.tsx +645 -0
- package/tests/components/disclosure/Collapse.spec.tsx +173 -0
- package/tests/components/disclosure/Dialog.spec.tsx +438 -0
- package/tests/components/disclosure/DialogProvider.spec.tsx +142 -0
- package/tests/components/disclosure/Dropdown.spec.tsx +213 -0
- package/tests/components/disclosure/Tabs.spec.tsx +220 -0
- package/tests/components/display/Alert.spec.tsx +47 -0
- package/tests/components/display/Barcode.spec.tsx +61 -0
- package/tests/components/display/Card.spec.tsx +41 -0
- package/tests/components/display/Link.spec.tsx +62 -0
- package/tests/components/display/Tag.spec.tsx +47 -0
- package/tests/components/features/address/AddressSearch.spec.tsx +45 -0
- package/tests/components/features/crud-detail/CrudDetail.spec.tsx +537 -0
- package/tests/components/features/crud-sheet/CrudSheet.spec.tsx +491 -0
- package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +482 -0
- package/tests/components/features/permission-table/PermissionTable.spec.tsx +288 -0
- package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +463 -0
- package/tests/components/feedback/busy/BusyContainer.spec.tsx +80 -0
- package/tests/components/feedback/notification/LiveRegion.spec.tsx +52 -0
- package/tests/components/feedback/notification/NotificationBanner.spec.tsx +187 -0
- package/tests/components/feedback/notification/NotificationBell.spec.tsx +226 -0
- package/tests/components/feedback/notification/NotificationContext.spec.tsx +362 -0
- package/tests/components/feedback/print/Print.spec.tsx +45 -0
- package/tests/components/form-control/Button.spec.tsx +119 -0
- package/tests/components/form-control/Invalid.spec.tsx +131 -0
- package/tests/components/form-control/checkbox/Checkbox.spec.tsx +137 -0
- package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +108 -0
- package/tests/components/form-control/checkbox/Radio.spec.tsx +138 -0
- package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +108 -0
- package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +94 -0
- package/tests/components/form-control/combobox/Combobox.spec.tsx +253 -0
- package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +88 -0
- package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +208 -0
- package/tests/components/form-control/field/DatePicker.spec.tsx +381 -0
- package/tests/components/form-control/field/DateTimePicker.spec.tsx +383 -0
- package/tests/components/form-control/field/NumberInput.spec.tsx +371 -0
- package/tests/components/form-control/field/TextInput.spec.tsx +341 -0
- package/tests/components/form-control/field/Textarea.spec.tsx +224 -0
- package/tests/components/form-control/field/TimePicker.spec.tsx +315 -0
- package/tests/components/form-control/numpad/Numpad.spec.tsx +248 -0
- package/tests/components/form-control/select/Select.spec.tsx +676 -0
- package/tests/components/form-control/select/SelectItem.spec.tsx +174 -0
- package/tests/components/layout/FormGroup.spec.tsx +104 -0
- package/tests/components/layout/FormTable.spec.tsx +43 -0
- package/tests/components/layout/sidebar/Sidebar.spec.tsx +192 -0
- package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +261 -0
- package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +219 -0
- package/tests/components/layout/sidebar/SidebarUser.spec.tsx +133 -0
- package/tests/components/layout/topbar/TopbarActions.spec.tsx +77 -0
- package/tests/components/layout/topbar/TopbarContainer.spec.tsx +38 -0
- package/tests/components/layout/topbar/createTopbarActions.spec.tsx +66 -0
- package/tests/directives/ripple.spec.tsx +130 -0
- package/tests/helpers/createAppStructure.spec.tsx +843 -0
- package/tests/helpers/mergeStyles.spec.ts +172 -0
- package/tests/hooks/createControllableSignal.spec.ts +194 -0
- package/tests/hooks/createIMEHandler.spec.ts +80 -0
- package/tests/hooks/createMountTransition.spec.ts +86 -0
- package/tests/hooks/useLocalStorage.spec.tsx +223 -0
- package/tests/hooks/useLogger.spec.tsx +116 -0
- package/tests/hooks/usePrint.spec.tsx +134 -0
- package/tests/hooks/useRouterLink.spec.tsx +183 -0
- package/tests/hooks/useSyncConfig.spec.tsx +304 -0
- package/tests/providers/ClipboardProvider.spec.tsx +20 -0
- package/tests/providers/ConfigContext.spec.tsx +42 -0
- package/tests/providers/ErrorLoggerProvider.spec.tsx +73 -0
- package/tests/providers/LoggerContext.spec.tsx +76 -0
- package/tests/providers/PwaUpdateProvider.spec.tsx +22 -0
- package/tests/providers/ServiceClientContext.spec.tsx +88 -0
- package/tests/providers/SyncStorageContext.spec.tsx +77 -0
- package/tests/providers/i18n/I18nContext.spec.tsx +110 -0
- package/tests/providers/shared-data/SharedDataProvider.spec.tsx +401 -0
- package/tests/vitest-env.d.ts +1 -0
- package/dist/components/form-control/select-list/SelectList.d.ts +0 -54
- package/dist/components/form-control/select-list/SelectList.d.ts.map +0 -1
- package/dist/components/form-control/select-list/SelectList.js +0 -280
- package/dist/components/form-control/select-list/SelectList.js.map +0 -6
- package/dist/components/form-control/select-list/SelectListContext.d.ts +0 -13
- package/dist/components/form-control/select-list/SelectListContext.d.ts.map +0 -1
- package/dist/components/form-control/select-list/SelectListContext.js +0 -14
- package/dist/components/form-control/select-list/SelectListContext.js.map +0 -6
- package/docs/data-components.md +0 -782
- package/docs/disclosure.md +0 -254
- package/docs/display.md +0 -153
- package/docs/feedback.md +0 -238
- package/docs/form-controls.md +0 -1068
- package/docs/helpers.md +0 -54
- package/docs/hooks.md +0 -588
- package/docs/layout.md +0 -384
- package/docs/providers.md +0 -211
- package/docs/styling.md +0 -184
- package/src/components/form-control/select-list/SelectList.tsx +0 -385
- package/src/components/form-control/select-list/SelectListContext.ts +0 -23
|
@@ -9,7 +9,7 @@ export function isCrudDetailBeforeDef(value: unknown): value is CrudDetailBefore
|
|
|
9
9
|
);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
/* eslint-disable solid/reactivity -- plain object
|
|
12
|
+
/* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
|
|
13
13
|
export function CrudDetailBefore(props: { children: JSX.Element }): JSX.Element {
|
|
14
14
|
return {
|
|
15
15
|
__type: "crud-detail-before",
|
|
@@ -9,7 +9,7 @@ export function isCrudDetailToolsDef(value: unknown): value is CrudDetailToolsDe
|
|
|
9
9
|
);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
/* eslint-disable solid/reactivity -- plain object
|
|
12
|
+
/* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
|
|
13
13
|
export function CrudDetailTools(props: { children: JSX.Element }): JSX.Element {
|
|
14
14
|
return {
|
|
15
15
|
__type: "crud-detail-tools",
|
|
@@ -19,6 +19,7 @@ import { DataSheet } from "../../data/sheet/DataSheet";
|
|
|
19
19
|
import { DataSheetColumn } from "../../data/sheet/DataSheetColumn";
|
|
20
20
|
import { BusyContainer } from "../../feedback/busy/BusyContainer";
|
|
21
21
|
import { useNotification } from "../../feedback/notification/NotificationContext";
|
|
22
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
22
23
|
import { Button } from "../../form-control/Button";
|
|
23
24
|
import { Icon } from "../../display/Icon";
|
|
24
25
|
import { FormGroup } from "../../layout/FormGroup";
|
|
@@ -91,6 +92,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
91
92
|
]);
|
|
92
93
|
|
|
93
94
|
const noti = useNotification();
|
|
95
|
+
const i18n = useI18nOptional();
|
|
94
96
|
const topbarCtx = useContext(TopbarContext);
|
|
95
97
|
const dialogInstance = useDialogInstance();
|
|
96
98
|
const isModal = dialogInstance !== undefined;
|
|
@@ -116,7 +118,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
116
118
|
});
|
|
117
119
|
let originalItems: TItem[] = [];
|
|
118
120
|
|
|
119
|
-
// eslint-disable-next-line solid/reactivity -- filterInitial
|
|
121
|
+
// eslint-disable-next-line solid/reactivity -- filterInitial is used only for initial value
|
|
120
122
|
const [filter, setFilter] = createStore<TFilter>((local.filterInitial ?? {}) as TFilter);
|
|
121
123
|
const [lastFilter, setLastFilter] = createSignal<TFilter>(objClone(filter));
|
|
122
124
|
|
|
@@ -158,7 +160,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
158
160
|
try {
|
|
159
161
|
await refresh();
|
|
160
162
|
} catch (err) {
|
|
161
|
-
noti.error(err, "
|
|
163
|
+
noti.error(err, i18n?.t("crudSheet.lookupFailed") ?? "Lookup failed");
|
|
162
164
|
}
|
|
163
165
|
setBusyCount((c) => c - 1);
|
|
164
166
|
setReady(true);
|
|
@@ -171,7 +173,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
171
173
|
setTotalPageCount(result.pageCount ?? 0);
|
|
172
174
|
}
|
|
173
175
|
|
|
174
|
-
/* eslint-disable solid/reactivity --
|
|
176
|
+
/* eslint-disable solid/reactivity -- called only in event handlers, immediate store read */
|
|
175
177
|
function getItemDiffs() {
|
|
176
178
|
return items.oneWayDiffs(originalItems, (item) => local.getItemKey(item), {
|
|
177
179
|
excludes: local.inlineEdit?.diffsExcludes,
|
|
@@ -182,7 +184,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
182
184
|
function checkIgnoreChanges(): boolean {
|
|
183
185
|
if (!local.inlineEdit) return true;
|
|
184
186
|
if (getItemDiffs().length === 0) return true;
|
|
185
|
-
return confirm("
|
|
187
|
+
return confirm(i18n?.t("crudSheet.discardChanges") ?? "You have unsaved changes. Discard them?");
|
|
186
188
|
}
|
|
187
189
|
|
|
188
190
|
// -- Filter --
|
|
@@ -233,18 +235,18 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
233
235
|
const diffs = getItemDiffs();
|
|
234
236
|
|
|
235
237
|
if (diffs.length === 0) {
|
|
236
|
-
noti.info("
|
|
238
|
+
noti.info(i18n?.t("crudSheet.notice") ?? "Notice", i18n?.t("crudSheet.noChanges") ?? "No changes to save.");
|
|
237
239
|
return;
|
|
238
240
|
}
|
|
239
241
|
|
|
240
242
|
setBusyCount((c) => c + 1);
|
|
241
243
|
try {
|
|
242
244
|
await local.inlineEdit.submit(diffs);
|
|
243
|
-
noti.success("
|
|
245
|
+
noti.success(i18n?.t("crudSheet.saveCompleted") ?? "Save completed", i18n?.t("crudSheet.saveSuccess") ?? "Saved successfully.");
|
|
244
246
|
await refresh();
|
|
245
247
|
local.onSubmitted?.();
|
|
246
248
|
} catch (err) {
|
|
247
|
-
noti.error(err, "
|
|
249
|
+
noti.error(err, i18n?.t("crudSheet.saveFailed") ?? "Save failed");
|
|
248
250
|
}
|
|
249
251
|
setBusyCount((c) => c - 1);
|
|
250
252
|
}
|
|
@@ -264,7 +266,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
264
266
|
try {
|
|
265
267
|
await refresh();
|
|
266
268
|
} catch (err) {
|
|
267
|
-
noti.error(err, "
|
|
269
|
+
noti.error(err, i18n?.t("crudSheet.lookupFailed") ?? "Lookup failed");
|
|
268
270
|
}
|
|
269
271
|
setBusyCount((c) => c - 1);
|
|
270
272
|
}
|
|
@@ -277,9 +279,9 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
277
279
|
setBusyCount((c) => c + 1);
|
|
278
280
|
try {
|
|
279
281
|
await refresh();
|
|
280
|
-
noti.success("
|
|
282
|
+
noti.success(i18n?.t("crudSheet.deleteCompleted") ?? "Delete completed", i18n?.t("crudSheet.deleteSuccess") ?? "Deleted successfully.");
|
|
281
283
|
} catch (err) {
|
|
282
|
-
noti.error(err, "
|
|
284
|
+
noti.error(err, i18n?.t("crudSheet.deleteFailed") ?? "Delete failed");
|
|
283
285
|
}
|
|
284
286
|
setBusyCount((c) => c - 1);
|
|
285
287
|
}
|
|
@@ -292,9 +294,9 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
292
294
|
setBusyCount((c) => c + 1);
|
|
293
295
|
try {
|
|
294
296
|
await refresh();
|
|
295
|
-
noti.success("
|
|
297
|
+
noti.success(i18n?.t("crudSheet.restoreCompleted") ?? "Restore completed", i18n?.t("crudSheet.restoreSuccess") ?? "Restored successfully.");
|
|
296
298
|
} catch (err) {
|
|
297
|
-
noti.error(err, "
|
|
299
|
+
noti.error(err, i18n?.t("crudSheet.restoreFailed") ?? "Restore failed");
|
|
298
300
|
}
|
|
299
301
|
setBusyCount((c) => c - 1);
|
|
300
302
|
}
|
|
@@ -308,7 +310,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
308
310
|
const result = await local.search(lastFilter(), undefined, sorts());
|
|
309
311
|
await local.excel.download(result.items);
|
|
310
312
|
} catch (err) {
|
|
311
|
-
noti.error(err, "
|
|
313
|
+
noti.error(err, i18n?.t("crudSheet.excelDownloadFailed") ?? "Excel download failed");
|
|
312
314
|
}
|
|
313
315
|
setBusyCount((c) => c - 1);
|
|
314
316
|
}
|
|
@@ -326,10 +328,10 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
326
328
|
setBusyCount((c) => c + 1);
|
|
327
329
|
try {
|
|
328
330
|
await local.excel!.upload!(file);
|
|
329
|
-
noti.success("
|
|
331
|
+
noti.success(i18n?.t("crudSheet.excelCompleted") ?? "Completed", i18n?.t("crudSheet.excelUploadSuccess") ?? "Excel upload completed successfully.");
|
|
330
332
|
await refresh();
|
|
331
333
|
} catch (err) {
|
|
332
|
-
noti.error(err, "
|
|
334
|
+
noti.error(err, i18n?.t("crudSheet.excelUploadFailed") ?? "Excel upload failed");
|
|
333
335
|
}
|
|
334
336
|
setBusyCount((c) => c - 1);
|
|
335
337
|
};
|
|
@@ -338,7 +340,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
338
340
|
|
|
339
341
|
// -- Select Mode --
|
|
340
342
|
function handleSelectedItemsChange(newSelectedItems: TItem[]) {
|
|
341
|
-
//
|
|
343
|
+
// Current page items key Set
|
|
342
344
|
const currentItems = items as unknown as TItem[];
|
|
343
345
|
const currentKeys = new Set<string | number>();
|
|
344
346
|
for (const item of currentItems) {
|
|
@@ -346,22 +348,22 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
346
348
|
if (key != null) currentKeys.add(key);
|
|
347
349
|
}
|
|
348
350
|
|
|
349
|
-
//
|
|
351
|
+
// Newly selected items key
|
|
350
352
|
const newSelectedKeys = new Set<string | number>();
|
|
351
353
|
for (const item of newSelectedItems) {
|
|
352
354
|
const key = local.getItemKey(item);
|
|
353
355
|
if (key != null) newSelectedKeys.add(key);
|
|
354
356
|
}
|
|
355
357
|
|
|
356
|
-
//
|
|
358
|
+
// Preserve other page keys + update current page keys
|
|
357
359
|
const merged = new Set<string | number>();
|
|
358
360
|
for (const key of selectedKeys()) {
|
|
359
361
|
if (!currentKeys.has(key)) {
|
|
360
|
-
merged.add(key); //
|
|
362
|
+
merged.add(key); // Preserve other page keys
|
|
361
363
|
}
|
|
362
364
|
}
|
|
363
365
|
for (const key of newSelectedKeys) {
|
|
364
|
-
merged.add(key); //
|
|
366
|
+
merged.add(key); // Add current page selection
|
|
365
367
|
}
|
|
366
368
|
|
|
367
369
|
setSelectedKeys(merged);
|
|
@@ -400,7 +402,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
400
402
|
});
|
|
401
403
|
|
|
402
404
|
// -- Route Leave Guard --
|
|
403
|
-
// eslint-disable-next-line solid/reactivity -- inlineEdit
|
|
405
|
+
// eslint-disable-next-line solid/reactivity -- inlineEdit is used only for initial value
|
|
404
406
|
if (!isModal && local.inlineEdit) {
|
|
405
407
|
try {
|
|
406
408
|
useBeforeLeave((e) => {
|
|
@@ -409,7 +411,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
409
411
|
}
|
|
410
412
|
});
|
|
411
413
|
} catch {
|
|
412
|
-
// Router context
|
|
414
|
+
// Skip if no Router context
|
|
413
415
|
}
|
|
414
416
|
}
|
|
415
417
|
|
|
@@ -425,12 +427,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
425
427
|
onClick={() => formRef?.requestSubmit()}
|
|
426
428
|
>
|
|
427
429
|
<Icon icon={IconDeviceFloppy} class="mr-1" />
|
|
428
|
-
|
|
430
|
+
{i18n?.t("crudSheet.save") ?? "Save"}
|
|
429
431
|
</Button>
|
|
430
432
|
</Show>
|
|
431
433
|
<Button size="lg" variant="ghost" theme="info" onClick={handleRefresh}>
|
|
432
434
|
<Icon icon={IconRefresh} class="mr-1" />
|
|
433
|
-
|
|
435
|
+
{i18n?.t("crudSheet.refresh") ?? "Refresh"}
|
|
434
436
|
</Button>
|
|
435
437
|
</>
|
|
436
438
|
));
|
|
@@ -491,12 +493,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
491
493
|
onClick={() => formRef?.requestSubmit()}
|
|
492
494
|
>
|
|
493
495
|
<Icon icon={IconDeviceFloppy} class="mr-1" />
|
|
494
|
-
|
|
496
|
+
{i18n?.t("crudSheet.save") ?? "Save"}
|
|
495
497
|
</Button>
|
|
496
498
|
</Show>
|
|
497
499
|
<Button size="sm" theme="info" variant="ghost" onClick={handleRefresh}>
|
|
498
500
|
<Icon icon={IconRefresh} class="mr-1" />
|
|
499
|
-
|
|
501
|
+
{i18n?.t("crudSheet.refresh") ?? "Refresh"}
|
|
500
502
|
</Button>
|
|
501
503
|
</div>
|
|
502
504
|
</Show>
|
|
@@ -512,7 +514,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
512
514
|
<FormGroup.Item>
|
|
513
515
|
<Button type="submit" theme="info" variant="solid">
|
|
514
516
|
<Icon icon={IconSearch} class="mr-1" />
|
|
515
|
-
|
|
517
|
+
{i18n?.t("crudSheet.search") ?? "Search"}
|
|
516
518
|
</Button>
|
|
517
519
|
</FormGroup.Item>
|
|
518
520
|
{filterDef().children(filter, setFilter)}
|
|
@@ -528,7 +530,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
528
530
|
{/* Inline edit buttons */}
|
|
529
531
|
<Show when={canEdit() && local.inlineEdit}>
|
|
530
532
|
<Button size="sm" theme="primary" variant="ghost" onClick={handleAddRow}>
|
|
531
|
-
<Icon icon={IconPlus} class="mr-1"
|
|
533
|
+
<Icon icon={IconPlus} class="mr-1" />{i18n?.t("crudSheet.addRow") ?? "Add Row"}
|
|
532
534
|
</Button>
|
|
533
535
|
</Show>
|
|
534
536
|
|
|
@@ -541,7 +543,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
541
543
|
onClick={() => void handleEditItem()}
|
|
542
544
|
>
|
|
543
545
|
<Icon icon={IconPlus} class="mr-1" />
|
|
544
|
-
|
|
546
|
+
{i18n?.t("crudSheet.register") ?? "Register"}
|
|
545
547
|
</Button>
|
|
546
548
|
</Show>
|
|
547
549
|
<Show when={canEdit() && local.modalEdit?.deleteItems}>
|
|
@@ -560,7 +562,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
560
562
|
}
|
|
561
563
|
>
|
|
562
564
|
<Icon icon={IconTrash} class="mr-1" />
|
|
563
|
-
|
|
565
|
+
{i18n?.t("crudSheet.deleteSelected") ?? "Delete Selected"}
|
|
564
566
|
</Button>
|
|
565
567
|
</Show>
|
|
566
568
|
<Show when={canEdit() && local.modalEdit?.restoreItems}>
|
|
@@ -575,7 +577,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
575
577
|
}
|
|
576
578
|
>
|
|
577
579
|
<Icon icon={IconTrashOff} class="mr-1" />
|
|
578
|
-
|
|
580
|
+
{i18n?.t("crudSheet.restoreSelected") ?? "Restore Selected"}
|
|
579
581
|
</Button>
|
|
580
582
|
</Show>
|
|
581
583
|
|
|
@@ -583,13 +585,13 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
583
585
|
<Show when={canEdit() && local.excel?.upload}>
|
|
584
586
|
<Button size="sm" theme="success" variant="ghost" onClick={handleExcelUpload}>
|
|
585
587
|
<Icon icon={IconUpload} class="mr-1" />
|
|
586
|
-
|
|
588
|
+
{i18n?.t("crudSheet.excelUpload") ?? "Excel Upload"}
|
|
587
589
|
</Button>
|
|
588
590
|
</Show>
|
|
589
591
|
<Show when={local.excel}>
|
|
590
592
|
<Button size="sm" theme="success" variant="ghost" onClick={handleExcelDownload}>
|
|
591
593
|
<Icon icon={IconFileExcel} class="mr-1" />
|
|
592
|
-
|
|
594
|
+
{i18n?.t("crudSheet.excelDownload") ?? "Excel Download"}
|
|
593
595
|
</Button>
|
|
594
596
|
</Show>
|
|
595
597
|
</Show>
|
|
@@ -709,7 +711,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
709
711
|
|
|
710
712
|
{/* Auto lastModified columns */}
|
|
711
713
|
<Show when={local.lastModifiedAtProp}>
|
|
712
|
-
<DataSheetColumn<TItem> key={local.lastModifiedAtProp!} header="
|
|
714
|
+
<DataSheetColumn<TItem> key={local.lastModifiedAtProp!} header={i18n?.t("crudSheet.lastModified") ?? "Last Modified"} hidden>
|
|
713
715
|
{(dsCtx) => (
|
|
714
716
|
<div class="px-2 py-1 text-center">
|
|
715
717
|
{(
|
|
@@ -723,7 +725,7 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
723
725
|
</Show>
|
|
724
726
|
|
|
725
727
|
<Show when={local.lastModifiedByProp}>
|
|
726
|
-
<DataSheetColumn<TItem> key={local.lastModifiedByProp!} header="
|
|
728
|
+
<DataSheetColumn<TItem> key={local.lastModifiedByProp!} header={i18n?.t("crudSheet.modifiedBy") ?? "Modified By"} hidden>
|
|
727
729
|
{(dsCtx) => (
|
|
728
730
|
<div class="px-2 py-1 text-center">
|
|
729
731
|
{objGetChainValue(dsCtx.item, local.lastModifiedByProp!, true) as string}
|
|
@@ -740,12 +742,12 @@ const CrudSheetBase = <TItem, TFilter extends Record<string, any>>(
|
|
|
740
742
|
<div class="flex-1" />
|
|
741
743
|
<Show when={selectedItems().length > 0}>
|
|
742
744
|
<Button size="sm" theme="danger" onClick={handleSelectCancel}>
|
|
743
|
-
{local.selectMode === "multiple" ? "
|
|
745
|
+
{local.selectMode === "multiple" ? (i18n?.t("crudSheet.deselectAll") ?? "Deselect All") : (i18n?.t("crudSheet.deselect") ?? "Deselect")}
|
|
744
746
|
</Button>
|
|
745
747
|
</Show>
|
|
746
748
|
<Show when={local.selectMode === "multiple"}>
|
|
747
749
|
<Button size="sm" theme="primary" onClick={handleSelectConfirm}>
|
|
748
|
-
|
|
750
|
+
{i18n?.t("crudSheet.confirm") ?? "Confirm"} ({selectedItems().length})
|
|
749
751
|
</Button>
|
|
750
752
|
</Show>
|
|
751
753
|
</div>
|
|
@@ -10,7 +10,7 @@ export function isCrudSheetColumnDef(value: unknown): value is CrudSheetColumnDe
|
|
|
10
10
|
);
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
/* eslint-disable solid/reactivity -- plain object
|
|
13
|
+
/* eslint-disable solid/reactivity -- plain object return pattern, reactive context not needed */
|
|
14
14
|
export function CrudSheetColumn<TItem>(props: CrudSheetColumnProps<TItem>): JSX.Element {
|
|
15
15
|
return {
|
|
16
16
|
__type: "crud-sheet-column",
|
|
@@ -9,7 +9,7 @@ export function isCrudSheetFilterDef(value: unknown): value is CrudSheetFilterDe
|
|
|
9
9
|
);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
/* eslint-disable solid/reactivity -- plain object
|
|
12
|
+
/* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
|
|
13
13
|
export function CrudSheetFilter<TFilter>(props: {
|
|
14
14
|
children: (filter: TFilter, setFilter: any) => JSX.Element;
|
|
15
15
|
}): JSX.Element {
|
|
@@ -9,7 +9,7 @@ export function isCrudSheetHeaderDef(value: unknown): value is CrudSheetHeaderDe
|
|
|
9
9
|
);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
/* eslint-disable solid/reactivity -- plain object
|
|
12
|
+
/* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
|
|
13
13
|
export function CrudSheetHeader(props: { children: JSX.Element }): JSX.Element {
|
|
14
14
|
return {
|
|
15
15
|
__type: "crud-sheet-header",
|
|
@@ -9,7 +9,7 @@ export function isCrudSheetToolsDef(value: unknown): value is CrudSheetToolsDef<
|
|
|
9
9
|
);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
/* eslint-disable solid/reactivity -- plain object
|
|
12
|
+
/* eslint-disable solid/reactivity -- plain object return pattern does not require reactive context */
|
|
13
13
|
export function CrudSheetTools<_TItem>(props: {
|
|
14
14
|
children: (ctx: any) => JSX.Element;
|
|
15
15
|
}): JSX.Element {
|
|
@@ -15,6 +15,7 @@ import { IconSearch, IconX } from "@tabler/icons-solidjs";
|
|
|
15
15
|
import { Icon } from "../../display/Icon";
|
|
16
16
|
import { Invalid } from "../../form-control/Invalid";
|
|
17
17
|
import { useDialog, type DialogShowOptions } from "../../disclosure/DialogContext";
|
|
18
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
18
19
|
import { createControllableSignal } from "../../../hooks/createControllableSignal";
|
|
19
20
|
import { type ComponentSize, textMuted } from "../../../styles/tokens.styles";
|
|
20
21
|
import {
|
|
@@ -24,46 +25,46 @@ import {
|
|
|
24
25
|
triggerSizeClasses,
|
|
25
26
|
} from "../../form-control/DropdownTrigger.styles";
|
|
26
27
|
|
|
27
|
-
/**
|
|
28
|
+
/** Result interface returned from modal */
|
|
28
29
|
export interface DataSelectModalResult<TKey> {
|
|
29
30
|
selectedKeys: TKey[];
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
/** DataSelectButton Props */
|
|
33
34
|
export interface DataSelectButtonProps<TItem, TKey = string | number> {
|
|
34
|
-
/**
|
|
35
|
+
/** Currently selected key(s) (single or multiple) */
|
|
35
36
|
value?: TKey | TKey[];
|
|
36
|
-
/**
|
|
37
|
+
/** Value change callback */
|
|
37
38
|
onValueChange?: (value: TKey | TKey[] | undefined) => void;
|
|
38
39
|
|
|
39
|
-
/**
|
|
40
|
+
/** Function to load items by key */
|
|
40
41
|
load: (keys: TKey[]) => TItem[] | Promise<TItem[]>;
|
|
41
|
-
/**
|
|
42
|
+
/** Selection modal component factory */
|
|
42
43
|
modal: () => JSX.Element;
|
|
43
|
-
/**
|
|
44
|
+
/** Item rendering function */
|
|
44
45
|
renderItem: (item: TItem) => JSX.Element;
|
|
45
46
|
|
|
46
|
-
/**
|
|
47
|
+
/** Multiple selection mode */
|
|
47
48
|
multiple?: boolean;
|
|
48
|
-
/**
|
|
49
|
+
/** Required input */
|
|
49
50
|
required?: boolean;
|
|
50
|
-
/**
|
|
51
|
+
/** Disabled */
|
|
51
52
|
disabled?: boolean;
|
|
52
|
-
/**
|
|
53
|
+
/** Trigger size */
|
|
53
54
|
size?: ComponentSize;
|
|
54
|
-
/**
|
|
55
|
+
/** Borderless style */
|
|
55
56
|
inset?: boolean;
|
|
56
57
|
|
|
57
|
-
/**
|
|
58
|
+
/** Custom validation function */
|
|
58
59
|
validate?: (value: unknown) => string | undefined;
|
|
59
|
-
/** touchMode:
|
|
60
|
+
/** touchMode: show error only after focus is lost */
|
|
60
61
|
touchMode?: boolean;
|
|
61
62
|
|
|
62
|
-
/**
|
|
63
|
+
/** Dialog options */
|
|
63
64
|
dialogOptions?: DialogShowOptions;
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
//
|
|
67
|
+
// Styles
|
|
67
68
|
const containerClass = clsx("inline-flex items-center", "group");
|
|
68
69
|
const selectedValueClass = clsx("flex-1", "whitespace-nowrap", "overflow-hidden", "text-ellipsis");
|
|
69
70
|
const actionButtonClass = clsx(
|
|
@@ -111,27 +112,28 @@ export function DataSelectButton<TItem, TKey = string | number>(
|
|
|
111
112
|
"dialogOptions",
|
|
112
113
|
]);
|
|
113
114
|
|
|
115
|
+
const i18n = useI18nOptional();
|
|
114
116
|
const dialog = useDialog();
|
|
115
117
|
|
|
116
|
-
// value
|
|
118
|
+
// Always normalize value to array
|
|
117
119
|
const normalizeKeys = (value: TKey | TKey[] | undefined): TKey[] => {
|
|
118
120
|
if (value === undefined || value === null) return [];
|
|
119
121
|
if (Array.isArray(value)) return value;
|
|
120
122
|
return [value];
|
|
121
123
|
};
|
|
122
124
|
|
|
123
|
-
//
|
|
125
|
+
// Controlled/uncontrolled pattern
|
|
124
126
|
type ValueType = TKey | TKey[] | undefined;
|
|
125
127
|
const [getValue, setValue] = createControllableSignal<ValueType>({
|
|
126
128
|
value: () => local.value,
|
|
127
129
|
onChange: () => local.onValueChange as ((v: ValueType) => void) | undefined,
|
|
128
130
|
} as Parameters<typeof createControllableSignal<ValueType>>[0]);
|
|
129
131
|
|
|
130
|
-
//
|
|
131
|
-
// eslint-disable-next-line solid/reactivity --
|
|
132
|
+
// Track keys for loading
|
|
133
|
+
// eslint-disable-next-line solid/reactivity -- initial value read once at mount time
|
|
132
134
|
const [loadKeys, setLoadKeys] = createSignal<TKey[]>(normalizeKeys(local.value));
|
|
133
135
|
|
|
134
|
-
//
|
|
136
|
+
// Update loadKeys when value changes
|
|
135
137
|
createEffect(
|
|
136
138
|
on(
|
|
137
139
|
() => getValue(),
|
|
@@ -141,33 +143,33 @@ export function DataSelectButton<TItem, TKey = string | number>(
|
|
|
141
143
|
),
|
|
142
144
|
);
|
|
143
145
|
|
|
144
|
-
//
|
|
145
|
-
// eslint-disable-next-line solid/reactivity -- createResource
|
|
146
|
+
// Call load via createResource
|
|
147
|
+
// eslint-disable-next-line solid/reactivity -- createResource fetcher is called when source changes
|
|
146
148
|
const [selectedItems] = createResource(loadKeys, async (keys) => {
|
|
147
149
|
if (keys.length === 0) return [];
|
|
148
150
|
return Promise.resolve(local.load(keys));
|
|
149
151
|
});
|
|
150
152
|
|
|
151
|
-
//
|
|
153
|
+
// Check if has value
|
|
152
154
|
const hasValue = createMemo(() => {
|
|
153
155
|
const keys = normalizeKeys(getValue());
|
|
154
156
|
return keys.length > 0;
|
|
155
157
|
});
|
|
156
158
|
|
|
157
|
-
//
|
|
159
|
+
// Check if clearable
|
|
158
160
|
const clearable = createMemo(() => !local.required && hasValue() && !local.disabled);
|
|
159
161
|
|
|
160
|
-
//
|
|
162
|
+
// Validation
|
|
161
163
|
const errorMsg = createMemo(() => {
|
|
162
164
|
const v = getValue();
|
|
163
165
|
if (local.required) {
|
|
164
166
|
const keys = normalizeKeys(v);
|
|
165
|
-
if (keys.length === 0) return "
|
|
167
|
+
if (keys.length === 0) return "Required field";
|
|
166
168
|
}
|
|
167
169
|
return local.validate?.(v);
|
|
168
170
|
});
|
|
169
171
|
|
|
170
|
-
//
|
|
172
|
+
// Open modal
|
|
171
173
|
const handleOpenModal = async () => {
|
|
172
174
|
if (local.disabled) return;
|
|
173
175
|
|
|
@@ -186,7 +188,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
|
|
|
186
188
|
}
|
|
187
189
|
};
|
|
188
190
|
|
|
189
|
-
//
|
|
191
|
+
// Clear selection
|
|
190
192
|
const handleClear = (e: MouseEvent) => {
|
|
191
193
|
e.stopPropagation();
|
|
192
194
|
if (local.multiple) {
|
|
@@ -196,7 +198,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
|
|
|
196
198
|
}
|
|
197
199
|
};
|
|
198
200
|
|
|
199
|
-
//
|
|
201
|
+
// Render selected value display
|
|
200
202
|
const renderSelectedDisplay = (): JSX.Element => {
|
|
201
203
|
const items = selectedItems();
|
|
202
204
|
if (!items || items.length === 0) {
|
|
@@ -218,7 +220,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
|
|
|
218
220
|
);
|
|
219
221
|
};
|
|
220
222
|
|
|
221
|
-
//
|
|
223
|
+
// Calculate trigger class
|
|
222
224
|
const triggerClassName = () =>
|
|
223
225
|
getTriggerContainerClass({
|
|
224
226
|
size: local.size,
|
|
@@ -254,7 +256,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
|
|
|
254
256
|
class={twMerge(actionButtonClass, "text-base-400 hover:text-danger-500")}
|
|
255
257
|
onClick={handleClear}
|
|
256
258
|
tabIndex={-1}
|
|
257
|
-
aria-label="
|
|
259
|
+
aria-label={i18n?.t("dataSelectButton.deselect") ?? "Deselect"}
|
|
258
260
|
>
|
|
259
261
|
<Icon icon={IconX} size="0.875em" />
|
|
260
262
|
</button>
|
|
@@ -266,7 +268,7 @@ export function DataSelectButton<TItem, TKey = string | number>(
|
|
|
266
268
|
class={twMerge(actionButtonClass, "text-base-400 hover:text-primary-500")}
|
|
267
269
|
onClick={() => void handleOpenModal()}
|
|
268
270
|
tabIndex={-1}
|
|
269
|
-
aria-label="
|
|
271
|
+
aria-label={i18n?.t("dataSelectButton.search") ?? "Search"}
|
|
270
272
|
>
|
|
271
273
|
<Icon icon={IconSearch} size="0.875em" />
|
|
272
274
|
</button>
|