@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
|
@@ -1,28 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
description?: string;
|
|
8
|
-
control: Snippet;
|
|
9
|
-
separated?: boolean;
|
|
10
|
-
class?: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
let {
|
|
14
|
-
label,
|
|
15
|
-
description,
|
|
16
|
-
control,
|
|
17
|
-
separated = false,
|
|
18
|
-
class: className = '',
|
|
19
|
-
}: Props = $props();
|
|
3
|
+
import { productSettingsRow } from '../../styled-system/recipes/index.js';
|
|
4
|
+
interface Props { label: string; description?: string; control: Snippet; separated?: boolean; class?: string; }
|
|
5
|
+
let { label, description, control, separated = false, class: className = '' }: Props = $props();
|
|
6
|
+
const styles = $derived(productSettingsRow({ separated }));
|
|
20
7
|
</script>
|
|
21
|
-
|
|
22
|
-
<div class={
|
|
23
|
-
|
|
24
|
-
<p class=
|
|
25
|
-
{#if description}<p class="svadmin-u-b6b02c0ebef6 svadmin-u-2cc8041eca99 svadmin-u-fc7473ca09eb svadmin-u-7054e2767710 svadmin-u-bfa603190748">{description}</p>{/if}
|
|
8
|
+
<div class={styles.root + ' ' + className} data-svadmin-settings-field-row>
|
|
9
|
+
<div class={styles.heading}>
|
|
10
|
+
<p class={styles.label}>{label}</p>
|
|
11
|
+
{#if description}<p class={styles.description}>{description}</p>{/if}
|
|
26
12
|
</div>
|
|
27
|
-
<div class=
|
|
13
|
+
<div class={styles.control}>{@render control()}</div>
|
|
28
14
|
</div>
|
|
@@ -1,33 +1,17 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
description?: string;
|
|
8
|
-
actions?: Snippet;
|
|
9
|
-
children: Snippet;
|
|
10
|
-
class?: string;
|
|
11
|
-
bodyClass?: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
let {
|
|
15
|
-
title,
|
|
16
|
-
description,
|
|
17
|
-
actions,
|
|
18
|
-
children,
|
|
19
|
-
class: className = '',
|
|
20
|
-
bodyClass = '',
|
|
21
|
-
}: Props = $props();
|
|
3
|
+
import { productSettings } from '../../styled-system/recipes/index.js';
|
|
4
|
+
interface Props { title: string; description?: string; actions?: Snippet; children: Snippet; class?: string; bodyClass?: string; }
|
|
5
|
+
let { title, description, actions, children, class: className = '', bodyClass = '' }: Props = $props();
|
|
6
|
+
const styles = productSettings();
|
|
22
7
|
</script>
|
|
23
|
-
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
<
|
|
28
|
-
{#if description}<p class="svadmin-u-2cc8041eca99 svadmin-u-fc7473ca09eb svadmin-u-18550d5945ae svadmin-u-bfa603190748">{description}</p>{/if}
|
|
8
|
+
<section class={styles.root + ' ' + className} data-svadmin-settings-group>
|
|
9
|
+
<header class={styles.header}>
|
|
10
|
+
<div class={styles.heading}>
|
|
11
|
+
<h2 class={styles.title}>{title}</h2>
|
|
12
|
+
{#if description}<p class={styles.description}>{description}</p>{/if}
|
|
29
13
|
</div>
|
|
30
|
-
{#if actions}<div class=
|
|
14
|
+
{#if actions}<div class={styles.actions}>{@render actions()}</div>{/if}
|
|
31
15
|
</header>
|
|
32
|
-
<div class={
|
|
16
|
+
<div class={styles.body + ' ' + bodyClass}>{@render children()}</div>
|
|
33
17
|
</section>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Badge } from '../ui/badge/index.js';
|
|
3
|
+
import { productStatus } from '../../styled-system/recipes/index.js';
|
|
3
4
|
export type Status = 'success' | 'warning' | 'danger' | 'info' | 'neutral';
|
|
4
5
|
interface Props {
|
|
5
6
|
status: Status;
|
|
@@ -7,13 +8,7 @@
|
|
|
7
8
|
class?: string;
|
|
8
9
|
}
|
|
9
10
|
let { status, label = status, class: className = '' }: Props = $props();
|
|
10
|
-
const
|
|
11
|
-
success: 'svadmin-u-18a6e7a36f29 svadmin-u-17a9f7af2265 svadmin-u-76747e5e02ff',
|
|
12
|
-
warning: 'svadmin-u-2f960aa0c478 svadmin-u-283481e780bb svadmin-u-3a4ff758c2ab',
|
|
13
|
-
danger: 'svadmin-u-9d5d8b4711b4 svadmin-u-43928fcc832f svadmin-u-811148b13d1e',
|
|
14
|
-
info: 'svadmin-u-05f954a846d6 svadmin-u-375dc44df6e9 svadmin-u-20aaf08a7ed1',
|
|
15
|
-
neutral: 'svadmin-u-18049387f0af svadmin-u-2ef11f1cb219 svadmin-u-bfa603190748',
|
|
16
|
-
};
|
|
11
|
+
const styles = $derived(productStatus({ status }));
|
|
17
12
|
</script>
|
|
18
13
|
|
|
19
|
-
<Badge variant="outline" class={
|
|
14
|
+
<Badge variant="outline" data-svadmin-status={status} class={styles.root + ' ' + className}>{label}</Badge>
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
|
|
64
64
|
const isCompact = $derived(density === 'compact');
|
|
65
65
|
|
|
66
|
-
const toneClasses: Record<
|
|
66
|
+
const toneClasses: Record<NonNullable<StatusTabItem['tone']>, { activeBadge: string; inactiveBadge: string }> = {
|
|
67
67
|
default: {
|
|
68
68
|
activeBadge: 'svadmin-u-6a1572b6bf5a svadmin-u-20aaf08a7ed1',
|
|
69
69
|
inactiveBadge: 'svadmin-u-2ef11f1cb219 svadmin-u-bfa603190748',
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
{#each items as item (item.key)}
|
|
108
108
|
{@const active = value === item.key}
|
|
109
109
|
{@const tone = item.tone ?? 'default'}
|
|
110
|
-
{@const badgeTone = toneClasses[tone] ?? toneClasses
|
|
110
|
+
{@const badgeTone = toneClasses[tone] ?? toneClasses['default']}
|
|
111
111
|
<button
|
|
112
112
|
type="button"
|
|
113
113
|
role="tab"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import {
|
|
3
|
+
import { productWorkspace } from '../../styled-system/recipes/index.js';
|
|
4
4
|
|
|
5
5
|
interface Props {
|
|
6
6
|
primary: Snippet;
|
|
@@ -24,19 +24,15 @@
|
|
|
24
24
|
class: className = '',
|
|
25
25
|
}: Props = $props();
|
|
26
26
|
|
|
27
|
+
const styles = $derived(productWorkspace({ hasSecondary: Boolean(secondary) }));
|
|
27
28
|
const resolvedSecondaryWidth = $derived(secondaryCollapsed ? secondaryCollapsedWidth : secondaryWidth);
|
|
28
29
|
</script>
|
|
29
30
|
|
|
30
|
-
<div
|
|
31
|
-
class={
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
>
|
|
36
|
-
{#if summary}<div data-svadmin-workspace-summary>{@render summary()}</div>{/if}
|
|
37
|
-
<div class={cn('svadmin-u-f3c543ad5fe9 svadmin-u-7e0b7cdf1a94 svadmin-u-60541e1e26f8 svadmin-u-0d304f904cb0 svadmin-u-febbcd95bf06', mobileOrder === 'secondary-first' && 'svadmin-u-dfb5e722be57')}>
|
|
38
|
-
{#if mobileOrder === 'secondary-first' && secondary}<aside class="svadmin-u-ea37b42b1c3b svadmin-u-7e0b7cdf1a94 svadmin-u-2c1f5e2b6a5b">{@render secondary()}</aside>{/if}
|
|
39
|
-
<div class={cn('svadmin-u-7e0b7cdf1a94', mobileOrder === 'secondary-first' ? 'svadmin-u-ef72121aca75 svadmin-u-831f8770959d' : 'svadmin-u-ea37b42b1c3b')} data-svadmin-workspace-primary>{@render primary()}</div>
|
|
40
|
-
{#if mobileOrder !== 'secondary-first' && secondary}<aside class="svadmin-u-ef72121aca75 svadmin-u-7e0b7cdf1a94 svadmin-u-2c1f5e2b6a5b">{@render secondary()}</aside>{/if}
|
|
31
|
+
<div class={styles.root + ' ' + className} data-svadmin-workspace-layout data-secondary-collapsed={secondaryCollapsed} style:--workspace-secondary-width={resolvedSecondaryWidth}>
|
|
32
|
+
{#if summary}<div class={styles.summary} data-svadmin-workspace-summary>{@render summary()}</div>{/if}
|
|
33
|
+
<div class={styles.columns}>
|
|
34
|
+
{#if mobileOrder === 'secondary-first' && secondary}<aside class={styles.secondary} data-svadmin-workspace-secondary>{@render secondary()}</aside>{/if}
|
|
35
|
+
<div class={styles.primary} data-svadmin-workspace-primary>{@render primary()}</div>
|
|
36
|
+
{#if mobileOrder !== 'secondary-first' && secondary}<aside class={styles.secondary} data-svadmin-workspace-secondary>{@render secondary()}</aside>{/if}
|
|
41
37
|
</div>
|
|
42
38
|
</div>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CrudOperator, FieldDefinition, Filter } from '@svadmin/core';
|
|
2
|
+
export declare const FILTER_EDITOR_LIMITS: Readonly<{
|
|
3
|
+
depth: 12;
|
|
4
|
+
nodes: 256;
|
|
5
|
+
values: 1000;
|
|
6
|
+
}>;
|
|
7
|
+
export interface FilterRuleNode {
|
|
8
|
+
kind: 'rule';
|
|
9
|
+
id: string;
|
|
10
|
+
field: string;
|
|
11
|
+
operator: CrudOperator;
|
|
12
|
+
value: unknown;
|
|
13
|
+
readonly?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface FilterGroupNode {
|
|
16
|
+
kind: 'group';
|
|
17
|
+
id: string;
|
|
18
|
+
operator: 'and' | 'or';
|
|
19
|
+
children: FilterNode[];
|
|
20
|
+
wrapped?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export type FilterNode = FilterRuleNode | FilterGroupNode;
|
|
23
|
+
export type FilterIssueCode = 'invalid-filter' | 'limit' | 'unknown-field' | 'operator' | 'value' | 'empty-group';
|
|
24
|
+
export interface FilterEditorIssue {
|
|
25
|
+
path: string;
|
|
26
|
+
code: FilterIssueCode;
|
|
27
|
+
}
|
|
28
|
+
export type FilterTreeRead = {
|
|
29
|
+
ok: true;
|
|
30
|
+
root: FilterGroupNode;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
issues: FilterEditorIssue[];
|
|
34
|
+
};
|
|
35
|
+
export type FilterTreeCompile = {
|
|
36
|
+
ok: true;
|
|
37
|
+
filters: Filter[];
|
|
38
|
+
} | {
|
|
39
|
+
ok: false;
|
|
40
|
+
issues: FilterEditorIssue[];
|
|
41
|
+
};
|
|
42
|
+
export declare const isCollectionOperator: (operator: CrudOperator) => boolean;
|
|
43
|
+
export declare const isNullOperator: (operator: CrudOperator) => boolean;
|
|
44
|
+
export declare function filterOperators(field: Pick<FieldDefinition, 'type'> | undefined): CrudOperator[];
|
|
45
|
+
/** Filter[] 的顶层是隐式 AND;只有单个显式组可以成为编辑器根组,且保留包装信息。 */
|
|
46
|
+
export declare function readFilterTree(input: unknown): FilterTreeRead;
|
|
47
|
+
export declare function compileFilterTree(root: FilterGroupNode, fields: readonly FieldDefinition[], preserved?: ReadonlyMap<string, Filter>): FilterTreeCompile;
|
|
48
|
+
export declare function parseFilterInput(raw: string, field: Pick<FieldDefinition, 'type'> | undefined, operator: CrudOperator): unknown;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
export const FILTER_EDITOR_LIMITS = Object.freeze({ depth: 12, nodes: 256, values: 1000 });
|
|
2
|
+
const operators = ['eq', 'ne', 'lt', 'gt', 'lte', 'gte', 'contains', 'ncontains', 'startswith', 'endswith', 'in', 'nin', 'null', 'nnull', 'between', 'nbetween'];
|
|
3
|
+
const comparison = ['eq', 'ne', 'lt', 'gt', 'lte', 'gte', 'in', 'nin', 'between', 'nbetween', 'null', 'nnull'];
|
|
4
|
+
const selection = ['eq', 'ne', 'in', 'nin', 'null', 'nnull'];
|
|
5
|
+
const text = ['eq', 'ne', 'contains', 'ncontains', 'startswith', 'endswith', 'in', 'nin', 'null', 'nnull'];
|
|
6
|
+
const scalar = (value) => value === null || typeof value === 'string' || typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value));
|
|
7
|
+
const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
8
|
+
export const isCollectionOperator = (operator) => ['in', 'nin', 'between', 'nbetween'].includes(operator);
|
|
9
|
+
export const isNullOperator = (operator) => operator === 'null' || operator === 'nnull';
|
|
10
|
+
export function filterOperators(field) {
|
|
11
|
+
if (!field)
|
|
12
|
+
return [];
|
|
13
|
+
if (field.type === 'number' || field.type === 'date')
|
|
14
|
+
return [...comparison];
|
|
15
|
+
if (field.type === 'boolean' || field.type === 'select' || field.type === 'multiselect')
|
|
16
|
+
return [...selection];
|
|
17
|
+
return [...text];
|
|
18
|
+
}
|
|
19
|
+
/** Filter[] 的顶层是隐式 AND;只有单个显式组可以成为编辑器根组,且保留包装信息。 */
|
|
20
|
+
export function readFilterTree(input) {
|
|
21
|
+
let count = 0;
|
|
22
|
+
const active = new Set();
|
|
23
|
+
const issues = [];
|
|
24
|
+
function read(raw, depth, path) {
|
|
25
|
+
if (++count > FILTER_EDITOR_LIMITS.nodes || depth > FILTER_EDITOR_LIMITS.depth) {
|
|
26
|
+
issues.push({ path, code: 'limit' });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!object(raw) || active.has(raw)) {
|
|
30
|
+
issues.push({ path, code: 'invalid-filter' });
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
active.add(raw);
|
|
34
|
+
try {
|
|
35
|
+
const id = `node-${count}`;
|
|
36
|
+
if ('field' in raw) {
|
|
37
|
+
if (typeof raw['field'] !== 'string' || !raw['field'] || !operators.includes(raw['operator'])
|
|
38
|
+
|| Object.keys(raw).some((key) => !['field', 'operator', 'value'].includes(key))) {
|
|
39
|
+
issues.push({ path, code: 'invalid-filter' });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const value = raw['value'];
|
|
43
|
+
if (!scalar(value) && !(Array.isArray(value) && value.length <= FILTER_EDITOR_LIMITS.values && Array.from(value).every(scalar))) {
|
|
44
|
+
issues.push({ path, code: 'value' });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
return { kind: 'rule', id, field: raw['field'], operator: raw['operator'], value: Array.isArray(value) ? [...value] : value };
|
|
48
|
+
}
|
|
49
|
+
if (!['and', 'or'].includes(String(raw['operator'])) || !Array.isArray(raw['value'])
|
|
50
|
+
|| Object.keys(raw).some((key) => !['operator', 'value'].includes(key))) {
|
|
51
|
+
issues.push({ path, code: 'invalid-filter' });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (raw['value'].length > FILTER_EDITOR_LIMITS.nodes) {
|
|
55
|
+
issues.push({ path, code: 'limit' });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const children = [];
|
|
59
|
+
for (const [index, child] of raw['value'].entries()) {
|
|
60
|
+
const node = read(child, depth + 1, `${path}/value/${index}`);
|
|
61
|
+
if (node)
|
|
62
|
+
children.push(node);
|
|
63
|
+
}
|
|
64
|
+
return { kind: 'group', id, operator: raw['operator'], children };
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
active.delete(raw);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (!Array.isArray(input))
|
|
71
|
+
return { ok: false, issues: [{ path: '', code: 'invalid-filter' }] };
|
|
72
|
+
if (input.length > FILTER_EDITOR_LIMITS.nodes)
|
|
73
|
+
return { ok: false, issues: [{ path: '', code: 'limit' }] };
|
|
74
|
+
const children = [];
|
|
75
|
+
for (const [index, raw] of input.entries()) {
|
|
76
|
+
const node = read(raw, 1, `/${index}`);
|
|
77
|
+
if (node)
|
|
78
|
+
children.push(node);
|
|
79
|
+
}
|
|
80
|
+
if (issues.length)
|
|
81
|
+
return { ok: false, issues };
|
|
82
|
+
const only = children[0];
|
|
83
|
+
return { ok: true, root: children.length === 1 && only?.kind === 'group'
|
|
84
|
+
? { ...only, wrapped: true }
|
|
85
|
+
: { kind: 'group', id: 'root', operator: 'and', children, wrapped: false } };
|
|
86
|
+
}
|
|
87
|
+
export function compileFilterTree(root, fields, preserved = new Map()) {
|
|
88
|
+
const issues = [];
|
|
89
|
+
const fieldMap = new Map(fields.map((field) => [field.key, field]));
|
|
90
|
+
const active = new Set();
|
|
91
|
+
let count = 0;
|
|
92
|
+
function visit(node, depth) {
|
|
93
|
+
const issue = (code) => { issues.push({ path: node.id, code }); };
|
|
94
|
+
if (++count > FILTER_EDITOR_LIMITS.nodes || depth > FILTER_EDITOR_LIMITS.depth) {
|
|
95
|
+
issue('limit');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (active.has(node)) {
|
|
99
|
+
issue('invalid-filter');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
active.add(node);
|
|
103
|
+
try {
|
|
104
|
+
// Only unchanged host-owned readonly leaves and originally empty groups may bypass
|
|
105
|
+
// editor capability checks. A forged readonly flag or edited payload is not sufficient.
|
|
106
|
+
const original = preserved.get(node.id);
|
|
107
|
+
if (original && node.kind === 'rule' && node.readonly && 'field' in original
|
|
108
|
+
&& node.field === original.field && node.operator === original.operator
|
|
109
|
+
&& JSON.stringify(node.value) === JSON.stringify(original.value)) {
|
|
110
|
+
return { ...original, value: Array.isArray(original.value) ? [...original.value] : original.value };
|
|
111
|
+
}
|
|
112
|
+
if (original && node.kind === 'group' && !('field' in original)
|
|
113
|
+
&& !node.children.length && !original.value.length && node.operator === original.operator) {
|
|
114
|
+
return { operator: node.operator, value: [] };
|
|
115
|
+
}
|
|
116
|
+
if (node.kind === 'group') {
|
|
117
|
+
if (node.operator !== 'and' && node.operator !== 'or') {
|
|
118
|
+
issue('operator');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (!node.children.length)
|
|
122
|
+
issue('empty-group');
|
|
123
|
+
if (node.children.length > FILTER_EDITOR_LIMITS.nodes) {
|
|
124
|
+
issue('limit');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const children = [];
|
|
128
|
+
for (const child of node.children) {
|
|
129
|
+
const filter = visit(child, depth + 1);
|
|
130
|
+
if (filter)
|
|
131
|
+
children.push(filter);
|
|
132
|
+
}
|
|
133
|
+
return { operator: node.operator, value: children };
|
|
134
|
+
}
|
|
135
|
+
const field = fieldMap.get(node.field);
|
|
136
|
+
if (!field || field.filterable === false) {
|
|
137
|
+
issue('unknown-field');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (!filterOperators(field).includes(node.operator)) {
|
|
141
|
+
issue('operator');
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const validScalar = (value) => {
|
|
145
|
+
if (!scalar(value) || value === null)
|
|
146
|
+
return false;
|
|
147
|
+
if (field.type === 'number')
|
|
148
|
+
return typeof value === 'number';
|
|
149
|
+
if (field.type === 'boolean')
|
|
150
|
+
return typeof value === 'boolean';
|
|
151
|
+
if (field.options?.length)
|
|
152
|
+
return field.options.some((option) => !option.disabled && option.value === value);
|
|
153
|
+
return typeof value === 'string';
|
|
154
|
+
};
|
|
155
|
+
if (isNullOperator(node.operator)) {
|
|
156
|
+
if (node.value !== null) {
|
|
157
|
+
issue('value');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (isCollectionOperator(node.operator)) {
|
|
162
|
+
if (!Array.isArray(node.value) || node.value.length === 0 || node.value.length > FILTER_EDITOR_LIMITS.values || !Array.from(node.value).every(validScalar)
|
|
163
|
+
|| ((node.operator === 'between' || node.operator === 'nbetween') && node.value.length !== 2)) {
|
|
164
|
+
issue('value');
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if ((node.operator === 'between' || node.operator === 'nbetween') && typeof node.value[0] === 'number' && typeof node.value[1] === 'number' && node.value[0] > node.value[1]) {
|
|
168
|
+
issue('value');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else if (!validScalar(node.value)) {
|
|
173
|
+
issue('value');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
return { field: node.field, operator: node.operator, value: Array.isArray(node.value) ? [...node.value] : node.value };
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
active.delete(node);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (root.children.length > FILTER_EDITOR_LIMITS.nodes)
|
|
183
|
+
return { ok: false, issues: [{ path: root.id, code: 'limit' }] };
|
|
184
|
+
if (!root.children.length && !root.wrapped)
|
|
185
|
+
return { ok: true, filters: [] };
|
|
186
|
+
// 隐式根不占公开 Filter 的深度或节点预算;显式根与读入时一致。
|
|
187
|
+
let filters = [];
|
|
188
|
+
if (root.operator === 'and' && !root.wrapped) {
|
|
189
|
+
for (const child of root.children) {
|
|
190
|
+
const filter = visit(child, 1);
|
|
191
|
+
if (filter)
|
|
192
|
+
filters.push(filter);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const filter = visit(root, 1);
|
|
197
|
+
if (filter)
|
|
198
|
+
filters = [filter];
|
|
199
|
+
}
|
|
200
|
+
return issues.length ? { ok: false, issues } : { ok: true, filters };
|
|
201
|
+
}
|
|
202
|
+
export function parseFilterInput(raw, field, operator) {
|
|
203
|
+
if (raw.length > 1_048_576)
|
|
204
|
+
throw new Error('value');
|
|
205
|
+
if (isNullOperator(operator))
|
|
206
|
+
return null;
|
|
207
|
+
if (isCollectionOperator(operator))
|
|
208
|
+
return raw.trim() ? JSON.parse(raw) : undefined;
|
|
209
|
+
if (field?.type === 'number') {
|
|
210
|
+
if (!raw.trim())
|
|
211
|
+
return undefined;
|
|
212
|
+
if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(raw.trim()) || !Number.isFinite(Number(raw)))
|
|
213
|
+
throw new Error('value');
|
|
214
|
+
return Number(raw);
|
|
215
|
+
}
|
|
216
|
+
if (field?.type === 'boolean') {
|
|
217
|
+
if (raw === '')
|
|
218
|
+
return undefined;
|
|
219
|
+
if (raw !== 'true' && raw !== 'false')
|
|
220
|
+
throw new Error('value');
|
|
221
|
+
return raw === 'true';
|
|
222
|
+
}
|
|
223
|
+
return raw;
|
|
224
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** JsonSchemaForm 当前支持的标量子集。未知断言必须显式拒绝,不能假装已校验。 */
|
|
2
|
+
export type JsonScalar = string | number | boolean | null;
|
|
3
|
+
export type SchemaIssueCode = 'unsupported-schema' | 'invalid-schema' | 'required' | 'type' | 'enum' | 'minimum' | 'maximum' | 'multipleOf' | 'minLength' | 'maxLength' | 'additionalProperties' | 'invalid-value' | 'minItems' | 'maxItems';
|
|
4
|
+
export interface SchemaFormIssue {
|
|
5
|
+
path: string;
|
|
6
|
+
code: SchemaIssueCode;
|
|
7
|
+
}
|
|
8
|
+
export interface SchemaFormField {
|
|
9
|
+
key: string;
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
type: 'string' | 'number' | 'integer' | 'boolean' | 'enum';
|
|
13
|
+
nullable: boolean;
|
|
14
|
+
required: boolean;
|
|
15
|
+
readonly: boolean;
|
|
16
|
+
choices: JsonScalar[] | undefined;
|
|
17
|
+
hasDefault: boolean;
|
|
18
|
+
defaultValue: JsonScalar | undefined;
|
|
19
|
+
minimum: number | undefined;
|
|
20
|
+
maximum: number | undefined;
|
|
21
|
+
exclusiveMinimum: number | undefined;
|
|
22
|
+
exclusiveMaximum: number | undefined;
|
|
23
|
+
multipleOf: number | undefined;
|
|
24
|
+
minLength: number | undefined;
|
|
25
|
+
maxLength: number | undefined;
|
|
26
|
+
}
|
|
27
|
+
export interface SchemaFormModel {
|
|
28
|
+
fields: SchemaFormField[];
|
|
29
|
+
issues: SchemaFormIssue[];
|
|
30
|
+
additionalProperties: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function readSchemaForm(schema: Record<string, unknown>): SchemaFormModel;
|
|
33
|
+
/** 只为不存在的键补默认值;显式 undefined 表示用户已清空,不重新灌回默认值。 */
|
|
34
|
+
export declare function schemaFormValues(model: SchemaFormModel, value: Record<string, unknown>): Record<string, unknown>;
|
|
35
|
+
export declare function parseSchemaNumber(raw: string): number | undefined;
|
|
36
|
+
export declare function enumIndex(choices: readonly JsonScalar[], value: unknown): string;
|
|
37
|
+
export declare function enumValue(choices: readonly JsonScalar[], index: string): JsonScalar | undefined;
|
|
38
|
+
export declare function validateSchemaForm(model: SchemaFormModel, value: Record<string, unknown>): SchemaFormIssue[];
|
|
39
|
+
export { schemaFormSnapshot } from '../json-schema-form-state.js';
|