@simplysm/solid 13.0.69 → 13.0.71
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 +26 -24
- package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
- package/dist/components/disclosure/Dropdown.js +24 -8
- package/dist/components/disclosure/Dropdown.js.map +2 -2
- package/dist/components/disclosure/Tabs.js +1 -1
- package/dist/components/disclosure/Tabs.js.map +1 -1
- package/dist/components/disclosure/dialogZIndex.d.ts +9 -7
- package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
- package/dist/components/disclosure/dialogZIndex.js +4 -0
- package/dist/components/disclosure/dialogZIndex.js.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.js +34 -22
- 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 +48 -33
- package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
- package/dist/components/features/crudRegistry.d.ts +16 -0
- package/dist/components/features/crudRegistry.d.ts.map +1 -0
- package/dist/components/features/crudRegistry.js +37 -0
- package/dist/components/features/crudRegistry.js.map +6 -0
- 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 +74 -85
- 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 +10 -6
- 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 -15
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js +191 -65
- 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 +7 -3
- package/dist/helpers/createAppStructure.js.map +1 -1
- package/dist/helpers/createHmrSafeContext.d.ts +3 -0
- package/dist/helpers/createHmrSafeContext.d.ts.map +1 -0
- package/dist/helpers/createHmrSafeContext.js +10 -0
- package/dist/helpers/createHmrSafeContext.js.map +6 -0
- 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.d.ts.map +1 -1
- package/dist/hooks/createSelectionGroup.js +4 -3
- package/dist/hooks/createSelectionGroup.js.map +2 -2
- 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 +9 -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 +89 -75
- package/src/components/disclosure/Tabs.tsx +1 -1
- package/src/components/disclosure/dialogZIndex.ts +16 -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 +34 -21
- 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 +52 -40
- 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/crudRegistry.ts +60 -0
- package/src/components/features/data-select-button/DataSelectButton.tsx +34 -32
- package/src/components/features/permission-table/PermissionTable.tsx +70 -64
- package/src/components/features/shared-data/SharedDataSelect.tsx +24 -22
- package/src/components/features/shared-data/SharedDataSelectButton.tsx +10 -10
- package/src/components/features/shared-data/SharedDataSelectList.tsx +231 -59
- 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 +82 -86
- 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 +15 -8
- package/src/helpers/createHmrSafeContext.ts +8 -0
- 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 +5 -3
- 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 +333 -0
- package/tests/components/disclosure/Tabs.spec.tsx +220 -0
- package/tests/components/disclosure/dialogZIndex.spec.ts +45 -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/crudRegistry.spec.ts +119 -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 +448 -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
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { onCleanup, onMount, type ParentComponent } from "solid-js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Provider that includes form control values in clipboard copy.
|
|
5
5
|
*
|
|
6
6
|
* @remarks
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Fixes the browser default behavior where `<input>`, `<textarea>`, `<select>` values
|
|
8
|
+
* are not included when copying after drag selection.
|
|
9
9
|
*
|
|
10
10
|
* - `<input type="text|number|...">` → `.value`
|
|
11
11
|
* - `<textarea>` → `.value`
|
|
12
|
-
* - `<select>` →
|
|
12
|
+
* - `<select>` → selected option text
|
|
13
13
|
* - `<input type="checkbox|radio">` → `.checked` ? "Y" : ""
|
|
14
|
-
* -
|
|
14
|
+
* - Within tables: tab (`\t`) between cells, newline (`\n`) between rows (Excel compatible)
|
|
15
15
|
*/
|
|
16
16
|
export const ClipboardProvider: ParentComponent = (props) => {
|
|
17
17
|
onMount(() => {
|
|
@@ -35,10 +35,10 @@ export const ClipboardProvider: ParentComponent = (props) => {
|
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
38
|
+
* Extracts text from a Selection Range.
|
|
39
|
+
* Substitutes form controls with their values and converts table structures to TSV format.
|
|
40
40
|
*
|
|
41
|
-
* @returns
|
|
41
|
+
* @returns Extracted text. Returns `null` if no form controls are present (preserves browser default behavior)
|
|
42
42
|
*/
|
|
43
43
|
function extractTextFromRange(range: Range): string | null {
|
|
44
44
|
const root =
|
|
@@ -47,7 +47,7 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
47
47
|
: range.commonAncestorContainer.parentElement;
|
|
48
48
|
if (!root) return null;
|
|
49
49
|
|
|
50
|
-
//
|
|
50
|
+
// Use browser default behavior if no form controls in selection range
|
|
51
51
|
const formSelector =
|
|
52
52
|
'input:not([type=hidden]), textarea, select, [role="checkbox"], [role="radio"]';
|
|
53
53
|
const hasFormElements = [...root.querySelectorAll(formSelector)].some((el) =>
|
|
@@ -60,7 +60,7 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
60
60
|
const walk = (node: Node) => {
|
|
61
61
|
if (!range.intersectsNode(node)) return;
|
|
62
62
|
|
|
63
|
-
// ARIA checkbox/radio: role="checkbox"
|
|
63
|
+
// ARIA checkbox/radio: elements with role="checkbox" or role="radio"
|
|
64
64
|
if (node instanceof Element) {
|
|
65
65
|
const role = node.getAttribute("role");
|
|
66
66
|
if (role === "checkbox" || role === "radio") {
|
|
@@ -69,7 +69,7 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
//
|
|
72
|
+
// Form control: extract value
|
|
73
73
|
if (node instanceof HTMLInputElement) {
|
|
74
74
|
if (node.type === "hidden") return;
|
|
75
75
|
if (node.type === "checkbox" || node.type === "radio") {
|
|
@@ -81,7 +81,7 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
81
81
|
}
|
|
82
82
|
if (node instanceof HTMLTextAreaElement) {
|
|
83
83
|
const v = node.value;
|
|
84
|
-
//
|
|
84
|
+
// Wrap in double quotes when containing newlines to preserve line breaks within Excel cells
|
|
85
85
|
parts.push(v.includes("\n") ? `"${v.replace(/"/g, '""')}"` : v);
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
@@ -92,9 +92,9 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
92
92
|
return;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
//
|
|
95
|
+
// Text node
|
|
96
96
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
97
|
-
//
|
|
97
|
+
// Skip hidden text (dual-element overlay pattern, etc.)
|
|
98
98
|
const parent = node.parentElement;
|
|
99
99
|
if (parent) {
|
|
100
100
|
const style = getComputedStyle(parent);
|
|
@@ -115,7 +115,7 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
// Element
|
|
118
|
+
// Non-Element node
|
|
119
119
|
if (!(node instanceof Element)) {
|
|
120
120
|
for (const child of node.childNodes) walk(child);
|
|
121
121
|
return;
|
|
@@ -127,7 +127,7 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
127
127
|
return;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
//
|
|
130
|
+
// Table row: tab-separated cells, newline at end of row
|
|
131
131
|
if (node.tagName === "TR") {
|
|
132
132
|
let firstCell = true;
|
|
133
133
|
for (const child of node.childNodes) {
|
|
@@ -142,7 +142,7 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
142
142
|
return;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
//
|
|
145
|
+
// Default: traverse children
|
|
146
146
|
for (const child of node.childNodes) {
|
|
147
147
|
walk(child);
|
|
148
148
|
}
|
|
@@ -154,11 +154,11 @@ function extractTextFromRange(range: Range): string | null {
|
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
/**
|
|
157
|
-
* input value
|
|
157
|
+
* Converts input value to locale format.
|
|
158
158
|
* - `date` → `toLocaleDateString()`
|
|
159
159
|
* - `time` → `toLocaleTimeString()`
|
|
160
160
|
* - `datetime-local` → `toLocaleString()`
|
|
161
|
-
* -
|
|
161
|
+
* - Others → original value as-is
|
|
162
162
|
*/
|
|
163
163
|
function formatInputValue(input: HTMLInputElement): string {
|
|
164
164
|
const { type, value } = input;
|
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
import { createContext, useContext, type ParentComponent } from "solid-js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* App-wide configuration.
|
|
5
5
|
*/
|
|
6
6
|
export interface AppConfig {
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Client identifier (used as storage key prefix)
|
|
9
9
|
*/
|
|
10
10
|
clientName: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* App-wide configuration Context.
|
|
15
15
|
*/
|
|
16
16
|
export const ConfigContext = createContext<AppConfig>();
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* Hook to access app-wide configuration.
|
|
20
20
|
*
|
|
21
|
-
* @throws ConfigProvider
|
|
21
|
+
* @throws Throws an error if ConfigProvider is not present
|
|
22
22
|
*/
|
|
23
23
|
export function useConfig(): AppConfig {
|
|
24
24
|
const context = useContext(ConfigContext);
|
|
25
25
|
if (!context) {
|
|
26
|
-
throw new Error("useConfig
|
|
26
|
+
throw new Error("useConfig can only be used inside ConfigProvider");
|
|
27
27
|
}
|
|
28
28
|
return context;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* App-wide configuration Provider.
|
|
33
33
|
*
|
|
34
34
|
* @example
|
|
35
35
|
* ```tsx
|
|
@@ -40,7 +40,7 @@ export function useConfig(): AppConfig {
|
|
|
40
40
|
*/
|
|
41
41
|
export const ConfigProvider: ParentComponent<{ clientName: string }> = (props) => {
|
|
42
42
|
return (
|
|
43
|
-
// eslint-disable-next-line solid/reactivity -- clientName
|
|
43
|
+
// eslint-disable-next-line solid/reactivity -- clientName is an initial config value that does not change
|
|
44
44
|
<ConfigContext.Provider value={{ clientName: props.clientName }}>
|
|
45
45
|
{props.children}
|
|
46
46
|
</ConfigContext.Provider>
|
|
@@ -2,11 +2,11 @@ import { onCleanup, type ParentComponent } from "solid-js";
|
|
|
2
2
|
import { useLogger } from "../hooks/useLogger";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Global error capture Provider.
|
|
6
6
|
*
|
|
7
7
|
* @remarks
|
|
8
|
-
* window.onerror
|
|
9
|
-
*
|
|
8
|
+
* Captures window.onerror and unhandledrejection events and logs them via useLogger.
|
|
9
|
+
* Falls back to consola if LoggerProvider is not present.
|
|
10
10
|
*/
|
|
11
11
|
export const ErrorLoggerProvider: ParentComponent = (props) => {
|
|
12
12
|
const logger = useLogger();
|
|
@@ -2,11 +2,11 @@ import { type Accessor, createContext, createSignal, type ParentComponent } from
|
|
|
2
2
|
import { consola } from "consola";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Log adapter interface.
|
|
6
6
|
*
|
|
7
7
|
* @remarks
|
|
8
|
-
* -
|
|
9
|
-
* - adapter
|
|
8
|
+
* - Log transport adapter used by `useLogger` (DB, server, etc.)
|
|
9
|
+
* - When an adapter is set, only the adapter is used instead of consola
|
|
10
10
|
*/
|
|
11
11
|
export interface LogAdapter {
|
|
12
12
|
write(severity: "error" | "warn" | "info" | "log", ...data: any[]): Promise<void> | void;
|
|
@@ -17,11 +17,11 @@ const defaultLogAdapter: LogAdapter = {
|
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* Logger context value.
|
|
21
21
|
*
|
|
22
22
|
* @remarks
|
|
23
|
-
* - `adapter`:
|
|
24
|
-
* - `configure`:
|
|
23
|
+
* - `adapter`: Currently configured LogAdapter (signal). Defaults to consola-based adapter
|
|
24
|
+
* - `configure`: Function that sets/chains adapter via decorator function
|
|
25
25
|
*/
|
|
26
26
|
export interface LoggerContextValue {
|
|
27
27
|
adapter: Accessor<LogAdapter>;
|
|
@@ -29,20 +29,20 @@ export interface LoggerContextValue {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* Log adapter Context.
|
|
33
33
|
*
|
|
34
34
|
* @remarks
|
|
35
|
-
*
|
|
35
|
+
* Returns `undefined` without Provider (useLogger uses consola default adapter)
|
|
36
36
|
*/
|
|
37
37
|
export const LoggerContext = createContext<LoggerContextValue>();
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
|
-
*
|
|
40
|
+
* Log adapter Provider.
|
|
41
41
|
*
|
|
42
42
|
* @remarks
|
|
43
|
-
* -
|
|
44
|
-
* -
|
|
45
|
-
* - configure
|
|
43
|
+
* - Used without props. Adapter is injected later via `useLogger().configure()`
|
|
44
|
+
* - Defaults to consola-based adapter
|
|
45
|
+
* - configure accepts a decorator function to wrap or replace the existing adapter
|
|
46
46
|
*
|
|
47
47
|
* @example
|
|
48
48
|
* ```tsx
|
|
@@ -50,7 +50,7 @@ export const LoggerContext = createContext<LoggerContextValue>();
|
|
|
50
50
|
* <App />
|
|
51
51
|
* </LoggerProvider>
|
|
52
52
|
*
|
|
53
|
-
* //
|
|
53
|
+
* // Configure with a decorator in a child component:
|
|
54
54
|
* useLogger().configure((origin) => ({
|
|
55
55
|
* write: (...args) => {
|
|
56
56
|
* origin.write(...args);
|
|
@@ -4,13 +4,13 @@ import { useNotification } from "../components/feedback/notification/Notificatio
|
|
|
4
4
|
const UPDATE_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* PWA Service Worker
|
|
7
|
+
* PWA Service Worker update detection Provider.
|
|
8
8
|
*
|
|
9
9
|
* @remarks
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* Polls for SW updates every 5 minutes and displays a notification when a new version is detected.
|
|
11
|
+
* Must be used inside NotificationProvider.
|
|
12
12
|
*
|
|
13
|
-
* navigator.serviceWorker
|
|
13
|
+
* Graceful no-op if navigator.serviceWorker is unavailable or no SW is registered.
|
|
14
14
|
*/
|
|
15
15
|
export const PwaUpdateProvider: ParentComponent = (props) => {
|
|
16
16
|
if (typeof navigator !== "undefined" && "serviceWorker" in navigator) {
|
|
@@ -53,9 +53,9 @@ export const PwaUpdateProvider: ParentComponent = (props) => {
|
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
function promptUpdate(waitingSW: ServiceWorker): void {
|
|
56
|
-
notification.info("
|
|
56
|
+
notification.info("App updated", "Refresh to use the latest version", {
|
|
57
57
|
action: {
|
|
58
|
-
label: "
|
|
58
|
+
label: "Refresh",
|
|
59
59
|
onClick: () => {
|
|
60
60
|
waitingSW.postMessage({ type: "SKIP_WAITING" });
|
|
61
61
|
},
|
|
@@ -2,31 +2,31 @@ import { createContext, useContext } from "solid-js";
|
|
|
2
2
|
import type { ServiceClient, ServiceConnectionConfig } from "@simplysm/service-client";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* WebSocket
|
|
5
|
+
* WebSocket service client context value.
|
|
6
6
|
*/
|
|
7
7
|
export interface ServiceClientContextValue {
|
|
8
|
-
/** WebSocket
|
|
8
|
+
/** Open a WebSocket connection (defaults to "default" if key is omitted) */
|
|
9
9
|
connect: (key?: string, options?: Partial<ServiceConnectionConfig>) => Promise<void>;
|
|
10
|
-
/**
|
|
10
|
+
/** Close a connection */
|
|
11
11
|
close: (key?: string) => Promise<void>;
|
|
12
|
-
/**
|
|
12
|
+
/** Get a connected client instance (throws if the key is not connected) */
|
|
13
13
|
get: (key?: string) => ServiceClient;
|
|
14
|
-
/**
|
|
14
|
+
/** Check connection status */
|
|
15
15
|
isConnected: (key?: string) => boolean;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
/** WebSocket
|
|
18
|
+
/** WebSocket service client Context */
|
|
19
19
|
export const ServiceClientContext = createContext<ServiceClientContextValue>();
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
22
|
+
* Hook to access the WebSocket service client.
|
|
23
23
|
*
|
|
24
|
-
* @throws ServiceClientProvider
|
|
24
|
+
* @throws Throws an error if ServiceClientProvider is not present
|
|
25
25
|
*/
|
|
26
26
|
export function useServiceClient(): ServiceClientContextValue {
|
|
27
27
|
const context = useContext(ServiceClientContext);
|
|
28
28
|
if (!context) {
|
|
29
|
-
throw new Error("useServiceClient
|
|
29
|
+
throw new Error("useServiceClient can only be used inside ServiceClientProvider");
|
|
30
30
|
}
|
|
31
31
|
return context;
|
|
32
32
|
}
|
|
@@ -9,14 +9,14 @@ import { useConfig } from "./ConfigContext";
|
|
|
9
9
|
import { useNotification } from "../components/feedback/notification/NotificationContext";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* WebSocket
|
|
12
|
+
* WebSocket service client Provider.
|
|
13
13
|
*
|
|
14
14
|
* @remarks
|
|
15
|
-
* -
|
|
16
|
-
* -
|
|
17
|
-
* -
|
|
18
|
-
* - host, port, ssl
|
|
19
|
-
* -
|
|
15
|
+
* - Must be used inside ConfigProvider and NotificationProvider
|
|
16
|
+
* - Key-based multi-connection management
|
|
17
|
+
* - Displays request/response progress as NotificationProvider alerts
|
|
18
|
+
* - Auto-infers host, port, ssl from window.location when not specified
|
|
19
|
+
* - Automatically closes all connections on cleanup
|
|
20
20
|
*
|
|
21
21
|
* @example
|
|
22
22
|
* ```tsx
|
|
@@ -53,9 +53,9 @@ export const ServiceClientProvider: ParentComponent = (props) => {
|
|
|
53
53
|
if (clientMap.has(resolvedKey)) {
|
|
54
54
|
const existing = clientMap.get(resolvedKey)!;
|
|
55
55
|
if (!existing.connected) {
|
|
56
|
-
throw new Error("
|
|
56
|
+
throw new Error("Attempted to connect with the same key as a disconnected client.");
|
|
57
57
|
} else {
|
|
58
|
-
throw new Error("
|
|
58
|
+
throw new Error("Attempted to connect with the same key as an already connected client.");
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
@@ -70,12 +70,12 @@ export const ServiceClientProvider: ParentComponent = (props) => {
|
|
|
70
70
|
...options,
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
//
|
|
73
|
+
// Request progress event
|
|
74
74
|
client.on("request-progress", (state) => {
|
|
75
75
|
const existing = reqProgressMap.get(state.uuid);
|
|
76
76
|
|
|
77
77
|
if (existing == null) {
|
|
78
|
-
const id = notification.info("
|
|
78
|
+
const id = notification.info("Sending request", "0%");
|
|
79
79
|
reqProgressMap.set(state.uuid, id);
|
|
80
80
|
} else {
|
|
81
81
|
const percent = Math.round((state.completedSize / state.totalSize) * 100);
|
|
@@ -88,7 +88,7 @@ export const ServiceClientProvider: ParentComponent = (props) => {
|
|
|
88
88
|
notification.update(
|
|
89
89
|
id,
|
|
90
90
|
{
|
|
91
|
-
title: "
|
|
91
|
+
title: "Request transmission completed",
|
|
92
92
|
message: "100%",
|
|
93
93
|
},
|
|
94
94
|
{ renotify: true },
|
|
@@ -98,12 +98,12 @@ export const ServiceClientProvider: ParentComponent = (props) => {
|
|
|
98
98
|
}
|
|
99
99
|
});
|
|
100
100
|
|
|
101
|
-
//
|
|
101
|
+
// Response progress event
|
|
102
102
|
client.on("response-progress", (state) => {
|
|
103
103
|
const existing = resProgressMap.get(state.uuid);
|
|
104
104
|
|
|
105
105
|
if (existing == null) {
|
|
106
|
-
const id = notification.info("
|
|
106
|
+
const id = notification.info("Receiving response", "0%");
|
|
107
107
|
resProgressMap.set(state.uuid, id);
|
|
108
108
|
} else {
|
|
109
109
|
const percent = Math.round((state.completedSize / state.totalSize) * 100);
|
|
@@ -116,7 +116,7 @@ export const ServiceClientProvider: ParentComponent = (props) => {
|
|
|
116
116
|
notification.update(
|
|
117
117
|
id,
|
|
118
118
|
{
|
|
119
|
-
title: "
|
|
119
|
+
title: "Response reception completed",
|
|
120
120
|
message: "100%",
|
|
121
121
|
},
|
|
122
122
|
{ renotify: true },
|
|
@@ -143,7 +143,7 @@ export const ServiceClientProvider: ParentComponent = (props) => {
|
|
|
143
143
|
const resolvedKey = key ?? "default";
|
|
144
144
|
const client = clientMap.get(resolvedKey);
|
|
145
145
|
if (!client) {
|
|
146
|
-
throw new Error(
|
|
146
|
+
throw new Error(`Client key not connected: ${resolvedKey}`);
|
|
147
147
|
}
|
|
148
148
|
return client;
|
|
149
149
|
};
|
|
@@ -7,11 +7,11 @@ import {
|
|
|
7
7
|
} from "solid-js";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Custom sync storage adapter interface.
|
|
11
11
|
*
|
|
12
12
|
* @remarks
|
|
13
|
-
* -
|
|
14
|
-
* -
|
|
13
|
+
* - Sync storage: can pass `localStorage`, `sessionStorage`, etc. directly
|
|
14
|
+
* - Async storage: pass an implementation where `getItem` returns a `Promise`
|
|
15
15
|
*/
|
|
16
16
|
export interface StorageAdapter {
|
|
17
17
|
getItem(key: string): string | null | Promise<string | null>;
|
|
@@ -20,7 +20,7 @@ export interface StorageAdapter {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* Default localStorage-based adapter.
|
|
24
24
|
*/
|
|
25
25
|
const defaultStorageAdapter: StorageAdapter = {
|
|
26
26
|
getItem: (key) => localStorage.getItem(key),
|
|
@@ -29,11 +29,11 @@ const defaultStorageAdapter: StorageAdapter = {
|
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* Sync storage context value.
|
|
33
33
|
*
|
|
34
34
|
* @remarks
|
|
35
|
-
* - `adapter`:
|
|
36
|
-
* - `configure`: decorator
|
|
35
|
+
* - `adapter`: Currently configured StorageAdapter (signal). Defaults to localStorage-based adapter
|
|
36
|
+
* - `configure`: Function that accepts a decorator function to wrap the existing adapter into a new one
|
|
37
37
|
*/
|
|
38
38
|
export interface SyncStorageContextValue {
|
|
39
39
|
adapter: Accessor<StorageAdapter>;
|
|
@@ -41,28 +41,28 @@ export interface SyncStorageContextValue {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Sync storage Context.
|
|
45
45
|
*
|
|
46
46
|
* @remarks
|
|
47
|
-
*
|
|
47
|
+
* Returns `undefined` without Provider (useSyncConfig falls back to localStorage)
|
|
48
48
|
*/
|
|
49
49
|
export const SyncStorageContext = createContext<SyncStorageContextValue>();
|
|
50
50
|
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
52
|
+
* Hook to access the sync storage Context.
|
|
53
53
|
*
|
|
54
|
-
* @returns SyncStorageContextValue
|
|
54
|
+
* @returns SyncStorageContextValue or undefined (if Provider is not present)
|
|
55
55
|
*/
|
|
56
56
|
export function useSyncStorage(): SyncStorageContextValue | undefined {
|
|
57
57
|
return useContext(SyncStorageContext);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
61
|
+
* Sync storage Provider.
|
|
62
62
|
*
|
|
63
63
|
* @remarks
|
|
64
|
-
* -
|
|
65
|
-
* - `configure()
|
|
64
|
+
* - Used without props. localStorage-based adapter is set by default
|
|
65
|
+
* - Use `configure()` to pass a decorator function to wrap or replace the existing adapter
|
|
66
66
|
*
|
|
67
67
|
* @example
|
|
68
68
|
* ```tsx
|
|
@@ -70,7 +70,7 @@ export function useSyncStorage(): SyncStorageContextValue | undefined {
|
|
|
70
70
|
* <App />
|
|
71
71
|
* </SyncStorageProvider>
|
|
72
72
|
*
|
|
73
|
-
* //
|
|
73
|
+
* // Customize adapter with decorator pattern in a child component:
|
|
74
74
|
* useSyncStorage()!.configure((origin) => ({
|
|
75
75
|
* getItem: (key) => myCustomGetItem(key),
|
|
76
76
|
* setItem: origin.setItem,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ParentComponent } from "solid-js";
|
|
2
2
|
import { ConfigProvider } from "./ConfigContext";
|
|
3
|
+
import { I18nProvider } from "./i18n/I18nContext";
|
|
3
4
|
import { SyncStorageProvider } from "./SyncStorageContext";
|
|
4
5
|
import { LoggerProvider } from "./LoggerContext";
|
|
5
6
|
import { NotificationProvider } from "../components/feedback/notification/NotificationProvider";
|
|
@@ -21,17 +22,18 @@ export const SystemProvider: ParentComponent<{
|
|
|
21
22
|
}> = (props) => {
|
|
22
23
|
return (
|
|
23
24
|
<ConfigProvider clientName={props.clientName}>
|
|
24
|
-
<
|
|
25
|
-
<
|
|
26
|
-
<
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
<
|
|
30
|
-
<
|
|
31
|
-
<
|
|
32
|
-
<
|
|
33
|
-
<
|
|
34
|
-
<
|
|
25
|
+
<I18nProvider>
|
|
26
|
+
<SyncStorageProvider>
|
|
27
|
+
<LoggerProvider>
|
|
28
|
+
<NotificationProvider>
|
|
29
|
+
<NotificationBanner />
|
|
30
|
+
<ErrorLoggerProvider>
|
|
31
|
+
<PwaUpdateProvider>
|
|
32
|
+
<ClipboardProvider>
|
|
33
|
+
<ThemeProvider>
|
|
34
|
+
<ServiceClientProvider>
|
|
35
|
+
<SharedDataProvider>
|
|
36
|
+
<BusyProvider variant={props.busyVariant}>{props.children}</BusyProvider>
|
|
35
37
|
</SharedDataProvider>
|
|
36
38
|
</ServiceClientProvider>
|
|
37
39
|
</ThemeProvider>
|
|
@@ -40,7 +42,8 @@ export const SystemProvider: ParentComponent<{
|
|
|
40
42
|
</ErrorLoggerProvider>
|
|
41
43
|
</NotificationProvider>
|
|
42
44
|
</LoggerProvider>
|
|
43
|
-
|
|
45
|
+
</SyncStorageProvider>
|
|
46
|
+
</I18nProvider>
|
|
44
47
|
</ConfigProvider>
|
|
45
48
|
);
|
|
46
49
|
};
|