@svgrid/grid 2.6.21 → 2.7.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/CHANGELOG.md +150 -88
- package/README.md +221 -199
- package/dist/FlexRender.svelte +96 -96
- package/dist/GridFooter.svelte +181 -181
- package/dist/GridMenus.svelte +201 -18
- package/dist/SvAutoComplete.svelte +169 -165
- package/dist/SvAvatar.svelte +75 -75
- package/dist/SvCalendar.svelte +503 -503
- package/dist/SvCarousel.svelte +141 -141
- package/dist/SvCheckBox.svelte +102 -102
- package/dist/SvCircularProgress.svelte +109 -109
- package/dist/SvColorInput.svelte +181 -181
- package/dist/SvComboBox.svelte +279 -275
- package/dist/SvContextMenu.svelte +116 -116
- package/dist/SvCountryInput.svelte +163 -163
- package/dist/SvDateRangeInput.svelte +25 -3
- package/dist/SvDrawer.svelte +254 -254
- package/dist/SvDropDownList.svelte +378 -374
- package/dist/SvDurationInput.svelte +126 -126
- package/dist/SvField.svelte +293 -293
- package/dist/SvForm.svelte +437 -437
- package/dist/SvGrid.controller.svelte.d.ts +61 -9
- package/dist/SvGrid.controller.svelte.js +363 -123
- package/dist/SvGrid.css +222 -1
- package/dist/SvGrid.helpers.d.ts +55 -0
- package/dist/SvGrid.helpers.js +83 -0
- package/dist/SvGrid.svelte +255 -56
- package/dist/SvGrid.types.d.ts +146 -1
- package/dist/SvGridCellEditor.svelte +744 -662
- package/dist/SvGridChart.svelte +1716 -1716
- package/dist/SvGridChartPanel.svelte +485 -485
- package/dist/SvGridChartView.svelte +70 -70
- package/dist/SvGridDropdown.svelte +728 -728
- package/dist/SvGridSelect.svelte +270 -266
- package/dist/SvGridSelect.svelte.d.ts +1 -1
- package/dist/SvGroupCell.svelte +116 -116
- package/dist/SvListBox.svelte +334 -326
- package/dist/SvMaskedInput.svelte +122 -122
- package/dist/SvMenu.svelte +124 -124
- package/dist/SvMenuList.svelte +146 -146
- package/dist/SvMultiSelect.svelte +293 -289
- package/dist/SvMultiSelect.svelte.d.ts +1 -1
- package/dist/SvNumberInput.svelte +172 -168
- package/dist/SvOtpInput.svelte +158 -158
- package/dist/SvPasswordInput.svelte +151 -151
- package/dist/SvPhoneInput.svelte +133 -133
- package/dist/SvPopover.svelte +197 -197
- package/dist/SvProgress.svelte +116 -116
- package/dist/SvRadioGroup.svelte +107 -107
- package/dist/SvRating.svelte +112 -112
- package/dist/SvResult.svelte +73 -73
- package/dist/SvRichCell.svelte +125 -0
- package/dist/SvRichCell.svelte.d.ts +15 -0
- package/dist/SvRichText.svelte +211 -211
- package/dist/SvRowGroupPanel.svelte +170 -170
- package/dist/SvScrollArea.svelte +61 -61
- package/dist/SvSlider.svelte +203 -203
- package/dist/SvSwitchButton.svelte +108 -108
- package/dist/SvTagsInput.svelte +115 -115
- package/dist/SvTextArea.svelte +5 -1
- package/dist/SvTextInput.svelte +147 -147
- package/dist/SvTimePicker.svelte +245 -245
- package/dist/SvToaster.svelte +159 -159
- package/dist/SvToggleButton.svelte +85 -85
- package/dist/SvTooltip.svelte +161 -161
- package/dist/SvTour.svelte +208 -208
- package/dist/SvTree.svelte +444 -444
- package/dist/SvTreeSelect.svelte +239 -235
- package/dist/SvTreeSelect.svelte.d.ts +1 -1
- package/dist/builtin-editors.d.ts +2 -2
- package/dist/builtin-editors.js +19 -3
- package/dist/cdn/GridMenus-C4oLsJyj.js +600 -0
- package/dist/cdn/GridMenus-yEivjNwl.js +601 -0
- package/dist/cdn/SvDateRangeInput-Bh0A0JkF.js +199 -0
- package/dist/cdn/SvDateRangeInput-DflbiP7N.js +198 -0
- package/dist/cdn/SvDateTimePicker-BWwpfB_o.js +812 -0
- package/dist/cdn/SvDateTimePicker-Bivn8dAP.js +816 -0
- package/dist/cdn/SvGridCellEditor-AXL8cHGO.js +550 -0
- package/dist/cdn/SvGridCellEditor-Ba7rY3eu.js +549 -0
- package/dist/cdn/{SvGridChart-BwVos976.js → SvGridChart-Bs2GIR2Q.js} +1 -1
- package/dist/cdn/{SvGridChart-BEJmNNx9.js → SvGridChart-CwhFz7GV.js} +1 -1
- package/dist/cdn/{SvGridChartPanel-BOknOkrP.js → SvGridChartPanel-1WXuStzM.js} +1 -1
- package/dist/cdn/{SvGridChartPanel-D2PjII4O.js → SvGridChartPanel-e5_nqNP9.js} +1 -1
- package/dist/cdn/{SvGridChartView-00LPUHL1.js → SvGridChartView-SmPW10dI.js} +1 -1
- package/dist/cdn/{SvGridChartView-BhUEJ5ki.js → SvGridChartView-eSPuJE6g.js} +1 -1
- package/dist/cdn/{SvGridDropdown-D0VdjeR8.js → SvGridDropdown-B1ZcLpgs.js} +1 -1
- package/dist/cdn/{SvGridDropdown-D13MtJ2j.js → SvGridDropdown-CtdbHcIS.js} +1 -1
- package/dist/cdn/column-resize-DsfNXMom.js +102 -0
- package/dist/cdn/date-format-CcP1tafP.js +1395 -0
- package/dist/cdn/date-format-DZT7T1wf.js +1393 -0
- package/dist/cdn/{editor-registry-CiI0xlKg.js → editor-registry-BhgE3S84.js} +51 -25
- package/dist/cdn/row-resize-BRcimkUT.js +95 -0
- package/dist/cdn/{src-BYq-qyrp.js → src-COC0vnpg.js} +7846 -7317
- package/dist/cdn/{src-DBel9wRZ.js → src-pYGV2rMR.js} +10033 -9504
- package/dist/cdn/svgrid.js +15 -11
- package/dist/cdn/svgrid.svelte-external.js +15 -11
- package/dist/cell-values.d.ts +16 -0
- package/dist/cell-values.js +28 -0
- package/dist/chart-export.js +8 -8
- package/dist/clipboard.d.ts +22 -0
- package/dist/clipboard.js +405 -27
- package/dist/column-groups.js +1 -1
- package/dist/column-resize.d.ts +46 -0
- package/dist/column-resize.js +205 -0
- package/dist/columns.d.ts +0 -3
- package/dist/columns.js +0 -57
- package/dist/core.d.ts +19 -4
- package/dist/core.js +460 -119
- package/dist/editing.js +12 -7
- package/dist/editors/cell-editors.d.ts +11 -0
- package/dist/editors/cell-editors.js +18 -1
- package/dist/filtering/excel-filters.js +28 -0
- package/dist/grid-messages.d.ts +15 -0
- package/dist/grid-messages.js +15 -0
- package/dist/group-display.d.ts +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +10 -0
- package/dist/list-option.d.ts +6 -0
- package/dist/menus.js +41 -8
- package/dist/row-resize.d.ts +11 -0
- package/dist/row-resize.js +7 -1
- package/dist/sanitize-html.d.ts +37 -0
- package/dist/sanitize-html.js +234 -0
- package/dist/selection-bar-view.svelte.d.ts +25 -0
- package/dist/selection-bar-view.svelte.js +13 -0
- package/dist/selection.d.ts +2 -1
- package/dist/selection.js +133 -8
- package/dist/spreadsheet.d.ts +1 -1
- package/dist/spreadsheet.js +1 -1
- package/package.json +11 -11
- package/src/FlexRender.svelte +96 -96
- package/src/GridFooter.svelte +181 -181
- package/src/GridMenus.svelte +201 -18
- package/src/SvAutoComplete.svelte +169 -165
- package/src/SvAvatar.svelte +75 -75
- package/src/SvCalendar.svelte +503 -503
- package/src/SvCalendar.test.ts +226 -226
- package/src/SvCarousel.svelte +141 -141
- package/src/SvCheckBox.svelte +102 -102
- package/src/SvCircularProgress.svelte +109 -109
- package/src/SvColorInput.svelte +181 -181
- package/src/SvComboBox.svelte +279 -275
- package/src/SvContextMenu.svelte +116 -116
- package/src/SvCountryInput.svelte +163 -163
- package/src/SvDateRangeInput.svelte +25 -3
- package/src/SvDrawer.svelte +254 -254
- package/src/SvDropDownList.svelte +378 -374
- package/src/SvDurationInput.svelte +126 -126
- package/src/SvField.svelte +293 -293
- package/src/SvForm.svelte +437 -437
- package/src/SvForm.test.ts +411 -411
- package/src/SvGrid.controller.svelte.ts +404 -133
- package/src/SvGrid.css +222 -1
- package/src/SvGrid.helpers.ts +87 -0
- package/src/SvGrid.svelte +255 -56
- package/src/SvGrid.types.ts +2092 -1940
- package/src/SvGridCellEditor.svelte +744 -662
- package/src/SvGridChart.svelte +1716 -1716
- package/src/SvGridChartPanel.svelte +485 -485
- package/src/SvGridChartView.svelte +70 -70
- package/src/SvGridDropdown.svelte +728 -728
- package/src/SvGridSelect.svelte +270 -266
- package/src/SvGroupCell.svelte +116 -116
- package/src/SvListBox.svelte +334 -326
- package/src/SvMaskedInput.svelte +122 -122
- package/src/SvMenu.svelte +124 -124
- package/src/SvMenu.test.ts +97 -97
- package/src/SvMenuList.svelte +146 -146
- package/src/SvMultiSelect.svelte +293 -289
- package/src/SvNumberInput.svelte +172 -168
- package/src/SvOtpInput.svelte +158 -158
- package/src/SvPasswordInput.svelte +151 -151
- package/src/SvPhoneInput.svelte +133 -133
- package/src/SvPopover.svelte +197 -197
- package/src/SvProgress.svelte +116 -116
- package/src/SvRadioGroup.svelte +107 -107
- package/src/SvRating.svelte +112 -112
- package/src/SvResult.svelte +73 -73
- package/src/SvRichCell.svelte +125 -0
- package/src/SvRichText.svelte +211 -211
- package/src/SvRowGroupPanel.svelte +170 -170
- package/src/SvScrollArea.svelte +61 -61
- package/src/SvSlider.svelte +203 -203
- package/src/SvSwitchButton.svelte +108 -108
- package/src/SvTagsInput.svelte +115 -115
- package/src/SvTextArea.svelte +5 -1
- package/src/SvTextInput.svelte +147 -147
- package/src/SvTimePicker.svelte +245 -245
- package/src/SvToaster.svelte +159 -159
- package/src/SvToaster.test.ts +95 -95
- package/src/SvToggleButton.svelte +85 -85
- package/src/SvTooltip.svelte +161 -161
- package/src/SvTour.svelte +208 -208
- package/src/SvTree.svelte +444 -444
- package/src/SvTreeSelect.svelte +239 -235
- package/src/a11y/dismissable.test.ts +119 -119
- package/src/a11y/dismissable.ts +114 -114
- package/src/a11y.contract.test.ts +49 -49
- package/src/a11y.test.ts +59 -59
- package/src/a11y.ts +61 -61
- package/src/ai.test.ts +502 -502
- package/src/ai.ts +1419 -1419
- package/src/build-api.coverage.test.ts +633 -633
- package/src/build-api.ts +846 -846
- package/src/builtin-editors.grid.test.ts +83 -83
- package/src/builtin-editors.test.ts +18 -1
- package/src/builtin-editors.ts +19 -3
- package/src/cell-formatting.ts +171 -171
- package/src/cell-render.test.ts +513 -513
- package/src/cell-render.ts +496 -496
- package/src/cell-values.ts +148 -118
- package/src/chart-export.ts +202 -202
- package/src/chart-view.svelte.ts +36 -36
- package/src/chart.ts +2321 -2321
- package/src/clipboard.test.ts +93 -20
- package/src/clipboard.ts +433 -33
- package/src/collaboration.test.ts +104 -104
- package/src/collaboration.ts +167 -167
- package/src/column-groups.ts +78 -78
- package/src/column-resize.test.ts +381 -0
- package/src/column-resize.ts +227 -0
- package/src/columns.test.ts +0 -103
- package/src/columns.ts +0 -58
- package/src/core.aggregate.test.ts +134 -0
- package/src/core.filter.test.ts +156 -0
- package/src/core.grouping.test.ts +146 -0
- package/src/core.performance.test.ts +30 -30
- package/src/core.row-shape.test.ts +119 -0
- package/src/core.rowmodel-cache.test.ts +121 -0
- package/src/core.sort.test.ts +293 -0
- package/src/core.ts +1865 -1468
- package/src/createAutocomplete.svelte.ts +132 -132
- package/src/createCombobox.svelte.ts +191 -191
- package/src/createCountryInput.svelte.ts +157 -157
- package/src/createDropdownList.svelte.ts +168 -168
- package/src/createForm.svelte.ts +386 -386
- package/src/createGrid.svelte.ts +42 -42
- package/src/createGrid.test.ts +10 -10
- package/src/createGridState.svelte.ts +17 -17
- package/src/createListbox.svelte.ts +250 -250
- package/src/createMenu.svelte.ts +224 -224
- package/src/createPopoverSelect.svelte.ts +213 -213
- package/src/createSlider.svelte.ts +191 -191
- package/src/createTooltip.svelte.ts +144 -144
- package/src/createTree.svelte.ts +322 -322
- package/src/date-string-column.test.ts +87 -0
- package/src/datetime/date-core.ts +206 -206
- package/src/datetime/date-restrict.ts +61 -61
- package/src/datetime/timezone.ts +135 -135
- package/src/dock-manager-model.ts +596 -596
- package/src/dock-model.ts +374 -374
- package/src/editing.test.ts +974 -949
- package/src/editing.ts +609 -606
- package/src/editor-block-prop.test.ts +132 -0
- package/src/editor-contract.ts +171 -171
- package/src/editor-registry.grid.test.ts +144 -144
- package/src/editor-registry.ts +122 -122
- package/src/editors/cell-editors.ts +27 -1
- package/src/export-data-api.test.ts +126 -126
- package/src/export-format.test.ts +107 -107
- package/src/export-format.ts +601 -601
- package/src/filter-operators.ts +160 -160
- package/src/filtering/excel-filters.ts +325 -295
- package/src/filtering/normalize-fast-path.test.ts +104 -0
- package/src/flex-render.ts +3 -3
- package/src/form-field.ts +127 -127
- package/src/grid-messages.ts +34 -0
- package/src/group-display.test.ts +167 -167
- package/src/group-display.ts +200 -200
- package/src/headless.ts +87 -87
- package/src/index.ts +25 -1
- package/src/js-scroller.svelte.ts +173 -173
- package/src/keyboard-handlers.ts +270 -270
- package/src/keyboard.test.ts +59 -59
- package/src/keyboard.ts +97 -97
- package/src/list-nav.test.ts +49 -49
- package/src/list-nav.ts +29 -29
- package/src/list-option.test.ts +56 -56
- package/src/list-option.ts +179 -173
- package/src/menus.test.ts +43 -0
- package/src/menus.ts +597 -567
- package/src/merge-objects.ts +48 -48
- package/src/move-cells.test.ts +850 -0
- package/src/number-editor-literal.test.ts +84 -0
- package/src/number-editor.grid.test.ts +160 -0
- package/src/overlays.test.ts +90 -90
- package/src/positioning.ts +268 -268
- package/src/render-component.ts +28 -28
- package/src/resize-props.test.ts +361 -0
- package/src/row-drag-touch.ts +211 -211
- package/src/row-drag.test.ts +353 -353
- package/src/row-drag.ts +415 -415
- package/src/row-resize.test.ts +524 -493
- package/src/row-resize.ts +228 -210
- package/src/sanitize-html.test.ts +182 -0
- package/src/sanitize-html.ts +235 -0
- package/src/scheduler-ical.ts +181 -181
- package/src/scheduler-model.test.ts +562 -562
- package/src/scheduler-model.ts +873 -873
- package/src/selection-bar-view.svelte.ts +36 -0
- package/src/selection.test.ts +900 -743
- package/src/selection.ts +135 -8
- package/src/server-data-source.test.ts +383 -383
- package/src/server-data-source.ts +469 -469
- package/src/sparkline.test.ts +68 -68
- package/src/sparkline.ts +169 -169
- package/src/spreadsheet.test.ts +488 -488
- package/src/spreadsheet.ts +312 -312
- package/src/static-functions.ts +11 -11
- package/src/subscribe.ts +38 -38
- package/src/summaries.ts +113 -113
- package/src/svgrid-wrapper.types.ts +563 -563
- package/src/svgrid.async-editor-options.test.ts +273 -273
- package/src/svgrid.auto-row-height.test.ts +204 -204
- package/src/svgrid.behavior.test.ts +910 -910
- package/src/svgrid.charting.test.ts +534 -534
- package/src/svgrid.comments-autocomplete.test.ts +127 -127
- package/src/svgrid.context-menu.test.ts +147 -147
- package/src/svgrid.features.test.ts +157 -157
- package/src/svgrid.filter-depth.test.ts +163 -163
- package/src/svgrid.filter-menu-listbox.svelte.test.ts +377 -331
- package/src/svgrid.filter-menu-scroll.test.ts +112 -112
- package/src/svgrid.grand-total.test.ts +188 -188
- package/src/svgrid.group-display-mode.test.ts +171 -171
- package/src/svgrid.group-footers.test.ts +121 -121
- package/src/svgrid.group-pagination.test.ts +153 -153
- package/src/svgrid.in-suggest-snapshot.svelte.test.ts +91 -0
- package/src/svgrid.menu-scroll-close.test.ts +204 -0
- package/src/svgrid.new-features.wrapper.test.ts +251 -251
- package/src/svgrid.selection-bar-seam.test.ts +185 -0
- package/src/svgrid.tree-data.test.ts +186 -186
- package/src/svgrid.upsell-license.test.ts +117 -0
- package/src/svgrid.wrapper.test.ts +63 -63
- package/src/svgriddropdown.async-panel.svelte.test.ts +195 -195
- package/src/test-setup.ts +62 -62
- package/src/themes/index.ts +288 -288
- package/src/toast-store.svelte.ts +250 -250
- package/src/toast-store.test.ts +147 -147
- package/src/tree-row-model.test.ts +168 -168
- package/src/ui-buttons.test.ts +144 -144
- package/src/ui-inputs.test.ts +118 -118
- package/src/ui-localization.test.ts +113 -113
- package/src/ui-range.test.ts +70 -70
- package/src/ui-selection.test.ts +155 -155
- package/src/ui-tier1.test.ts +142 -142
- package/src/virtual.test.ts +88 -88
- package/src/virtualization/column-virtualizer.test.ts +27 -27
- package/src/virtualization/column-virtualizer.ts +30 -30
- package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
- package/src/virtualization/types.ts +30 -30
- package/src/virtualization/virtualizer.test.ts +47 -47
- package/src/virtualization/virtualizer.ts +322 -322
- package/dist/cdn/GridMenus-BfTAKn84.js +0 -488
- package/dist/cdn/GridMenus-C3bJd7w8.js +0 -489
- package/dist/cdn/SvDateTimePicker-CHnUkWcH.js +0 -2206
- package/dist/cdn/SvDateTimePicker-CRQH_U7E.js +0 -2201
- package/dist/cdn/SvGridCellEditor-BGUCzuPB.js +0 -523
- package/dist/cdn/SvGridCellEditor-G8IMWIws.js +0 -522
package/src/group-display.ts
CHANGED
|
@@ -1,200 +1,200 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Row-grouping display helpers. Two pure, framework-free transforms:
|
|
3
|
-
*
|
|
4
|
-
* - `insertGroupFooters` inserts a footer/total row after each group's children
|
|
5
|
-
* (and optionally a grand-total row at the end), carrying the group's already
|
|
6
|
-
* computed aggregate values. Mirrors the server model's footer shape
|
|
7
|
-
* (`server-group-model.ts`) client-side.
|
|
8
|
-
* - `buildAutoGroupColumns` decides, for a grouping display mode, which synthetic
|
|
9
|
-
* "auto group" columns to show and which grouped source columns to hide - the
|
|
10
|
-
* groundwork for `singleColumn` / `multipleColumns` display types (the current
|
|
11
|
-
* default `groupRows` renders a full-width banner and needs neither).
|
|
12
|
-
*
|
|
13
|
-
* Both are generic over the row / column shape (via small accessor callbacks) so
|
|
14
|
-
* they are trivially unit-testable and carry no dependency on the grid runtime.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
export type GroupDisplayType = 'groupRows' | 'singleColumn' | 'multipleColumns'
|
|
19
|
-
|
|
20
|
-
export type GroupFooterOptions<R> = {
|
|
21
|
-
/** Depth of a row (group rows and their descendants). */
|
|
22
|
-
getDepth: (row: R) => number
|
|
23
|
-
/** True when a row is a group (banner) row. */
|
|
24
|
-
isGroup: (row: R) => boolean
|
|
25
|
-
/** Build a footer row from the group row it closes (carries its aggregates). */
|
|
26
|
-
makeFooter: (groupRow: R) => R
|
|
27
|
-
/** Insert a footer after each group's children. */
|
|
28
|
-
includeGroupFooter?: boolean
|
|
29
|
-
/** Append a grand-total footer at the very end. */
|
|
30
|
-
includeGrandTotalFooter?: boolean
|
|
31
|
-
/** Build the grand-total footer (over the whole set). Return null to skip. */
|
|
32
|
-
makeGrandTotal?: () => R | null
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Insert group footer rows after each group's descendants. A group opened at
|
|
37
|
-
* depth d closes when a later row appears at depth <= d (a sibling group or an
|
|
38
|
-
* ancestor-level row); its footer is emitted at that point. Order is otherwise
|
|
39
|
-
* preserved. No-op when neither footer flag is set.
|
|
40
|
-
*/
|
|
41
|
-
export function insertGroupFooters<R>(rows: ReadonlyArray<R>, opts: GroupFooterOptions<R>): R[] {
|
|
42
|
-
const { getDepth, isGroup, makeFooter, includeGroupFooter, includeGrandTotalFooter, makeGrandTotal } = opts
|
|
43
|
-
if (!includeGroupFooter && !includeGrandTotalFooter) return [...rows]
|
|
44
|
-
|
|
45
|
-
const out: R[] = []
|
|
46
|
-
const openGroups: R[] = []
|
|
47
|
-
|
|
48
|
-
const closeTo = (depth: number) => {
|
|
49
|
-
while (openGroups.length > 0) {
|
|
50
|
-
const top = openGroups[openGroups.length - 1]!
|
|
51
|
-
if (getDepth(top) < depth) break
|
|
52
|
-
openGroups.pop()
|
|
53
|
-
if (includeGroupFooter) out.push(makeFooter(top))
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
for (const row of rows) {
|
|
58
|
-
// Before adding this row, close any groups it ends (same-or-shallower depth).
|
|
59
|
-
closeTo(getDepth(row))
|
|
60
|
-
out.push(row)
|
|
61
|
-
if (isGroup(row)) openGroups.push(row)
|
|
62
|
-
}
|
|
63
|
-
// Close everything still open at the end.
|
|
64
|
-
closeTo(Number.NEGATIVE_INFINITY)
|
|
65
|
-
|
|
66
|
-
if (includeGrandTotalFooter && makeGrandTotal) {
|
|
67
|
-
const gt = makeGrandTotal()
|
|
68
|
-
if (gt != null) out.push(gt)
|
|
69
|
-
}
|
|
70
|
-
return out
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export type GroupPaginationOptions<R> = {
|
|
74
|
-
/** Depth of a row (group rows and their descendants). */
|
|
75
|
-
getDepth: (row: R) => number
|
|
76
|
-
/** True when a row is a group (banner) row. */
|
|
77
|
-
isGroup: (row: R) => boolean
|
|
78
|
-
/**
|
|
79
|
-
* True when a group row is expanded. Defaults to treating every group as
|
|
80
|
-
* expanded. This matters: an EXPANDED group is a header, reprinted above its
|
|
81
|
-
* children and costing no page budget, while a COLLAPSED group is the visible
|
|
82
|
-
* unit itself and must consume a slot - otherwise a fully collapsed grid has
|
|
83
|
-
* no budget-consuming rows at all and every page comes back empty.
|
|
84
|
-
*/
|
|
85
|
-
isExpanded?: (row: R) => boolean
|
|
86
|
-
pageIndex: number
|
|
87
|
-
pageSize: number
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export type GroupPaginationResult<R> = {
|
|
91
|
-
/** The rows to render for this page: the page's budget-consuming rows, each
|
|
92
|
-
* preceded by whichever ancestor banners have not been printed yet. */
|
|
93
|
-
rows: R[]
|
|
94
|
-
/** Budget-consuming rows across every page - what the pager divides by.
|
|
95
|
-
* Data rows plus collapsed group rows; expanded banners do not count. */
|
|
96
|
-
dataRowCount: number
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Paginate a grouped row list by DATA rows, repeating each page's ancestor
|
|
101
|
-
* group headers.
|
|
102
|
-
*
|
|
103
|
-
* Slicing the flat grouped list directly counts group banners against
|
|
104
|
-
* `pageSize`, so `pageSize: 10` over ten groups of two shows almost no data
|
|
105
|
-
* (#73). Here only non-group rows consume the page budget, and a page reprints
|
|
106
|
-
* the group chain its first rows sit under - the same thing a spreadsheet does
|
|
107
|
-
* when a grouped table breaks across pages.
|
|
108
|
-
*
|
|
109
|
-
* Ancestors are tracked with a depth stack rather than parent pointers, so this
|
|
110
|
-
* works on the already-flattened expanded model and needs nothing from the row
|
|
111
|
-
* objects but depth and group-ness.
|
|
112
|
-
*/
|
|
113
|
-
export function paginateGroupedRows<R>(
|
|
114
|
-
rows: ReadonlyArray<R>,
|
|
115
|
-
opts: GroupPaginationOptions<R>,
|
|
116
|
-
): GroupPaginationResult<R> {
|
|
117
|
-
const { getDepth, isGroup, isExpanded, pageIndex, pageSize } = opts
|
|
118
|
-
const expanded = isExpanded ?? (() => true)
|
|
119
|
-
const start = pageIndex * pageSize
|
|
120
|
-
const end = start + pageSize
|
|
121
|
-
|
|
122
|
-
const out: R[] = []
|
|
123
|
-
// Expanded banners currently open, outermost first. `printed` marks the ones
|
|
124
|
-
// this page has already emitted, so a group spanning rows 3-8 prints its
|
|
125
|
-
// banner once, not once per row.
|
|
126
|
-
const openGroups: Array<{ row: R; printed: boolean }> = []
|
|
127
|
-
let unitsSeen = 0
|
|
128
|
-
|
|
129
|
-
for (const row of rows) {
|
|
130
|
-
const depth = getDepth(row)
|
|
131
|
-
// A row at depth <= an open banner's depth closes it.
|
|
132
|
-
while (openGroups.length > 0 && getDepth(openGroups[openGroups.length - 1]!.row) >= depth) {
|
|
133
|
-
openGroups.pop()
|
|
134
|
-
}
|
|
135
|
-
if (isGroup(row) && expanded(row)) {
|
|
136
|
-
// A header for rows that follow: reprinted per page, costs no budget.
|
|
137
|
-
openGroups.push({ row, printed: false })
|
|
138
|
-
continue
|
|
139
|
-
}
|
|
140
|
-
// Everything else is a visible unit: a data row, or a collapsed group
|
|
141
|
-
// standing in for its whole subtree.
|
|
142
|
-
const index = unitsSeen
|
|
143
|
-
unitsSeen += 1
|
|
144
|
-
if (index < start || index >= end) continue
|
|
145
|
-
for (const g of openGroups) {
|
|
146
|
-
if (g.printed) continue
|
|
147
|
-
g.printed = true
|
|
148
|
-
out.push(g.row)
|
|
149
|
-
}
|
|
150
|
-
out.push(row)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return { rows: out, dataRowCount: unitsSeen }
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export type AutoGroupColumnSpec = {
|
|
157
|
-
/** Synthetic column id (e.g. `__autoGroup` or `__group_<field>`). */
|
|
158
|
-
id: string
|
|
159
|
-
/** The grouped field this auto column stands in for (null for the single
|
|
160
|
-
* combined auto-group column). */
|
|
161
|
-
field: string | null
|
|
162
|
-
/** Nesting level this column represents (0-based), for indentation. */
|
|
163
|
-
level: number
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export type AutoGroupResult = {
|
|
167
|
-
/** Synthetic auto-group column specs to prepend to the visible columns. */
|
|
168
|
-
autoColumns: AutoGroupColumnSpec[]
|
|
169
|
-
/** Ids of the grouped SOURCE columns to hide (rolled into the auto columns). */
|
|
170
|
-
hiddenSourceIds: Set<string>
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Decide the synthetic auto-group columns for a grouping display mode:
|
|
175
|
-
* - `groupRows`: none (the banner path handles display) - `{ [], {} }`.
|
|
176
|
-
* - `singleColumn`: one combined auto-group column; every grouped source column
|
|
177
|
-
* is hidden.
|
|
178
|
-
* - `multipleColumns`: one auto column per grouped field; the grouped source
|
|
179
|
-
* columns are hidden.
|
|
180
|
-
*/
|
|
181
|
-
export function buildAutoGroupColumns(
|
|
182
|
-
grouping: ReadonlyArray<string>,
|
|
183
|
-
displayType: GroupDisplayType,
|
|
184
|
-
): AutoGroupResult {
|
|
185
|
-
if (displayType === 'groupRows' || grouping.length === 0) {
|
|
186
|
-
return { autoColumns: [], hiddenSourceIds: new Set() }
|
|
187
|
-
}
|
|
188
|
-
const hiddenSourceIds = new Set(grouping)
|
|
189
|
-
if (displayType === 'singleColumn') {
|
|
190
|
-
return {
|
|
191
|
-
autoColumns: [{ id: '__autoGroup', field: null, level: 0 }],
|
|
192
|
-
hiddenSourceIds,
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
// multipleColumns
|
|
196
|
-
return {
|
|
197
|
-
autoColumns: grouping.map((field, level) => ({ id: `__group_${field}`, field, level })),
|
|
198
|
-
hiddenSourceIds,
|
|
199
|
-
}
|
|
200
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Row-grouping display helpers. Two pure, framework-free transforms:
|
|
3
|
+
*
|
|
4
|
+
* - `insertGroupFooters` inserts a footer/total row after each group's children
|
|
5
|
+
* (and optionally a grand-total row at the end), carrying the group's already
|
|
6
|
+
* computed aggregate values. Mirrors the server model's footer shape
|
|
7
|
+
* (`server-group-model.ts`) client-side.
|
|
8
|
+
* - `buildAutoGroupColumns` decides, for a grouping display mode, which synthetic
|
|
9
|
+
* "auto group" columns to show and which grouped source columns to hide - the
|
|
10
|
+
* groundwork for `singleColumn` / `multipleColumns` display types (the current
|
|
11
|
+
* default `groupRows` renders a full-width banner and needs neither).
|
|
12
|
+
*
|
|
13
|
+
* Both are generic over the row / column shape (via small accessor callbacks) so
|
|
14
|
+
* they are trivially unit-testable and carry no dependency on the grid runtime.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Grouping display variants. */
|
|
18
|
+
export type GroupDisplayType = 'groupRows' | 'singleColumn' | 'multipleColumns'
|
|
19
|
+
|
|
20
|
+
export type GroupFooterOptions<R> = {
|
|
21
|
+
/** Depth of a row (group rows and their descendants). */
|
|
22
|
+
getDepth: (row: R) => number
|
|
23
|
+
/** True when a row is a group (banner) row. */
|
|
24
|
+
isGroup: (row: R) => boolean
|
|
25
|
+
/** Build a footer row from the group row it closes (carries its aggregates). */
|
|
26
|
+
makeFooter: (groupRow: R) => R
|
|
27
|
+
/** Insert a footer after each group's children. */
|
|
28
|
+
includeGroupFooter?: boolean
|
|
29
|
+
/** Append a grand-total footer at the very end. */
|
|
30
|
+
includeGrandTotalFooter?: boolean
|
|
31
|
+
/** Build the grand-total footer (over the whole set). Return null to skip. */
|
|
32
|
+
makeGrandTotal?: () => R | null
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Insert group footer rows after each group's descendants. A group opened at
|
|
37
|
+
* depth d closes when a later row appears at depth <= d (a sibling group or an
|
|
38
|
+
* ancestor-level row); its footer is emitted at that point. Order is otherwise
|
|
39
|
+
* preserved. No-op when neither footer flag is set.
|
|
40
|
+
*/
|
|
41
|
+
export function insertGroupFooters<R>(rows: ReadonlyArray<R>, opts: GroupFooterOptions<R>): R[] {
|
|
42
|
+
const { getDepth, isGroup, makeFooter, includeGroupFooter, includeGrandTotalFooter, makeGrandTotal } = opts
|
|
43
|
+
if (!includeGroupFooter && !includeGrandTotalFooter) return [...rows]
|
|
44
|
+
|
|
45
|
+
const out: R[] = []
|
|
46
|
+
const openGroups: R[] = []
|
|
47
|
+
|
|
48
|
+
const closeTo = (depth: number) => {
|
|
49
|
+
while (openGroups.length > 0) {
|
|
50
|
+
const top = openGroups[openGroups.length - 1]!
|
|
51
|
+
if (getDepth(top) < depth) break
|
|
52
|
+
openGroups.pop()
|
|
53
|
+
if (includeGroupFooter) out.push(makeFooter(top))
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
for (const row of rows) {
|
|
58
|
+
// Before adding this row, close any groups it ends (same-or-shallower depth).
|
|
59
|
+
closeTo(getDepth(row))
|
|
60
|
+
out.push(row)
|
|
61
|
+
if (isGroup(row)) openGroups.push(row)
|
|
62
|
+
}
|
|
63
|
+
// Close everything still open at the end.
|
|
64
|
+
closeTo(Number.NEGATIVE_INFINITY)
|
|
65
|
+
|
|
66
|
+
if (includeGrandTotalFooter && makeGrandTotal) {
|
|
67
|
+
const gt = makeGrandTotal()
|
|
68
|
+
if (gt != null) out.push(gt)
|
|
69
|
+
}
|
|
70
|
+
return out
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export type GroupPaginationOptions<R> = {
|
|
74
|
+
/** Depth of a row (group rows and their descendants). */
|
|
75
|
+
getDepth: (row: R) => number
|
|
76
|
+
/** True when a row is a group (banner) row. */
|
|
77
|
+
isGroup: (row: R) => boolean
|
|
78
|
+
/**
|
|
79
|
+
* True when a group row is expanded. Defaults to treating every group as
|
|
80
|
+
* expanded. This matters: an EXPANDED group is a header, reprinted above its
|
|
81
|
+
* children and costing no page budget, while a COLLAPSED group is the visible
|
|
82
|
+
* unit itself and must consume a slot - otherwise a fully collapsed grid has
|
|
83
|
+
* no budget-consuming rows at all and every page comes back empty.
|
|
84
|
+
*/
|
|
85
|
+
isExpanded?: (row: R) => boolean
|
|
86
|
+
pageIndex: number
|
|
87
|
+
pageSize: number
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export type GroupPaginationResult<R> = {
|
|
91
|
+
/** The rows to render for this page: the page's budget-consuming rows, each
|
|
92
|
+
* preceded by whichever ancestor banners have not been printed yet. */
|
|
93
|
+
rows: R[]
|
|
94
|
+
/** Budget-consuming rows across every page - what the pager divides by.
|
|
95
|
+
* Data rows plus collapsed group rows; expanded banners do not count. */
|
|
96
|
+
dataRowCount: number
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Paginate a grouped row list by DATA rows, repeating each page's ancestor
|
|
101
|
+
* group headers.
|
|
102
|
+
*
|
|
103
|
+
* Slicing the flat grouped list directly counts group banners against
|
|
104
|
+
* `pageSize`, so `pageSize: 10` over ten groups of two shows almost no data
|
|
105
|
+
* (#73). Here only non-group rows consume the page budget, and a page reprints
|
|
106
|
+
* the group chain its first rows sit under - the same thing a spreadsheet does
|
|
107
|
+
* when a grouped table breaks across pages.
|
|
108
|
+
*
|
|
109
|
+
* Ancestors are tracked with a depth stack rather than parent pointers, so this
|
|
110
|
+
* works on the already-flattened expanded model and needs nothing from the row
|
|
111
|
+
* objects but depth and group-ness.
|
|
112
|
+
*/
|
|
113
|
+
export function paginateGroupedRows<R>(
|
|
114
|
+
rows: ReadonlyArray<R>,
|
|
115
|
+
opts: GroupPaginationOptions<R>,
|
|
116
|
+
): GroupPaginationResult<R> {
|
|
117
|
+
const { getDepth, isGroup, isExpanded, pageIndex, pageSize } = opts
|
|
118
|
+
const expanded = isExpanded ?? (() => true)
|
|
119
|
+
const start = pageIndex * pageSize
|
|
120
|
+
const end = start + pageSize
|
|
121
|
+
|
|
122
|
+
const out: R[] = []
|
|
123
|
+
// Expanded banners currently open, outermost first. `printed` marks the ones
|
|
124
|
+
// this page has already emitted, so a group spanning rows 3-8 prints its
|
|
125
|
+
// banner once, not once per row.
|
|
126
|
+
const openGroups: Array<{ row: R; printed: boolean }> = []
|
|
127
|
+
let unitsSeen = 0
|
|
128
|
+
|
|
129
|
+
for (const row of rows) {
|
|
130
|
+
const depth = getDepth(row)
|
|
131
|
+
// A row at depth <= an open banner's depth closes it.
|
|
132
|
+
while (openGroups.length > 0 && getDepth(openGroups[openGroups.length - 1]!.row) >= depth) {
|
|
133
|
+
openGroups.pop()
|
|
134
|
+
}
|
|
135
|
+
if (isGroup(row) && expanded(row)) {
|
|
136
|
+
// A header for rows that follow: reprinted per page, costs no budget.
|
|
137
|
+
openGroups.push({ row, printed: false })
|
|
138
|
+
continue
|
|
139
|
+
}
|
|
140
|
+
// Everything else is a visible unit: a data row, or a collapsed group
|
|
141
|
+
// standing in for its whole subtree.
|
|
142
|
+
const index = unitsSeen
|
|
143
|
+
unitsSeen += 1
|
|
144
|
+
if (index < start || index >= end) continue
|
|
145
|
+
for (const g of openGroups) {
|
|
146
|
+
if (g.printed) continue
|
|
147
|
+
g.printed = true
|
|
148
|
+
out.push(g.row)
|
|
149
|
+
}
|
|
150
|
+
out.push(row)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return { rows: out, dataRowCount: unitsSeen }
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export type AutoGroupColumnSpec = {
|
|
157
|
+
/** Synthetic column id (e.g. `__autoGroup` or `__group_<field>`). */
|
|
158
|
+
id: string
|
|
159
|
+
/** The grouped field this auto column stands in for (null for the single
|
|
160
|
+
* combined auto-group column). */
|
|
161
|
+
field: string | null
|
|
162
|
+
/** Nesting level this column represents (0-based), for indentation. */
|
|
163
|
+
level: number
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export type AutoGroupResult = {
|
|
167
|
+
/** Synthetic auto-group column specs to prepend to the visible columns. */
|
|
168
|
+
autoColumns: AutoGroupColumnSpec[]
|
|
169
|
+
/** Ids of the grouped SOURCE columns to hide (rolled into the auto columns). */
|
|
170
|
+
hiddenSourceIds: Set<string>
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Decide the synthetic auto-group columns for a grouping display mode:
|
|
175
|
+
* - `groupRows`: none (the banner path handles display) - `{ [], {} }`.
|
|
176
|
+
* - `singleColumn`: one combined auto-group column; every grouped source column
|
|
177
|
+
* is hidden.
|
|
178
|
+
* - `multipleColumns`: one auto column per grouped field; the grouped source
|
|
179
|
+
* columns are hidden.
|
|
180
|
+
*/
|
|
181
|
+
export function buildAutoGroupColumns(
|
|
182
|
+
grouping: ReadonlyArray<string>,
|
|
183
|
+
displayType: GroupDisplayType,
|
|
184
|
+
): AutoGroupResult {
|
|
185
|
+
if (displayType === 'groupRows' || grouping.length === 0) {
|
|
186
|
+
return { autoColumns: [], hiddenSourceIds: new Set() }
|
|
187
|
+
}
|
|
188
|
+
const hiddenSourceIds = new Set(grouping)
|
|
189
|
+
if (displayType === 'singleColumn') {
|
|
190
|
+
return {
|
|
191
|
+
autoColumns: [{ id: '__autoGroup', field: null, level: 0 }],
|
|
192
|
+
hiddenSourceIds,
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// multipleColumns
|
|
196
|
+
return {
|
|
197
|
+
autoColumns: grouping.map((field, level) => ({ id: `__group_${field}`, field, level })),
|
|
198
|
+
hiddenSourceIds,
|
|
199
|
+
}
|
|
200
|
+
}
|
package/src/headless.ts
CHANGED
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The headless entry point: `@svgrid/grid/core`.
|
|
3
|
-
*
|
|
4
|
-
* Everything here is the grid's state machine - rows, columns, sorting,
|
|
5
|
-
* filtering, grouping, pagination, expansion, selection - and nothing here
|
|
6
|
-
* touches the DOM, ARIA, or CSS. Import from this subpath when you are writing
|
|
7
|
-
* your own renderer, running the engine under SSR, or unit-testing row models
|
|
8
|
-
* without a browser.
|
|
9
|
-
*
|
|
10
|
-
* Two entry functions, and the difference matters outside a bundler:
|
|
11
|
-
* `createSvGrid` is the Svelte 5 wrapper - it holds its state in runes, so it
|
|
12
|
-
* needs the Svelte compiler in the pipeline (Vite, SvelteKit, vitest). Bare
|
|
13
|
-
* `node script.mjs` cannot run it. `createSvGridCore` is the same engine with
|
|
14
|
-
* no runes and no reactivity, so it runs anywhere Node runs: a service, a
|
|
15
|
-
* worker, a CLI, a plain unit test.
|
|
16
|
-
*
|
|
17
|
-
* Every runtime symbol here is also reachable from the main `@svgrid/grid`
|
|
18
|
-
* barrel, so the two paths never disagree. This entry additionally exposes the
|
|
19
|
-
* low-level types a custom renderer needs and the barrel does not re-export
|
|
20
|
-
* (`RowModelFactory`, `Store`, `createSvGridCore`, and the individual state
|
|
21
|
-
* types), and it makes the headless bundle cost measurable instead of leaving
|
|
22
|
-
* it to tree-shaking a 200+ export barrel.
|
|
23
|
-
*
|
|
24
|
-
* See docs/why-headless.md.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
export {
|
|
28
|
-
columnFilteringFeature,
|
|
29
|
-
columnGroupingFeature,
|
|
30
|
-
createCoreRowModel,
|
|
31
|
-
createExpandedRowModel,
|
|
32
|
-
createFilteredRowModel,
|
|
33
|
-
createGroupedRowModel,
|
|
34
|
-
createPaginatedRowModel,
|
|
35
|
-
createSortedRowModel,
|
|
36
|
-
createTreeRowModel,
|
|
37
|
-
createSvGridCore,
|
|
38
|
-
flattenTreeData,
|
|
39
|
-
applyGroupAggregate,
|
|
40
|
-
filterFns,
|
|
41
|
-
rowExpandingFeature,
|
|
42
|
-
rowPaginationFeature,
|
|
43
|
-
rowSelectionFeature,
|
|
44
|
-
rowSortingFeature,
|
|
45
|
-
sortFns,
|
|
46
|
-
tableFeatures,
|
|
47
|
-
type Cell,
|
|
48
|
-
type CellContext,
|
|
49
|
-
type CellSpanParams,
|
|
50
|
-
type ValueParserParams,
|
|
51
|
-
type EditorContext,
|
|
52
|
-
type CellData,
|
|
53
|
-
type ActiveCellState,
|
|
54
|
-
type CellFormatConfig,
|
|
55
|
-
type CellFormatter,
|
|
56
|
-
type Column,
|
|
57
|
-
type ColumnDef,
|
|
58
|
-
type ColumnDefTemplate,
|
|
59
|
-
type ColumnFilter,
|
|
60
|
-
type ColumnFiltersState,
|
|
61
|
-
type ExpandedState,
|
|
62
|
-
type GridColumnDef,
|
|
63
|
-
type GridColumns,
|
|
64
|
-
type GroupAggregator,
|
|
65
|
-
type GroupingState,
|
|
66
|
-
type Header,
|
|
67
|
-
type HeaderContext,
|
|
68
|
-
type HeaderGroup,
|
|
69
|
-
type PaginationState,
|
|
70
|
-
type Row,
|
|
71
|
-
type RowData,
|
|
72
|
-
type RowModel,
|
|
73
|
-
type RowModelFactory,
|
|
74
|
-
type RowSelectionState,
|
|
75
|
-
type SortingState,
|
|
76
|
-
type Store,
|
|
77
|
-
type SvGrid as SvGridInstance,
|
|
78
|
-
type SvGridOptions,
|
|
79
|
-
type TableFeatures,
|
|
80
|
-
type TreeRowModelOptions,
|
|
81
|
-
type FlattenTreeOptions,
|
|
82
|
-
type Updater,
|
|
83
|
-
} from './core'
|
|
84
|
-
|
|
85
|
-
export { createGrid, createSvGrid, type SvelteGrid } from './createGrid.svelte'
|
|
86
|
-
export { createGridState, createSvGridState } from './createGridState.svelte'
|
|
87
|
-
export { subscribeGrid, subscribeSvGrid } from './subscribe'
|
|
1
|
+
/**
|
|
2
|
+
* The headless entry point: `@svgrid/grid/core`.
|
|
3
|
+
*
|
|
4
|
+
* Everything here is the grid's state machine - rows, columns, sorting,
|
|
5
|
+
* filtering, grouping, pagination, expansion, selection - and nothing here
|
|
6
|
+
* touches the DOM, ARIA, or CSS. Import from this subpath when you are writing
|
|
7
|
+
* your own renderer, running the engine under SSR, or unit-testing row models
|
|
8
|
+
* without a browser.
|
|
9
|
+
*
|
|
10
|
+
* Two entry functions, and the difference matters outside a bundler:
|
|
11
|
+
* `createSvGrid` is the Svelte 5 wrapper - it holds its state in runes, so it
|
|
12
|
+
* needs the Svelte compiler in the pipeline (Vite, SvelteKit, vitest). Bare
|
|
13
|
+
* `node script.mjs` cannot run it. `createSvGridCore` is the same engine with
|
|
14
|
+
* no runes and no reactivity, so it runs anywhere Node runs: a service, a
|
|
15
|
+
* worker, a CLI, a plain unit test.
|
|
16
|
+
*
|
|
17
|
+
* Every runtime symbol here is also reachable from the main `@svgrid/grid`
|
|
18
|
+
* barrel, so the two paths never disagree. This entry additionally exposes the
|
|
19
|
+
* low-level types a custom renderer needs and the barrel does not re-export
|
|
20
|
+
* (`RowModelFactory`, `Store`, `createSvGridCore`, and the individual state
|
|
21
|
+
* types), and it makes the headless bundle cost measurable instead of leaving
|
|
22
|
+
* it to tree-shaking a 200+ export barrel.
|
|
23
|
+
*
|
|
24
|
+
* See docs/why-headless.md.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
columnFilteringFeature,
|
|
29
|
+
columnGroupingFeature,
|
|
30
|
+
createCoreRowModel,
|
|
31
|
+
createExpandedRowModel,
|
|
32
|
+
createFilteredRowModel,
|
|
33
|
+
createGroupedRowModel,
|
|
34
|
+
createPaginatedRowModel,
|
|
35
|
+
createSortedRowModel,
|
|
36
|
+
createTreeRowModel,
|
|
37
|
+
createSvGridCore,
|
|
38
|
+
flattenTreeData,
|
|
39
|
+
applyGroupAggregate,
|
|
40
|
+
filterFns,
|
|
41
|
+
rowExpandingFeature,
|
|
42
|
+
rowPaginationFeature,
|
|
43
|
+
rowSelectionFeature,
|
|
44
|
+
rowSortingFeature,
|
|
45
|
+
sortFns,
|
|
46
|
+
tableFeatures,
|
|
47
|
+
type Cell,
|
|
48
|
+
type CellContext,
|
|
49
|
+
type CellSpanParams,
|
|
50
|
+
type ValueParserParams,
|
|
51
|
+
type EditorContext,
|
|
52
|
+
type CellData,
|
|
53
|
+
type ActiveCellState,
|
|
54
|
+
type CellFormatConfig,
|
|
55
|
+
type CellFormatter,
|
|
56
|
+
type Column,
|
|
57
|
+
type ColumnDef,
|
|
58
|
+
type ColumnDefTemplate,
|
|
59
|
+
type ColumnFilter,
|
|
60
|
+
type ColumnFiltersState,
|
|
61
|
+
type ExpandedState,
|
|
62
|
+
type GridColumnDef,
|
|
63
|
+
type GridColumns,
|
|
64
|
+
type GroupAggregator,
|
|
65
|
+
type GroupingState,
|
|
66
|
+
type Header,
|
|
67
|
+
type HeaderContext,
|
|
68
|
+
type HeaderGroup,
|
|
69
|
+
type PaginationState,
|
|
70
|
+
type Row,
|
|
71
|
+
type RowData,
|
|
72
|
+
type RowModel,
|
|
73
|
+
type RowModelFactory,
|
|
74
|
+
type RowSelectionState,
|
|
75
|
+
type SortingState,
|
|
76
|
+
type Store,
|
|
77
|
+
type SvGrid as SvGridInstance,
|
|
78
|
+
type SvGridOptions,
|
|
79
|
+
type TableFeatures,
|
|
80
|
+
type TreeRowModelOptions,
|
|
81
|
+
type FlattenTreeOptions,
|
|
82
|
+
type Updater,
|
|
83
|
+
} from './core'
|
|
84
|
+
|
|
85
|
+
export { createGrid, createSvGrid, type SvelteGrid } from './createGrid.svelte'
|
|
86
|
+
export { createGridState, createSvGridState } from './createGridState.svelte'
|
|
87
|
+
export { subscribeGrid, subscribeSvGrid } from './subscribe'
|
package/src/index.ts
CHANGED
|
@@ -80,6 +80,15 @@ export { default as SvGrid } from './SvGrid.svelte'
|
|
|
80
80
|
// through this seam (see board-view.svelte.ts). Mirrors the scheduler-view seam.
|
|
81
81
|
export type { BoardConfig, BoardLane, BoardCardMoveEvent, BoardCardCommitEvent, BoardLayout, BoardSubtask, BoardComment, BoardMenuContext, BoardLaneMenuContext, BoardDrawerConfig } from './SvGrid.types'
|
|
82
82
|
export { registerBoardView, getBoardView, hasBoardView } from './board-view.svelte'
|
|
83
|
+
// Bulk-action bar over the row selection (`selectionBar`), and the right-click
|
|
84
|
+
// menu items - both are prop-shaped config a consumer has to be able to name
|
|
85
|
+
// when they lift the array into its own module.
|
|
86
|
+
export type {
|
|
87
|
+
SelectionBarAction,
|
|
88
|
+
SelectionBarTarget,
|
|
89
|
+
ContextMenuItem,
|
|
90
|
+
ContextMenuTarget,
|
|
91
|
+
} from './SvGrid.types'
|
|
83
92
|
// Built-in AI helpers (free): natural-language filter, smart-fill, summarize,
|
|
84
93
|
// classify, anomaly detection, chart-this and export planning. They ship no
|
|
85
94
|
// model client and no-op until you register one with `setAIProvider(...)`, so
|
|
@@ -111,6 +120,8 @@ export type {
|
|
|
111
120
|
SchedulerOccurrenceChangeEvent,
|
|
112
121
|
} from './SvGrid.types'
|
|
113
122
|
export { registerSchedulerView, getSchedulerView, hasSchedulerView } from './scheduler-view.svelte'
|
|
123
|
+
// Bulk-action bar over the row selection. Prop + types free, renderer Pro.
|
|
124
|
+
export { registerSelectionBarView, getSelectionBarView, hasSelectionBarView } from './selection-bar-view.svelte'
|
|
114
125
|
// Chart view. The `chart` prop + its config live in the free grid AND so does the
|
|
115
126
|
// renderer (SvGridChartView wraps the free SvChart) - so unlike board/scheduler
|
|
116
127
|
// it works out of the box. This seam only lets a host OVERRIDE the built-in view.
|
|
@@ -254,6 +265,7 @@ export {
|
|
|
254
265
|
type CellEditorRegistration,
|
|
255
266
|
} from './editor-registry'
|
|
256
267
|
export { registerBuiltinEditors } from './builtin-editors'
|
|
268
|
+
export { sanitizeHtml, renderMarkdown, htmlToText } from './sanitize-html'
|
|
257
269
|
// UI kit - shared field chrome (label + hint + error + direction wrapper)
|
|
258
270
|
export { default as SvField } from './SvField.svelte'
|
|
259
271
|
// UI kit - headless cores (state + prop-getters you render yourself, like createSvGrid)
|
|
@@ -441,6 +453,7 @@ export { default as SvAvatarGroup } from './SvAvatarGroup.svelte'
|
|
|
441
453
|
export { default as SvCommand, type CommandItem } from './SvCommand.svelte'
|
|
442
454
|
export { fuzzyScore, fuzzyMatch } from './fuzzy'
|
|
443
455
|
export { default as SvRichText, type RichTextTool } from './SvRichText.svelte'
|
|
456
|
+
export { default as SvRichCell } from './SvRichCell.svelte'
|
|
444
457
|
export { default as SvCarousel } from './SvCarousel.svelte'
|
|
445
458
|
export { default as SvTour, type TourStep } from './SvTour.svelte'
|
|
446
459
|
export { default as SvPagination } from './SvPagination.svelte'
|
|
@@ -588,7 +601,13 @@ export {
|
|
|
588
601
|
type CellBorderSpec,
|
|
589
602
|
type BorderSpec,
|
|
590
603
|
} from './spreadsheet'
|
|
604
|
+
// The two resize actions, exported as a matched pair. `<SvGrid>` drives both
|
|
605
|
+
// through the `rowResize` / `columnResize` props - both default OFF, both are
|
|
606
|
+
// turned on by setting them true, and the grid `import()`s the module itself so
|
|
607
|
+
// a grid that leaves them off carries neither. Import them directly only for a
|
|
608
|
+
// headless table, which renders its own rows and headers.
|
|
591
609
|
export { rowResize, type RowResizeOptions } from './row-resize'
|
|
610
|
+
export { columnResize, type ColumnResizeOptions } from './column-resize'
|
|
592
611
|
export { rowDropZone, type RowDragEndEvent, type RowDropZoneOptions } from './row-drag'
|
|
593
612
|
export { resolveColumnTypes, inferCellDataType, type CellDataType } from './column-types'
|
|
594
613
|
export {
|
|
@@ -690,7 +709,12 @@ export { createVirtualizer } from './virtualization/virtualizer'
|
|
|
690
709
|
export { createSvelteVirtualizer } from './virtualization/svelte-virtualizer.svelte'
|
|
691
710
|
export { createColumnVirtualizer } from './virtualization/column-virtualizer'
|
|
692
711
|
export type { VirtualItem, VirtualizerOptions, VirtualizerState } from './virtualization/types'
|
|
693
|
-
export type {
|
|
712
|
+
export type {
|
|
713
|
+
SvGridApi,
|
|
714
|
+
SvGridFilterOperator,
|
|
715
|
+
SvGridViewState,
|
|
716
|
+
SvGridWrapperProps,
|
|
717
|
+
} from './svgrid-wrapper.types'
|
|
694
718
|
export {
|
|
695
719
|
parseEditorValue,
|
|
696
720
|
normalizeEditorOptions,
|