@svadmin/ui 0.72.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/app.css +7694 -5117
- package/dist/app.theme.css +7645 -5119
- 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/components/AutoForm.svelte +20 -6
- package/dist/components/AutoForm.svelte.d.ts +2 -0
- package/dist/components/AutoTable.svelte +249 -9
- package/dist/components/AutoTable.svelte.d.ts +5 -0
- package/dist/components/BoundRecordDetailDrawer.svelte +8 -2
- package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +2 -0
- package/dist/components/ComboboxField.svelte +31 -9
- package/dist/components/ComboboxField.svelte.d.ts +3 -2
- package/dist/components/CreatePage.svelte +4 -0
- 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/DevTools.svelte +2 -2
- package/dist/components/EditPage.svelte +4 -0
- package/dist/components/EditPage.svelte.d.ts +2 -0
- package/dist/components/FieldRenderer.svelte +90 -18
- package/dist/components/FileUpload.svelte +250 -0
- package/dist/components/FileUpload.svelte.d.ts +32 -0
- package/dist/components/FilterBuilder.svelte +236 -279
- package/dist/components/FilterBuilder.svelte.d.ts +3 -0
- package/dist/components/ImportWizard.svelte +181 -94
- package/dist/components/JsonSchemaForm.svelte +255 -99
- package/dist/components/JsonSchemaForm.svelte.d.ts +12 -1
- package/dist/components/Layout.svelte +1 -2
- package/dist/components/LazyTaskQueueDrawer.svelte.d.ts +1 -1
- package/dist/components/ListPage.svelte +4 -0
- package/dist/components/ListPage.svelte.d.ts +2 -0
- package/dist/components/LoginPage.svelte +1 -1
- package/dist/components/MoneyInput.svelte +25 -0
- package/dist/components/MoneyInput.svelte.d.ts +20 -0
- 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/QuickEditDrawer.svelte +4 -1
- package/dist/components/QuickEditDrawer.svelte.d.ts +2 -0
- package/dist/components/RecordDetailDrawer.svelte +4 -2
- package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
- package/dist/components/ResourceOperationsPage.svelte +25 -19
- package/dist/components/ResourceOperationsPage.svelte.d.ts +5 -1
- package/dist/components/ShowInferencer.svelte +4 -2
- package/dist/components/ShowInferencer.svelte.d.ts +2 -0
- package/dist/components/ShowPage.svelte +7 -3
- package/dist/components/ShowPage.svelte.d.ts +2 -0
- package/dist/components/Sidebar.svelte +5 -5
- package/dist/components/SpreadsheetView.svelte +81 -286
- package/dist/components/StepsForm.svelte +5 -5
- 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/TaskQueueDrawer.svelte +72 -16
- package/dist/components/TreeSelect.svelte +208 -28
- package/dist/components/TreeSelect.svelte.d.ts +3 -1
- package/dist/components/auto-table-grid.d.ts +26 -0
- package/dist/components/auto-table-grid.js +1 -0
- package/dist/components/content/ContentPageHeader.svelte +12 -9
- package/dist/components/content/ContentPageShell.svelte +6 -9
- package/dist/components/content/FileBrowser.svelte +35 -0
- package/dist/components/content/FileBrowser.svelte.d.ts +14 -0
- package/dist/components/content/MetricBlock.svelte +10 -13
- package/dist/components/content/NetworkTable.svelte +3 -3
- 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/SettingsFieldRow.svelte +9 -23
- package/dist/components/content/SettingsGroup.svelte +11 -27
- package/dist/components/content/StatusBadge.svelte +3 -8
- 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.js +5 -0
- package/dist/components/fields/DateField.svelte +4 -3
- package/dist/components/fields/date-field-value.d.ts +2 -0
- package/dist/components/fields/date-field-value.js +13 -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/record-detail.svelte.d.ts +3 -0
- package/dist/components/record-detail.svelte.js +10 -4
- 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/ui/badge/badge-variants.js +3 -1
- package/dist/components/ui/button/button-variants.js +5 -2
- package/dist/components/ui/input/input.svelte +1 -4
- package/dist/components/ui/textarea/textarea.svelte +2 -1
- 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 +14 -0
- package/dist/index.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/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/package.json +31 -13
- package/styles-compatibility.json +12 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
function own(event, key) {
|
|
2
|
+
return event && typeof event === 'object' ? Object.getOwnPropertyDescriptor(event, key)?.value : undefined;
|
|
3
|
+
}
|
|
4
|
+
function mirroredEvent(action, event) {
|
|
5
|
+
if (action === 'scroll-to') {
|
|
6
|
+
const top = own(event, 'top');
|
|
7
|
+
return typeof top === 'number' && Number.isFinite(top) && top >= 0 ? { top } : undefined;
|
|
8
|
+
}
|
|
9
|
+
if (action === 'open-row' || action === 'close-row') {
|
|
10
|
+
const id = own(event, 'id');
|
|
11
|
+
return typeof id === 'string' ? { id, nested: own(event, 'nested') === true } : undefined;
|
|
12
|
+
}
|
|
13
|
+
const key = own(event, 'key');
|
|
14
|
+
if (typeof key !== 'string')
|
|
15
|
+
return undefined;
|
|
16
|
+
if (action === 'sort-rows') {
|
|
17
|
+
// 上游首次排序可能省略 order,其公开语义为升序。
|
|
18
|
+
const order = own(event, 'order') ?? 'asc';
|
|
19
|
+
if (order !== 'asc' && order !== 'desc')
|
|
20
|
+
return undefined;
|
|
21
|
+
return { key, order, add: own(event, 'add') === true };
|
|
22
|
+
}
|
|
23
|
+
const value = own(event, 'value');
|
|
24
|
+
return typeof value === 'string' || value == null ? { key, value: value ?? '' } : undefined;
|
|
25
|
+
}
|
|
26
|
+
/** 两个公开 Grid 实例组成固定右侧面板,不读取或改写上游 Community 功能开关。 */
|
|
27
|
+
export function createSvarPanePair(current) {
|
|
28
|
+
const panes = new Map();
|
|
29
|
+
let disposed = false;
|
|
30
|
+
let synchronizing = 0;
|
|
31
|
+
function attach(side, api) {
|
|
32
|
+
panes.set(side, api);
|
|
33
|
+
for (const action of ['scroll-to', 'sort-rows', 'filter-rows', 'open-row', 'close-row']) {
|
|
34
|
+
api.on(action, event => {
|
|
35
|
+
const peer = panes.get(side === 0 ? 1 : 0);
|
|
36
|
+
if (disposed || synchronizing || panes.get(side) !== api || !peer || !current())
|
|
37
|
+
return;
|
|
38
|
+
const next = mirroredEvent(action, event);
|
|
39
|
+
if (!next)
|
|
40
|
+
return;
|
|
41
|
+
if (action === 'scroll-to' && peer.getState().scrollTop === next['top'])
|
|
42
|
+
return;
|
|
43
|
+
synchronizing++;
|
|
44
|
+
try {
|
|
45
|
+
void Promise.resolve(peer.exec(action, next)).catch(() => { }).finally(() => { synchronizing--; });
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
synchronizing--;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (side === 1) {
|
|
53
|
+
const top = panes.get(0)?.getState().scrollTop;
|
|
54
|
+
if (typeof top === 'number' && top > 0)
|
|
55
|
+
void api.exec('scroll-to', { top }).catch(() => { });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function focus(side, row, column) {
|
|
59
|
+
if (disposed || !current())
|
|
60
|
+
return;
|
|
61
|
+
const api = panes.get(side);
|
|
62
|
+
if (api)
|
|
63
|
+
void api.exec('focus-cell', { row, column, eventSource: 'svadmin-pinned-navigation' }).catch(() => { });
|
|
64
|
+
}
|
|
65
|
+
return { attach, focus, get: (side) => panes.get(side), dispose() { disposed = true; panes.clear(); } };
|
|
66
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type SvarRange, type SvarWindowPage } from './svar-grid-loading.js';
|
|
2
|
+
export interface SvarLazyTree {
|
|
3
|
+
/** Resource field containing the parent record ID. */
|
|
4
|
+
readonly parentField: string;
|
|
5
|
+
readonly rootValue?: string | number | null;
|
|
6
|
+
readonly hasChildrenKey?: string;
|
|
7
|
+
/** A branch is rejected rather than silently truncated above this bound. Default: 10,000. */
|
|
8
|
+
readonly maxChildren?: number;
|
|
9
|
+
}
|
|
10
|
+
export type SvarResourcePageReader = (pagination: {
|
|
11
|
+
current: number;
|
|
12
|
+
pageSize: number;
|
|
13
|
+
}) => Promise<SvarWindowPage>;
|
|
14
|
+
/** Translate a zero-based exclusive grid window to the existing one-based Provider pagination. */
|
|
15
|
+
export declare function loadSvarResourceWindow(range: SvarRange, pageSize: number, read: SvarResourcePageReader, signal: AbortSignal, primaryKey?: string): Promise<SvarWindowPage>;
|
|
16
|
+
/** Load all children in bounded pages. Partial branches must never masquerade as complete trees. */
|
|
17
|
+
export declare function loadSvarResourceChildren(pageSize: number, maxChildren: number, read: SvarResourcePageReader, signal: AbortSignal, primaryKey?: string, childrenKey?: string): Promise<readonly Record<string, unknown>[]>;
|
|
18
|
+
export declare function appendSvarResourcePage(rows: readonly Record<string, unknown>[], page: SvarWindowPage, expectedTotal: number, primaryKey?: string): readonly Record<string, unknown>[];
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { snapshotSvarRecords, snapshotSvarWindow, SvarLoadCancelled } from './svar-grid-loading.js';
|
|
2
|
+
function checkSignal(signal) {
|
|
3
|
+
if (signal.aborted)
|
|
4
|
+
throw new SvarLoadCancelled();
|
|
5
|
+
}
|
|
6
|
+
function checkPageSize(pageSize) {
|
|
7
|
+
if (!Number.isSafeInteger(pageSize) || pageSize < 1 || pageSize > 1000)
|
|
8
|
+
throw new Error('Invalid resource page size');
|
|
9
|
+
}
|
|
10
|
+
function checkPage(page, start, size, primaryKey) {
|
|
11
|
+
return snapshotSvarWindow(page, { start, end: start + size }, primaryKey);
|
|
12
|
+
}
|
|
13
|
+
/** Translate a zero-based exclusive grid window to the existing one-based Provider pagination. */
|
|
14
|
+
export async function loadSvarResourceWindow(range, pageSize, read, signal, primaryKey = 'id') {
|
|
15
|
+
checkPageSize(pageSize);
|
|
16
|
+
checkSignal(signal);
|
|
17
|
+
if (!Number.isSafeInteger(range.start) || !Number.isSafeInteger(range.end) || range.start < 0
|
|
18
|
+
|| range.end < range.start || range.end > 10_000_000 || range.end - range.start > 2048)
|
|
19
|
+
throw new Error('Invalid resource window');
|
|
20
|
+
const first = Math.floor(range.start / pageSize);
|
|
21
|
+
const last = Math.max(first, Math.ceil(range.end / pageSize) - 1);
|
|
22
|
+
let total;
|
|
23
|
+
const rows = [];
|
|
24
|
+
for (let pageIndex = first; pageIndex <= last; pageIndex++) {
|
|
25
|
+
checkSignal(signal);
|
|
26
|
+
const page = checkPage(await read({ current: pageIndex + 1, pageSize }), pageIndex * pageSize, pageSize, primaryKey);
|
|
27
|
+
checkSignal(signal);
|
|
28
|
+
if (total !== undefined && total !== page.total)
|
|
29
|
+
throw new Error('Resource changed during window loading; refresh');
|
|
30
|
+
total = page.total;
|
|
31
|
+
rows.push(...page.data);
|
|
32
|
+
if ((pageIndex + 1) * pageSize >= total)
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
const data = rows.slice(range.start - first * pageSize, range.end - first * pageSize);
|
|
36
|
+
return snapshotSvarWindow({ data, total: total ?? 0 }, range, primaryKey);
|
|
37
|
+
}
|
|
38
|
+
/** Load all children in bounded pages. Partial branches must never masquerade as complete trees. */
|
|
39
|
+
export async function loadSvarResourceChildren(pageSize, maxChildren, read, signal, primaryKey = 'id', childrenKey = 'children') {
|
|
40
|
+
checkPageSize(pageSize);
|
|
41
|
+
checkSignal(signal);
|
|
42
|
+
if (!Number.isSafeInteger(maxChildren) || maxChildren < 1 || maxChildren > 100_000)
|
|
43
|
+
throw new Error('Invalid child limit');
|
|
44
|
+
let total;
|
|
45
|
+
const rows = [];
|
|
46
|
+
for (let pageIndex = 0;; pageIndex++) {
|
|
47
|
+
checkSignal(signal);
|
|
48
|
+
const page = checkPage(await read({ current: pageIndex + 1, pageSize }), pageIndex * pageSize, pageSize, primaryKey);
|
|
49
|
+
checkSignal(signal);
|
|
50
|
+
if (page.total > maxChildren)
|
|
51
|
+
throw new Error('Branch exceeds the configured child limit');
|
|
52
|
+
if (total !== undefined && total !== page.total)
|
|
53
|
+
throw new Error('Branch changed during loading; retry');
|
|
54
|
+
total = page.total;
|
|
55
|
+
rows.push(...page.data);
|
|
56
|
+
if (rows.length >= total)
|
|
57
|
+
return snapshotSvarRecords(rows, primaryKey, childrenKey);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function appendSvarResourcePage(rows, page, expectedTotal, primaryKey = 'id') {
|
|
61
|
+
if (!Number.isSafeInteger(expectedTotal) || expectedTotal < 0 || expectedTotal > 10_000_000)
|
|
62
|
+
throw new Error('Invalid expected total');
|
|
63
|
+
if (page.total !== expectedTotal)
|
|
64
|
+
throw new Error('Resource changed during infinite loading; refresh');
|
|
65
|
+
if (rows.length + page.data.length > expectedTotal || (!page.data.length && rows.length < expectedTotal))
|
|
66
|
+
throw new Error('Invalid next resource page');
|
|
67
|
+
return snapshotSvarRecords([...rows, ...page.data], primaryKey);
|
|
68
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SvelteMap } from 'svelte/reactivity';
|
|
2
|
+
import type { Filter, Sort } from '@svadmin/core';
|
|
3
|
+
import type { SvarResourceReadRequest } from './SvarResourceRead.svelte';
|
|
4
|
+
import { type SvarWindowPage } from './svar-grid-loading.js';
|
|
5
|
+
import type { SvarRecordId } from './svar-grid-operations.js';
|
|
6
|
+
/** Query workers remain descendants of the host AdminContext and QueryClientProvider. */
|
|
7
|
+
export declare function createSvarResourceReads<Scope extends object>(options: {
|
|
8
|
+
scope: () => Scope;
|
|
9
|
+
current: (scope: Scope) => boolean;
|
|
10
|
+
authorize: (scope: Scope, parentId?: SvarRecordId) => Promise<boolean>;
|
|
11
|
+
resourceName: () => string;
|
|
12
|
+
dataScopeKey: () => string | number;
|
|
13
|
+
primaryKey: () => string;
|
|
14
|
+
childrenKey: () => string | undefined;
|
|
15
|
+
}): {
|
|
16
|
+
requests: SvelteMap<number, SvarResourceReadRequest>;
|
|
17
|
+
read: (input: {
|
|
18
|
+
scope: Scope;
|
|
19
|
+
signal: AbortSignal;
|
|
20
|
+
pagination: {
|
|
21
|
+
current: number;
|
|
22
|
+
pageSize: number;
|
|
23
|
+
};
|
|
24
|
+
filters: Filter[];
|
|
25
|
+
sorters: Sort[];
|
|
26
|
+
parentId?: SvarRecordId;
|
|
27
|
+
}) => Promise<SvarWindowPage>;
|
|
28
|
+
cancelAll: () => void;
|
|
29
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { onDestroy, untrack } from 'svelte';
|
|
2
|
+
import { SvelteMap } from 'svelte/reactivity';
|
|
3
|
+
import { SvarLoadCancelled } from './svar-grid-loading.js';
|
|
4
|
+
/** Query workers remain descendants of the host AdminContext and QueryClientProvider. */
|
|
5
|
+
export function createSvarResourceReads(options) {
|
|
6
|
+
const requests = new SvelteMap();
|
|
7
|
+
const pending = new Map();
|
|
8
|
+
let sequence = 0;
|
|
9
|
+
let alive = true;
|
|
10
|
+
function cancelAll() { for (const entry of [...pending.values()])
|
|
11
|
+
entry.cancel(); }
|
|
12
|
+
onDestroy(() => { alive = false; cancelAll(); });
|
|
13
|
+
$effect.pre(() => {
|
|
14
|
+
const scope = options.scope();
|
|
15
|
+
const available = options.current(scope);
|
|
16
|
+
untrack(() => {
|
|
17
|
+
for (const entry of [...pending.values()])
|
|
18
|
+
if (!available || entry.scope !== scope)
|
|
19
|
+
entry.cancel();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
async function read(input) {
|
|
23
|
+
const { scope, signal } = input;
|
|
24
|
+
const current = () => alive && !signal.aborted && options.current(scope);
|
|
25
|
+
if (!current())
|
|
26
|
+
throw new SvarLoadCancelled();
|
|
27
|
+
if (!await options.authorize(scope, input.parentId))
|
|
28
|
+
throw new Error('Resource read access denied');
|
|
29
|
+
if (!current())
|
|
30
|
+
throw new SvarLoadCancelled();
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const id = ++sequence;
|
|
33
|
+
let settled = false;
|
|
34
|
+
const finish = (callback) => {
|
|
35
|
+
if (settled)
|
|
36
|
+
return;
|
|
37
|
+
settled = true;
|
|
38
|
+
signal.removeEventListener('abort', abort);
|
|
39
|
+
pending.delete(id);
|
|
40
|
+
requests.delete(id);
|
|
41
|
+
callback();
|
|
42
|
+
};
|
|
43
|
+
const abort = () => finish(() => reject(new SvarLoadCancelled()));
|
|
44
|
+
pending.set(id, { scope, cancel: abort });
|
|
45
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
46
|
+
if (!current()) {
|
|
47
|
+
abort();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const childrenKey = options.childrenKey();
|
|
51
|
+
requests.set(id, {
|
|
52
|
+
resourceName: options.resourceName(), dataScopeKey: options.dataScopeKey(), primaryKey: options.primaryKey(),
|
|
53
|
+
...(childrenKey === undefined ? {} : { childrenKey }),
|
|
54
|
+
pagination: { ...input.pagination }, filters: input.filters, sorters: input.sorters,
|
|
55
|
+
resolve(page) { finish(() => current() ? resolve(page) : reject(new SvarLoadCancelled())); },
|
|
56
|
+
reject(error) { finish(() => reject(current() ? error : new SvarLoadCancelled())); },
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return { requests, read, cancelAll };
|
|
61
|
+
}
|
|
@@ -1 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import { uiBadge } from '../../../styled-system/recipes/index.js';
|
|
2
|
+
export const badgeVariants = ({ variant = "default", class: className = "", className: extraClassName = "", } = {}) => ["svadmin-badge", variant && `svadmin-badge--${variant}`,
|
|
3
|
+
uiBadge(variant ? { variant } : {}), className, extraClassName].filter(Boolean).join(" ");
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { uiButton } from '../../../styled-system/recipes/index.js';
|
|
2
|
+
// 保留公开 helper、语义标记和 null 行为;样式由预生成 Panda recipe 提供。
|
|
3
|
+
export const buttonVariants = ({ variant = "default", size = "default", class: className = "", className: extraClassName = "", } = {}) => ["svadmin-button", variant && `svadmin-button--${variant}`, size && `svadmin-button-size--${size}`,
|
|
4
|
+
uiButton({ ...(variant ? { variant } : {}), ...(size ? { size } : {}) }),
|
|
5
|
+
className, extraClassName].filter(Boolean).join(" ");
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { HTMLTextareaAttributes } from "svelte/elements";
|
|
3
3
|
import { cn, type WithElementRef } from "../../../utils.js";
|
|
4
|
+
import { uiTextarea } from "../../../styled-system/recipes/index.js";
|
|
4
5
|
|
|
5
6
|
type Props = WithElementRef<HTMLTextareaAttributes, HTMLTextAreaElement>;
|
|
6
7
|
|
|
@@ -15,7 +16,7 @@
|
|
|
15
16
|
<textarea
|
|
16
17
|
bind:this={ref}
|
|
17
18
|
data-slot="textarea"
|
|
18
|
-
class={cn("svadmin-textarea", className)}
|
|
19
|
+
class={cn("svadmin-textarea", uiTextarea(), className)}
|
|
19
20
|
bind:value
|
|
20
21
|
{...restProps}
|
|
21
22
|
></textarea>
|