@svgrid/grid 2.6.2 → 2.6.4
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/FlexRender.svelte +96 -96
- package/dist/GridFooter.svelte +178 -178
- package/dist/GridMenus.svelte +705 -705
- 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 +163 -163
- 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.controller.svelte.d.ts +2 -1
- package/dist/SvGrid.controller.svelte.js +145 -3
- package/dist/SvGrid.css +2846 -2814
- package/dist/SvGrid.svelte +3548 -3490
- package/dist/SvGrid.types.d.ts +61 -0
- 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 +266 -266
- package/dist/SvGroupCell.svelte +116 -116
- 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/SvMultiSelect.svelte +289 -289
- 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 -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/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 +235 -235
- package/dist/a11y/grid-announcements.d.ts +58 -0
- package/dist/a11y/grid-announcements.js +70 -0
- package/dist/advanced-filter.svelte.d.ts +42 -0
- package/dist/advanced-filter.svelte.js +13 -0
- package/dist/build-api.js +44 -2
- package/dist/cdn/{GridMenus-DL1zrDwf.js → GridMenus-1NLNSqWz.js} +15 -15
- package/dist/cdn/{GridMenus-BoVKgAv8.js → GridMenus-B2Dt25-8.js} +15 -15
- package/dist/cdn/{SvDateTimePicker-CHnUkWcH.js → SvDateTimePicker-DSUhIta8.js} +2 -2
- package/dist/cdn/{SvDateTimePicker-CRQH_U7E.js → SvDateTimePicker-h9kPyszT.js} +2 -2
- 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/{src-M2NfKnjX.js → src-D35VGBU5.js} +5954 -5765
- package/dist/cdn/{src-CEpw6Ato.js → src-D7DLIAPD.js} +3396 -3207
- 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/filter-operators.d.ts +2 -1
- package/dist/filter-operators.js +5 -6
- package/dist/filtering/excel-filters.d.ts +1 -0
- package/dist/filtering/excel-filters.js +5 -0
- package/dist/filtering/filter-operator-catalogue.d.ts +42 -0
- package/dist/filtering/filter-operator-catalogue.js +42 -0
- package/dist/filtering/predicate-expr.d.ts +78 -0
- package/dist/filtering/predicate-expr.js +1 -0
- package/dist/filtering/row-predicate.d.ts +17 -0
- package/dist/filtering/row-predicate.js +55 -0
- package/dist/grid-messages.d.ts +7 -0
- package/dist/grid-messages.js +7 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -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/server-data-source.d.ts +34 -0
- package/dist/server-data-source.js +19 -0
- package/dist/svgrid-wrapper.types.d.ts +37 -5
- package/dist/themes/index.js +12 -4
- package/package.json +12 -11
- package/src/FlexRender.svelte +96 -96
- package/src/GridFooter.svelte +178 -178
- package/src/GridMenus.svelte +705 -705
- 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 +163 -163
- 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 +3858 -3691
- package/src/SvGrid.css +2846 -2814
- package/src/SvGrid.svelte +3548 -3490
- package/src/SvGrid.types.ts +1769 -1708
- 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 +266 -266
- package/src/SvGroupCell.svelte +116 -116
- 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/SvMultiSelect.svelte +289 -289
- 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 -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/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 +235 -235
- package/src/a11y/dismissable.test.ts +119 -119
- package/src/a11y/dismissable.ts +114 -114
- package/src/a11y/grid-announcements.test.ts +78 -0
- package/src/a11y/grid-announcements.ts +94 -0
- package/src/a11y.announce.test.ts +250 -0
- package/src/a11y.axe.test.ts +194 -0
- package/src/a11y.contract.test.ts +49 -49
- package/src/a11y.test.ts +59 -59
- package/src/a11y.ts +61 -61
- package/src/advanced-filter.svelte.ts +59 -0
- 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 +846 -805
- package/src/builtin-editors.grid.test.ts +85 -85
- package/src/cell-formatting.ts +169 -169
- package/src/cell-render.test.ts +513 -513
- package/src/cell-render.ts +496 -496
- 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 -2295
- package/src/collaboration.test.ts +104 -104
- package/src/collaboration.ts +167 -167
- 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 -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 +319 -319
- package/src/editing.test.ts +949 -949
- package/src/editing.ts +606 -606
- package/src/editor-contract.ts +170 -170
- package/src/editor-registry.grid.test.ts +144 -144
- 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 -601
- package/src/filter-operators.ts +160 -157
- package/src/filtering/excel-filters.ts +15 -0
- package/src/filtering/filter-operator-catalogue.ts +74 -0
- package/src/filtering/node-entry.test.ts +75 -0
- package/src/filtering/predicate-expr.ts +50 -0
- package/src/filtering/row-predicate.ts +57 -0
- package/src/flex-render.ts +3 -3
- package/src/form-field.ts +127 -127
- package/src/grid-messages.ts +18 -0
- package/src/group-display.test.ts +167 -167
- package/src/group-display.ts +200 -200
- package/src/index.ts +754 -726
- 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 +172 -172
- package/src/menus.ts +567 -567
- package/src/merge-objects.ts +48 -48
- 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-resize.ts +210 -210
- package/src/scheduler-model.test.ts +562 -562
- package/src/scheduler-model.ts +872 -872
- package/src/selection.test.ts +754 -754
- package/src/selection.ts +491 -491
- package/src/server-data-source.test.ts +383 -289
- package/src/server-data-source.ts +469 -413
- 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/svgrid-wrapper.types.ts +558 -526
- package/src/svgrid.advanced-filter.test.ts +481 -0
- 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 -705
- package/src/svgrid.charting.test.ts +534 -534
- package/src/svgrid.comments-autocomplete.test.ts +123 -123
- package/src/svgrid.context-menu.test.ts +147 -147
- package/src/svgrid.displayed-rows.test.ts +144 -0
- 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 +331 -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.group-props-reactive.svelte.test.ts +151 -0
- package/src/svgrid.group-props.test.ts +280 -0
- 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 +63 -63
- package/src/svgriddropdown.async-panel.svelte.test.ts +195 -195
- package/src/test-setup.ts +62 -62
- package/src/themes/contrast.test.ts +112 -0
- package/src/themes/index.ts +286 -278
- package/src/toast-store.svelte.ts +246 -246
- 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 +296 -296
- package/themes/catppuccin.css +3 -3
- package/themes/dracula.css +3 -3
- package/themes/nord.css +3 -3
- package/themes/notion.css +4 -4
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DOM: with grouping on, `pageSize` budgets DATA rows, not group banners (#73).
|
|
3
|
-
*
|
|
4
|
-
* The row model hands the view one flat list with group banners interleaved
|
|
5
|
-
* between their children. Slicing that list by `pageSize` spent the budget on
|
|
6
|
-
* banners: ten groups of two at `pageSize: 10` showed roughly three data rows,
|
|
7
|
-
* and with enough small groups a page could show almost none.
|
|
8
|
-
*
|
|
9
|
-
* Now the page window is measured in data rows, and each page reprints the
|
|
10
|
-
* banners its rows sit under - so a group split across a page boundary is
|
|
11
|
-
* labelled on both pages.
|
|
12
|
-
*/
|
|
13
|
-
import { afterEach, describe, expect, it } from 'vitest'
|
|
14
|
-
import { mount, unmount } from 'svelte'
|
|
15
|
-
import SvGrid from './SvGrid.svelte'
|
|
16
|
-
import {
|
|
17
|
-
createCoreRowModel,
|
|
18
|
-
createExpandedRowModel,
|
|
19
|
-
createFilteredRowModel,
|
|
20
|
-
createGroupedRowModel,
|
|
21
|
-
createPaginatedRowModel,
|
|
22
|
-
createSortedRowModel,
|
|
23
|
-
sortFns,
|
|
24
|
-
tableFeatures,
|
|
25
|
-
rowSortingFeature,
|
|
26
|
-
columnGroupingFeature,
|
|
27
|
-
} from './index'
|
|
28
|
-
|
|
29
|
-
type Row = { id: number; region: string; amount: number }
|
|
30
|
-
|
|
31
|
-
// Ten groups of two rows - the shape from the report.
|
|
32
|
-
const data: Row[] = []
|
|
33
|
-
for (let g = 0; g < 10; g += 1) {
|
|
34
|
-
data.push({ id: g * 2, region: `R${g}`, amount: 1 })
|
|
35
|
-
data.push({ id: g * 2 + 1, region: `R${g}`, amount: 2 })
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const columns = [
|
|
39
|
-
{ field: 'region', header: 'Region', width: 120 },
|
|
40
|
-
{ field: 'amount', header: 'Amount', width: 100 },
|
|
41
|
-
]
|
|
42
|
-
|
|
43
|
-
const features = tableFeatures({ rowSortingFeature, columnGroupingFeature })
|
|
44
|
-
const tick = () => new Promise<void>((r) => queueMicrotask(r))
|
|
45
|
-
|
|
46
|
-
function mountGrid(pageSize: number, groupFooters = false) {
|
|
47
|
-
const target = document.createElement('div')
|
|
48
|
-
document.body.appendChild(target)
|
|
49
|
-
// Grouping state starts empty and is driven through the api - there is no
|
|
50
|
-
// initial-grouping prop - so group by region as soon as the api lands.
|
|
51
|
-
let api: { setGroupBy: (ids: string[]) => void } | null = null
|
|
52
|
-
const app = mount(SvGrid, {
|
|
53
|
-
target,
|
|
54
|
-
props: {
|
|
55
|
-
data,
|
|
56
|
-
columns,
|
|
57
|
-
features,
|
|
58
|
-
groupable: true,
|
|
59
|
-
groupFooters,
|
|
60
|
-
onApiReady: (a: never) => { api = a as never },
|
|
61
|
-
pageable: true,
|
|
62
|
-
pageSize,
|
|
63
|
-
_rowModels: {
|
|
64
|
-
coreRowModel: createCoreRowModel(),
|
|
65
|
-
filteredRowModel: createFilteredRowModel(),
|
|
66
|
-
sortedRowModel: createSortedRowModel(sortFns),
|
|
67
|
-
groupedRowModel: createGroupedRowModel(),
|
|
68
|
-
expandedRowModel: createExpandedRowModel(),
|
|
69
|
-
paginatedRowModel: createPaginatedRowModel(),
|
|
70
|
-
},
|
|
71
|
-
containerHeight: 900,
|
|
72
|
-
virtualization: false,
|
|
73
|
-
} as never,
|
|
74
|
-
})
|
|
75
|
-
return {
|
|
76
|
-
target,
|
|
77
|
-
groupByRegion: () => api?.setGroupBy(['region']),
|
|
78
|
-
/** Groups render collapsed by default; click every banner to open them. */
|
|
79
|
-
expandAll: () => {
|
|
80
|
-
for (const btn of target.querySelectorAll<HTMLButtonElement>('.sv-grid-group-toggle')) {
|
|
81
|
-
if (btn.getAttribute('aria-expanded') !== 'true') btn.click()
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
destroy: () => { unmount(app); target.remove() },
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
let cleanup: (() => void) | null = null
|
|
89
|
-
afterEach(() => { cleanup?.(); cleanup = null })
|
|
90
|
-
|
|
91
|
-
const dataRows = (t: HTMLElement) =>
|
|
92
|
-
[...t.querySelectorAll('tbody tr.sv-grid-row')].filter(
|
|
93
|
-
(r) => !r.classList.contains('sv-grid-group-row') && !r.classList.contains('sv-grid-row-spacer'),
|
|
94
|
-
)
|
|
95
|
-
const groupRows = (t: HTMLElement) => [...t.querySelectorAll('tbody tr.sv-grid-group-row')]
|
|
96
|
-
|
|
97
|
-
async function grouped(pageSize: number, expand = true, groupFooters = false) {
|
|
98
|
-
const g = mountGrid(pageSize, groupFooters)
|
|
99
|
-
cleanup = g.destroy
|
|
100
|
-
await tick()
|
|
101
|
-
g.groupByRegion()
|
|
102
|
-
await tick()
|
|
103
|
-
if (expand) {
|
|
104
|
-
g.expandAll()
|
|
105
|
-
await tick()
|
|
106
|
-
}
|
|
107
|
-
return g
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
describe('grouped pagination (#73)', () => {
|
|
111
|
-
it('fills the page with pageSize DATA rows, not banners', async () => {
|
|
112
|
-
const { target } = await grouped(10)
|
|
113
|
-
// Before the fix the flat slice returned 10 TOTAL rows - banners included -
|
|
114
|
-
// so only a handful of them were data.
|
|
115
|
-
expect(dataRows(target)).toHaveLength(10)
|
|
116
|
-
// Those 10 data rows span 5 groups, so 5 banners come along for free.
|
|
117
|
-
expect(groupRows(target)).toHaveLength(5)
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
it('reports the data-row count in the pager, not banners + data', async () => {
|
|
121
|
-
const { target } = await grouped(10)
|
|
122
|
-
// 20 data rows at pageSize 10 = 2 pages. Counting banners would say 30.
|
|
123
|
-
expect(target.textContent).toMatch(/of\s+20\b/)
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
it('reprints the banner for a group straddling a page boundary', async () => {
|
|
127
|
-
const { target } = await grouped(3)
|
|
128
|
-
// Page 0 holds R0's two rows plus R1's first, so both banners show.
|
|
129
|
-
const labels = groupRows(target).map((r) => r.textContent ?? '')
|
|
130
|
-
expect(labels.some((t) => t.includes('R0'))).toBe(true)
|
|
131
|
-
expect(labels.some((t) => t.includes('R1'))).toBe(true)
|
|
132
|
-
expect(dataRows(target)).toHaveLength(3)
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
it('does not spend page budget on group footers', async () => {
|
|
136
|
-
// Footers are inserted after paging, so turning them on must not push data
|
|
137
|
-
// rows onto the next page.
|
|
138
|
-
const { target } = await grouped(10, true, true)
|
|
139
|
-
expect(dataRows(target).filter((r) => !r.classList.contains('sv-grid-group-footer-row')))
|
|
140
|
-
.toHaveLength(10)
|
|
141
|
-
expect(target.textContent).toMatch(/of\s+20\b/)
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
it('still fills a page when every group is collapsed', async () => {
|
|
145
|
-
// Collapsed groups are the visible unit. Treating them as free headers
|
|
146
|
-
// emptied the page entirely - caught here, not by the pure helper.
|
|
147
|
-
const { target } = await grouped(4, false)
|
|
148
|
-
expect(groupRows(target)).toHaveLength(4)
|
|
149
|
-
expect(dataRows(target)).toHaveLength(0)
|
|
150
|
-
// 10 collapsed groups over pageSize 4.
|
|
151
|
-
expect(target.textContent).toMatch(/of\s+10\b/)
|
|
152
|
-
})
|
|
153
|
-
})
|
|
1
|
+
/**
|
|
2
|
+
* DOM: with grouping on, `pageSize` budgets DATA rows, not group banners (#73).
|
|
3
|
+
*
|
|
4
|
+
* The row model hands the view one flat list with group banners interleaved
|
|
5
|
+
* between their children. Slicing that list by `pageSize` spent the budget on
|
|
6
|
+
* banners: ten groups of two at `pageSize: 10` showed roughly three data rows,
|
|
7
|
+
* and with enough small groups a page could show almost none.
|
|
8
|
+
*
|
|
9
|
+
* Now the page window is measured in data rows, and each page reprints the
|
|
10
|
+
* banners its rows sit under - so a group split across a page boundary is
|
|
11
|
+
* labelled on both pages.
|
|
12
|
+
*/
|
|
13
|
+
import { afterEach, describe, expect, it } from 'vitest'
|
|
14
|
+
import { mount, unmount } from 'svelte'
|
|
15
|
+
import SvGrid from './SvGrid.svelte'
|
|
16
|
+
import {
|
|
17
|
+
createCoreRowModel,
|
|
18
|
+
createExpandedRowModel,
|
|
19
|
+
createFilteredRowModel,
|
|
20
|
+
createGroupedRowModel,
|
|
21
|
+
createPaginatedRowModel,
|
|
22
|
+
createSortedRowModel,
|
|
23
|
+
sortFns,
|
|
24
|
+
tableFeatures,
|
|
25
|
+
rowSortingFeature,
|
|
26
|
+
columnGroupingFeature,
|
|
27
|
+
} from './index'
|
|
28
|
+
|
|
29
|
+
type Row = { id: number; region: string; amount: number }
|
|
30
|
+
|
|
31
|
+
// Ten groups of two rows - the shape from the report.
|
|
32
|
+
const data: Row[] = []
|
|
33
|
+
for (let g = 0; g < 10; g += 1) {
|
|
34
|
+
data.push({ id: g * 2, region: `R${g}`, amount: 1 })
|
|
35
|
+
data.push({ id: g * 2 + 1, region: `R${g}`, amount: 2 })
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const columns = [
|
|
39
|
+
{ field: 'region', header: 'Region', width: 120 },
|
|
40
|
+
{ field: 'amount', header: 'Amount', width: 100 },
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
const features = tableFeatures({ rowSortingFeature, columnGroupingFeature })
|
|
44
|
+
const tick = () => new Promise<void>((r) => queueMicrotask(r))
|
|
45
|
+
|
|
46
|
+
function mountGrid(pageSize: number, groupFooters = false) {
|
|
47
|
+
const target = document.createElement('div')
|
|
48
|
+
document.body.appendChild(target)
|
|
49
|
+
// Grouping state starts empty and is driven through the api - there is no
|
|
50
|
+
// initial-grouping prop - so group by region as soon as the api lands.
|
|
51
|
+
let api: { setGroupBy: (ids: string[]) => void } | null = null
|
|
52
|
+
const app = mount(SvGrid, {
|
|
53
|
+
target,
|
|
54
|
+
props: {
|
|
55
|
+
data,
|
|
56
|
+
columns,
|
|
57
|
+
features,
|
|
58
|
+
groupable: true,
|
|
59
|
+
groupFooters,
|
|
60
|
+
onApiReady: (a: never) => { api = a as never },
|
|
61
|
+
pageable: true,
|
|
62
|
+
pageSize,
|
|
63
|
+
_rowModels: {
|
|
64
|
+
coreRowModel: createCoreRowModel(),
|
|
65
|
+
filteredRowModel: createFilteredRowModel(),
|
|
66
|
+
sortedRowModel: createSortedRowModel(sortFns),
|
|
67
|
+
groupedRowModel: createGroupedRowModel(),
|
|
68
|
+
expandedRowModel: createExpandedRowModel(),
|
|
69
|
+
paginatedRowModel: createPaginatedRowModel(),
|
|
70
|
+
},
|
|
71
|
+
containerHeight: 900,
|
|
72
|
+
virtualization: false,
|
|
73
|
+
} as never,
|
|
74
|
+
})
|
|
75
|
+
return {
|
|
76
|
+
target,
|
|
77
|
+
groupByRegion: () => api?.setGroupBy(['region']),
|
|
78
|
+
/** Groups render collapsed by default; click every banner to open them. */
|
|
79
|
+
expandAll: () => {
|
|
80
|
+
for (const btn of target.querySelectorAll<HTMLButtonElement>('.sv-grid-group-toggle')) {
|
|
81
|
+
if (btn.getAttribute('aria-expanded') !== 'true') btn.click()
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
destroy: () => { unmount(app); target.remove() },
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
let cleanup: (() => void) | null = null
|
|
89
|
+
afterEach(() => { cleanup?.(); cleanup = null })
|
|
90
|
+
|
|
91
|
+
const dataRows = (t: HTMLElement) =>
|
|
92
|
+
[...t.querySelectorAll('tbody tr.sv-grid-row')].filter(
|
|
93
|
+
(r) => !r.classList.contains('sv-grid-group-row') && !r.classList.contains('sv-grid-row-spacer'),
|
|
94
|
+
)
|
|
95
|
+
const groupRows = (t: HTMLElement) => [...t.querySelectorAll('tbody tr.sv-grid-group-row')]
|
|
96
|
+
|
|
97
|
+
async function grouped(pageSize: number, expand = true, groupFooters = false) {
|
|
98
|
+
const g = mountGrid(pageSize, groupFooters)
|
|
99
|
+
cleanup = g.destroy
|
|
100
|
+
await tick()
|
|
101
|
+
g.groupByRegion()
|
|
102
|
+
await tick()
|
|
103
|
+
if (expand) {
|
|
104
|
+
g.expandAll()
|
|
105
|
+
await tick()
|
|
106
|
+
}
|
|
107
|
+
return g
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
describe('grouped pagination (#73)', () => {
|
|
111
|
+
it('fills the page with pageSize DATA rows, not banners', async () => {
|
|
112
|
+
const { target } = await grouped(10)
|
|
113
|
+
// Before the fix the flat slice returned 10 TOTAL rows - banners included -
|
|
114
|
+
// so only a handful of them were data.
|
|
115
|
+
expect(dataRows(target)).toHaveLength(10)
|
|
116
|
+
// Those 10 data rows span 5 groups, so 5 banners come along for free.
|
|
117
|
+
expect(groupRows(target)).toHaveLength(5)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
it('reports the data-row count in the pager, not banners + data', async () => {
|
|
121
|
+
const { target } = await grouped(10)
|
|
122
|
+
// 20 data rows at pageSize 10 = 2 pages. Counting banners would say 30.
|
|
123
|
+
expect(target.textContent).toMatch(/of\s+20\b/)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it('reprints the banner for a group straddling a page boundary', async () => {
|
|
127
|
+
const { target } = await grouped(3)
|
|
128
|
+
// Page 0 holds R0's two rows plus R1's first, so both banners show.
|
|
129
|
+
const labels = groupRows(target).map((r) => r.textContent ?? '')
|
|
130
|
+
expect(labels.some((t) => t.includes('R0'))).toBe(true)
|
|
131
|
+
expect(labels.some((t) => t.includes('R1'))).toBe(true)
|
|
132
|
+
expect(dataRows(target)).toHaveLength(3)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
it('does not spend page budget on group footers', async () => {
|
|
136
|
+
// Footers are inserted after paging, so turning them on must not push data
|
|
137
|
+
// rows onto the next page.
|
|
138
|
+
const { target } = await grouped(10, true, true)
|
|
139
|
+
expect(dataRows(target).filter((r) => !r.classList.contains('sv-grid-group-footer-row')))
|
|
140
|
+
.toHaveLength(10)
|
|
141
|
+
expect(target.textContent).toMatch(/of\s+20\b/)
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('still fills a page when every group is collapsed', async () => {
|
|
145
|
+
// Collapsed groups are the visible unit. Treating them as free headers
|
|
146
|
+
// emptied the page entirely - caught here, not by the pure helper.
|
|
147
|
+
const { target } = await grouped(4, false)
|
|
148
|
+
expect(groupRows(target)).toHaveLength(4)
|
|
149
|
+
expect(dataRows(target)).toHaveLength(0)
|
|
150
|
+
// 10 collapsed groups over pageSize 4.
|
|
151
|
+
expect(target.textContent).toMatch(/of\s+10\b/)
|
|
152
|
+
})
|
|
153
|
+
})
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactivity for `groupBy` / `expanded`: reassigning the prop must re-apply to
|
|
3
|
+
* the engine, and a controlled parent that echoes `onExpandedChange` straight
|
|
4
|
+
* back into `expanded` must settle instead of looping.
|
|
5
|
+
*
|
|
6
|
+
* Lives in a `.svelte.test.ts` so runes are available - the props object is a
|
|
7
|
+
* `$state` proxy, which is what makes a prop reassignment reach the component.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from 'vitest'
|
|
10
|
+
import { mount, unmount, flushSync } from 'svelte'
|
|
11
|
+
import SvGrid from './SvGrid.svelte'
|
|
12
|
+
import {
|
|
13
|
+
columnGroupingFeature,
|
|
14
|
+
createCoreRowModel,
|
|
15
|
+
createExpandedRowModel,
|
|
16
|
+
createFilteredRowModel,
|
|
17
|
+
createGroupedRowModel,
|
|
18
|
+
createPaginatedRowModel,
|
|
19
|
+
createSortedRowModel,
|
|
20
|
+
rowExpandingFeature,
|
|
21
|
+
rowSortingFeature,
|
|
22
|
+
sortFns,
|
|
23
|
+
tableFeatures,
|
|
24
|
+
} from './index'
|
|
25
|
+
import type { SvGridApi } from './index'
|
|
26
|
+
|
|
27
|
+
type Row = { id: number; name: string; department: string }
|
|
28
|
+
|
|
29
|
+
const rows: Row[] = [
|
|
30
|
+
{ id: 1, name: 'Ada', department: 'Engineering' },
|
|
31
|
+
{ id: 2, name: 'Grace', department: 'Engineering' },
|
|
32
|
+
{ id: 3, name: 'Linus', department: 'Operations' },
|
|
33
|
+
]
|
|
34
|
+
const columns = [
|
|
35
|
+
{ field: 'name', header: 'Name', width: 150 },
|
|
36
|
+
{ field: 'department', header: 'Department', width: 180 },
|
|
37
|
+
]
|
|
38
|
+
const features = tableFeatures({ rowSortingFeature, columnGroupingFeature, rowExpandingFeature })
|
|
39
|
+
|
|
40
|
+
function baseProps(extra: Record<string, unknown>): Record<string, unknown> {
|
|
41
|
+
return {
|
|
42
|
+
data: rows,
|
|
43
|
+
columns,
|
|
44
|
+
features,
|
|
45
|
+
_rowModels: {
|
|
46
|
+
coreRowModel: createCoreRowModel(),
|
|
47
|
+
filteredRowModel: createFilteredRowModel(),
|
|
48
|
+
sortedRowModel: createSortedRowModel(sortFns),
|
|
49
|
+
groupedRowModel: createGroupedRowModel(),
|
|
50
|
+
expandedRowModel: createExpandedRowModel(),
|
|
51
|
+
paginatedRowModel: createPaginatedRowModel(),
|
|
52
|
+
},
|
|
53
|
+
containerHeight: 480,
|
|
54
|
+
virtualization: false,
|
|
55
|
+
...extra,
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
describe('groupBy reactivity', () => {
|
|
60
|
+
it('re-groups when the prop is reassigned, and ungroups when emptied', () => {
|
|
61
|
+
const target = document.createElement('div')
|
|
62
|
+
document.body.appendChild(target)
|
|
63
|
+
let api: SvGridApi<typeof features, Row> | null = null
|
|
64
|
+
const props = $state(
|
|
65
|
+
baseProps({
|
|
66
|
+
groupBy: ['department'],
|
|
67
|
+
onApiReady: (next: SvGridApi<typeof features, Row>) => (api = next),
|
|
68
|
+
}),
|
|
69
|
+
)
|
|
70
|
+
const app = mount(SvGrid, { target, props: props as never })
|
|
71
|
+
flushSync()
|
|
72
|
+
expect(api!.getState().grouping).toEqual(['department'])
|
|
73
|
+
|
|
74
|
+
props.groupBy = ['name']
|
|
75
|
+
flushSync()
|
|
76
|
+
expect(api!.getState().grouping).toEqual(['name'])
|
|
77
|
+
|
|
78
|
+
props.groupBy = []
|
|
79
|
+
flushSync()
|
|
80
|
+
expect(api!.getState().grouping).toEqual([])
|
|
81
|
+
expect(target.querySelectorAll('tbody tr').length).toBe(3) // flat again
|
|
82
|
+
|
|
83
|
+
unmount(app)
|
|
84
|
+
target.remove()
|
|
85
|
+
})
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
describe('expanded reactivity', () => {
|
|
89
|
+
it('opens and closes a group when the prop is reassigned', () => {
|
|
90
|
+
const target = document.createElement('div')
|
|
91
|
+
document.body.appendChild(target)
|
|
92
|
+
const props = $state(baseProps({ groupBy: ['department'], expanded: {} }))
|
|
93
|
+
const app = mount(SvGrid, { target, props: props as never })
|
|
94
|
+
flushSync()
|
|
95
|
+
expect(target.querySelectorAll('tbody tr').length).toBe(2) // two banners
|
|
96
|
+
|
|
97
|
+
props.expanded = {
|
|
98
|
+
group_department_Engineering: true,
|
|
99
|
+
}
|
|
100
|
+
flushSync()
|
|
101
|
+
expect(target.querySelectorAll('tbody tr').length).toBe(4) // + Ada, Grace
|
|
102
|
+
|
|
103
|
+
props.expanded = {}
|
|
104
|
+
flushSync()
|
|
105
|
+
expect(target.querySelectorAll('tbody tr').length).toBe(2)
|
|
106
|
+
|
|
107
|
+
unmount(app)
|
|
108
|
+
target.remove()
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('settles when a controlled parent echoes onExpandedChange back into the prop', () => {
|
|
112
|
+
const target = document.createElement('div')
|
|
113
|
+
document.body.appendChild(target)
|
|
114
|
+
let api: SvGridApi<typeof features, Row> | null = null
|
|
115
|
+
let notifications = 0
|
|
116
|
+
const props = $state(
|
|
117
|
+
baseProps({
|
|
118
|
+
groupBy: ['department'],
|
|
119
|
+
expanded: {} as Record<string, boolean>,
|
|
120
|
+
// The exact round-trip the docs recommend.
|
|
121
|
+
onExpandedChange: (next: Record<string, boolean>) => {
|
|
122
|
+
notifications += 1
|
|
123
|
+
props.expanded = next
|
|
124
|
+
},
|
|
125
|
+
onApiReady: (next: SvGridApi<typeof features, Row>) => (api = next),
|
|
126
|
+
}),
|
|
127
|
+
)
|
|
128
|
+
const app = mount(SvGrid, { target, props: props as never })
|
|
129
|
+
flushSync()
|
|
130
|
+
notifications = 0
|
|
131
|
+
|
|
132
|
+
api!.expandAllGroups()
|
|
133
|
+
flushSync()
|
|
134
|
+
|
|
135
|
+
// The echo must not re-seed and re-fire; one settled notification.
|
|
136
|
+
expect(notifications).toBe(1)
|
|
137
|
+
expect(props.expanded).toEqual({
|
|
138
|
+
group_department_Engineering: true,
|
|
139
|
+
group_department_Operations: true,
|
|
140
|
+
})
|
|
141
|
+
expect(target.querySelectorAll('tbody tr').length).toBe(5) // 2 banners + 3 leaves
|
|
142
|
+
|
|
143
|
+
api!.collapseAllGroups()
|
|
144
|
+
flushSync()
|
|
145
|
+
expect(notifications).toBe(2)
|
|
146
|
+
expect(target.querySelectorAll('tbody tr').length).toBe(2)
|
|
147
|
+
|
|
148
|
+
unmount(app)
|
|
149
|
+
target.remove()
|
|
150
|
+
})
|
|
151
|
+
})
|