@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
|
@@ -15,12 +15,13 @@ import { DataSheet } from "../../data/sheet/DataSheet";
|
|
|
15
15
|
import { Checkbox } from "../../form-control/checkbox/Checkbox";
|
|
16
16
|
import { borderDefault } from "../../../styles/tokens.styles";
|
|
17
17
|
import type { AppPerm } from "../../../helpers/createAppStructure";
|
|
18
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
18
19
|
|
|
19
20
|
const titleCellClass = clsx("flex items-stretch", "px-2");
|
|
20
21
|
const indentGuideWrapperClass = clsx("mr-1 flex w-3", "justify-center");
|
|
21
22
|
const indentGuideLineClass = clsx("w-0 self-stretch", "border-r", borderDefault);
|
|
22
23
|
|
|
23
|
-
// ---
|
|
24
|
+
// --- Types ---
|
|
24
25
|
|
|
25
26
|
export interface PermissionTableProps<TModule = string> {
|
|
26
27
|
items?: AppPerm<TModule>[];
|
|
@@ -32,9 +33,9 @@ export interface PermissionTableProps<TModule = string> {
|
|
|
32
33
|
style?: JSX.CSSProperties;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
// ---
|
|
36
|
+
// --- Utilities (also used in tests) ---
|
|
36
37
|
|
|
37
|
-
/**
|
|
38
|
+
/** Collect all unique perm types from the tree */
|
|
38
39
|
export function collectAllPerms<TModule>(items: AppPerm<TModule>[]): string[] {
|
|
39
40
|
const set = new Set<string>();
|
|
40
41
|
const walk = (list: AppPerm<TModule>[]) => {
|
|
@@ -49,7 +50,7 @@ export function collectAllPerms<TModule>(items: AppPerm<TModule>[]): string[] {
|
|
|
49
50
|
return [...set];
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
/** modules
|
|
53
|
+
/** Filter by modules: keep only items that have intersection with active modules */
|
|
53
54
|
export function filterByModules<TModule>(
|
|
54
55
|
items: AppPerm<TModule>[],
|
|
55
56
|
modules: TModule[] | undefined,
|
|
@@ -72,7 +73,7 @@ export function filterByModules<TModule>(
|
|
|
72
73
|
return result;
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
/**
|
|
76
|
+
/** Handle cascading when checkbox changes */
|
|
76
77
|
export function changePermCheck<TModule>(
|
|
77
78
|
value: Record<string, boolean>,
|
|
78
79
|
item: AppPerm<TModule>,
|
|
@@ -112,9 +113,9 @@ export function changePermCheck<TModule>(
|
|
|
112
113
|
return result;
|
|
113
114
|
}
|
|
114
115
|
|
|
115
|
-
// ---
|
|
116
|
+
// --- Internal Helpers ---
|
|
116
117
|
|
|
117
|
-
/**
|
|
118
|
+
/** Check if item is visible by module filter (preserve object reference) */
|
|
118
119
|
function isItemVisible<TModule>(item: AppPerm<TModule>, modules: TModule[] | undefined): boolean {
|
|
119
120
|
if (!modules || modules.length === 0) return true;
|
|
120
121
|
if (item.modules && !item.modules.some((m) => modules.includes(m))) return false;
|
|
@@ -124,7 +125,7 @@ function isItemVisible<TModule>(item: AppPerm<TModule>, modules: TModule[] | und
|
|
|
124
125
|
return true;
|
|
125
126
|
}
|
|
126
127
|
|
|
127
|
-
/**
|
|
128
|
+
/** Collect unique perm types from visible items only */
|
|
128
129
|
function collectVisiblePerms<TModule>(
|
|
129
130
|
items: AppPerm<TModule>[],
|
|
130
131
|
modules: TModule[] | undefined,
|
|
@@ -145,7 +146,7 @@ function collectVisiblePerms<TModule>(
|
|
|
145
146
|
return [...set];
|
|
146
147
|
}
|
|
147
148
|
|
|
148
|
-
/**
|
|
149
|
+
/** Get check state of group node: true if any child is checked */
|
|
149
150
|
function isGroupPermChecked<TModule>(
|
|
150
151
|
item: AppPerm<TModule>,
|
|
151
152
|
perm: string,
|
|
@@ -160,7 +161,7 @@ function isGroupPermChecked<TModule>(
|
|
|
160
161
|
return false;
|
|
161
162
|
}
|
|
162
163
|
|
|
163
|
-
/**
|
|
164
|
+
/** Check if specific perm exists in subtree */
|
|
164
165
|
function hasPermInTree<TModule>(item: AppPerm<TModule>, perm: string): boolean {
|
|
165
166
|
if (item.perms?.includes(perm)) return true;
|
|
166
167
|
if (item.children) {
|
|
@@ -169,7 +170,7 @@ function hasPermInTree<TModule>(item: AppPerm<TModule>, perm: string): boolean {
|
|
|
169
170
|
return false;
|
|
170
171
|
}
|
|
171
172
|
|
|
172
|
-
/**
|
|
173
|
+
/** Check if perm should be disabled (base perm is off) */
|
|
173
174
|
function isPermDisabled<TModule>(
|
|
174
175
|
item: AppPerm<TModule>,
|
|
175
176
|
perm: string,
|
|
@@ -181,7 +182,7 @@ function isPermDisabled<TModule>(
|
|
|
181
182
|
return !(value[item.href + "/" + basePerm] ?? false);
|
|
182
183
|
}
|
|
183
184
|
|
|
184
|
-
/**
|
|
185
|
+
/** Collect all expandable items (preserve object reference) */
|
|
185
186
|
function collectExpandable<TModule>(
|
|
186
187
|
items: AppPerm<TModule>[],
|
|
187
188
|
getChildren: (item: AppPerm<TModule>) => AppPerm<TModule>[] | undefined,
|
|
@@ -202,7 +203,7 @@ function collectExpandable<TModule>(
|
|
|
202
203
|
return result;
|
|
203
204
|
}
|
|
204
205
|
|
|
205
|
-
// ---
|
|
206
|
+
// --- Component ---
|
|
206
207
|
|
|
207
208
|
export const PermissionTable: Component<PermissionTableProps> = (props) => {
|
|
208
209
|
const [local] = splitProps(props, [
|
|
@@ -215,14 +216,16 @@ export const PermissionTable: Component<PermissionTableProps> = (props) => {
|
|
|
215
216
|
"style",
|
|
216
217
|
]);
|
|
217
218
|
|
|
218
|
-
|
|
219
|
+
const i18n = useI18nOptional();
|
|
220
|
+
|
|
221
|
+
// Visible top-level items (preserve object reference)
|
|
219
222
|
const visibleItems = createMemo(() => {
|
|
220
223
|
const items = local.items ?? [];
|
|
221
224
|
if (!local.modules || local.modules.length === 0) return items;
|
|
222
225
|
return items.filter((item) => isItemVisible(item, local.modules));
|
|
223
226
|
});
|
|
224
227
|
|
|
225
|
-
// Sheet
|
|
228
|
+
// Sheet's getChildren — apply module filter, preserve object reference
|
|
226
229
|
const getChildren = (item: AppPerm): AppPerm[] | undefined => {
|
|
227
230
|
if (!item.children || item.children.length === 0) return undefined;
|
|
228
231
|
const modules = local.modules;
|
|
@@ -231,17 +234,17 @@ export const PermissionTable: Component<PermissionTableProps> = (props) => {
|
|
|
231
234
|
return filtered.length > 0 ? filtered : undefined;
|
|
232
235
|
};
|
|
233
236
|
|
|
234
|
-
//
|
|
237
|
+
// All unique perm types from visible items
|
|
235
238
|
const allPerms = createMemo(() => collectVisiblePerms(local.items ?? [], local.modules));
|
|
236
239
|
|
|
237
240
|
const currentValue = createMemo(() => local.value ?? {});
|
|
238
241
|
|
|
239
|
-
//
|
|
242
|
+
// Expanded state — all expanded by default
|
|
240
243
|
const getAllExpandable = () => collectExpandable(visibleItems(), getChildren);
|
|
241
244
|
|
|
242
245
|
const [expandedItems, setExpandedItems] = createSignal<AppPerm[]>(getAllExpandable());
|
|
243
246
|
|
|
244
|
-
//
|
|
247
|
+
// Re-expand all when tree structure changes (e.g., module filter changed)
|
|
245
248
|
createEffect(
|
|
246
249
|
on(
|
|
247
250
|
visibleItems,
|
|
@@ -266,7 +269,7 @@ export const PermissionTable: Component<PermissionTableProps> = (props) => {
|
|
|
266
269
|
onExpandedItemsChange={setExpandedItems}
|
|
267
270
|
hideConfigBar
|
|
268
271
|
>
|
|
269
|
-
<DataSheet.Column key="title" header="
|
|
272
|
+
<DataSheet.Column key="title" header={i18n?.t("permissionTable.permissionItem") ?? "Permission Item"} sortable={false} resizable={false}>
|
|
270
273
|
{(ctx) => {
|
|
271
274
|
const item = ctx.item as AppPerm;
|
|
272
275
|
return (
|
|
@@ -4,72 +4,74 @@ import { type SharedDataAccessor } from "../../../providers/shared-data/SharedDa
|
|
|
4
4
|
import { Select, type SelectProps } from "../../form-control/select/Select";
|
|
5
5
|
import { Icon } from "../../display/Icon";
|
|
6
6
|
import { useDialog } from "../../disclosure/DialogContext";
|
|
7
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
7
8
|
import { type ComponentSize } from "../../../styles/tokens.styles";
|
|
8
9
|
|
|
9
10
|
/** SharedDataSelect Props */
|
|
10
11
|
export interface SharedDataSelectProps<TItem> {
|
|
11
|
-
/**
|
|
12
|
+
/** Shared data accessor */
|
|
12
13
|
data: SharedDataAccessor<TItem>;
|
|
13
14
|
|
|
14
|
-
/**
|
|
15
|
+
/** Currently selected value */
|
|
15
16
|
value?: unknown;
|
|
16
|
-
/**
|
|
17
|
+
/** Value change callback */
|
|
17
18
|
onValueChange?: (value: unknown) => void;
|
|
18
|
-
/**
|
|
19
|
+
/** Multiple selection mode */
|
|
19
20
|
multiple?: boolean;
|
|
20
|
-
/**
|
|
21
|
+
/** Required input */
|
|
21
22
|
required?: boolean;
|
|
22
|
-
/**
|
|
23
|
+
/** Disabled */
|
|
23
24
|
disabled?: boolean;
|
|
24
|
-
/**
|
|
25
|
+
/** Trigger size */
|
|
25
26
|
size?: ComponentSize;
|
|
26
|
-
/**
|
|
27
|
+
/** Borderless style */
|
|
27
28
|
inset?: boolean;
|
|
28
29
|
|
|
29
|
-
/**
|
|
30
|
+
/** Item filter function */
|
|
30
31
|
filterFn?: (item: TItem, index: number) => boolean;
|
|
31
|
-
/**
|
|
32
|
+
/** Selection modal component factory */
|
|
32
33
|
modal?: () => JSX.Element;
|
|
33
|
-
/**
|
|
34
|
+
/** Edit modal component factory */
|
|
34
35
|
editModal?: () => JSX.Element;
|
|
35
36
|
|
|
36
|
-
/**
|
|
37
|
+
/** Item rendering function */
|
|
37
38
|
children: (item: TItem, index: number, depth: number) => JSX.Element;
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
export function SharedDataSelect<TItem>(props: SharedDataSelectProps<TItem>): JSX.Element {
|
|
41
42
|
const [local, rest] = splitProps(props, ["data", "filterFn", "modal", "editModal", "children"]);
|
|
42
43
|
|
|
44
|
+
const i18n = useI18nOptional();
|
|
43
45
|
const dialog = useDialog();
|
|
44
46
|
|
|
45
|
-
// filterFn
|
|
47
|
+
// Items with filterFn applied
|
|
46
48
|
const items = createMemo(() => {
|
|
47
49
|
const allItems = local.data.items();
|
|
48
50
|
if (!local.filterFn) return allItems;
|
|
49
51
|
return allItems.filter(local.filterFn);
|
|
50
52
|
});
|
|
51
53
|
|
|
52
|
-
// modal
|
|
54
|
+
// Open modal
|
|
53
55
|
const handleOpenModal = async () => {
|
|
54
56
|
if (!local.modal) return;
|
|
55
57
|
await dialog.show(local.modal, {});
|
|
56
58
|
};
|
|
57
59
|
|
|
58
|
-
//
|
|
60
|
+
// Open edit modal
|
|
59
61
|
const handleOpenEditModal = async () => {
|
|
60
62
|
if (!local.editModal) return;
|
|
61
63
|
await dialog.show(local.editModal, {});
|
|
62
64
|
};
|
|
63
65
|
|
|
64
|
-
// Select
|
|
65
|
-
// getter
|
|
66
|
+
// Use mergeProps + as for Select's discriminated union (multiple: true | false?) and TItem → unknown conversion
|
|
67
|
+
// Wrap with getter to satisfy SolidJS reactivity lint rules
|
|
66
68
|
const selectProps = mergeProps(rest, {
|
|
67
69
|
get items() {
|
|
68
70
|
return items();
|
|
69
71
|
},
|
|
70
72
|
get getChildren() {
|
|
71
73
|
if (!local.data.getParentKey) return undefined;
|
|
72
|
-
// eslint-disable-next-line solid/reactivity --
|
|
74
|
+
// eslint-disable-next-line solid/reactivity -- return function is called within Select's internal JSX tracked scope
|
|
73
75
|
return (item: TItem) => {
|
|
74
76
|
const key = local.data.getKey(item);
|
|
75
77
|
return items().filter((child) => local.data.getParentKey!(child) === key);
|
|
@@ -87,12 +89,12 @@ export function SharedDataSelect<TItem>(props: SharedDataSelectProps<TItem>): JS
|
|
|
87
89
|
<Select {...selectProps}>
|
|
88
90
|
<Select.ItemTemplate>{local.children}</Select.ItemTemplate>
|
|
89
91
|
{local.modal && (
|
|
90
|
-
<Select.Action onClick={() => void handleOpenModal()} aria-label="
|
|
92
|
+
<Select.Action onClick={() => void handleOpenModal()} aria-label={i18n?.t("sharedDataSelect.search") ?? "Search"}>
|
|
91
93
|
<Icon icon={IconSearch} size="1em" />
|
|
92
94
|
</Select.Action>
|
|
93
95
|
)}
|
|
94
96
|
{local.editModal && (
|
|
95
|
-
<Select.Action onClick={() => void handleOpenEditModal()} aria-label="
|
|
97
|
+
<Select.Action onClick={() => void handleOpenEditModal()} aria-label={i18n?.t("sharedDataSelect.edit") ?? "Edit"}>
|
|
96
98
|
<Icon icon={IconEdit} size="1em" />
|
|
97
99
|
</Select.Action>
|
|
98
100
|
)}
|
|
@@ -8,27 +8,27 @@ import { type ComponentSize } from "../../../styles/tokens.styles";
|
|
|
8
8
|
|
|
9
9
|
/** SharedDataSelectButton Props */
|
|
10
10
|
export interface SharedDataSelectButtonProps<TItem> {
|
|
11
|
-
/**
|
|
11
|
+
/** Shared data accessor */
|
|
12
12
|
data: SharedDataAccessor<TItem>;
|
|
13
13
|
|
|
14
|
-
/**
|
|
14
|
+
/** Currently selected key(s) (single or multiple) */
|
|
15
15
|
value?: DataSelectButtonProps<TItem>["value"];
|
|
16
|
-
/**
|
|
16
|
+
/** Value change callback */
|
|
17
17
|
onValueChange?: DataSelectButtonProps<TItem>["onValueChange"];
|
|
18
|
-
/**
|
|
18
|
+
/** Multiple selection mode */
|
|
19
19
|
multiple?: boolean;
|
|
20
|
-
/**
|
|
20
|
+
/** Required input */
|
|
21
21
|
required?: boolean;
|
|
22
|
-
/**
|
|
22
|
+
/** Disabled */
|
|
23
23
|
disabled?: boolean;
|
|
24
|
-
/**
|
|
24
|
+
/** Trigger size */
|
|
25
25
|
size?: ComponentSize;
|
|
26
|
-
/**
|
|
26
|
+
/** Borderless style */
|
|
27
27
|
inset?: boolean;
|
|
28
28
|
|
|
29
|
-
/**
|
|
29
|
+
/** Selection modal component factory */
|
|
30
30
|
modal: () => JSX.Element;
|
|
31
|
-
/**
|
|
31
|
+
/** Item rendering function */
|
|
32
32
|
children: (item: TItem) => JSX.Element;
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -1,85 +1,282 @@
|
|
|
1
|
-
import { createMemo, type JSX, Show, splitProps } from "solid-js";
|
|
1
|
+
import { createEffect, createMemo, createSignal, For, type JSX, Show, splitProps } from "solid-js";
|
|
2
2
|
import { IconExternalLink } from "@tabler/icons-solidjs";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { twMerge } from "tailwind-merge";
|
|
3
5
|
import { type SharedDataAccessor } from "../../../providers/shared-data/SharedDataContext";
|
|
4
|
-
import {
|
|
6
|
+
import { List } from "../../data/list/List";
|
|
7
|
+
import { Pagination } from "../../data/Pagination";
|
|
8
|
+
import { Button } from "../../form-control/Button";
|
|
5
9
|
import { Icon } from "../../display/Icon";
|
|
10
|
+
import { TextInput } from "../../form-control/field/TextInput";
|
|
6
11
|
import { useDialog } from "../../disclosure/DialogContext";
|
|
12
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
13
|
+
import { textMuted } from "../../../styles/tokens.styles";
|
|
14
|
+
import { createSlotSignal } from "../../../hooks/createSlotSignal";
|
|
15
|
+
import {
|
|
16
|
+
SharedDataSelectListContext,
|
|
17
|
+
type SharedDataSelectListContextValue,
|
|
18
|
+
SharedDataSelectListItemTemplate,
|
|
19
|
+
SharedDataSelectListFilter,
|
|
20
|
+
} from "./SharedDataSelectListContext";
|
|
7
21
|
|
|
8
22
|
/** SharedDataSelectList Props */
|
|
9
23
|
export interface SharedDataSelectListProps<TItem> {
|
|
10
|
-
/**
|
|
24
|
+
/** Shared data accessor */
|
|
11
25
|
data: SharedDataAccessor<TItem>;
|
|
12
26
|
|
|
13
|
-
/**
|
|
27
|
+
/** Currently selected value */
|
|
14
28
|
value?: TItem;
|
|
15
|
-
/**
|
|
29
|
+
/** Value change callback */
|
|
16
30
|
onValueChange?: (value: TItem | undefined) => void;
|
|
17
|
-
/**
|
|
31
|
+
/** Required input */
|
|
18
32
|
required?: boolean;
|
|
19
|
-
/**
|
|
33
|
+
/** Disabled */
|
|
20
34
|
disabled?: boolean;
|
|
21
35
|
|
|
22
|
-
/**
|
|
36
|
+
/** Item filter function */
|
|
23
37
|
filterFn?: (item: TItem, index: number) => boolean;
|
|
24
|
-
/**
|
|
38
|
+
/** Value change guard (blocks change if returns false) */
|
|
25
39
|
canChange?: (item: TItem | undefined) => boolean | Promise<boolean>;
|
|
26
|
-
/**
|
|
40
|
+
/** Page size (shows Pagination if provided) */
|
|
27
41
|
pageSize?: number;
|
|
28
|
-
/**
|
|
42
|
+
/** Header text */
|
|
29
43
|
header?: string;
|
|
30
|
-
/**
|
|
44
|
+
/** Management modal component factory */
|
|
31
45
|
modal?: () => JSX.Element;
|
|
32
46
|
|
|
33
|
-
/**
|
|
34
|
-
children
|
|
47
|
+
/** Compound sub-components (ItemTemplate, Filter) */
|
|
48
|
+
children?: JSX.Element;
|
|
49
|
+
|
|
50
|
+
/** Custom class */
|
|
51
|
+
class?: string;
|
|
52
|
+
/** Custom style */
|
|
53
|
+
style?: JSX.CSSProperties;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ─── Styles ──────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
const containerClass = clsx("flex-col gap-1");
|
|
59
|
+
|
|
60
|
+
const headerClass = clsx("flex items-center gap-1 px-2 py-1 text-sm font-semibold");
|
|
61
|
+
|
|
62
|
+
// ─── Component ───────────────────────────────────────────
|
|
63
|
+
|
|
64
|
+
export interface SharedDataSelectListComponent {
|
|
65
|
+
<TItem>(props: SharedDataSelectListProps<TItem>): JSX.Element;
|
|
66
|
+
ItemTemplate: typeof SharedDataSelectListItemTemplate;
|
|
67
|
+
Filter: typeof SharedDataSelectListFilter;
|
|
35
68
|
}
|
|
36
69
|
|
|
37
|
-
export
|
|
38
|
-
|
|
70
|
+
export const SharedDataSelectList: SharedDataSelectListComponent = (<TItem,>(
|
|
71
|
+
props: SharedDataSelectListProps<TItem>,
|
|
72
|
+
): JSX.Element => {
|
|
73
|
+
const [local, rest] = splitProps(props, [
|
|
74
|
+
"data",
|
|
75
|
+
"children",
|
|
76
|
+
"class",
|
|
77
|
+
"style",
|
|
78
|
+
"value",
|
|
79
|
+
"onValueChange",
|
|
80
|
+
"required",
|
|
81
|
+
"disabled",
|
|
82
|
+
"filterFn",
|
|
83
|
+
"canChange",
|
|
84
|
+
"pageSize",
|
|
85
|
+
"header",
|
|
86
|
+
"modal",
|
|
87
|
+
]);
|
|
39
88
|
|
|
40
89
|
const dialog = useDialog();
|
|
90
|
+
const i18n = useI18nOptional();
|
|
91
|
+
|
|
92
|
+
// ─── Slot signals ──────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
const [filter, setFilter] = createSlotSignal();
|
|
95
|
+
const [itemTemplate, _setItemTemplate] = createSignal<
|
|
96
|
+
((item: TItem, index: number) => JSX.Element) | undefined
|
|
97
|
+
>();
|
|
98
|
+
const setItemTemplate = (fn: ((...args: unknown[]) => JSX.Element) | undefined) =>
|
|
99
|
+
_setItemTemplate(() => fn as ((item: TItem, index: number) => JSX.Element) | undefined);
|
|
100
|
+
|
|
101
|
+
const contextValue: SharedDataSelectListContextValue = {
|
|
102
|
+
setItemTemplate,
|
|
103
|
+
setFilter,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// ─── Search state ──────────────────────────────────────
|
|
107
|
+
|
|
108
|
+
const [searchText, setSearchText] = createSignal("");
|
|
109
|
+
|
|
110
|
+
// Reset search text when filter slot changes
|
|
111
|
+
createEffect(() => {
|
|
112
|
+
if (filter()) {
|
|
113
|
+
setSearchText("");
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// ─── Pagination state ─────────────────────────────────
|
|
118
|
+
|
|
119
|
+
const [page, setPage] = createSignal(1);
|
|
120
|
+
|
|
121
|
+
// ─── Filtering pipeline ─────────────────────────────────
|
|
122
|
+
|
|
123
|
+
const filteredItems = createMemo(() => {
|
|
124
|
+
let result = local.data.items();
|
|
125
|
+
|
|
126
|
+
// getIsHidden filter
|
|
127
|
+
const isHidden = local.data.getIsHidden;
|
|
128
|
+
if (isHidden) {
|
|
129
|
+
result = result.filter((item) => !isHidden(item));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Search filter (only when Filter compound is absent and getSearchText exists)
|
|
133
|
+
const getSearchText = local.data.getSearchText;
|
|
134
|
+
if (!filter() && getSearchText && searchText()) {
|
|
135
|
+
const terms = searchText().trim().split(" ").filter(Boolean);
|
|
136
|
+
if (terms.length > 0) {
|
|
137
|
+
result = result.filter((item) => {
|
|
138
|
+
const text = getSearchText(item).toLowerCase();
|
|
139
|
+
return terms.every((t) => text.includes(t.toLowerCase()));
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// filterFn
|
|
145
|
+
if (local.filterFn) {
|
|
146
|
+
const fn = local.filterFn;
|
|
147
|
+
result = result.filter((item, index) => fn(item, index));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return result;
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// ─── Page calculation ───────────────────────────────────────
|
|
41
154
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (!local.filterFn) return allItems;
|
|
46
|
-
return allItems.filter(local.filterFn);
|
|
155
|
+
const totalPageCount = createMemo(() => {
|
|
156
|
+
if (local.pageSize == null) return 1;
|
|
157
|
+
return Math.max(1, Math.ceil(filteredItems().length / local.pageSize));
|
|
47
158
|
});
|
|
48
159
|
|
|
49
|
-
//
|
|
160
|
+
// Reset page when filter changes
|
|
161
|
+
createEffect(() => {
|
|
162
|
+
void filteredItems();
|
|
163
|
+
setPage(1);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Page slice
|
|
167
|
+
const displayItems = createMemo(() => {
|
|
168
|
+
const items = filteredItems();
|
|
169
|
+
if (local.pageSize == null) return items;
|
|
170
|
+
|
|
171
|
+
const start = (page() - 1) * local.pageSize;
|
|
172
|
+
const end = start + local.pageSize;
|
|
173
|
+
return items.slice(start, end);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// ─── Select/toggle handler ─────────────────────────────
|
|
177
|
+
|
|
178
|
+
const handleSelect = async (item: TItem | undefined) => {
|
|
179
|
+
if (local.disabled) return;
|
|
180
|
+
|
|
181
|
+
// canChange guard
|
|
182
|
+
if (local.canChange) {
|
|
183
|
+
const allowed = await local.canChange(item);
|
|
184
|
+
if (!allowed) return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Toggle: click already selected value to deselect (only if not required)
|
|
188
|
+
if (item !== undefined && item === local.value && !local.required) {
|
|
189
|
+
local.onValueChange?.(undefined);
|
|
190
|
+
} else {
|
|
191
|
+
local.onValueChange?.(item);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// ─── Open modal ────────────────────────────────────────
|
|
196
|
+
|
|
50
197
|
const handleOpenModal = async () => {
|
|
51
198
|
if (!local.modal) return;
|
|
52
199
|
await dialog.show(local.modal, {});
|
|
53
200
|
};
|
|
54
201
|
|
|
202
|
+
// ─── Render ────────────────────────────────────────────
|
|
203
|
+
|
|
55
204
|
return (
|
|
56
|
-
<
|
|
57
|
-
{
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
</Show>
|
|
205
|
+
<SharedDataSelectListContext.Provider value={contextValue}>
|
|
206
|
+
{/* Render children inside Provider so sub-components (ItemTemplate, Filter) can access context */}
|
|
207
|
+
{local.children}
|
|
208
|
+
<div
|
|
209
|
+
{...rest}
|
|
210
|
+
data-shared-data-select-list
|
|
211
|
+
class={twMerge(containerClass, local.class)}
|
|
212
|
+
style={local.style}
|
|
213
|
+
>
|
|
214
|
+
{/* Header */}
|
|
215
|
+
<Show when={local.header != null || local.modal != null}>
|
|
216
|
+
<div class={headerClass}>
|
|
217
|
+
<Show when={local.header != null}>{local.header}</Show>
|
|
69
218
|
<Show when={local.modal != null}>
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
aria-label="관리"
|
|
74
|
-
onClick={() => void handleOpenModal()}
|
|
75
|
-
>
|
|
76
|
-
<Icon icon={IconExternalLink} size="1em" />
|
|
77
|
-
</button>
|
|
219
|
+
<Button size="sm" onClick={() => void handleOpenModal()}>
|
|
220
|
+
<Icon icon={IconExternalLink} />
|
|
221
|
+
</Button>
|
|
78
222
|
</Show>
|
|
79
223
|
</div>
|
|
80
|
-
</
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
224
|
+
</Show>
|
|
225
|
+
|
|
226
|
+
{/* Search input: when Filter compound is absent and getSearchText exists */}
|
|
227
|
+
<Show when={!filter() && local.data.getSearchText}>
|
|
228
|
+
<TextInput
|
|
229
|
+
value={searchText()}
|
|
230
|
+
onValueChange={setSearchText}
|
|
231
|
+
placeholder={i18n?.t("sharedDataSelectList.searchPlaceholder") ?? "Search..."}
|
|
232
|
+
size="sm"
|
|
233
|
+
inset
|
|
234
|
+
/>
|
|
235
|
+
</Show>
|
|
236
|
+
|
|
237
|
+
{/* Custom Filter */}
|
|
238
|
+
<Show when={filter()}>{filter()!()}</Show>
|
|
239
|
+
|
|
240
|
+
{/* Pagination */}
|
|
241
|
+
<Show when={local.pageSize != null && totalPageCount() > 1}>
|
|
242
|
+
<Pagination
|
|
243
|
+
page={page()}
|
|
244
|
+
onPageChange={setPage}
|
|
245
|
+
totalPageCount={totalPageCount()}
|
|
246
|
+
size="sm"
|
|
247
|
+
/>
|
|
248
|
+
</Show>
|
|
249
|
+
|
|
250
|
+
{/* List */}
|
|
251
|
+
<List inset>
|
|
252
|
+
{/* Unspecified item (when not required) */}
|
|
253
|
+
<Show when={!local.required}>
|
|
254
|
+
<List.Item
|
|
255
|
+
selected={local.value === undefined}
|
|
256
|
+
disabled={local.disabled}
|
|
257
|
+
onClick={() => handleSelect(undefined)}
|
|
258
|
+
>
|
|
259
|
+
<span class={textMuted}>Unspecified</span>
|
|
260
|
+
</List.Item>
|
|
261
|
+
</Show>
|
|
262
|
+
|
|
263
|
+
{/* Item list */}
|
|
264
|
+
<For each={displayItems()}>
|
|
265
|
+
{(item, index) => (
|
|
266
|
+
<List.Item
|
|
267
|
+
selected={item === local.value}
|
|
268
|
+
disabled={local.disabled}
|
|
269
|
+
onClick={() => handleSelect(item)}
|
|
270
|
+
>
|
|
271
|
+
{itemTemplate()?.(item, index())}
|
|
272
|
+
</List.Item>
|
|
273
|
+
)}
|
|
274
|
+
</For>
|
|
275
|
+
</List>
|
|
276
|
+
</div>
|
|
277
|
+
</SharedDataSelectListContext.Provider>
|
|
84
278
|
);
|
|
85
|
-
}
|
|
279
|
+
}) as SharedDataSelectListComponent;
|
|
280
|
+
|
|
281
|
+
SharedDataSelectList.ItemTemplate = SharedDataSelectListItemTemplate;
|
|
282
|
+
SharedDataSelectList.Filter = SharedDataSelectListFilter;
|