@svgrid/grid 2.2.32 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +199 -199
- package/dist/DockNodeView.svelte +1 -1
- package/dist/FlexRender.svelte +96 -96
- package/dist/GridFooter.svelte +178 -179
- package/dist/GridMenus.svelte +705 -782
- package/dist/SvAutoComplete.svelte +165 -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 +275 -275
- package/dist/SvContextMenu.svelte +116 -116
- package/dist/SvCountryInput.svelte +160 -160
- package/dist/SvDateRangeInput.svelte +1 -1
- package/dist/SvDrawer.svelte +254 -254
- package/dist/SvDropDownList.svelte +374 -374
- package/dist/SvDurationInput.svelte +126 -126
- package/dist/SvField.svelte +293 -293
- package/dist/SvForm.svelte +437 -437
- package/dist/SvGrid.css +2814 -2804
- package/dist/SvGrid.svelte +3490 -3513
- package/dist/SvGridChart.svelte +1716 -1724
- package/dist/SvGridChartPanel.svelte +485 -485
- package/dist/SvGridChartView.svelte +70 -70
- package/dist/SvGridDropdown.svelte +728 -728
- package/dist/SvGridSelect.svelte +266 -268
- package/dist/SvGroupCell.svelte +116 -116
- package/dist/SvKbd.svelte +1 -1
- package/dist/SvList.svelte +1 -1
- package/dist/SvListBox.svelte +326 -326
- package/dist/SvMaskedInput.svelte +122 -122
- package/dist/SvMenu.svelte +124 -124
- package/dist/SvMenuList.svelte +146 -146
- package/dist/SvMenubar.svelte +1 -1
- package/dist/SvMultiSelect.svelte +289 -290
- package/dist/SvNumberInput.svelte +168 -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/SvRichText.svelte +211 -207
- package/dist/SvRowGroupPanel.svelte +170 -170
- package/dist/SvScrollArea.svelte +61 -61
- package/dist/SvSlider.svelte +200 -200
- package/dist/SvSwitchButton.svelte +108 -108
- package/dist/SvTagsInput.svelte +112 -112
- 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 -204
- package/dist/SvTree.svelte +444 -444
- package/dist/SvTreeSelect.svelte +235 -237
- package/dist/cdn/{GridMenus-C6ixSGWW.js → GridMenus-BpVcKyUr.js} +5 -7
- package/dist/cdn/{GridMenus-Cyk3qpJ7.js → GridMenus-CeXL5IW4.js} +153 -152
- package/dist/cdn/{SvDateTimePicker-ClqtVIj3.js → SvDateTimePicker-DSUhIta8.js} +165 -165
- package/dist/cdn/{SvDateTimePicker-CdqaP61H.js → SvDateTimePicker-h9kPyszT.js} +572 -555
- package/dist/cdn/{SvGridChart-BcLCYvw9.js → SvGridChart-Bs2GIR2Q.js} +28 -21
- package/dist/cdn/{SvGridChart-BhnFdLd0.js → SvGridChart-CwhFz7GV.js} +2 -2
- package/dist/cdn/{SvGridChartPanel-Cmx9DHAS.js → SvGridChartPanel-1WXuStzM.js} +2 -2
- package/dist/cdn/{SvGridChartPanel-DvjwxLvK.js → SvGridChartPanel-e5_nqNP9.js} +22 -14
- package/dist/cdn/{SvGridChartView-PwqI4s02.js → SvGridChartView-SmPW10dI.js} +3 -3
- package/dist/cdn/{SvGridChartView-B40DTJSX.js → SvGridChartView-eSPuJE6g.js} +2 -2
- package/dist/cdn/{SvGridDropdown-D0VdjeR8.js → SvGridDropdown-B1ZcLpgs.js} +1 -1
- package/dist/cdn/{SvGridDropdown-Dh-2ej8j.js → SvGridDropdown-CtdbHcIS.js} +6 -5
- package/dist/cdn/{chart-T1usDN0o.js → chart-i4XcXyHJ.js} +12 -10
- package/dist/cdn/disclose-version-Dr7rEVv-.js +2866 -0
- package/dist/cdn/{export-format-JT5pWVT8.js → export-format-Cv1Dll6k.js} +66 -245
- package/dist/cdn/{src-CgD-wiuS.js → src-DbeN1ReZ.js} +9223 -8944
- package/dist/cdn/{src-BgHjWF0Q.js → src-DmEQFW5_.js} +9023 -8828
- package/dist/cdn/svgrid.js +9 -9
- package/dist/cdn/svgrid.svelte-external.js +9 -9
- package/dist/chart-export.js +8 -8
- package/dist/chart.d.ts +2 -0
- package/dist/chart.js +1 -4
- package/dist/columns.js +9 -2
- package/dist/createMenu.svelte.js +0 -1
- package/dist/createPopoverSelect.svelte.d.ts +2 -2
- package/dist/editing.js +1 -1
- package/dist/export-format.js +3 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +178 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +3843 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +23 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +1925 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +206 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +20 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +264 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +698 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +3 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +135 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +57 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +46691 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +239 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +85 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +561 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +26 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +124 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +91 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +242 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +497 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +4929 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +192 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +10 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +140 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +1 -0
- package/dist/selection.js +0 -1
- package/package.json +11 -10
- package/src/DockNodeView.svelte +1 -1
- package/src/FlexRender.svelte +96 -96
- package/src/GridFooter.svelte +178 -179
- package/src/GridMenus.svelte +705 -782
- package/src/SvAutoComplete.svelte +165 -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 +275 -275
- package/src/SvContextMenu.svelte +116 -116
- package/src/SvCountryInput.svelte +160 -160
- package/src/SvDateRangeInput.svelte +1 -1
- package/src/SvDrawer.svelte +254 -254
- package/src/SvDropDownList.svelte +374 -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 +3680 -3685
- package/src/SvGrid.css +2814 -2804
- package/src/SvGrid.svelte +3490 -3513
- package/src/SvGrid.types.ts +1708 -1709
- package/src/SvGridChart.svelte +1716 -1724
- package/src/SvGridChartPanel.svelte +485 -485
- package/src/SvGridChartView.svelte +70 -70
- package/src/SvGridDropdown.svelte +728 -728
- package/src/SvGridSelect.svelte +266 -268
- package/src/SvGroupCell.svelte +116 -116
- package/src/SvKbd.svelte +1 -1
- package/src/SvList.svelte +1 -1
- package/src/SvListBox.svelte +326 -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/SvMenubar.svelte +1 -1
- package/src/SvMultiSelect.svelte +289 -290
- package/src/SvNumberInput.svelte +168 -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/SvRichText.svelte +211 -207
- package/src/SvRowGroupPanel.svelte +170 -170
- package/src/SvScrollArea.svelte +61 -61
- package/src/SvSlider.svelte +200 -200
- package/src/SvSwitchButton.svelte +108 -108
- package/src/SvTagsInput.svelte +112 -112
- 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 -204
- package/src/SvTree.svelte +444 -444
- package/src/SvTreeSelect.svelte +235 -237
- 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 +1391 -1391
- package/src/build-api.coverage.test.ts +633 -633
- package/src/build-api.ts +805 -910
- package/src/builtin-editors.grid.test.ts +85 -85
- package/src/cell-formatting.test.ts +1 -1
- package/src/cell-formatting.ts +169 -169
- package/src/cell-render.test.ts +513 -513
- package/src/cell-render.ts +496 -590
- package/src/cell-values.ts +118 -118
- package/src/chart-export.ts +201 -201
- package/src/chart-view.svelte.ts +36 -36
- package/src/chart.ts +2295 -2296
- package/src/clipboard.ts +0 -102
- package/src/collaboration.test.ts +104 -104
- package/src/collaboration.ts +167 -167
- package/src/columns.ts +7 -117
- package/src/core.performance.test.ts +30 -30
- package/src/core.ts +1261 -1261
- 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 -225
- 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 +319 -319
- package/src/editing.test.ts +949 -949
- package/src/editing.ts +606 -709
- package/src/editor-contract.ts +164 -164
- package/src/editor-registry.grid.test.ts +144 -146
- package/src/editor-registry.ts +122 -122
- package/src/export-data-api.test.ts +126 -126
- package/src/export-format.test.ts +107 -107
- package/src/export-format.ts +601 -598
- package/src/features.ts +0 -90
- package/src/filter-operators.ts +157 -157
- package/src/flex-render.ts +3 -3
- package/src/form-field.ts +127 -127
- package/src/group-display.test.ts +167 -167
- package/src/group-display.ts +200 -200
- package/src/index.ts +724 -724
- package/src/js-scroller.svelte.ts +173 -173
- package/src/keyboard-handlers.coverage.test.ts +1 -1
- package/src/keyboard-handlers.ts +270 -390
- 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 +172 -172
- package/src/menus.test.ts +0 -1
- package/src/menus.ts +567 -679
- package/src/merge-objects.ts +48 -48
- package/src/new-features.test.ts +3 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +178 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +3843 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +23 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +1925 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +206 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +20 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +264 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +698 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +3 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +135 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +57 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +46691 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +239 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +85 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +561 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +26 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +124 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +91 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +242 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +497 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +4929 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +192 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +10 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +140 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +1 -0
- package/src/overlays.test.ts +90 -90
- package/src/render-component.ts +28 -28
- package/src/row-drag.test.ts +1 -1
- package/src/row-resize.test.ts +1 -2
- package/src/row-resize.ts +210 -210
- package/src/scheduler-model.test.ts +562 -562
- package/src/scheduler-model.ts +872 -872
- package/src/scroll-sync.test.ts +4 -7
- package/src/scroll-sync.ts +0 -122
- package/src/selection.test.ts +754 -754
- package/src/selection.ts +491 -600
- package/src/server-data-source.test.ts +289 -289
- package/src/server-data-source.ts +413 -413
- package/src/server-group-model.test.ts +2 -2
- 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 +0 -112
- package/src/svgrid-wrapper.types.ts +526 -526
- package/src/svgrid.async-editor-options.test.ts +271 -271
- package/src/svgrid.auto-row-height.test.ts +204 -204
- package/src/svgrid.behavior.test.ts +705 -706
- package/src/svgrid.charting.test.ts +534 -534
- package/src/svgrid.column-reorder.test.ts +0 -8
- package/src/svgrid.comments-autocomplete.test.ts +123 -123
- 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 +322 -322
- package/src/svgrid.filter-menu-scroll.test.ts +112 -112
- package/src/svgrid.footer-pagesize.svelte.test.ts +86 -0
- 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.new-features.wrapper.test.ts +251 -251
- package/src/svgrid.tree-data.test.ts +186 -186
- package/src/svgrid.wrapper.test.ts +40 -40
- package/src/svgriddropdown.async-panel.svelte.test.ts +195 -195
- package/src/test-setup.ts +62 -62
- package/src/themes/index.ts +257 -257
- package/src/toast-store.svelte.ts +246 -246
- package/src/toast-store.test.ts +147 -147
- package/src/tree-row-model.test.ts +168 -169
- 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 +296 -296
- package/dist/cdn/disclose-version-DoD9AFD_.js +0 -2958
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
|
-
/** AG-Grid-style 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
|
-
}
|
|
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
|
+
/** AG-Grid-style 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
|
+
}
|