@svgrid/enterprise 3.0.2 → 3.1.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/LICENSE +94 -24
- package/README.md +36 -4
- package/dist/SvAdvancedFilter.svelte +1 -1
- package/dist/SvAlertsManager.svelte +2 -1
- package/dist/SvBoard.svelte +2 -1
- package/dist/SvExportMenu.svelte +4 -1
- package/dist/SvExportMenu.svelte.d.ts +0 -13
- package/dist/SvExpressionEditor.svelte +3 -3
- package/dist/SvFormulaBar.svelte +94 -20
- package/dist/SvFormulaBar.svelte.d.ts +7 -0
- package/dist/SvGridAlerts.svelte +49 -9
- package/dist/SvGridBoard.svelte +13 -8
- package/dist/SvGridBulkEditDrawer.svelte +26 -2
- package/dist/SvGridEditPanel.svelte +3 -0
- package/dist/SvGridScheduler.svelte +69 -40
- package/dist/SvGridSelectionBar.svelte +10 -3
- package/dist/SvPivotDesigner.svelte +198 -40
- package/dist/SvPivotDesigner.svelte.d.ts +27 -20
- package/dist/SvSheet.svelte +4043 -243
- package/dist/SvSheet.svelte.d.ts +76 -3
- package/dist/SvSheetChartSetup.svelte +151 -0
- package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
- package/dist/SvSheetComment.svelte +216 -31
- package/dist/SvSheetComment.svelte.d.ts +11 -11
- package/dist/SvSheetConditionalFormat.svelte +28 -31
- package/dist/SvSheetDataValidation.svelte +66 -42
- package/dist/SvSheetEditRanges.svelte +217 -0
- package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
- package/dist/SvSheetErrors.svelte +125 -0
- package/dist/SvSheetErrors.svelte.d.ts +20 -0
- package/dist/SvSheetEvaluate.svelte +133 -0
- package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
- package/dist/SvSheetFilterMenu.svelte +137 -34
- package/dist/SvSheetFilterMenu.svelte.d.ts +5 -0
- package/dist/SvSheetFindReplace.svelte +19 -19
- package/dist/SvSheetFormatCells.svelte +125 -81
- package/dist/SvSheetGoalSeek.svelte +17 -16
- package/dist/SvSheetInsertFunction.svelte +15 -13
- package/dist/SvSheetIteration.svelte +81 -0
- package/dist/SvSheetIteration.svelte.d.ts +10 -0
- package/dist/SvSheetLink.svelte +99 -0
- package/dist/SvSheetLink.svelte.d.ts +17 -0
- package/dist/SvSheetListPicker.svelte +4 -2
- package/dist/SvSheetListPicker.svelte.d.ts +0 -6
- package/dist/SvSheetManageRules.svelte +20 -18
- package/dist/SvSheetNameManager.svelte +17 -15
- package/dist/SvSheetPageSetup.svelte +159 -0
- package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
- package/dist/SvSheetPasteSpecial.svelte +22 -20
- package/dist/SvSheetPivot.svelte +220 -0
- package/dist/SvSheetPivot.svelte.d.ts +21 -0
- package/dist/SvSheetProtectSheet.svelte +81 -0
- package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
- package/dist/SvSheetRemoveDuplicates.svelte +13 -10
- package/dist/SvSheetRibbon.svelte +104 -51
- package/dist/SvSheetSizeDialog.svelte +4 -2
- package/dist/SvSheetSort.svelte +218 -0
- package/dist/SvSheetSort.svelte.d.ts +28 -0
- package/dist/SvSheetSparklines.svelte +135 -0
- package/dist/SvSheetSparklines.svelte.d.ts +14 -0
- package/dist/SvSheetTable.svelte +160 -0
- package/dist/SvSheetTable.svelte.d.ts +24 -0
- package/dist/SvSheetTabs.svelte +161 -31
- package/dist/SvSheetTabs.svelte.d.ts +22 -8
- package/dist/SvSheetTextToColumns.svelte +20 -20
- package/dist/SvSheetValidationAlert.svelte +8 -6
- package/dist/advanced-filter-enable.js +1 -1
- package/dist/alerts/alert-engine.d.ts +6 -0
- package/dist/alerts/alert-engine.js +21 -4
- package/dist/alerts/alert-formats.js +2 -0
- package/dist/alerts/alert-types.d.ts +1 -1
- package/dist/alerts.d.ts +1 -1
- package/dist/alerts.js +2 -2
- package/dist/board.js +2 -2
- package/dist/bulk-edit.d.ts +3 -1
- package/dist/bulk-edit.js +1 -1
- package/dist/cdn/svgrid-enterprise.svelte-external.js +39827 -16429
- package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
- package/dist/designer/assets/{SvChartMenu-D9hEeHar.js → SvChartMenu-BDoeqGz6.js} +1 -1
- package/dist/designer/assets/{SvDateTimePicker-DARvKUL2.js → SvDateTimePicker-DCPg7WGN.js} +1 -1
- package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
- package/dist/designer/assets/{SvGridChart-B8j1SSy3.js → SvGridChart-Cy1ATrWh.js} +2 -2
- package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
- package/dist/designer/assets/{SvGridChartPanel-pT6ITc2P.js → SvGridChartPanel-CATdVc9X.js} +3 -3
- package/dist/designer/assets/{SvGridChartView-bg281UA1.js → SvGridChartView-CmsZtCED.js} +1 -1
- package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
- package/dist/designer/assets/{SvTabs-UFCMTHXS.js → SvTabs-2mHC6oaz.js} +1 -1
- package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
- package/dist/designer/assets/{chart-cIPUsbM5.js → chart-Cn7MnNqA.js} +1 -1
- package/dist/designer/assets/{chart-panel-messages-DtTxpBUU.js → chart-panel-messages-Dz7PTIqT.js} +1 -1
- package/dist/designer/assets/{chart-summary-Czu_5epb.js → chart-summary-BD1qYB2R.js} +1 -1
- package/dist/designer/assets/{chart-trend-D5I5VEe8.js → chart-trend-B8xr5LuD.js} +1 -1
- package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
- package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
- package/dist/designer/assets/{focus-trap-CAreAhlU.js → focus-trap-V2-6Fy9I.js} +1 -1
- package/dist/designer/assets/{index-DwU7CAMm.js → index-BSjv6Qec.js} +317 -315
- package/dist/designer/assets/index-_JVFxt02.css +1 -0
- package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
- package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
- package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
- package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
- package/dist/designer/index.html +17 -16
- package/dist/export-pdf.d.ts +75 -0
- package/dist/export-pdf.js +216 -15
- package/dist/export.js +10 -2
- package/dist/gantt/SvGridGantt.svelte +2890 -0
- package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
- package/dist/gantt/gantt-config.d.ts +73 -0
- package/dist/gantt/gantt-config.js +1 -0
- package/dist/gantt/gantt-critical-path.d.ts +67 -0
- package/dist/gantt/gantt-critical-path.js +207 -0
- package/dist/gantt/gantt-model.d.ts +257 -0
- package/dist/gantt/gantt-model.js +651 -0
- package/dist/gantt/gantt-resources.d.ts +59 -0
- package/dist/gantt/gantt-resources.js +71 -0
- package/dist/gantt/gantt.d.ts +7 -0
- package/dist/gantt/gantt.js +36 -0
- package/dist/gantt/index.d.ts +15 -0
- package/dist/gantt/index.js +22 -0
- package/dist/gantt/timeline-arrows.d.ts +102 -0
- package/dist/gantt/timeline-arrows.js +181 -0
- package/dist/import.d.ts +2 -2
- package/dist/import.js +1 -1
- package/dist/index.d.ts +34 -7
- package/dist/index.js +44 -7
- package/dist/install.js +8 -1
- package/dist/license-core.d.ts +17 -1
- package/dist/license-core.js +16 -5
- package/dist/license.d.ts +18 -2
- package/dist/license.js +71 -6
- package/dist/node/studio.js +140 -8
- package/dist/pivot-enable.js +2 -2
- package/dist/scheduler-dependencies.d.ts +35 -0
- package/dist/scheduler-dependencies.js +36 -1
- package/dist/scheduler.js +2 -2
- package/dist/selection-bar.js +2 -2
- package/dist/server/SvGroupCell.svelte +213 -0
- package/dist/server/SvGroupCell.svelte.d.ts +62 -0
- package/dist/server/SvRowGroupPanel.svelte +322 -0
- package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
- package/dist/server/enable.d.ts +17 -0
- package/dist/server/enable.js +49 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.js +24 -0
- package/dist/server/messages.d.ts +45 -0
- package/dist/server/messages.js +35 -0
- package/dist/server/server-group-model.d.ts +104 -0
- package/dist/server/server-group-model.js +272 -0
- package/dist/server/server-pivot.d.ts +46 -0
- package/dist/server/server-pivot.js +57 -0
- package/dist/server/server-row-model.d.ts +547 -0
- package/dist/server/server-row-model.js +1551 -0
- package/dist/server/server-selection.d.ts +99 -0
- package/dist/server/server-selection.js +215 -0
- package/dist/server/svgrid-adapter.d.ts +155 -0
- package/dist/server/svgrid-adapter.js +202 -0
- package/dist/sheet/ast.d.ts +45 -1
- package/dist/sheet/ast.js +14 -0
- package/dist/sheet/auto-filter.d.ts +58 -4
- package/dist/sheet/auto-filter.js +159 -11
- package/dist/sheet/autocomplete.d.ts +9 -0
- package/dist/sheet/autocomplete.js +90 -4
- package/dist/sheet/cell-images.d.ts +39 -0
- package/dist/sheet/cell-images.js +90 -0
- package/dist/sheet/cell-types.d.ts +58 -0
- package/dist/sheet/cell-types.js +96 -0
- package/dist/sheet/coerce.d.ts +40 -0
- package/dist/sheet/coerce.js +170 -3
- package/dist/sheet/comments.d.ts +43 -9
- package/dist/sheet/comments.js +85 -27
- package/dist/sheet/conditional-formats.d.ts +29 -6
- package/dist/sheet/conditional-formats.js +37 -12
- package/dist/sheet/csv.d.ts +32 -0
- package/dist/sheet/csv.js +158 -0
- package/dist/sheet/culture.d.ts +87 -0
- package/dist/sheet/culture.js +247 -0
- package/dist/sheet/delta.d.ts +102 -0
- package/dist/sheet/delta.js +203 -0
- package/dist/sheet/deps.d.ts +45 -1
- package/dist/sheet/deps.js +77 -2
- package/dist/sheet/document.d.ts +106 -4
- package/dist/sheet/document.js +204 -3
- package/dist/sheet/engine.d.ts +67 -0
- package/dist/sheet/engine.js +19 -0
- package/dist/sheet/entry.d.ts +8 -4
- package/dist/sheet/entry.js +171 -21
- package/dist/sheet/error-check.d.ts +49 -0
- package/dist/sheet/error-check.js +83 -0
- package/dist/sheet/evaluate-steps.d.ts +48 -0
- package/dist/sheet/evaluate-steps.js +196 -0
- package/dist/sheet/evaluate.d.ts +67 -0
- package/dist/sheet/evaluate.js +725 -13
- package/dist/sheet/filter-files.d.ts +37 -0
- package/dist/sheet/filter-files.js +465 -0
- package/dist/sheet/format-store.d.ts +15 -0
- package/dist/sheet/format-store.js +11 -1
- package/dist/sheet/from-rows.d.ts +14 -0
- package/dist/sheet/from-rows.js +50 -0
- package/dist/sheet/function-catalog.d.ts +1 -1
- package/dist/sheet/function-catalog.js +296 -5
- package/dist/sheet/functions.js +363 -91
- package/dist/sheet/index.d.ts +35 -8
- package/dist/sheet/index.js +35 -8
- package/dist/sheet/links.d.ts +57 -0
- package/dist/sheet/links.js +174 -0
- package/dist/sheet/messages.d.ts +778 -0
- package/dist/sheet/messages.js +806 -0
- package/dist/sheet/number-format.d.ts +52 -5
- package/dist/sheet/number-format.js +465 -68
- package/dist/sheet/objects.d.ts +106 -0
- package/dist/sheet/objects.js +149 -0
- package/dist/sheet/ods-document.d.ts +44 -0
- package/dist/sheet/ods-document.js +1275 -0
- package/dist/sheet/open-file.d.ts +26 -0
- package/dist/sheet/open-file.js +56 -0
- package/dist/sheet/outline.d.ts +82 -0
- package/dist/sheet/outline.js +228 -0
- package/dist/sheet/packs/array.d.ts +16 -0
- package/dist/sheet/packs/array.js +172 -0
- package/dist/sheet/packs/database.d.ts +42 -0
- package/dist/sheet/packs/database.js +142 -0
- package/dist/sheet/packs/engineering.d.ts +2 -0
- package/dist/sheet/packs/engineering.js +296 -0
- package/dist/sheet/packs/financial.d.ts +5 -0
- package/dist/sheet/packs/financial.js +220 -0
- package/dist/sheet/packs/math-stats.d.ts +2 -0
- package/dist/sheet/packs/math-stats.js +372 -0
- package/dist/sheet/packs/special.d.ts +44 -0
- package/dist/sheet/packs/special.js +187 -0
- package/dist/sheet/packs/stats-dist.d.ts +2 -0
- package/dist/sheet/packs/stats-dist.js +785 -0
- package/dist/sheet/packs/text-date.d.ts +2 -0
- package/dist/sheet/packs/text-date.js +332 -0
- package/dist/sheet/packs/trig.d.ts +2 -0
- package/dist/sheet/packs/trig.js +73 -0
- package/dist/sheet/page-setup.d.ts +73 -0
- package/dist/sheet/page-setup.js +73 -0
- package/dist/sheet/parse.js +42 -10
- package/dist/sheet/paste-special.d.ts +22 -0
- package/dist/sheet/paste-special.js +14 -5
- package/dist/sheet/pivot-range.d.ts +160 -0
- package/dist/sheet/pivot-range.js +333 -0
- package/dist/sheet/presence.d.ts +73 -0
- package/dist/sheet/presence.js +79 -0
- package/dist/sheet/print.d.ts +104 -0
- package/dist/sheet/print.js +169 -0
- package/dist/sheet/protection.d.ts +55 -1
- package/dist/sheet/protection.js +55 -2
- package/dist/sheet/rects.d.ts +1 -1
- package/dist/sheet/refs.d.ts +48 -0
- package/dist/sheet/refs.js +155 -8
- package/dist/sheet/ribbon-icons.d.ts +1 -1
- package/dist/sheet/ribbon-icons.js +186 -0
- package/dist/sheet/ribbon.d.ts +1 -1
- package/dist/sheet/ribbon.js +324 -23
- package/dist/sheet/sheet-kinds.d.ts +74 -0
- package/dist/sheet/sheet-kinds.js +91 -0
- package/dist/sheet/shortcuts.d.ts +13 -3
- package/dist/sheet/shortcuts.js +63 -12
- package/dist/sheet/sort.d.ts +51 -0
- package/dist/sheet/sort.js +107 -0
- package/dist/sheet/sparklines.d.ts +111 -0
- package/dist/sheet/sparklines.js +204 -0
- package/dist/sheet/table-styles.d.ts +74 -0
- package/dist/sheet/table-styles.js +152 -0
- package/dist/sheet/tables.d.ts +19 -0
- package/dist/sheet/tables.js +31 -0
- package/dist/sheet/tokenize.d.ts +18 -1
- package/dist/sheet/tokenize.js +60 -9
- package/dist/sheet/validation.d.ts +16 -0
- package/dist/sheet/validation.js +37 -0
- package/dist/sheet/workbook.d.ts +148 -3
- package/dist/sheet/workbook.js +742 -31
- package/dist/sheet/xls-cfb.d.ts +32 -0
- package/dist/sheet/xls-cfb.js +290 -0
- package/dist/sheet/xls-document.d.ts +10 -0
- package/dist/sheet/xls-document.js +1243 -0
- package/dist/sheet/xls-formula.d.ts +40 -0
- package/dist/sheet/xls-formula.js +569 -0
- package/dist/sheet/xlsx-document.d.ts +108 -0
- package/dist/sheet/xlsx-document.js +1849 -0
- package/dist/sheet/xlsx-drawing.d.ts +99 -0
- package/dist/sheet/xlsx-drawing.js +420 -0
- package/dist/sheet-enable.js +6 -7
- package/dist/sheet-text.d.ts +7 -0
- package/dist/sheet-text.js +29 -0
- package/dist/sources/auth-supabase.js +2 -2
- package/dist/sources/realtime-supabase.js +2 -2
- package/dist/sources/rest.d.ts +6 -2
- package/dist/sources/rest.js +42 -7
- package/dist/sources/supabase.d.ts +10 -1
- package/dist/sources/supabase.js +73 -40
- package/dist/studio/emit-project.js +14 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio/project.d.ts +11 -2
- package/dist/studio/project.js +5 -2
- package/dist/studio/ui-components.generated.js +107 -2
- package/dist/sveltekit/in-memory.d.ts +2 -2
- package/dist/sveltekit/in-memory.js +125 -4
- package/dist/sveltekit/index.d.ts +1 -1
- package/dist/sveltekit/index.js +1 -1
- package/dist/sveltekit/query-plan.d.ts +50 -4
- package/dist/sveltekit/query-plan.js +25 -3
- package/dist/sveltekit/sql-source.d.ts +6 -0
- package/dist/sveltekit/sql-source.js +34 -6
- package/dist/sveltekit/sql.d.ts +31 -0
- package/dist/sveltekit/sql.js +135 -25
- package/dist/sveltekit/transport.d.ts +10 -2
- package/dist/sveltekit/transport.js +30 -6
- package/dist/upgrade-prompt.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/watermark.js +35 -2
- package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
- package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
- package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
- package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
- package/dist/wc/SvField-B_kurx_P.js +149 -0
- package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
- package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
- package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
- package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
- package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
- package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
- package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
- package/dist/wc/SvModal-DrfOYYyX.js +189 -0
- package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
- package/dist/wc/chart-6OXlybVT.js +4341 -0
- package/dist/wc/chart-export-CeSADGfi.js +135 -0
- package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
- package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
- package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
- package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
- package/dist/wc/client-DQIzjDBG.js +3064 -0
- package/dist/wc/column-resize-DUPgynvc.js +101 -0
- package/dist/wc/date-format-DS-z_h9v.js +1130 -0
- package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
- package/dist/wc/editor-contract-peBDxir_.js +22 -0
- package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
- package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
- package/dist/wc/list-option-DrRyivWp.js +82 -0
- package/dist/wc/popover-WsGlvtQv.js +69 -0
- package/dist/wc/positioning-BiKLfu1E.js +112 -0
- package/dist/wc/react.d.ts +41 -0
- package/dist/wc/react.js +90 -0
- package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
- package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
- package/dist/wc/row-resize-limG_N1z.js +111 -0
- package/dist/wc/sv-sheet-element.d.ts +97 -0
- package/dist/wc/sv-sheet-element.js +44213 -0
- package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
- package/dist/wc/validate-BqDthkNr.js +88 -0
- package/dist/wc/vue.d.ts +31 -0
- package/dist/wc/vue.js +75 -0
- package/package.json +30 -5
- package/dist/designer/assets/GridMenus-BlsvL_aU.js +0 -8
- package/dist/designer/assets/SvGridCellEditor-C7uQXYds.js +0 -4
- package/dist/designer/assets/SvGridChartBuilder-kvyIU_Rl.js +0 -1
- package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
- package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
- package/dist/designer/assets/index-CMFgAoVV.css +0 -1
- package/dist/designer/assets/row-resize-DLktcqUK.js +0 -1
- package/dist/designer/assets/src-EdI3Xqds.js +0 -58
- package/dist/designer/assets/validate-h-aslRV9.js +0 -1
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Server-Side Row Model.
|
|
3
|
+
*
|
|
4
|
+
* One `getRows` contract, any depth of grouping or tree, and every level
|
|
5
|
+
* scrolls: the top level is one block cache, each expanded group is another,
|
|
6
|
+
* and the rows the user has not scrolled to are placeholders that cost
|
|
7
|
+
* nothing to hold. Sorting, filtering, expanding, refreshing, transactions
|
|
8
|
+
* (Phase 4) and selection across rows that were never loaded (Phase 5) all
|
|
9
|
+
* hang off this one object, and `<SvGrid rowModel={ctl} />` wires the lot.
|
|
10
|
+
*
|
|
11
|
+
* What the free grid gives it: the datasource contract (`ServerRequest` /
|
|
12
|
+
* `ServerResult`), the block cache (`createBlockCache`), the placeholder mark
|
|
13
|
+
* (`createRowPlaceholder`) and the four seams `rowModel` plugs into. What this
|
|
14
|
+
* file adds is the TREE: a store per route, a flatten that splices expanded
|
|
15
|
+
* groups' children into one display list, and the rules for which stores a
|
|
16
|
+
* sort, a filter or a refresh actually touches.
|
|
17
|
+
*
|
|
18
|
+
* Headless and framework-agnostic on purpose. Nothing here imports Svelte;
|
|
19
|
+
* `onChange` and `subscribe` are how the outside learns anything changed.
|
|
20
|
+
*
|
|
21
|
+
* `createServerGroupModel` (the previous model, block-append with a "Load N
|
|
22
|
+
* more" button) is still exported for anyone on it; this one supersedes it.
|
|
23
|
+
*/
|
|
24
|
+
import { type BlockState, type GridFilterState, type GridRowModel, type ServerAggregation, type ServerDataSource, type ServerDisplayRow, type ServerFilterModel, type ServerGroupRow, type ServerLeafRow, type ServerPlaceholderRow, type ServerSortModel } from '@svgrid/grid/server';
|
|
25
|
+
import { type PivotResultColumnOptions } from './server-pivot.js';
|
|
26
|
+
import { type ServerGroupMessages } from './messages.js';
|
|
27
|
+
import { type ServerGroupSelectionNode, type ServerSelectionGroupMode, type ServerSelectionModel, type ServerSelectionState } from './server-selection.js';
|
|
28
|
+
import { type CallbackGroupSelectionState, type CallbackSelectionState } from './svgrid-adapter.js';
|
|
29
|
+
/** Per-level cache settings, from `levelParams`. */
|
|
30
|
+
export type ServerLevelParams = {
|
|
31
|
+
/** Rows per request at this level. Default: the model's `blockSize`. */
|
|
32
|
+
blockSize?: number;
|
|
33
|
+
/** Loaded blocks to keep at this level. Default: the model's `maxBlocksInCache`. */
|
|
34
|
+
maxBlocksInCache?: number;
|
|
35
|
+
/**
|
|
36
|
+
* `false` loads the whole level as soon as it opens (block by block, still
|
|
37
|
+
* under the concurrency cap) instead of waiting for the viewport. A level
|
|
38
|
+
* that is fully loaded can also be sorted in the browser - see
|
|
39
|
+
* `clientSideSort`.
|
|
40
|
+
*/
|
|
41
|
+
infinite?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Children arrive one block at a time behind a "Load N more" row instead
|
|
44
|
+
* of by scroll: the level shows what it has loaded, then a `more` row
|
|
45
|
+
* while the server holds more. `loadMoreChildren(route)` - or the row's
|
|
46
|
+
* own toggle - fetches the next block. Wins over `infinite`.
|
|
47
|
+
*/
|
|
48
|
+
loadMore?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Rows this level claims before its first block lands, as placeholders.
|
|
51
|
+
* Default: the model's `skeletonRows`. Set it to the count you expect at
|
|
52
|
+
* the root of flat data and `api.scrollToRow(900000)` works before
|
|
53
|
+
* anything has loaded: the scrollbar is already the right length, the
|
|
54
|
+
* rows there are placeholders, and the block under them is what loads.
|
|
55
|
+
*/
|
|
56
|
+
initialRowCount?: number;
|
|
57
|
+
};
|
|
58
|
+
/** Paging the top level instead of scrolling it. See `ServerRowModelOptions.pagination`. */
|
|
59
|
+
export type ServerRowModelPaginationOptions = {
|
|
60
|
+
/** Rows per page. Default 100. */
|
|
61
|
+
pageSize?: number;
|
|
62
|
+
/** Choices for the footer's page-size selector. */
|
|
63
|
+
pageSizes?: number[];
|
|
64
|
+
/**
|
|
65
|
+
* Fit the page to the grid: as many rows as its body shows without
|
|
66
|
+
* scrolling, re-measured when the grid resizes. `pageSize` is then the
|
|
67
|
+
* size until the first measurement.
|
|
68
|
+
*/
|
|
69
|
+
autoPageSize?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Count every row of the flattened tree towards the page, children
|
|
72
|
+
* included. Off, a page is `pageSize` top-level rows, each shown with
|
|
73
|
+
* whatever is open beneath it.
|
|
74
|
+
*/
|
|
75
|
+
paginateChildRows?: boolean;
|
|
76
|
+
};
|
|
77
|
+
/** Where the pager stands. */
|
|
78
|
+
export type ServerRowModelPagination = {
|
|
79
|
+
pageIndex: number;
|
|
80
|
+
pageSize: number;
|
|
81
|
+
/** Top-level rows, or flattened rows with `paginateChildRows`. */
|
|
82
|
+
rowCount: number;
|
|
83
|
+
pageCount: number;
|
|
84
|
+
};
|
|
85
|
+
/** Where a route's rows stand, for diagnostics. */
|
|
86
|
+
export type ServerLevelState = {
|
|
87
|
+
route: string[];
|
|
88
|
+
level: number;
|
|
89
|
+
rowCount: number | null;
|
|
90
|
+
lastRowKnown: boolean;
|
|
91
|
+
loading: boolean;
|
|
92
|
+
failedBlocks: number[];
|
|
93
|
+
blocks: BlockState[];
|
|
94
|
+
};
|
|
95
|
+
/** Everything `createServerRowModel` is built from: grouping, tree, pivot, blocks per level, totals, paging, selection, transactions and events. */
|
|
96
|
+
export type ServerRowModelOptions<TData> = {
|
|
97
|
+
/** Columns to group on, outer to inner. Leave empty for a flat list or a tree. */
|
|
98
|
+
groupBy?: string[];
|
|
99
|
+
/** Value columns to roll up per group. */
|
|
100
|
+
aggregations?: ServerAggregation[];
|
|
101
|
+
/**
|
|
102
|
+
* Server-side pivot: the columns whose distinct values become columns.
|
|
103
|
+
* Takes effect with `pivotMode`; see `setPivot`.
|
|
104
|
+
*/
|
|
105
|
+
pivotBy?: string[];
|
|
106
|
+
pivotMode?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* In pivot mode, a `Total` header group after the pivot keys with the
|
|
109
|
+
* row's plain aggregates (`amount` beside `2024_amount`, `2025_amount`).
|
|
110
|
+
* The backend puts those fields on every group row and on the grand
|
|
111
|
+
* total in pivot mode; the reference sources do. A string is the label.
|
|
112
|
+
*/
|
|
113
|
+
pivotRowTotals?: boolean | string;
|
|
114
|
+
/** How a backend joins pivot keys and the value column into a field name. Default `_`. */
|
|
115
|
+
pivotFieldSeparator?: string;
|
|
116
|
+
/** Post-process each generated pivot value column. */
|
|
117
|
+
pivotResultColumn?: PivotResultColumnOptions['pivotResultColumn'];
|
|
118
|
+
/**
|
|
119
|
+
* Columns to put BEFORE the generated pivot columns in pivot mode -
|
|
120
|
+
* the group column with its expander, typically. The pivot columns
|
|
121
|
+
* replace the grid's `columns` wholesale, so this is where the
|
|
122
|
+
* app's own leading columns come back in.
|
|
123
|
+
*/
|
|
124
|
+
pivotLeadingColumns?: ReadonlyArray<unknown>;
|
|
125
|
+
/**
|
|
126
|
+
* Self-referential tree: each row is a node whose children load on expand.
|
|
127
|
+
* Needs `getRowId` (the node id, which builds the `groupKeys` path) and
|
|
128
|
+
* `hasChildren`.
|
|
129
|
+
*/
|
|
130
|
+
treeData?: boolean;
|
|
131
|
+
/** Stable row id. Needed for tree data, selection and transactions. */
|
|
132
|
+
getRowId?: (row: TData) => string;
|
|
133
|
+
/** Tree data: whether a node can be expanded. */
|
|
134
|
+
hasChildren?: (row: TData) => boolean;
|
|
135
|
+
/**
|
|
136
|
+
* How many rows a group holds, read off its response row. Shown beside the
|
|
137
|
+
* key, and used to size the group's scrollbar before its first block lands.
|
|
138
|
+
*/
|
|
139
|
+
childCount?: (row: TData) => number | undefined;
|
|
140
|
+
/** Open a group as soon as it arrives. Receives the route and the row. */
|
|
141
|
+
isGroupOpenByDefault?: (route: string[], row: TData) => boolean;
|
|
142
|
+
/** Per-level cache settings. Called once per route when its store is created. */
|
|
143
|
+
levelParams?: (level: number, route: string[]) => ServerLevelParams;
|
|
144
|
+
/** Rows per request, unless `levelParams` says otherwise. Default 100. */
|
|
145
|
+
blockSize?: number;
|
|
146
|
+
/** Loaded blocks to keep per level, unless `levelParams` says otherwise. Unlimited by default. */
|
|
147
|
+
maxBlocksInCache?: number;
|
|
148
|
+
/** Requests open at once, across every level. Default 2. */
|
|
149
|
+
maxConcurrentRequests?: number;
|
|
150
|
+
/** Wait for the scroll to settle this long before fetching. Default 0. */
|
|
151
|
+
blockLoadDebounceMs?: number;
|
|
152
|
+
/**
|
|
153
|
+
* Placeholder rows shown for a level before its first block lands - so an
|
|
154
|
+
* expand never opens onto nothing. Default 3.
|
|
155
|
+
*/
|
|
156
|
+
skeletonRows?: number;
|
|
157
|
+
/**
|
|
158
|
+
* Page the top level instead of scrolling it. Blocks stay independent of
|
|
159
|
+
* pages: a page of 20 over blocks of 100 costs one request per five
|
|
160
|
+
* pages. Omit for infinite scrolling.
|
|
161
|
+
*/
|
|
162
|
+
pagination?: ServerRowModelPaginationOptions;
|
|
163
|
+
/** Emit a subtotal "footer" row after each expanded group's children. */
|
|
164
|
+
groupFooters?: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* A grand-total row across the whole result. The root request then carries
|
|
167
|
+
* `needsGrandTotal` and the source answers with `grandTotal`. `top` /
|
|
168
|
+
* `bottom` put it in the scrolling list; the pinned variants hand it to the
|
|
169
|
+
* grid's pinned rows so it stays in view.
|
|
170
|
+
*/
|
|
171
|
+
grandTotalRow?: 'top' | 'bottom' | 'pinnedTop' | 'pinnedBottom';
|
|
172
|
+
/** Drop a group's cached children when it is collapsed. Default false. */
|
|
173
|
+
purgeClosedGroups?: boolean;
|
|
174
|
+
/**
|
|
175
|
+
* Hide a group row once it is open, so its children stand at its level.
|
|
176
|
+
* The classic "multi-column group" look.
|
|
177
|
+
*/
|
|
178
|
+
hideOpenParents?: boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Treat a group whose key is empty as unbalanced: always open, its group
|
|
181
|
+
* row hidden, its rows shown among the siblings. Costs one extra request
|
|
182
|
+
* per such group.
|
|
183
|
+
*/
|
|
184
|
+
allowUnbalancedGroups?: boolean;
|
|
185
|
+
/**
|
|
186
|
+
* Which levels a sort re-fetches. The default is selective: a column that
|
|
187
|
+
* is neither grouped nor aggregated only re-orders leaves; a grouped column
|
|
188
|
+
* re-fetches its own level; an aggregated column re-fetches everything.
|
|
189
|
+
* `true` always re-fetches everything.
|
|
190
|
+
*/
|
|
191
|
+
sortAllLevels?: boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Sort a fully loaded level in the browser instead of asking the server.
|
|
194
|
+
* Plain type-aware comparison; a backend with collation rules of its own
|
|
195
|
+
* should leave this off.
|
|
196
|
+
*/
|
|
197
|
+
clientSideSort?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Re-fetch only the levels a filter touches instead of everything. Cheaper,
|
|
200
|
+
* but the levels above keep their old counts and aggregates, so a group can
|
|
201
|
+
* end up showing zero children. A filter on an aggregated column always
|
|
202
|
+
* re-fetches everything.
|
|
203
|
+
*/
|
|
204
|
+
onlyRefreshFilteredGroups?: boolean;
|
|
205
|
+
/**
|
|
206
|
+
* Row selection as a RULE rather than a list of ids, so "select all" can
|
|
207
|
+
* mean a million rows the grid never loaded. `self` treats a group row as
|
|
208
|
+
* one row; `descendants` makes ticking a group select everything beneath
|
|
209
|
+
* it. Off by default; the grid then keeps selection itself, over loaded
|
|
210
|
+
* rows only. See `ctl.selection`, `getSelectionState`, `bulkUpdate`.
|
|
211
|
+
*/
|
|
212
|
+
selection?: {
|
|
213
|
+
groupSelects?: ServerSelectionGroupMode;
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* Apply `updateRow` and `deleteRow` to the loaded rows before the server
|
|
217
|
+
* answers, and put them back if it rejects: the same contract as the
|
|
218
|
+
* free controller's `optimistic`. A create waits for the server either
|
|
219
|
+
* way, since the row has no id until then. Off by default, so a cell
|
|
220
|
+
* shows a new value only once the server has it.
|
|
221
|
+
*/
|
|
222
|
+
optimistic?: boolean;
|
|
223
|
+
/** Forwarded on every request as `ServerRequest.context`. Keep it serialisable. */
|
|
224
|
+
context?: unknown;
|
|
225
|
+
/** Distinct values for a column's set filter, for `<SvGrid rowModel>` to use. */
|
|
226
|
+
filterValues?: (columnId: string) => Promise<Array<string>>;
|
|
227
|
+
/** Log every block requested, loaded, failed and evicted, with its route. */
|
|
228
|
+
debug?: boolean;
|
|
229
|
+
/**
|
|
230
|
+
* Veto a transaction. Return false and it is reported `cancelled` and
|
|
231
|
+
* nothing changes - the hook for "a refresh is in flight, drop this".
|
|
232
|
+
*/
|
|
233
|
+
isApplyTransaction?: (transaction: ServerTransaction<TData>) => boolean;
|
|
234
|
+
/** How long `applyTransactionAsync` batches before flushing. Default 50 ms. */
|
|
235
|
+
asyncTransactionWaitMs?: number;
|
|
236
|
+
onChange?: (state: ServerRowModelState<TData>) => void;
|
|
237
|
+
/** A batch of async transactions was applied, in order. */
|
|
238
|
+
onAsyncTransactionsFlushed?: (results: ServerTransactionResult[]) => void;
|
|
239
|
+
/** A level finished re-fetching after `refresh()` (not after a purge). */
|
|
240
|
+
onStoreRefreshed?: (route: string[]) => void;
|
|
241
|
+
/** A group was opened, by the user or by `isGroupOpenByDefault`. */
|
|
242
|
+
onGroupOpened?: (route: string[]) => void;
|
|
243
|
+
/** A block failed to load. The row shows a Retry; this is for logging. */
|
|
244
|
+
onLoadError?: (route: string[], error: unknown) => void;
|
|
245
|
+
};
|
|
246
|
+
/** What this model puts on screen: every shared display row, plus placeholders. */
|
|
247
|
+
export type ServerRowModelDisplayRow<TData> = ServerDisplayRow<TData> | ServerPlaceholderRow;
|
|
248
|
+
/** What the model emits on every change: the flattened display list, the grid rows, the counts and the current layout. */
|
|
249
|
+
export type ServerRowModelState<TData> = {
|
|
250
|
+
/**
|
|
251
|
+
* The flattened tree, one entry per row the grid shows: groups with their
|
|
252
|
+
* expanded children spliced in, footers, the grand total, and a shared
|
|
253
|
+
* placeholder object for every row not yet loaded.
|
|
254
|
+
*/
|
|
255
|
+
displayRows: ReadonlyArray<ServerRowModelDisplayRow<TData>>;
|
|
256
|
+
/** `displayRows` mapped to grid rows - each row's data spread, plus `__group`. */
|
|
257
|
+
gridRows: ReadonlyArray<ServerRowModelGridRow<TData>>;
|
|
258
|
+
groupBy: string[];
|
|
259
|
+
aggregations: ServerAggregation[];
|
|
260
|
+
/** Rows at the top level, or null until the root has answered. */
|
|
261
|
+
rowCount: number | null;
|
|
262
|
+
/** True while the root has never loaded. */
|
|
263
|
+
loading: boolean;
|
|
264
|
+
/** True while a `createRow`, `updateRow` or `deleteRow` is in flight. */
|
|
265
|
+
saving: boolean;
|
|
266
|
+
/** The rejection from the last failed top-level fetch, else null. */
|
|
267
|
+
error: unknown;
|
|
268
|
+
sortModel: ServerSortModel;
|
|
269
|
+
filterModel: ServerFilterModel;
|
|
270
|
+
/** Ids (JSON of the route) of the expanded groups. */
|
|
271
|
+
expandedGroups: string[];
|
|
272
|
+
/** Ids (by `getRowId`) of the leaves whose detail panel is open. */
|
|
273
|
+
openDetails: string[];
|
|
274
|
+
/** The grand-total row, when one is configured and has arrived. */
|
|
275
|
+
grandTotal: TData | null;
|
|
276
|
+
pivotBy: string[];
|
|
277
|
+
pivotMode: boolean;
|
|
278
|
+
/** The pivoted value fields the backend has reported so far, in pivot mode. */
|
|
279
|
+
pivotResultFields: string[];
|
|
280
|
+
/** The pager, or null when the top level scrolls. */
|
|
281
|
+
pagination: ServerRowModelPagination | null;
|
|
282
|
+
};
|
|
283
|
+
/**
|
|
284
|
+
* What the grid renders: the row's own fields at the top level (so a plain
|
|
285
|
+
* `field` column shows a subtotal on a group row and the value on a leaf)
|
|
286
|
+
* plus the display row under `__group`. Placeholders carry only the marker.
|
|
287
|
+
*/
|
|
288
|
+
export type ServerRowModelGridRow<TData> = (TData | Record<string, never>) & {
|
|
289
|
+
__group: ServerRowModelDisplayRow<TData>;
|
|
290
|
+
};
|
|
291
|
+
/**
|
|
292
|
+
* Add, update and remove rows in one level without a request.
|
|
293
|
+
*
|
|
294
|
+
* Rows are matched by `getRowId` at a leaf level, and by the group column's
|
|
295
|
+
* value at a group level (a group row IS its key). The grand total answers
|
|
296
|
+
* to the fixed id `sv-grand-total`.
|
|
297
|
+
*/
|
|
298
|
+
export type ServerTransaction<TData> = {
|
|
299
|
+
/** The level to apply to. Omit for the top level. */
|
|
300
|
+
route?: string[];
|
|
301
|
+
add?: ReadonlyArray<TData>;
|
|
302
|
+
/** Where `add` goes. Default: the end of the level. */
|
|
303
|
+
addIndex?: number;
|
|
304
|
+
update?: ReadonlyArray<TData>;
|
|
305
|
+
/** Rows to remove, or their ids. */
|
|
306
|
+
remove?: ReadonlyArray<TData | string>;
|
|
307
|
+
/**
|
|
308
|
+
* The level's row count afterwards, when you know it better than the
|
|
309
|
+
* arithmetic does - a delete that also removed rows outside the cache,
|
|
310
|
+
* say. Applied last.
|
|
311
|
+
*/
|
|
312
|
+
rowCount?: number;
|
|
313
|
+
};
|
|
314
|
+
/**
|
|
315
|
+
* How a transaction went. `applied`: every part that could be applied was.
|
|
316
|
+
* `storeNotFound`: no level exists for `route` (nothing has been expanded
|
|
317
|
+
* there). `cancelled`: `isApplyTransaction` said no. `storeLoading`: the
|
|
318
|
+
* level's first block is still in flight. `storeWaitingToLoad`: the level
|
|
319
|
+
* exists but nothing has been requested from it yet. `storeLoadingFailed`:
|
|
320
|
+
* the level's load failed; retry it before applying.
|
|
321
|
+
*/
|
|
322
|
+
export type ServerTransactionStatus = 'applied' | 'storeNotFound' | 'cancelled' | 'storeLoading' | 'storeWaitingToLoad' | 'storeLoadingFailed';
|
|
323
|
+
/** What `applyTransaction` returns: the status and the ids it placed, patched and removed. */
|
|
324
|
+
export type ServerTransactionResult = {
|
|
325
|
+
status: ServerTransactionStatus;
|
|
326
|
+
/** Ids of the rows placed in the cache. */
|
|
327
|
+
add: string[];
|
|
328
|
+
/** Ids of the rows found and updated. */
|
|
329
|
+
update: string[];
|
|
330
|
+
/** Ids of the rows found and removed. */
|
|
331
|
+
remove: string[];
|
|
332
|
+
};
|
|
333
|
+
/** What `refresh` takes: the level to re-read (`[]` is the root) and whether to drop its cache first. */
|
|
334
|
+
export type RefreshOptions = {
|
|
335
|
+
/** The group whose children to reload. Omit for the top level. */
|
|
336
|
+
route?: string[];
|
|
337
|
+
/**
|
|
338
|
+
* Drop the cache for that level and everything beneath it and start over.
|
|
339
|
+
* Without it the loaded blocks re-fetch in place: the count, the scroll
|
|
340
|
+
* position and every expanded descendant survive.
|
|
341
|
+
*/
|
|
342
|
+
purge?: boolean;
|
|
343
|
+
};
|
|
344
|
+
/** The Server-Side Row Model: the controller surface plus the `GridRowModel` shape, so one object drives the grid through `rowModel`. */
|
|
345
|
+
export type ServerRowModel<TData> = GridRowModel<ServerRowModelGridRow<TData>> & {
|
|
346
|
+
/** The group accessors the grid's treegrid keyboard and `SvGroupCell` use. Always present on this model. */
|
|
347
|
+
group: NonNullable<GridRowModel<ServerRowModelGridRow<TData>>['group']>;
|
|
348
|
+
/** Load the top level, or reload a level. See {@link RefreshOptions}. */
|
|
349
|
+
refresh(options?: RefreshOptions): void;
|
|
350
|
+
/** Re-fetch every block that failed, at every level. */
|
|
351
|
+
retryLoads(): void;
|
|
352
|
+
/** Replace the sort and re-fetch the levels it affects. Takes either filter shape. */
|
|
353
|
+
setSort(sortModel: ServerSortModel): void;
|
|
354
|
+
setFilter(filterModel: ServerFilterModel | GridFilterState): void;
|
|
355
|
+
/** Change the grouping. Collapses everything and reloads the top level. */
|
|
356
|
+
setGroupBy(groupBy: string[]): void;
|
|
357
|
+
/** Change the aggregations. Reloads every level. */
|
|
358
|
+
setAggregations(aggregations: ServerAggregation[]): void;
|
|
359
|
+
/**
|
|
360
|
+
* Change the pivot columns and / or switch pivot mode. Reloads every
|
|
361
|
+
* level. In pivot mode the innermost group level cannot be opened: its
|
|
362
|
+
* rows are the pivoted aggregates, and there are no leaves under them.
|
|
363
|
+
*/
|
|
364
|
+
setPivot(pivot: {
|
|
365
|
+
pivotBy?: string[];
|
|
366
|
+
pivotMode?: boolean;
|
|
367
|
+
}): void;
|
|
368
|
+
/**
|
|
369
|
+
* Change any of group-by, aggregations and pivot in one go, with ONE
|
|
370
|
+
* reload - what a designer sends on Apply. A field left out keeps its
|
|
371
|
+
* value; a layout equal to the current one does nothing at all.
|
|
372
|
+
*/
|
|
373
|
+
setLayout(layout: {
|
|
374
|
+
groupBy?: string[];
|
|
375
|
+
aggregations?: ServerAggregation[];
|
|
376
|
+
pivotBy?: string[];
|
|
377
|
+
pivotMode?: boolean;
|
|
378
|
+
pivotRowTotals?: boolean | string;
|
|
379
|
+
}): void;
|
|
380
|
+
/** Go to a page (clamped to what exists). No-op without `pagination`. */
|
|
381
|
+
setPage(pageIndex: number): void;
|
|
382
|
+
/** Change the page size; the current first row stays on screen. */
|
|
383
|
+
setPageSize(pageSize: number): void;
|
|
384
|
+
/** Fetch the next block of a `loadMore` level (the "Load N more" row). */
|
|
385
|
+
loadMoreChildren(route: string[]): void;
|
|
386
|
+
toggleGroup(row: ServerGroupRow<TData>): void;
|
|
387
|
+
expandGroup(route: string[]): void;
|
|
388
|
+
collapseGroup(route: string[]): void;
|
|
389
|
+
/**
|
|
390
|
+
* Open every group. With `includeUnloaded`, groups that arrive later open
|
|
391
|
+
* on arrival too, until the next `collapseAll()`.
|
|
392
|
+
*/
|
|
393
|
+
expandAll(options?: {
|
|
394
|
+
includeUnloaded?: boolean;
|
|
395
|
+
}): void;
|
|
396
|
+
collapseAll(): void;
|
|
397
|
+
isExpanded(route: string[]): boolean;
|
|
398
|
+
/**
|
|
399
|
+
* Master-detail: open or close the detail panel under a leaf, by the id
|
|
400
|
+
* `getRowId` gives it. The panel is a display row of kind `detail` right
|
|
401
|
+
* under its leaf, carrying the leaf as `master`; mark it for the grid
|
|
402
|
+
* with `isDetailRow: (row) => row.__group?.kind === 'detail'` and draw
|
|
403
|
+
* it with `renderDetailRow` (give `detailRowHeight` under
|
|
404
|
+
* virtualization). Closes with the group that holds the leaf, and goes
|
|
405
|
+
* when the leaf is removed.
|
|
406
|
+
*/
|
|
407
|
+
toggleDetail(id: string, open?: boolean): void;
|
|
408
|
+
isDetailOpen(id: string): boolean;
|
|
409
|
+
/** Close every open detail panel. */
|
|
410
|
+
closeAllDetails(): void;
|
|
411
|
+
/**
|
|
412
|
+
* Write rows straight into a level, bypassing the datasource: children
|
|
413
|
+
* that came with their parent, a socket that pushed a whole level. Creates
|
|
414
|
+
* the level's store if it does not exist. `startRow` must sit on a block
|
|
415
|
+
* boundary for that level.
|
|
416
|
+
*/
|
|
417
|
+
applyRowData(input: {
|
|
418
|
+
route?: string[];
|
|
419
|
+
rows: ReadonlyArray<TData>;
|
|
420
|
+
rowCount?: number;
|
|
421
|
+
startRow?: number;
|
|
422
|
+
}): void;
|
|
423
|
+
/** Apply a transaction now. See {@link ServerTransaction}. */
|
|
424
|
+
applyTransaction(transaction: ServerTransaction<TData>): ServerTransactionResult;
|
|
425
|
+
/**
|
|
426
|
+
* Queue a transaction and apply it with whatever else arrives within
|
|
427
|
+
* `asyncTransactionWaitMs`, so a burst of updates re-renders once. A
|
|
428
|
+
* transaction whose level is still loading waits for it. The callback
|
|
429
|
+
* gets that transaction's result when the batch flushes.
|
|
430
|
+
*/
|
|
431
|
+
applyTransactionAsync(transaction: ServerTransaction<TData>, callback?: (result: ServerTransactionResult) => void): void;
|
|
432
|
+
/** Apply every queued async transaction now. */
|
|
433
|
+
flushAsyncTransactions(): void;
|
|
434
|
+
/**
|
|
435
|
+
* Patch one loaded row in place, on whatever level holds it, without a
|
|
436
|
+
* request and without changing its id. The path for a socket-driven
|
|
437
|
+
* tick; `applyTransaction` is for adding and removing. `replace` swaps
|
|
438
|
+
* the whole row instead of merging the patch. Returns whether it was found.
|
|
439
|
+
*/
|
|
440
|
+
updateRowData(id: string, patch: Partial<TData>, options?: {
|
|
441
|
+
replace?: boolean;
|
|
442
|
+
}): boolean;
|
|
443
|
+
/**
|
|
444
|
+
* Write through the source, then update the cache with what it returned
|
|
445
|
+
* (no refetch). Throws when the source lacks the method. Aggregates are
|
|
446
|
+
* NOT recomputed - `refresh({ route })` the parent when a subtotal must
|
|
447
|
+
* follow. A created row lands at `addIndex` within its level, else at the
|
|
448
|
+
* end, which in a level of thousands is out of sight: pass `0` for the
|
|
449
|
+
* top, or the index a deleted row had to put it back where it was.
|
|
450
|
+
*/
|
|
451
|
+
createRow(input: Partial<TData>, route?: string[], addIndex?: number): Promise<TData>;
|
|
452
|
+
updateRow(id: string, patch: Partial<TData>): Promise<TData>;
|
|
453
|
+
deleteRow(id: string): Promise<void>;
|
|
454
|
+
/**
|
|
455
|
+
* Move a loaded row to another level: a file dragged into a folder, an
|
|
456
|
+
* order into another region. With `patch` the move is written through
|
|
457
|
+
* `source.updateRow` first (the parent field, typically) and the saved
|
|
458
|
+
* row is what lands; without it the cache alone moves. The row leaves
|
|
459
|
+
* its level as a transaction and joins `toRoute` at `addIndex` (the end
|
|
460
|
+
* by default). A group takes its open children with it in the sense
|
|
461
|
+
* that their cached level is dropped: they are read again under the
|
|
462
|
+
* new route. A target level nothing has opened reports `storeNotFound`
|
|
463
|
+
* and holds the row once it opens; the parent counts follow either way.
|
|
464
|
+
*/
|
|
465
|
+
moveRow(id: string, toRoute: string[], options?: {
|
|
466
|
+
patch?: Partial<TData>;
|
|
467
|
+
addIndex?: number;
|
|
468
|
+
}): Promise<{
|
|
469
|
+
row: TData;
|
|
470
|
+
status: ServerTransactionStatus;
|
|
471
|
+
}>;
|
|
472
|
+
/** Tell the model which display rows are on screen. `<SvGrid rowModel>` does this. */
|
|
473
|
+
setViewport(startIndex: number, endIndex: number): void;
|
|
474
|
+
/** The selection rule, when `selection` was configured. */
|
|
475
|
+
readonly selectionModel: ServerSelectionModel | null;
|
|
476
|
+
/** The rule as plain data, for saving or for sending to a bulk endpoint. */
|
|
477
|
+
getSelectionState(): ServerSelectionState | ServerGroupSelectionNode | null;
|
|
478
|
+
/**
|
|
479
|
+
* Restore a saved rule. The callback-style shape (`toggledNodes`) is
|
|
480
|
+
* accepted as it is, with group ids read as group keys; pass it through
|
|
481
|
+
* `fromCallbackSelectionState(state, mapping)` first when they differ.
|
|
482
|
+
*/
|
|
483
|
+
setSelectionState(state: ServerSelectionState | ServerGroupSelectionNode | CallbackSelectionState | CallbackGroupSelectionState): void;
|
|
484
|
+
/**
|
|
485
|
+
* Apply one patch to every selected row, loaded or not, through the
|
|
486
|
+
* datasource's `updateWhere`, then reload every level so the rows and
|
|
487
|
+
* their aggregates reflect it. Resolves with how many rows changed.
|
|
488
|
+
* Throws when the source has no `updateWhere` - a bulk edit is refused
|
|
489
|
+
* rather than silently applied to the loaded rows only.
|
|
490
|
+
*/
|
|
491
|
+
bulkUpdate(patch: Partial<TData>): Promise<number>;
|
|
492
|
+
getLevelState(route?: string[]): ServerLevelState | null;
|
|
493
|
+
levelStates(): ServerLevelState[];
|
|
494
|
+
/** Every block at every level, for logging and tests. */
|
|
495
|
+
getCacheState(): Array<BlockState & {
|
|
496
|
+
route: string[];
|
|
497
|
+
}>;
|
|
498
|
+
getState(): ServerRowModelState<TData>;
|
|
499
|
+
/** Abort what is in flight, close the source, stop emitting. Call on unmount. */
|
|
500
|
+
dispose(): void;
|
|
501
|
+
/** The grand-total row for `pinnedTop` / `pinnedBottom`, or nothing. */
|
|
502
|
+
readonly pinnedTopRows: ReadonlyArray<ServerRowModelGridRow<TData>> | undefined;
|
|
503
|
+
readonly pinnedBottomRows: ReadonlyArray<ServerRowModelGridRow<TData>> | undefined;
|
|
504
|
+
};
|
|
505
|
+
/** The fixed id of the grand-total display row, so a transaction can address it. */
|
|
506
|
+
export declare const GRAND_TOTAL_ROW_ID: "sv-grand-total";
|
|
507
|
+
/** The prefix of a group footer's id; the rest is the group route. */
|
|
508
|
+
export declare const GROUP_TOTAL_ROW_ID_PREFIX: "sv-group-total:";
|
|
509
|
+
/**
|
|
510
|
+
* Build the Server-Side Row Model over a `ServerDataSource`: lazy grouping
|
|
511
|
+
* and tree data one level at a time, a block cache per level, aggregates,
|
|
512
|
+
* child counts, grand totals, pivot, paging, transactions and a selection
|
|
513
|
+
* that reaches rows the grid never loaded. Hand the result to
|
|
514
|
+
* `<SvGrid rowModel>`. Enterprise: nudges when no licence key is set.
|
|
515
|
+
*/
|
|
516
|
+
export declare function createServerRowModel<TData>(source: ServerDataSource<TData>, options: ServerRowModelOptions<TData>): ServerRowModel<TData>;
|
|
517
|
+
/**
|
|
518
|
+
* Map a state's display rows to grid rows. `state.gridRows` already holds
|
|
519
|
+
* this; the function exists for parity with `serverGroupRows` and for code
|
|
520
|
+
* that keeps its own display list.
|
|
521
|
+
*/
|
|
522
|
+
export declare function serverRowModelRows<TData>(state: ServerRowModelState<TData> | null | undefined): ReadonlyArray<ServerRowModelGridRow<TData>>;
|
|
523
|
+
/** The `serverGroup` prop for a grid driven by hand rather than by `rowModel`. */
|
|
524
|
+
export declare function serverRowModelNav<TData>(ctl: ServerRowModel<TData>): {
|
|
525
|
+
isGroup: (row: ServerRowModelGridRow<TData>) => boolean;
|
|
526
|
+
level: (row: ServerRowModelGridRow<TData>) => number;
|
|
527
|
+
expanded?: ((row: ServerRowModelGridRow<TData>) => boolean) | undefined;
|
|
528
|
+
onToggle: (row: ServerRowModelGridRow<TData>) => void;
|
|
529
|
+
toggleDetail?: ((row: ServerRowModelGridRow<TData>) => void) | undefined;
|
|
530
|
+
detailOpen?: ((row: ServerRowModelGridRow<TData>) => boolean) | undefined;
|
|
531
|
+
hasDetail?: ((row: ServerRowModelGridRow<TData>) => boolean) | undefined;
|
|
532
|
+
};
|
|
533
|
+
/**
|
|
534
|
+
* The group column's text for one grid row: a group's key (or its
|
|
535
|
+
* `leafField` under `treeData`, where a node's key is its id), `Total` for a
|
|
536
|
+
* footer, `Grand total` for the grand total, the `leafField` value of a leaf,
|
|
537
|
+
* and nothing for the rows that carry no data (placeholders, skeletons, the
|
|
538
|
+
* "load more" row). `SvGroupCell` draws the expander, the count and the
|
|
539
|
+
* spinner; this is the value behind it, so give the group column
|
|
540
|
+
* `fieldFn: (row) => serverGroupText(row, leafField)` and copy, export, the
|
|
541
|
+
* clipboard and a `pinnedTop` / `pinnedBottom` grand total (which the grid
|
|
542
|
+
* formats from the accessor, not from the cell renderer) all read the same
|
|
543
|
+
* text. `messages` is the map `SvGroupCell` takes, so a localized footer
|
|
544
|
+
* and grand total read the same in the cell and in a copy.
|
|
545
|
+
*/
|
|
546
|
+
export declare function serverGroupText<TData>(row: ServerRowModelGridRow<TData>, leafField?: keyof TData & string, messages?: Partial<ServerGroupMessages>): string;
|
|
547
|
+
export type { ServerLeafRow };
|