@svadmin/ui 0.70.0 → 0.73.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -25
- package/THIRD_PARTY_NOTICES.md +52 -0
- package/dist/actions.js +1 -1
- package/dist/app.css +7804 -5188
- package/dist/app.theme.css +7738 -5173
- package/dist/class-properties.generated.d.ts +1 -0
- package/dist/class-properties.generated.js +2 -0
- package/dist/classnames.d.ts +8 -0
- package/dist/classnames.js +26 -0
- package/dist/component-registry.svelte.d.ts +33 -19
- package/dist/component-registry.svelte.js +6 -4
- package/dist/components/AdminApp.svelte +55 -53
- package/dist/components/AdminApp.svelte.d.ts +2 -2
- package/dist/components/ApiSettings.svelte +19 -1
- package/dist/components/AuditLogDrawer.svelte +14 -3
- package/dist/components/AutoForm.svelte +162 -50
- package/dist/components/AutoForm.svelte.d.ts +4 -0
- package/dist/components/AutoTable.svelte +599 -259
- package/dist/components/AutoTable.svelte.d.ts +6 -0
- package/dist/components/BoundRecordDetailDrawer.svelte +172 -0
- package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +11 -0
- package/dist/components/Breadcrumbs.svelte +7 -4
- package/dist/components/CancelTaskButton.svelte +9 -5
- package/dist/components/ColumnHeaderFilter.svelte +4 -3
- package/dist/components/ColumnSettings.svelte +1 -0
- package/dist/components/ComboboxField.svelte +118 -36
- package/dist/components/ComboboxField.svelte.d.ts +5 -4
- package/dist/components/CreatePage.svelte +7 -1
- package/dist/components/CreatePage.svelte.d.ts +2 -0
- package/dist/components/DateRangeInput.svelte +75 -0
- package/dist/components/DateRangeInput.svelte.d.ts +25 -0
- package/dist/components/DateTimeInput.svelte +65 -0
- package/dist/components/DateTimeInput.svelte.d.ts +19 -0
- package/dist/components/DetailDrawer.svelte +4 -0
- package/dist/components/DetailDrawer.svelte.d.ts +1 -0
- package/dist/components/DevTools.svelte +8 -21
- package/dist/components/DraggableGrid.svelte +1 -0
- package/dist/components/DraggableHeader.svelte +5 -9
- package/dist/components/DraggableHeader.svelte.d.ts +43 -18
- package/dist/components/DraggableRowTable.svelte +2 -2
- package/dist/components/DynamicFormList.svelte +17 -17
- package/dist/components/DynamicFormList.svelte.d.ts +2 -1
- package/dist/components/EditPage.svelte +7 -1
- package/dist/components/EditPage.svelte.d.ts +2 -0
- package/dist/components/EditableTable.svelte +4 -0
- package/dist/components/ErrorPage.svelte +3 -1
- package/dist/components/FieldDisplay.svelte +14 -0
- package/dist/components/FieldDisplay.svelte.d.ts +7 -0
- package/dist/components/FieldRenderer.svelte +96 -20
- package/dist/components/FileUpload.svelte +250 -0
- package/dist/components/FileUpload.svelte.d.ts +32 -0
- package/dist/components/FilterBuilder.svelte +236 -268
- package/dist/components/FilterBuilder.svelte.d.ts +3 -0
- package/dist/components/FilterDropdown.svelte.d.ts +1 -1
- package/dist/components/Header.svelte +5 -6
- package/dist/components/ImportWizard.svelte +182 -94
- package/dist/components/InfiniteList.svelte +22 -8
- package/dist/components/InfiniteList.svelte.d.ts +5 -3
- package/dist/components/InlineEdit.svelte +114 -44
- package/dist/components/JsonSchemaForm.svelte +256 -95
- package/dist/components/JsonSchemaForm.svelte.d.ts +12 -1
- package/dist/components/Layout.svelte +20 -17
- package/dist/components/LazyTaskQueueDrawer.svelte +26 -0
- package/dist/components/LazyTaskQueueDrawer.svelte.d.ts +8 -0
- package/dist/components/ListPage.svelte +11 -6
- package/dist/components/ListPage.svelte.d.ts +2 -0
- package/dist/components/LoginPage.svelte +1 -1
- package/dist/components/MasterDetailView.svelte +3 -3
- package/dist/components/MediaLibraryModal.svelte +5 -2
- package/dist/components/MentionsInput.svelte +4 -3
- package/dist/components/MoneyInput.svelte +25 -0
- package/dist/components/MoneyInput.svelte.d.ts +20 -0
- package/dist/components/NavigateToResource.svelte +3 -2
- package/dist/components/NumberInput.svelte +25 -0
- package/dist/components/NumberInput.svelte.d.ts +19 -0
- package/dist/components/NumericInput.svelte +110 -0
- package/dist/components/NumericInput.svelte.d.ts +23 -0
- package/dist/components/PercentInput.svelte +25 -0
- package/dist/components/PercentInput.svelte.d.ts +20 -0
- package/dist/components/PermissionMatrix.svelte +4 -3
- package/dist/components/ProfilePage.svelte +2 -2
- package/dist/components/QuickEditDrawer.svelte +42 -0
- package/dist/components/QuickEditDrawer.svelte.d.ts +10 -0
- package/dist/components/RecordDetailDrawer.svelte +16 -108
- package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
- package/dist/components/RecordRowActions.svelte +41 -0
- package/dist/components/RecordRowActions.svelte.d.ts +14 -0
- package/dist/components/ResourceAccessGuard.svelte +7 -5
- package/dist/components/ResourceOperationsPage.svelte +25 -19
- package/dist/components/ResourceOperationsPage.svelte.d.ts +5 -1
- package/dist/components/RetryTaskButton.svelte +9 -5
- package/dist/components/RowActions.svelte +5 -3
- package/dist/components/SensitiveDataMask.svelte +3 -3
- package/dist/components/SettingsPage.svelte +1 -1
- package/dist/components/ShowInferencer.svelte +4 -2
- package/dist/components/ShowInferencer.svelte.d.ts +2 -0
- package/dist/components/ShowPage.svelte +49 -39
- package/dist/components/ShowPage.svelte.d.ts +2 -0
- package/dist/components/Sidebar.svelte +15 -13
- package/dist/components/SplitPaneLayout.svelte +4 -2
- package/dist/components/SpreadsheetView.svelte +81 -286
- package/dist/components/StepsForm.svelte +166 -49
- package/dist/components/StepsForm.svelte.d.ts +1 -0
- package/dist/components/SvarAutoTable.svelte +39 -0
- package/dist/components/SvarAutoTable.svelte.d.ts +13 -0
- package/dist/components/SvarDataGrid.svelte +362 -0
- package/dist/components/SvarDataGrid.svelte.d.ts +57 -0
- package/dist/components/SvarGridCell.svelte +10 -0
- package/dist/components/SvarGridCell.svelte.d.ts +7 -0
- package/dist/components/SvarResourceRead.svelte +50 -0
- package/dist/components/SvarResourceRead.svelte.d.ts +23 -0
- package/dist/components/SvarResourceTable.svelte +63 -0
- package/dist/components/SvarResourceTable.svelte.d.ts +42 -0
- package/dist/components/SvarResourceTableView.svelte +364 -0
- package/dist/components/SvarResourceTableView.svelte.d.ts +4 -0
- package/dist/components/TaskDetails.svelte +20 -7
- package/dist/components/TaskList.svelte +19 -7
- package/dist/components/TaskQueueDrawer.svelte +92 -37
- package/dist/components/Toast.svelte +4 -2
- package/dist/components/TooltipButton.svelte +1 -1
- package/dist/components/TreeSelect.svelte +212 -30
- package/dist/components/TreeSelect.svelte.d.ts +3 -1
- package/dist/components/ValidatedField.svelte +27 -0
- package/dist/components/ValidatedField.svelte.d.ts +35 -0
- package/dist/components/account/ImportMembersPage.svelte +2 -2
- package/dist/components/account/SecurityLogPage.svelte +3 -1
- package/dist/components/account/SettingsEnterprisePage.svelte +7 -5
- package/dist/components/account/TeamMembersPage.svelte +1 -1
- package/dist/components/auto-table-grid.d.ts +26 -0
- package/dist/components/auto-table-grid.js +1 -0
- package/dist/components/buttons/CloneButton.svelte +6 -4
- package/dist/components/buttons/DeleteButton.svelte +95 -29
- package/dist/components/buttons/DeleteButton.svelte.d.ts +2 -0
- package/dist/components/buttons/EditButton.svelte +6 -4
- package/dist/components/buttons/ExportButton.svelte +22 -4
- package/dist/components/buttons/ImportButton.svelte +83 -38
- package/dist/components/buttons/ImportButton.svelte.d.ts +6 -10
- package/dist/components/buttons/RefreshButton.svelte +48 -8
- package/dist/components/buttons/ShowButton.svelte +6 -4
- package/dist/components/content/ApiKeyList.svelte +3 -1
- package/dist/components/content/ContentPageHeader.svelte +12 -9
- package/dist/components/content/ContentPageShell.svelte +8 -9
- package/dist/components/content/FileBrowser.svelte +35 -0
- package/dist/components/content/FileBrowser.svelte.d.ts +14 -0
- package/dist/components/content/FileList.svelte +3 -1
- package/dist/components/content/MemberList.svelte +3 -1
- package/dist/components/content/MetricBlock.svelte +10 -13
- package/dist/components/content/NetworkTable.svelte +6 -4
- package/dist/components/content/NetworkTable.svelte.d.ts +1 -0
- package/dist/components/content/PageToolbar.svelte +6 -10
- package/dist/components/content/SectionHeader.svelte +8 -13
- package/dist/components/content/SecurityEventTable.svelte +3 -1
- package/dist/components/content/SettingsFieldRow.svelte +9 -23
- package/dist/components/content/SettingsGroup.svelte +11 -27
- package/dist/components/content/StatusBadge.svelte +3 -8
- package/dist/components/content/StatusTabs.svelte +2 -2
- package/dist/components/content/WorkspaceLayout.svelte +8 -12
- package/dist/components/enterprise/filter-tree.d.ts +48 -0
- package/dist/components/enterprise/filter-tree.js +224 -0
- package/dist/components/enterprise/json-schema-form.d.ts +39 -0
- package/dist/components/enterprise/json-schema-form.js +195 -0
- package/dist/components/enterprise/recursive-schema-form.d.ts +30 -0
- package/dist/components/enterprise/recursive-schema-form.js +196 -0
- package/dist/components/enterprise/spreadsheet-formula.d.ts +12 -0
- package/dist/components/enterprise/spreadsheet-formula.js +245 -0
- package/dist/components/fieldComponentMap.d.ts +18 -13
- package/dist/components/fieldComponentMap.js +100 -47
- package/dist/components/fields/AvatarField.svelte +1 -1
- package/dist/components/fields/ChoiceField.svelte +16 -0
- package/dist/components/fields/ChoiceField.svelte.d.ts +10 -0
- package/dist/components/fields/CodeField.svelte +11 -12
- package/dist/components/fields/CodeField.svelte.d.ts +1 -1
- package/dist/components/fields/DateField.svelte +4 -3
- package/dist/components/fields/DateRangeField.svelte +2 -4
- package/dist/components/fields/ImageField.svelte +3 -1
- package/dist/components/fields/ImagesField.svelte +23 -0
- package/dist/components/fields/ImagesField.svelte.d.ts +6 -0
- package/dist/components/fields/JsonField.svelte +19 -13
- package/dist/components/fields/PasswordField.svelte +5 -0
- package/dist/components/fields/PasswordField.svelte.d.ts +6 -0
- package/dist/components/fields/date-field-value.d.ts +2 -0
- package/dist/components/fields/date-field-value.js +13 -0
- package/dist/components/fields/json-value.d.ts +11 -0
- package/dist/components/fields/json-value.js +28 -0
- package/dist/components/json-schema-form-state.d.ts +37 -0
- package/dist/components/json-schema-form-state.js +168 -0
- package/dist/components/profile/ActivityTimeline.svelte +2 -2
- package/dist/components/record-detail.svelte.d.ts +19 -0
- package/dist/components/record-detail.svelte.js +34 -0
- package/dist/components/saved-list-views.js +29 -29
- package/dist/components/svar-grid-cells.d.ts +14 -0
- package/dist/components/svar-grid-cells.js +2 -0
- package/dist/components/svar-grid-contract.d.ts +80 -0
- package/dist/components/svar-grid-contract.js +159 -0
- package/dist/components/svar-grid-interactions.d.ts +54 -0
- package/dist/components/svar-grid-interactions.js +174 -0
- package/dist/components/svar-grid-loading.d.ts +40 -0
- package/dist/components/svar-grid-loading.js +180 -0
- package/dist/components/svar-grid-operations.d.ts +37 -0
- package/dist/components/svar-grid-operations.js +186 -0
- package/dist/components/svar-grid-panes.d.ts +34 -0
- package/dist/components/svar-grid-panes.js +66 -0
- package/dist/components/svar-grid-resource-loading.d.ts +18 -0
- package/dist/components/svar-grid-resource-loading.js +68 -0
- package/dist/components/svar-grid-resource-session.svelte.d.ts +29 -0
- package/dist/components/svar-grid-resource-session.svelte.js +61 -0
- package/dist/components/table-contract.d.ts +13 -0
- package/dist/components/table-contract.js +42 -0
- package/dist/components/task-utils.js +4 -2
- package/dist/components/ui/alert/alert-variants.d.ts +2 -3
- package/dist/components/ui/alert/alert-variants.js +1 -2
- package/dist/components/ui/alert/alert.svelte +4 -5
- package/dist/components/ui/alert/alert.svelte.d.ts +3 -8
- package/dist/components/ui/alert/index.js +0 -2
- package/dist/components/ui/avatar/avatar-variants.d.ts +2 -3
- package/dist/components/ui/avatar/avatar-variants.js +1 -2
- package/dist/components/ui/avatar/avatar.svelte +5 -6
- package/dist/components/ui/avatar/avatar.svelte.d.ts +3 -8
- package/dist/components/ui/badge/badge-variants.d.ts +2 -3
- package/dist/components/ui/badge/badge-variants.js +3 -2
- package/dist/components/ui/badge/badge.svelte +4 -5
- package/dist/components/ui/badge/badge.svelte.d.ts +3 -8
- package/dist/components/ui/badge/index.js +0 -2
- package/dist/components/ui/button/button-variants.d.ts +2 -3
- package/dist/components/ui/button/button-variants.js +5 -3
- package/dist/components/ui/button/button.svelte +100 -44
- package/dist/components/ui/button/button.svelte.d.ts +8 -12
- package/dist/components/ui/button/index.js +0 -2
- package/dist/components/ui/command/command-dialog.svelte +3 -1
- package/dist/components/ui/command/command-dialog.svelte.d.ts +1 -1
- package/dist/components/ui/command/command-group.svelte +4 -2
- package/dist/components/ui/command/command-item.svelte +4 -2
- package/dist/components/ui/command/command-separator.svelte +3 -1
- package/dist/components/ui/command/index.d.ts +5 -5
- package/dist/components/ui/input/input.svelte +41 -24
- package/dist/components/ui/input/input.svelte.d.ts +5 -4
- package/dist/components/ui/sheet/sheet.svelte +9 -3
- package/dist/components/ui/sheet/sheet.svelte.d.ts +1 -0
- package/dist/components/ui/textarea/textarea.svelte +2 -1
- package/dist/components/ui/tooltip/tooltip.svelte +4 -2
- package/dist/components.css +3079 -0
- package/dist/design-contract.d.ts +13 -0
- package/dist/design-contract.js +11 -0
- package/dist/design-system.d.ts +15 -0
- package/dist/design-system.js +7 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.js +9 -0
- package/dist/inline-value.d.ts +5 -0
- package/dist/inline-value.js +24 -0
- package/dist/numeric-input.d.ts +2 -0
- package/dist/numeric-input.js +9 -0
- package/dist/page-chrome.css +12 -49
- package/dist/recipes.d.ts +4 -0
- package/dist/recipes.js +4 -0
- package/dist/rendering/index.d.ts +87 -0
- package/dist/rendering/index.js +117 -0
- package/dist/styled-system/css/conditions.js +36 -0
- package/dist/styled-system/css/css.d.ts +22 -0
- package/dist/styled-system/css/css.js +45 -0
- package/dist/styled-system/css/cva.d.ts +6 -0
- package/dist/styled-system/css/cva.js +87 -0
- package/dist/styled-system/css/cx.d.ts +5 -0
- package/dist/styled-system/css/cx.js +15 -0
- package/dist/styled-system/css/index.d.ts +5 -0
- package/dist/styled-system/css/index.js +4 -0
- package/dist/styled-system/css/sva.d.ts +4 -0
- package/dist/styled-system/css/sva.js +46 -0
- package/dist/styled-system/helpers.js +316 -0
- package/dist/styled-system/patterns/aspect-ratio.d.ts +20 -0
- package/dist/styled-system/patterns/aspect-ratio.js +38 -0
- package/dist/styled-system/patterns/bleed.d.ts +21 -0
- package/dist/styled-system/patterns/bleed.js +24 -0
- package/dist/styled-system/patterns/box.d.ts +20 -0
- package/dist/styled-system/patterns/box.js +15 -0
- package/dist/styled-system/patterns/center.d.ts +20 -0
- package/dist/styled-system/patterns/center.js +21 -0
- package/dist/styled-system/patterns/circle.d.ts +20 -0
- package/dist/styled-system/patterns/circle.js +25 -0
- package/dist/styled-system/patterns/container.d.ts +20 -0
- package/dist/styled-system/patterns/container.js +21 -0
- package/dist/styled-system/patterns/cq.d.ts +21 -0
- package/dist/styled-system/patterns/cq.js +21 -0
- package/dist/styled-system/patterns/divider.d.ts +22 -0
- package/dist/styled-system/patterns/divider.js +25 -0
- package/dist/styled-system/patterns/flex.d.ts +26 -0
- package/dist/styled-system/patterns/flex.js +26 -0
- package/dist/styled-system/patterns/float.d.ts +23 -0
- package/dist/styled-system/patterns/float.js +52 -0
- package/dist/styled-system/patterns/grid-item.d.ts +25 -0
- package/dist/styled-system/patterns/grid-item.js +25 -0
- package/dist/styled-system/patterns/grid.d.ts +24 -0
- package/dist/styled-system/patterns/grid.js +27 -0
- package/dist/styled-system/patterns/hstack.d.ts +21 -0
- package/dist/styled-system/patterns/hstack.js +24 -0
- package/dist/styled-system/patterns/index.d.ts +21 -0
- package/dist/styled-system/patterns/index.js +20 -0
- package/dist/styled-system/patterns/link-overlay.d.ts +20 -0
- package/dist/styled-system/patterns/link-overlay.js +24 -0
- package/dist/styled-system/patterns/spacer.d.ts +20 -0
- package/dist/styled-system/patterns/spacer.js +25 -0
- package/dist/styled-system/patterns/square.d.ts +20 -0
- package/dist/styled-system/patterns/square.js +24 -0
- package/dist/styled-system/patterns/stack.d.ts +23 -0
- package/dist/styled-system/patterns/stack.js +24 -0
- package/dist/styled-system/patterns/visually-hidden.d.ts +20 -0
- package/dist/styled-system/patterns/visually-hidden.js +18 -0
- package/dist/styled-system/patterns/vstack.d.ts +21 -0
- package/dist/styled-system/patterns/vstack.js +24 -0
- package/dist/styled-system/patterns/wrap.d.ts +24 -0
- package/dist/styled-system/patterns/wrap.js +25 -0
- package/dist/styled-system/recipes/content-header.d.ts +31 -0
- package/dist/styled-system/recipes/content-header.js +65 -0
- package/dist/styled-system/recipes/content-page.d.ts +34 -0
- package/dist/styled-system/recipes/content-page.js +43 -0
- package/dist/styled-system/recipes/create-recipe.js +82 -0
- package/dist/styled-system/recipes/index.d.ts +17 -0
- package/dist/styled-system/recipes/index.js +16 -0
- package/dist/styled-system/recipes/metric-block.d.ts +34 -0
- package/dist/styled-system/recipes/metric-block.js +76 -0
- package/dist/styled-system/recipes/product-list.d.ts +31 -0
- package/dist/styled-system/recipes/product-list.js +73 -0
- package/dist/styled-system/recipes/product-section.d.ts +31 -0
- package/dist/styled-system/recipes/product-section.js +49 -0
- package/dist/styled-system/recipes/product-settings-row.d.ts +34 -0
- package/dist/styled-system/recipes/product-settings-row.js +58 -0
- package/dist/styled-system/recipes/product-settings.d.ts +31 -0
- package/dist/styled-system/recipes/product-settings.js +57 -0
- package/dist/styled-system/recipes/product-status.d.ts +34 -0
- package/dist/styled-system/recipes/product-status.js +45 -0
- package/dist/styled-system/recipes/product-toolbar.d.ts +31 -0
- package/dist/styled-system/recipes/product-toolbar.js +41 -0
- package/dist/styled-system/recipes/product-workspace.d.ts +34 -0
- package/dist/styled-system/recipes/product-workspace.js +58 -0
- package/dist/styled-system/recipes/surface-metric.d.ts +38 -0
- package/dist/styled-system/recipes/surface-metric.js +63 -0
- package/dist/styled-system/recipes/surface-table.d.ts +34 -0
- package/dist/styled-system/recipes/surface-table.js +62 -0
- package/dist/styled-system/recipes/ui-badge.d.ts +31 -0
- package/dist/styled-system/recipes/ui-badge.js +38 -0
- package/dist/styled-system/recipes/ui-button.d.ts +32 -0
- package/dist/styled-system/recipes/ui-button.js +43 -0
- package/dist/styled-system/recipes/ui-input.d.ts +31 -0
- package/dist/styled-system/recipes/ui-input.js +49 -0
- package/dist/styled-system/recipes/ui-textarea.d.ts +31 -0
- package/dist/styled-system/recipes/ui-textarea.js +24 -0
- package/dist/styled-system/styles.css +1257 -0
- package/dist/styled-system/tokens/index.d.ts +9 -0
- package/dist/styled-system/tokens/index.js +268 -0
- package/dist/styled-system/tokens/tokens.d.ts +36 -0
- package/dist/styled-system/types/composition.d.ts +227 -0
- package/dist/styled-system/types/conditions.d.ts +236 -0
- package/dist/styled-system/types/csstype.d.ts +22570 -0
- package/dist/styled-system/types/index.d.ts +6 -0
- package/dist/styled-system/types/parts.d.ts +8 -0
- package/dist/styled-system/types/pattern.d.ts +78 -0
- package/dist/styled-system/types/prop-type.d.ts +223 -0
- package/dist/styled-system/types/recipe.d.ts +181 -0
- package/dist/styled-system/types/selectors.d.ts +59 -0
- package/dist/styled-system/types/static-css.d.ts +56 -0
- package/dist/styled-system/types/style-props.d.ts +8088 -0
- package/dist/styled-system/types/system-types.d.ts +151 -0
- package/dist/styles/aliases.css +49 -0
- package/dist/styles/compatibility.epilogue.css +384 -0
- package/dist/styles/compatibility.prelude.css +5513 -0
- package/dist/styles/conditional-states.css +28 -0
- package/dist/styles/conditional-utilities.css +22 -0
- package/dist/styles/recipes.css +1262 -0
- package/dist/types.d.ts +3 -3
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/package.json +38 -14
- package/styles-compatibility.json +12 -0
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
</script>
|
|
8
8
|
|
|
9
9
|
<script lang="ts">
|
|
10
|
+
import { definedOptions } from '@svadmin/core/options';
|
|
11
|
+
|
|
10
12
|
/* eslint-disable svelte/no-useless-children-snippet */
|
|
11
13
|
import type { Snippet } from 'svelte';
|
|
12
14
|
import { fade, fly } from 'svelte/transition';
|
|
@@ -18,7 +20,7 @@
|
|
|
18
20
|
import { useTranslation } from '@svadmin/core/i18n';
|
|
19
21
|
|
|
20
22
|
import { captureAdminContext } from '@svadmin/core';
|
|
21
|
-
import type { Identity, MenuItem
|
|
23
|
+
import type { Identity, MenuItem } from '@svadmin/core';
|
|
22
24
|
import { getPath } from '../router-state.svelte.js';
|
|
23
25
|
import { Skeleton } from './ui/skeleton/index.js';
|
|
24
26
|
import * as Sheet from './ui/sheet/index.js';
|
|
@@ -42,7 +44,7 @@
|
|
|
42
44
|
const auth = $derived(adminContext.authProvider);
|
|
43
45
|
let loading = $state(true);
|
|
44
46
|
let identity = $state<Identity | null>(null);
|
|
45
|
-
const taskProvider = $derived(adminContext.taskProvider
|
|
47
|
+
const taskProvider = $derived(adminContext.taskProvider ?? undefined);
|
|
46
48
|
const TaskQueueComponent = getComponentRegistry()?.TaskQueueDrawer;
|
|
47
49
|
|
|
48
50
|
$effect(() => {
|
|
@@ -94,10 +96,10 @@
|
|
|
94
96
|
let touchEndX = $state(0);
|
|
95
97
|
|
|
96
98
|
function ownsLayoutEvent(event: Event): boolean {
|
|
97
|
-
const target = event.target instanceof
|
|
99
|
+
const target = event.target instanceof Element ? event.target : document.activeElement;
|
|
98
100
|
const owner = target
|
|
99
101
|
?.closest<HTMLElement>('[data-svadmin-layout-scope]')
|
|
100
|
-
?.dataset
|
|
102
|
+
?.dataset['svadminLayoutScope'];
|
|
101
103
|
if (owner) return owner === layoutScope;
|
|
102
104
|
return document.querySelectorAll('[data-svadmin-layout-scope]').length === 1;
|
|
103
105
|
}
|
|
@@ -108,7 +110,7 @@
|
|
|
108
110
|
e.preventDefault();
|
|
109
111
|
commandOpen = true;
|
|
110
112
|
}
|
|
111
|
-
if (e.key === '?' && !['INPUT', 'TEXTAREA', 'SELECT'].includes(
|
|
113
|
+
if (e.key === '?' && !(e.target instanceof Element && ['INPUT', 'TEXTAREA', 'SELECT'].includes(e.target.tagName))) {
|
|
112
114
|
e.preventDefault();
|
|
113
115
|
shortcutsOpen = true;
|
|
114
116
|
}
|
|
@@ -116,16 +118,18 @@
|
|
|
116
118
|
|
|
117
119
|
function handleTouchStart(e: TouchEvent) {
|
|
118
120
|
if (!ownsLayoutEvent(e)) return;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
const touch = e.touches.item(0);
|
|
122
|
+
if (e.touches.length === 1 && touch) {
|
|
123
|
+
touchStartX = touch.clientX;
|
|
124
|
+
touchEndX = touch.clientX;
|
|
122
125
|
}
|
|
123
126
|
}
|
|
124
127
|
|
|
125
128
|
function handleTouchMove(e: TouchEvent) {
|
|
126
129
|
if (!ownsLayoutEvent(e)) return;
|
|
127
|
-
|
|
128
|
-
|
|
130
|
+
const touch = e.touches.item(0);
|
|
131
|
+
if (e.touches.length === 1 && touch) {
|
|
132
|
+
touchEndX = touch.clientX;
|
|
129
133
|
}
|
|
130
134
|
}
|
|
131
135
|
|
|
@@ -180,7 +184,7 @@
|
|
|
180
184
|
|
|
181
185
|
<!-- Desktop sidebar -->
|
|
182
186
|
<div class="svadmin-u-99d72c7fc3e2 svadmin-u-9d60be3a6d80">
|
|
183
|
-
<Sidebar {collapsed} {identity} {title} {menu} {routeMode} onToggle={() => collapsed = !collapsed} onLogout={handleLogout} />
|
|
187
|
+
<Sidebar {collapsed} {identity} {title} {...definedOptions({ "menu": menu })} {routeMode} onToggle={() => collapsed = !collapsed} onLogout={handleLogout} />
|
|
184
188
|
</div>
|
|
185
189
|
|
|
186
190
|
<!-- Mobile sidebar via Sheet -->
|
|
@@ -193,21 +197,20 @@
|
|
|
193
197
|
>
|
|
194
198
|
<Sheet.Title id={`${layoutScope}-mobile-navigation-title`} class="svadmin-u-2daa8e5e2f2e">{title}</Sheet.Title>
|
|
195
199
|
<div class="svadmin-u-e477a6af4cb6">
|
|
196
|
-
<Sidebar collapsed={false} {identity} {title} {menu} {routeMode} onToggle={() => { mobileMenuOpen = false; }} onLogout={handleLogout} />
|
|
200
|
+
<Sidebar collapsed={false} {identity} {title} {...definedOptions({ "menu": menu })} {routeMode} onToggle={() => { mobileMenuOpen = false; }} onLogout={handleLogout} />
|
|
197
201
|
</div>
|
|
198
202
|
</Sheet.Root>
|
|
199
203
|
|
|
200
204
|
<div
|
|
201
205
|
class="svadmin-u-36e579c0b41c svadmin-u-60fbb7713999 svadmin-u-8dddea0773ed svadmin-u-2cd02d11d1af svadmin-u-0fe7d7d814d0 svadmin-u-7890552ecd63"
|
|
202
|
-
|
|
206
|
+
data-svadmin-content-frame
|
|
203
207
|
class:sidebar-content-expanded={!collapsed}
|
|
204
|
-
class:md:ml-[70px]={collapsed}
|
|
205
208
|
class:sidebar-content-collapsed={collapsed}
|
|
206
209
|
>
|
|
207
210
|
<!-- Header with mobile hamburger -->
|
|
208
211
|
<Header
|
|
209
|
-
{siteUrl}
|
|
210
|
-
{menu}
|
|
212
|
+
{...definedOptions({ "siteUrl": siteUrl })}
|
|
213
|
+
{...definedOptions({ "menu": menu })}
|
|
211
214
|
showSearch={true}
|
|
212
215
|
showThemeToggle={true}
|
|
213
216
|
onSearchClick={() => { commandOpen = true; }}
|
|
@@ -255,7 +258,7 @@
|
|
|
255
258
|
</div>
|
|
256
259
|
<CommandPalette
|
|
257
260
|
bind:open={commandOpen}
|
|
258
|
-
onAskAI
|
|
261
|
+
{...definedOptions({ "onAskAI": aiAssistant ? handleAskAI : undefined })}
|
|
259
262
|
/>
|
|
260
263
|
<KeyboardShortcuts bind:open={shortcutsOpen} />
|
|
261
264
|
{/if}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ComponentProps } from 'svelte';
|
|
3
|
+
import type TaskQueueDrawer from './TaskQueueDrawer.svelte';
|
|
4
|
+
import { definedOptions } from '@svadmin/core/options';
|
|
5
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
6
|
+
import { ListTodo, RotateCcw } from '@lucide/svelte';
|
|
7
|
+
import { Button } from './ui/button/index.js';
|
|
8
|
+
|
|
9
|
+
let { open = $bindable(false), taskProvider, title, initialTab }: ComponentProps<typeof TaskQueueDrawer> = $props();
|
|
10
|
+
const i18n = useTranslation();
|
|
11
|
+
const load = () => import('./TaskQueueDrawer.svelte');
|
|
12
|
+
let module = $state(load());
|
|
13
|
+
const resolvedTitle = $derived(title ?? i18n.t('task.drawerTitle'));
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
{#await module}
|
|
17
|
+
<Button variant="ghost" size="icon" disabled aria-busy="true" aria-label={resolvedTitle}>
|
|
18
|
+
<ListTodo class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" />
|
|
19
|
+
</Button>
|
|
20
|
+
{:then { default: Drawer }}
|
|
21
|
+
<Drawer bind:open {...definedOptions({ taskProvider, title, initialTab })} />
|
|
22
|
+
{:catch}
|
|
23
|
+
<Button variant="ghost" size="icon" aria-label={`${resolvedTitle}: ${i18n.t('common.retry')}`} onclick={() => module = load()}>
|
|
24
|
+
<RotateCcw class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" />
|
|
25
|
+
</Button>
|
|
26
|
+
{/await}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare const LazyTaskQueueDrawer: import("svelte").Component<{
|
|
2
|
+
open?: boolean;
|
|
3
|
+
taskProvider?: import("@svadmin/core").TaskProvider<import("@svadmin/core").TaskRecord>;
|
|
4
|
+
title?: string;
|
|
5
|
+
initialTab?: "tasks" | "dlq";
|
|
6
|
+
}, {}, "open">;
|
|
7
|
+
type LazyTaskQueueDrawer = ReturnType<typeof LazyTaskQueueDrawer>;
|
|
8
|
+
export default LazyTaskQueueDrawer;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import type { ResourceRendering } from '../rendering/index.js';
|
|
3
|
+
import { definedOptions } from '@svadmin/core/options';
|
|
4
|
+
|
|
2
5
|
import { getResource } from '@svadmin/core';
|
|
3
6
|
|
|
4
7
|
import type { Snippet } from 'svelte';
|
|
@@ -9,6 +12,7 @@
|
|
|
9
12
|
|
|
10
13
|
interface Props {
|
|
11
14
|
resourceName: string;
|
|
15
|
+
rendering?: ResourceRendering | undefined;
|
|
12
16
|
title?: string;
|
|
13
17
|
canCreate?: boolean;
|
|
14
18
|
density?: 'compact' | 'comfortable';
|
|
@@ -35,6 +39,7 @@
|
|
|
35
39
|
|
|
36
40
|
let {
|
|
37
41
|
resourceName,
|
|
42
|
+
rendering,
|
|
38
43
|
title,
|
|
39
44
|
canCreate,
|
|
40
45
|
density = 'comfortable',
|
|
@@ -79,14 +84,14 @@
|
|
|
79
84
|
{/if}
|
|
80
85
|
|
|
81
86
|
<AutoTable
|
|
87
|
+
{rendering}
|
|
82
88
|
{resourceName}
|
|
83
89
|
showHeader={false}
|
|
84
90
|
{density}
|
|
85
|
-
{selectable}
|
|
86
|
-
{batchActions}
|
|
87
|
-
defaultCellRenderer
|
|
88
|
-
{rowActions}
|
|
89
|
-
{emptyState}
|
|
90
|
-
{expandedRowRender}
|
|
91
|
+
{...definedOptions({ "selectable": selectable })}
|
|
92
|
+
{...definedOptions({ batchActions })}
|
|
93
|
+
{...definedOptions({ "defaultCellRenderer": cellRenderer })}
|
|
94
|
+
{...definedOptions({ "rowActions": rowActions })}
|
|
95
|
+
{...definedOptions({ emptyState, expandedRowRender })}
|
|
91
96
|
/>
|
|
92
97
|
</div>
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import type { ResourceRendering } from '../rendering/index.js';
|
|
1
2
|
import type { Snippet } from 'svelte';
|
|
2
3
|
import type { FieldDefinition } from '@svadmin/core';
|
|
3
4
|
interface Props {
|
|
4
5
|
resourceName: string;
|
|
6
|
+
rendering?: ResourceRendering | undefined;
|
|
5
7
|
title?: string;
|
|
6
8
|
canCreate?: boolean;
|
|
7
9
|
density?: 'compact' | 'comfortable';
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
</span>
|
|
156
156
|
</div>
|
|
157
157
|
|
|
158
|
-
<div class="svadmin-u-f3c543ad5fe9 svadmin-u-1004c0c3954c" class:
|
|
158
|
+
<div class="svadmin-u-f3c543ad5fe9 svadmin-u-1004c0c3954c" class:svadmin-u-8e75e3db482b={socialProviders.length >= 2}>
|
|
159
159
|
{#each socialProviders as provider (provider.name)}
|
|
160
160
|
<Button
|
|
161
161
|
variant="outline"
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
let {
|
|
20
20
|
items = [],
|
|
21
|
-
selectedId = $bindable(items[0]?.id as (string | number | undefined)),
|
|
21
|
+
selectedId = $bindable(items[0]?.['id'] as (string | number | undefined)),
|
|
22
22
|
idKey = 'id',
|
|
23
23
|
titleKey = 'title',
|
|
24
24
|
subtitleKey = 'subtitle',
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
{@render itemSnippet(item, isSelected)}
|
|
81
81
|
{:else}
|
|
82
82
|
<div class={cn('svadmin-u-e83a7042bc91 svadmin-u-f283ea9bea0e', isSelected ? 'svadmin-u-20aaf08a7ed1' : 'svadmin-u-d4108abe6359')}>
|
|
83
|
-
{item[titleKey] ?? item
|
|
83
|
+
{item[titleKey] ?? item['name'] ?? `Item #${item[idKey]}`}
|
|
84
84
|
</div>
|
|
85
85
|
{#if item[subtitleKey]}
|
|
86
86
|
<div class="svadmin-u-d058ca6de60f svadmin-u-bfa603190748 svadmin-u-f283ea9bea0e svadmin-u-15e1b1f444fe">
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
<div class="svadmin-u-3e7ce58d64fa">
|
|
109
109
|
<div class="svadmin-u-7fcf9124b5df svadmin-u-65fdbade2025 svadmin-u-05faf5c801ff">
|
|
110
110
|
<h3 class="svadmin-u-4ee734926ff6 svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">
|
|
111
|
-
{activeItem[titleKey] ?? activeItem
|
|
111
|
+
{activeItem[titleKey] ?? activeItem['name'] ?? `Item #${activeItem[idKey]}`}
|
|
112
112
|
</h3>
|
|
113
113
|
{#if activeItem[subtitleKey]}
|
|
114
114
|
<p class="svadmin-u-359090c2d529 svadmin-u-bfa603190748 svadmin-u-15e1b1f444fe">{activeItem[subtitleKey]}</p>
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { Button } from './ui/button/index.js';
|
|
4
4
|
import { Badge } from './ui/badge/index.js';
|
|
5
5
|
import { Upload, Image as ImageIcon, Check, Search, Folder } from '@lucide/svelte';
|
|
6
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
6
7
|
import { cn } from '../utils.js';
|
|
7
8
|
|
|
8
9
|
export interface MediaItem {
|
|
@@ -38,6 +39,8 @@
|
|
|
38
39
|
class: className = '',
|
|
39
40
|
}: Props = $props();
|
|
40
41
|
|
|
42
|
+
const i18n = useTranslation();
|
|
43
|
+
|
|
41
44
|
let activeCategory = $state('All');
|
|
42
45
|
let searchQuery = $state('');
|
|
43
46
|
let localSelected = $state<string[]>([...selectedUrls]);
|
|
@@ -111,7 +114,7 @@
|
|
|
111
114
|
<input
|
|
112
115
|
type="text"
|
|
113
116
|
bind:value={searchQuery}
|
|
114
|
-
placeholder=
|
|
117
|
+
placeholder={i18n.t('common.search')}
|
|
115
118
|
class="svadmin-u-d1c57777d8b6 svadmin-u-6da6a3c3f741 svadmin-u-421ac2be5045 svadmin-u-ca6bcd4b6f3f svadmin-u-e5795dad4d22 svadmin-u-e6f9e383a762 svadmin-u-d2d2d97dd0c8 svadmin-u-aa2c13a5e1b4 svadmin-u-359090c2d529 svadmin-u-f10f771f87e9 svadmin-u-3e94a98e1466 svadmin-u-9c1295a6914a"
|
|
116
119
|
/>
|
|
117
120
|
</div>
|
|
@@ -120,7 +123,7 @@
|
|
|
120
123
|
<input type="file" multiple class="svadmin-u-99d72c7fc3e2" onchange={handleFileInput} />
|
|
121
124
|
<span class="svadmin-u-52083e7da442 svadmin-u-3960ffc248d9 svadmin-u-44ee8ba0a421 svadmin-u-d1c57777d8b6 svadmin-u-0b91436debbd svadmin-u-421ac2be5045 svadmin-u-ba939ea82d8b svadmin-u-5064267f78e3 svadmin-u-359090c2d529 svadmin-u-2689f3958069 svadmin-u-35b680bc2a46 svadmin-u-34516836730d">
|
|
122
125
|
<Upload class="svadmin-u-7fc7f732bf7e svadmin-u-bf600f8e029c" />
|
|
123
|
-
|
|
126
|
+
{i18n.t('common.upload')}
|
|
124
127
|
</span>
|
|
125
128
|
</label>
|
|
126
129
|
</div>
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
|
|
66
66
|
for (const trig of triggers) {
|
|
67
67
|
const idx = textBeforeCursor.lastIndexOf(trig);
|
|
68
|
-
if (idx !== -1 && (idx === 0 || /\s/.test(textBeforeCursor
|
|
68
|
+
if (idx !== -1 && (idx === 0 || /\s/.test(textBeforeCursor.charAt(idx - 1)))) {
|
|
69
69
|
const query = textBeforeCursor.slice(idx + 1);
|
|
70
70
|
if (!/\s/.test(query)) {
|
|
71
71
|
matchTrigger = trig;
|
|
@@ -117,8 +117,9 @@
|
|
|
117
117
|
selectedIndex = (selectedIndex - 1 + activeOptions.length) % activeOptions.length;
|
|
118
118
|
} else if (e.key === 'Enter' || e.key === 'Tab') {
|
|
119
119
|
e.preventDefault();
|
|
120
|
-
|
|
121
|
-
|
|
120
|
+
const selectedOption = activeOptions[selectedIndex];
|
|
121
|
+
if (selectedOption) {
|
|
122
|
+
insertMention(selectedOption);
|
|
122
123
|
}
|
|
123
124
|
} else if (e.key === 'Escape') {
|
|
124
125
|
showDropdown = false;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import NumericInput from './NumericInput.svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
value?: number | null;
|
|
6
|
+
currency?: string;
|
|
7
|
+
min?: number;
|
|
8
|
+
max?: number;
|
|
9
|
+
step?: number;
|
|
10
|
+
precision?: number;
|
|
11
|
+
id?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
required?: boolean;
|
|
16
|
+
invalid?: boolean;
|
|
17
|
+
describedby?: string;
|
|
18
|
+
class?: string;
|
|
19
|
+
onchange?: (value: number | null) => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let props: Props = $props();
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<NumericInput {...props} mode="currency" />
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
value?: number | null;
|
|
3
|
+
currency?: string;
|
|
4
|
+
min?: number;
|
|
5
|
+
max?: number;
|
|
6
|
+
step?: number;
|
|
7
|
+
precision?: number;
|
|
8
|
+
id?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
invalid?: boolean;
|
|
14
|
+
describedby?: string;
|
|
15
|
+
class?: string;
|
|
16
|
+
onchange?: (value: number | null) => void;
|
|
17
|
+
}
|
|
18
|
+
declare const MoneyInput: import("svelte").Component<Props, {}, "">;
|
|
19
|
+
type MoneyInput = ReturnType<typeof MoneyInput>;
|
|
20
|
+
export default MoneyInput;
|
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
let navigated = false;
|
|
8
8
|
$effect(() => {
|
|
9
9
|
// Navigate to first resource ONCE — avoid infinite re-triggers
|
|
10
|
-
|
|
10
|
+
const firstMenuItem = menuItems[0];
|
|
11
|
+
if (!navigated && firstMenuItem) {
|
|
11
12
|
navigated = true;
|
|
12
|
-
adminContext.navigate(
|
|
13
|
+
adminContext.navigate(firstMenuItem.route);
|
|
13
14
|
}
|
|
14
15
|
});
|
|
15
16
|
</script>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import NumericInput from './NumericInput.svelte';
|
|
3
|
+
import type { NumericInputMode } from './NumericInput.svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
value?: number | null;
|
|
7
|
+
min?: number;
|
|
8
|
+
max?: number;
|
|
9
|
+
step?: number;
|
|
10
|
+
precision?: number;
|
|
11
|
+
id?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
required?: boolean;
|
|
16
|
+
invalid?: boolean;
|
|
17
|
+
describedby?: string;
|
|
18
|
+
class?: string;
|
|
19
|
+
onchange?: (value: number | null) => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let props: Props = $props();
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<NumericInput {...props} mode={'number' satisfies NumericInputMode} />
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
value?: number | null;
|
|
3
|
+
min?: number;
|
|
4
|
+
max?: number;
|
|
5
|
+
step?: number;
|
|
6
|
+
precision?: number;
|
|
7
|
+
id?: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
required?: boolean;
|
|
12
|
+
invalid?: boolean;
|
|
13
|
+
describedby?: string;
|
|
14
|
+
class?: string;
|
|
15
|
+
onchange?: (value: number | null) => void;
|
|
16
|
+
}
|
|
17
|
+
declare const NumberInput: import("svelte").Component<Props, {}, "">;
|
|
18
|
+
type NumberInput = ReturnType<typeof NumberInput>;
|
|
19
|
+
export default NumberInput;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Input } from './ui/input/index.js';
|
|
3
|
+
import { cn } from '../utils.js';
|
|
4
|
+
|
|
5
|
+
export type NumericInputMode = 'number' | 'currency' | 'percent';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
value?: number | null;
|
|
9
|
+
mode?: NumericInputMode;
|
|
10
|
+
currency?: string;
|
|
11
|
+
scale?: '100' | '1';
|
|
12
|
+
min?: number;
|
|
13
|
+
max?: number;
|
|
14
|
+
step?: number;
|
|
15
|
+
precision?: number;
|
|
16
|
+
id?: string;
|
|
17
|
+
name?: string;
|
|
18
|
+
placeholder?: string;
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
invalid?: boolean;
|
|
22
|
+
describedby?: string;
|
|
23
|
+
class?: string;
|
|
24
|
+
onchange?: (value: number | null) => void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let {
|
|
28
|
+
value = $bindable(null),
|
|
29
|
+
mode = 'number',
|
|
30
|
+
currency,
|
|
31
|
+
scale = '100',
|
|
32
|
+
min,
|
|
33
|
+
max,
|
|
34
|
+
step,
|
|
35
|
+
precision,
|
|
36
|
+
id,
|
|
37
|
+
name,
|
|
38
|
+
placeholder,
|
|
39
|
+
disabled = false,
|
|
40
|
+
required = false,
|
|
41
|
+
invalid = false,
|
|
42
|
+
describedby,
|
|
43
|
+
class: className = '',
|
|
44
|
+
onchange,
|
|
45
|
+
}: Props = $props();
|
|
46
|
+
|
|
47
|
+
const normalizedPrecision = $derived(
|
|
48
|
+
precision == null || !Number.isFinite(precision)
|
|
49
|
+
? undefined
|
|
50
|
+
: Math.min(20, Math.max(0, Math.trunc(precision))),
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const displayValue = $derived.by(() => {
|
|
54
|
+
if (value == null) return '';
|
|
55
|
+
const displayed = mode === 'percent' && scale === '1' ? value * 100 : value;
|
|
56
|
+
return normalizedPrecision === undefined ? String(displayed) : displayed.toFixed(normalizedPrecision);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const displayMin = $derived(mode === 'percent' && scale === '1' && min != null ? min * 100 : min);
|
|
60
|
+
const displayMax = $derived(mode === 'percent' && scale === '1' && max != null ? max * 100 : max);
|
|
61
|
+
const resolvedStep = $derived(
|
|
62
|
+
mode === 'percent' && scale === '1'
|
|
63
|
+
? step == null ? 1 : step * 100
|
|
64
|
+
: step ?? (normalizedPrecision === undefined ? 'any' : 10 ** -normalizedPrecision),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
function clamp(next: number): number {
|
|
68
|
+
return Math.min(max ?? next, Math.max(min ?? next, next));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function handleInput(event: Event): void {
|
|
72
|
+
const input = event.currentTarget;
|
|
73
|
+
if (!(input instanceof HTMLInputElement)) return;
|
|
74
|
+
if (input.value === '') {
|
|
75
|
+
value = null;
|
|
76
|
+
onchange?.(null);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const parsed = Number(input.value);
|
|
80
|
+
if (!Number.isFinite(parsed)) return;
|
|
81
|
+
const stored = mode === 'percent' && scale === '1' ? parsed / 100 : parsed;
|
|
82
|
+
const next = clamp(stored);
|
|
83
|
+
value = next;
|
|
84
|
+
onchange?.(next);
|
|
85
|
+
}
|
|
86
|
+
</script>
|
|
87
|
+
|
|
88
|
+
<div class={cn('svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc', className)} data-numeric-input={mode}>
|
|
89
|
+
{#if mode === 'currency' && currency}
|
|
90
|
+
<span class="svadmin-u-bfa603190748 svadmin-u-012fbd121f37" aria-hidden="true">{currency}</span>
|
|
91
|
+
{/if}
|
|
92
|
+
<Input
|
|
93
|
+
{id}
|
|
94
|
+
{name}
|
|
95
|
+
type="number"
|
|
96
|
+
value={displayValue}
|
|
97
|
+
min={displayMin}
|
|
98
|
+
max={displayMax}
|
|
99
|
+
step={resolvedStep}
|
|
100
|
+
{placeholder}
|
|
101
|
+
{disabled}
|
|
102
|
+
{required}
|
|
103
|
+
aria-invalid={invalid || undefined}
|
|
104
|
+
aria-describedby={describedby}
|
|
105
|
+
oninput={handleInput}
|
|
106
|
+
/>
|
|
107
|
+
{#if mode === 'percent'}
|
|
108
|
+
<span class="svadmin-u-bfa603190748 svadmin-u-012fbd121f37" aria-hidden="true">%</span>
|
|
109
|
+
{/if}
|
|
110
|
+
</div>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type NumericInputMode = 'number' | 'currency' | 'percent';
|
|
2
|
+
interface Props {
|
|
3
|
+
value?: number | null;
|
|
4
|
+
mode?: NumericInputMode;
|
|
5
|
+
currency?: string;
|
|
6
|
+
scale?: '100' | '1';
|
|
7
|
+
min?: number;
|
|
8
|
+
max?: number;
|
|
9
|
+
step?: number;
|
|
10
|
+
precision?: number;
|
|
11
|
+
id?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
required?: boolean;
|
|
16
|
+
invalid?: boolean;
|
|
17
|
+
describedby?: string;
|
|
18
|
+
class?: string;
|
|
19
|
+
onchange?: (value: number | null) => void;
|
|
20
|
+
}
|
|
21
|
+
declare const NumericInput: import("svelte").Component<Props, {}, "value">;
|
|
22
|
+
type NumericInput = ReturnType<typeof NumericInput>;
|
|
23
|
+
export default NumericInput;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import NumericInput from './NumericInput.svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
value?: number | null;
|
|
6
|
+
scale?: '100' | '1';
|
|
7
|
+
min?: number;
|
|
8
|
+
max?: number;
|
|
9
|
+
step?: number;
|
|
10
|
+
precision?: number;
|
|
11
|
+
id?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
required?: boolean;
|
|
16
|
+
invalid?: boolean;
|
|
17
|
+
describedby?: string;
|
|
18
|
+
class?: string;
|
|
19
|
+
onchange?: (value: number | null) => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let props: Props = $props();
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<NumericInput {...props} mode="percent" />
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
value?: number | null;
|
|
3
|
+
scale?: '100' | '1';
|
|
4
|
+
min?: number;
|
|
5
|
+
max?: number;
|
|
6
|
+
step?: number;
|
|
7
|
+
precision?: number;
|
|
8
|
+
id?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
invalid?: boolean;
|
|
14
|
+
describedby?: string;
|
|
15
|
+
class?: string;
|
|
16
|
+
onchange?: (value: number | null) => void;
|
|
17
|
+
}
|
|
18
|
+
declare const PercentInput: import("svelte").Component<Props, {}, "">;
|
|
19
|
+
type PercentInput = ReturnType<typeof PercentInput>;
|
|
20
|
+
export default PercentInput;
|
|
@@ -48,8 +48,9 @@
|
|
|
48
48
|
} = $props();
|
|
49
49
|
|
|
50
50
|
$effect(() => {
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
const firstRole = roles[0];
|
|
52
|
+
if (!selectedRole && firstRole) {
|
|
53
|
+
selectedRole = firstRole.code;
|
|
53
54
|
}
|
|
54
55
|
});
|
|
55
56
|
</script>
|
|
@@ -163,7 +164,7 @@
|
|
|
163
164
|
{/if}
|
|
164
165
|
{#each resources as resource, i (i)}
|
|
165
166
|
<!-- Section Grouping Header -->
|
|
166
|
-
{#if resource.section && (i === 0 || resource.section !== resources[i-1]
|
|
167
|
+
{#if resource.section && (i === 0 || resource.section !== resources[i-1]?.section)}
|
|
167
168
|
<tr class="svadmin-u-989c466fdbe7">
|
|
168
169
|
<td colspan="{actions.length + 1}" class="svadmin-u-f0faeb26d656 svadmin-u-03b4dd7f172b svadmin-u-359090c2d529 svadmin-u-69450ef1487e svadmin-u-20aaf08a7ed1">{resource.section}</td>
|
|
169
170
|
</tr>
|
|
@@ -232,14 +232,14 @@
|
|
|
232
232
|
<p class="svadmin-u-42536e69e639 svadmin-u-e83a7042bc91 svadmin-u-f283ea9bea0e">{identity.data.name ?? '—'}</p>
|
|
233
233
|
</div>
|
|
234
234
|
|
|
235
|
-
{#if identity.data.email || identity.data
|
|
235
|
+
{#if identity.data.email || identity.data['username']}
|
|
236
236
|
<div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-77a2a20e90d4 svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">
|
|
237
237
|
{#if identity.data.email}
|
|
238
238
|
<Mail class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3 svadmin-u-012fbd121f37" />
|
|
239
239
|
{:else}
|
|
240
240
|
<User class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3 svadmin-u-012fbd121f37" />
|
|
241
241
|
{/if}
|
|
242
|
-
<span class="svadmin-u-f283ea9bea0e">{identity.data.email || identity.data
|
|
242
|
+
<span class="svadmin-u-f283ea9bea0e">{identity.data.email || identity.data['username']}</span>
|
|
243
243
|
</div>
|
|
244
244
|
{/if}
|
|
245
245
|
|