@svgrid/grid 2.6.3 → 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
package/src/filter-operators.ts
CHANGED
|
@@ -1,157 +1,160 @@
|
|
|
1
|
-
// Filter-operator catalogue + the pure helpers that pick which operators
|
|
2
|
-
// apply to a column and how they're labelled. Fully static - no grid state -
|
|
3
|
-
// so it lives outside the controller.
|
|
4
|
-
import type { Column, RowData } from "./index";
|
|
5
|
-
import type { FilterOperator, FilterOption } from "./SvGrid.types";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
{ value: "
|
|
13
|
-
{ value: "
|
|
14
|
-
{ value: "
|
|
15
|
-
{ value: "
|
|
16
|
-
{ value: "
|
|
17
|
-
{ value: "
|
|
18
|
-
{ value: "
|
|
19
|
-
{ value: "
|
|
20
|
-
{ value: "
|
|
21
|
-
{ value: "
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
/** Operators
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
export const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
1
|
+
// Filter-operator catalogue + the pure helpers that pick which operators
|
|
2
|
+
// apply to a column and how they're labelled. Fully static - no grid state -
|
|
3
|
+
// so it lives outside the controller.
|
|
4
|
+
import type { Column, RowData } from "./index";
|
|
5
|
+
import type { FilterOperator, FilterOption } from "./SvGrid.types";
|
|
6
|
+
import {
|
|
7
|
+
SET_OPERATOR_IDS,
|
|
8
|
+
VALUELESS_OPERATOR_IDS,
|
|
9
|
+
} from "./filtering/filter-operator-catalogue";
|
|
10
|
+
|
|
11
|
+
export const filterOperatorOptions: Array<FilterOption> = [
|
|
12
|
+
{ value: "contains", label: "Contains", iconName: "op-contains" },
|
|
13
|
+
{ value: "notContains", label: "Not contains", iconName: "op-notContains" },
|
|
14
|
+
{ value: "equals", label: "Equals", iconName: "op-equals" },
|
|
15
|
+
{ value: "notEquals", label: "Not equals", iconName: "op-notEquals" },
|
|
16
|
+
{ value: "startsWith", label: "Starts with", iconName: "op-startsWith" },
|
|
17
|
+
{ value: "endsWith", label: "Ends with", iconName: "op-endsWith" },
|
|
18
|
+
{ value: "regex", label: "Regex", iconName: "op-regex" },
|
|
19
|
+
{ value: "in", label: "In", iconName: "op-in" },
|
|
20
|
+
{ value: "notIn", label: "Not in", iconName: "op-notIn" },
|
|
21
|
+
{ value: "greaterThan", label: "Greater than", iconName: "op-greaterThan" },
|
|
22
|
+
{ value: "lessThan", label: "Less than", iconName: "op-lessThan" },
|
|
23
|
+
{ value: "between", label: "Between", iconName: "op-between" },
|
|
24
|
+
{ value: "isBlank", label: "Blank", iconName: "op-isBlank" },
|
|
25
|
+
{ value: "isNotBlank", label: "Not blank", iconName: "op-isNotBlank" },
|
|
26
|
+
];
|
|
27
|
+
/** Operators whose predicate is a set-membership test over a token list.
|
|
28
|
+
* The filter row renders a multi-value chip input for these instead of a
|
|
29
|
+
* single text box. Sourced from the shared catalogue so the grid and the
|
|
30
|
+
* expression editor cannot disagree about which control to render. */
|
|
31
|
+
export const SET_OPERATORS: ReadonlyArray<FilterOperator> = SET_OPERATOR_IDS;
|
|
32
|
+
/** Operators that need no value input - they act on emptiness alone. */
|
|
33
|
+
export const VALUELESS_OPERATORS: ReadonlyArray<FilterOperator> =
|
|
34
|
+
VALUELESS_OPERATOR_IDS;
|
|
35
|
+
/** Which operators make sense for each column editor type. */
|
|
36
|
+
export const TEXT_OPERATORS: Array<FilterOperator> = [
|
|
37
|
+
"contains",
|
|
38
|
+
"notContains",
|
|
39
|
+
"equals",
|
|
40
|
+
"notEquals",
|
|
41
|
+
"startsWith",
|
|
42
|
+
"endsWith",
|
|
43
|
+
"regex",
|
|
44
|
+
"in",
|
|
45
|
+
"notIn",
|
|
46
|
+
"isBlank",
|
|
47
|
+
"isNotBlank",
|
|
48
|
+
];
|
|
49
|
+
export const NUMBER_OPERATORS: Array<FilterOperator> = [
|
|
50
|
+
"equals",
|
|
51
|
+
"notEquals",
|
|
52
|
+
"greaterThan",
|
|
53
|
+
"lessThan",
|
|
54
|
+
"between",
|
|
55
|
+
"in",
|
|
56
|
+
"notIn",
|
|
57
|
+
"isBlank",
|
|
58
|
+
"isNotBlank",
|
|
59
|
+
];
|
|
60
|
+
export const DATE_OPERATORS: Array<FilterOperator> = [
|
|
61
|
+
"equals",
|
|
62
|
+
"notEquals",
|
|
63
|
+
"lessThan",
|
|
64
|
+
"greaterThan",
|
|
65
|
+
"between",
|
|
66
|
+
"isBlank",
|
|
67
|
+
"isNotBlank",
|
|
68
|
+
];
|
|
69
|
+
export const CHECKBOX_OPERATORS: Array<FilterOperator> = [
|
|
70
|
+
"equals",
|
|
71
|
+
"isBlank",
|
|
72
|
+
"isNotBlank",
|
|
73
|
+
];
|
|
74
|
+
export const fallbackOperatorOption: FilterOption = {
|
|
75
|
+
value: "contains",
|
|
76
|
+
label: "Contains",
|
|
77
|
+
iconName: "op-contains",
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export function operatorOption(value: FilterOperator): FilterOption {
|
|
81
|
+
return (
|
|
82
|
+
filterOperatorOptions.find((option) => option.value === value) ??
|
|
83
|
+
fallbackOperatorOption
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Returns the operators that make sense for the given column's data type. */
|
|
88
|
+
export function operatorsForColumn<TData extends RowData>(
|
|
89
|
+
column: Column<TData> | undefined,
|
|
90
|
+
): Array<FilterOption> {
|
|
91
|
+
const editorType = column?.columnDef.editorType ?? "text";
|
|
92
|
+
const ids =
|
|
93
|
+
editorType === "number"
|
|
94
|
+
? NUMBER_OPERATORS
|
|
95
|
+
: editorType === "date" || editorType === "datetime"
|
|
96
|
+
? DATE_OPERATORS
|
|
97
|
+
: editorType === "checkbox"
|
|
98
|
+
? CHECKBOX_OPERATORS
|
|
99
|
+
: TEXT_OPERATORS;
|
|
100
|
+
return ids
|
|
101
|
+
.map((id) => filterOperatorOptions.find((option) => option.value === id))
|
|
102
|
+
.filter((option): option is FilterOption => Boolean(option));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Default operator for a column (first one valid for its type). */
|
|
106
|
+
export function defaultOperatorFor<TData extends RowData>(
|
|
107
|
+
column: Column<TData> | undefined,
|
|
108
|
+
): FilterOperator {
|
|
109
|
+
return operatorsForColumn(column)[0]?.value ?? "contains";
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Date columns get friendlier labels for "less / greater than". */
|
|
113
|
+
export function operatorLabelFor<TData extends RowData>(
|
|
114
|
+
option: FilterOption,
|
|
115
|
+
column: Column<TData> | undefined,
|
|
116
|
+
): string {
|
|
117
|
+
const editorType = column?.columnDef.editorType;
|
|
118
|
+
if (editorType === "date" || editorType === "datetime") {
|
|
119
|
+
if (option.value === "lessThan") return "Before";
|
|
120
|
+
if (option.value === "greaterThan") return "After";
|
|
121
|
+
}
|
|
122
|
+
return option.label;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** GridMessages key for each operator's label (see grid-messages.ts). */
|
|
126
|
+
const OPERATOR_MESSAGE_KEY: Record<FilterOperator, string> = {
|
|
127
|
+
contains: "opContains",
|
|
128
|
+
notContains: "opNotContains",
|
|
129
|
+
equals: "opEquals",
|
|
130
|
+
notEquals: "opNotEquals",
|
|
131
|
+
startsWith: "opStartsWith",
|
|
132
|
+
endsWith: "opEndsWith",
|
|
133
|
+
regex: "opRegex",
|
|
134
|
+
in: "opIn",
|
|
135
|
+
notIn: "opNotIn",
|
|
136
|
+
greaterThan: "opGreaterThan",
|
|
137
|
+
lessThan: "opLessThan",
|
|
138
|
+
between: "opBetween",
|
|
139
|
+
isBlank: "opIsBlank",
|
|
140
|
+
isNotBlank: "opIsNotBlank",
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Localized operator label: honors date `Before`/`After` relabels, then the
|
|
145
|
+
* `localeText` override for the operator, falling back to the English
|
|
146
|
+
* `option.label`. `messages` is a loose string map to avoid a type cycle.
|
|
147
|
+
*/
|
|
148
|
+
export function localizeOperatorLabel<TData extends RowData>(
|
|
149
|
+
option: FilterOption,
|
|
150
|
+
column: Column<TData> | undefined,
|
|
151
|
+
messages?: Record<string, string> | null,
|
|
152
|
+
): string {
|
|
153
|
+
const editorType = column?.columnDef.editorType;
|
|
154
|
+
if (editorType === "date" || editorType === "datetime") {
|
|
155
|
+
if (option.value === "lessThan") return messages?.opBefore || "Before";
|
|
156
|
+
if (option.value === "greaterThan") return messages?.opAfter || "After";
|
|
157
|
+
}
|
|
158
|
+
const key = OPERATOR_MESSAGE_KEY[option.value];
|
|
159
|
+
return (key && messages?.[key]) || option.label;
|
|
160
|
+
}
|
|
@@ -159,6 +159,21 @@ function scanInTokens(value: unknown): { tokens: string[]; trailing: string } {
|
|
|
159
159
|
return { tokens, trailing: take() }
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
+
// Re-exported here so consumers can reach the catalogue through the
|
|
163
|
+
// `@svgrid/grid/filtering` subpath. Importing it from the package root would
|
|
164
|
+
// pull in SvGrid.svelte, which is a runtime cost (and a bundler hazard) for
|
|
165
|
+
// anything that only wants operator semantics.
|
|
166
|
+
export {
|
|
167
|
+
ALL_FILTER_OPERATORS,
|
|
168
|
+
SET_OPERATOR_IDS,
|
|
169
|
+
VALUELESS_OPERATOR_IDS,
|
|
170
|
+
RANGE_OPERATOR_IDS,
|
|
171
|
+
isSetOperator,
|
|
172
|
+
isValuelessOperator,
|
|
173
|
+
isRangeOperator,
|
|
174
|
+
type FilterValueType,
|
|
175
|
+
} from './filter-operator-catalogue.js'
|
|
176
|
+
|
|
162
177
|
/** A filter with its needle-side work already done. Call per row. */
|
|
163
178
|
export type CompiledExcelFilter = (cellValue: unknown) => boolean
|
|
164
179
|
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The canonical filter-operator catalogue: which operators exist, and the
|
|
3
|
+
* semantics every surface must agree on.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately narrow. Two things live here:
|
|
6
|
+
*
|
|
7
|
+
* 1. `ALL_FILTER_OPERATORS` - the operator identity list, so a new operator
|
|
8
|
+
* cannot be added to one surface and silently missed by another.
|
|
9
|
+
* 2. The input-shape predicates - whether an operator takes no value, a
|
|
10
|
+
* token list, or a second value. Get these wrong and a filter UI renders
|
|
11
|
+
* the wrong control, so they cannot be allowed to diverge.
|
|
12
|
+
*
|
|
13
|
+
* What deliberately does NOT live here: labels, ordering, and which operators
|
|
14
|
+
* a given column type offers. Those are presentation choices that legitimately
|
|
15
|
+
* differ per surface - the grid's filter menu leads with "Contains" for text
|
|
16
|
+
* while the expression editor leads with "Equals", and both are right for
|
|
17
|
+
* their context.
|
|
18
|
+
*
|
|
19
|
+
* Zero imports beyond the operator union, so any package can consume this
|
|
20
|
+
* without pulling in the grid's type graph.
|
|
21
|
+
*/
|
|
22
|
+
import type { ExcelFilterOperator } from './excel-filters.js'
|
|
23
|
+
|
|
24
|
+
/** Coarse value type used to decide which operators a column offers. */
|
|
25
|
+
export type FilterValueType = 'text' | 'number' | 'date' | 'datetime' | 'boolean'
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Every filter operator, in the grid's filter-menu order. Any surface that
|
|
29
|
+
* presents operators should be able to account for all of these.
|
|
30
|
+
*/
|
|
31
|
+
export const ALL_FILTER_OPERATORS: ReadonlyArray<ExcelFilterOperator> = [
|
|
32
|
+
'contains',
|
|
33
|
+
'notContains',
|
|
34
|
+
'equals',
|
|
35
|
+
'notEquals',
|
|
36
|
+
'startsWith',
|
|
37
|
+
'endsWith',
|
|
38
|
+
'regex',
|
|
39
|
+
'in',
|
|
40
|
+
'notIn',
|
|
41
|
+
'greaterThan',
|
|
42
|
+
'lessThan',
|
|
43
|
+
'between',
|
|
44
|
+
'isBlank',
|
|
45
|
+
'isNotBlank',
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
/** Operators whose predicate is a set-membership test over a token list.
|
|
49
|
+
* A filter UI renders a multi-value chip input for these. */
|
|
50
|
+
export const SET_OPERATOR_IDS: ReadonlyArray<ExcelFilterOperator> = ['in', 'notIn']
|
|
51
|
+
|
|
52
|
+
/** Operators that need no value input - they act on emptiness alone. */
|
|
53
|
+
export const VALUELESS_OPERATOR_IDS: ReadonlyArray<ExcelFilterOperator> = [
|
|
54
|
+
'isBlank',
|
|
55
|
+
'isNotBlank',
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
/** Operators that need a second value (`valueTo`). */
|
|
59
|
+
export const RANGE_OPERATOR_IDS: ReadonlyArray<ExcelFilterOperator> = ['between']
|
|
60
|
+
|
|
61
|
+
/** Whether an operator takes a multi-value token list. */
|
|
62
|
+
export function isSetOperator(op: ExcelFilterOperator): boolean {
|
|
63
|
+
return SET_OPERATOR_IDS.includes(op)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Whether an operator needs no value input. */
|
|
67
|
+
export function isValuelessOperator(op: ExcelFilterOperator): boolean {
|
|
68
|
+
return VALUELESS_OPERATOR_IDS.includes(op)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Whether an operator needs a second (`valueTo`) value. */
|
|
72
|
+
export function isRangeOperator(op: ExcelFilterOperator): boolean {
|
|
73
|
+
return RANGE_OPERATOR_IDS.includes(op)
|
|
74
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { readdirSync, readFileSync } from 'node:fs'
|
|
3
|
+
import { join } from 'node:path'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* `@svgrid/grid/filtering` is one of the few entry points consumed by RAW NODE
|
|
7
|
+
* rather than by a bundler: @svgrid/enterprise's Studio bundle keeps
|
|
8
|
+
* `@svgrid/grid` external, so the published dist is imported by Node's own ESM
|
|
9
|
+
* resolver at runtime.
|
|
10
|
+
*
|
|
11
|
+
* Node ESM does not guess extensions. The rest of the package can use
|
|
12
|
+
* extensionless relative imports because a bundler resolves them; anything
|
|
13
|
+
* reachable from this entry cannot. `import './x'` works in Vite and throws
|
|
14
|
+
* ERR_MODULE_NOT_FOUND under Node.
|
|
15
|
+
*
|
|
16
|
+
* This was not hypothetical. Splitting the operator catalogue out of
|
|
17
|
+
* `excel-filters.ts` gave that file its first relative import and broke every
|
|
18
|
+
* generated Studio app at startup. Only `pnpm verify:app` caught it, after the
|
|
19
|
+
* change was committed.
|
|
20
|
+
*
|
|
21
|
+
* The rule enforced here is deliberately blunt - EVERY relative specifier in
|
|
22
|
+
* this folder ends in `.js`, type-only ones included. Type imports are erased
|
|
23
|
+
* and would be safe either way, but exempting them means parsing TypeScript to
|
|
24
|
+
* decide which is which, and a subtle parser in a guard test is how the guard
|
|
25
|
+
* silently stops guarding. TypeScript resolves `./excel-filters.js` to
|
|
26
|
+
* `excel-filters.ts` regardless, so the strict rule costs nothing.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const DIR = import.meta.dirname
|
|
30
|
+
|
|
31
|
+
/** Every relative module specifier in the file, however it is imported. */
|
|
32
|
+
function relativeSpecifiers(source: string): string[] {
|
|
33
|
+
const out: string[] = []
|
|
34
|
+
// Covers `from './x'`, bare `import './x'`, and dynamic `import('./x')`.
|
|
35
|
+
const re = /(?:from|import)\s*\(?\s*['"](\.[^'"]*)['"]/g
|
|
36
|
+
let m: RegExpExecArray | null
|
|
37
|
+
while ((m = re.exec(source))) out.push(m[1]!)
|
|
38
|
+
return out
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const files = readdirSync(DIR).filter(
|
|
42
|
+
(f) => f.endsWith('.ts') && !f.endsWith('.test.ts'),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
describe('the /filtering entry stays resolvable by raw Node', () => {
|
|
46
|
+
it('finds the source files to check', () => {
|
|
47
|
+
// Guards against the directory read silently matching nothing, which would
|
|
48
|
+
// turn every case below into a vacuous pass.
|
|
49
|
+
expect(files.length).toBeGreaterThan(0)
|
|
50
|
+
expect(files).toContain('excel-filters.ts')
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it.each(files)('%s gives every relative import a .js extension', (file) => {
|
|
54
|
+
const offenders = relativeSpecifiers(readFileSync(join(DIR, file), 'utf8')).filter(
|
|
55
|
+
(spec) => !spec.endsWith('.js'),
|
|
56
|
+
)
|
|
57
|
+
expect(
|
|
58
|
+
offenders,
|
|
59
|
+
`${file} imports ${offenders.join(', ')} without a .js extension. ` +
|
|
60
|
+
'Node cannot resolve that in the published dist, which breaks every ' +
|
|
61
|
+
'generated Studio app at startup. Add .js to the specifier.',
|
|
62
|
+
).toEqual([])
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('detects a missing extension', () => {
|
|
66
|
+
// The guard has to be able to fail. Without this the regex could stop
|
|
67
|
+
// matching and every case above would pass for the wrong reason.
|
|
68
|
+
expect(relativeSpecifiers(`export { a } from './some-module'`)).toEqual([
|
|
69
|
+
'./some-module',
|
|
70
|
+
])
|
|
71
|
+
expect(relativeSpecifiers(`import './side-effect'`)).toEqual(['./side-effect'])
|
|
72
|
+
expect(relativeSpecifiers(`const m = await import('./lazy')`)).toEqual(['./lazy'])
|
|
73
|
+
expect(relativeSpecifiers(`import { a } from './ok.js'`)).toEqual(['./ok.js'])
|
|
74
|
+
})
|
|
75
|
+
})
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The advanced-filter expression shape, as the free grid sees it.
|
|
3
|
+
*
|
|
4
|
+
* This is a structural mirror of `@svgrid/enterprise`'s `PredicateExpr`. It is
|
|
5
|
+
* written here, in MIT code, against the grid's own operator union - the same
|
|
6
|
+
* arrangement `GridPivotConfig` uses so the free package can type a commercial
|
|
7
|
+
* feature's payload without depending on the commercial package.
|
|
8
|
+
*
|
|
9
|
+
* The two definitions must stay assignable in both directions. A bidirectional
|
|
10
|
+
* assignability test in `@svgrid/enterprise` fails `pnpm test:types` the moment
|
|
11
|
+
* either side drifts, so this is a checked mirror rather than a hopeful one.
|
|
12
|
+
*
|
|
13
|
+
* The grid never interprets these nodes. It hands the whole expression to the
|
|
14
|
+
* engine registered via `registerAdvancedFilterEngine`, which compiles it. That
|
|
15
|
+
* keeps the evaluator, the parser and the editor commercial.
|
|
16
|
+
*/
|
|
17
|
+
import type { ExcelFilterOperator } from './excel-filters.js'
|
|
18
|
+
|
|
19
|
+
/** Comparison operators available to a cross-column (`scalarCmp`) node. */
|
|
20
|
+
export type GridComparisonOp = '=' | '!=' | '>' | '<' | '>=' | '<='
|
|
21
|
+
|
|
22
|
+
/** Arithmetic operators available inside a scalar expression. */
|
|
23
|
+
export type GridArithmeticOp = '+' | '-' | '*' | '/' | '%'
|
|
24
|
+
|
|
25
|
+
/** Aggregate functions available inside a scalar expression. */
|
|
26
|
+
export type GridAggFn = 'sum' | 'avg' | 'min' | 'max' | 'count'
|
|
27
|
+
|
|
28
|
+
/** A value-producing expression: a column, a literal, or maths over them. */
|
|
29
|
+
export type GridScalarExpr =
|
|
30
|
+
| { kind: 'col'; id: string }
|
|
31
|
+
| { kind: 'lit'; value: string | number | boolean | null }
|
|
32
|
+
| { kind: 'neg'; expr: GridScalarExpr }
|
|
33
|
+
| { kind: 'bin'; op: GridArithmeticOp; left: GridScalarExpr; right: GridScalarExpr }
|
|
34
|
+
| { kind: 'agg'; fn: GridAggFn; column: string }
|
|
35
|
+
| { kind: 'func'; name: string; args: GridScalarExpr[] }
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* A boolean expression over a row.
|
|
39
|
+
*
|
|
40
|
+
* `cmp` is deliberately isomorphic to one column-menu filter condition: its
|
|
41
|
+
* `op` is the same `ExcelFilterOperator` the filter row uses, so a simple
|
|
42
|
+
* advanced filter and a column filter mean exactly the same thing.
|
|
43
|
+
*/
|
|
44
|
+
export type GridPredicateExpr =
|
|
45
|
+
| { kind: 'and'; parts: GridPredicateExpr[] }
|
|
46
|
+
| { kind: 'or'; parts: GridPredicateExpr[] }
|
|
47
|
+
| { kind: 'not'; expr: GridPredicateExpr }
|
|
48
|
+
| { kind: 'cmp'; column: string; op: ExcelFilterOperator; value?: unknown; valueTo?: unknown }
|
|
49
|
+
| { kind: 'scalarCmp'; left: GridScalarExpr; op: GridComparisonOp; right: GridScalarExpr }
|
|
50
|
+
| { kind: 'const'; value: boolean }
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apply a row predicate across a depth-ordered row list, keeping group banners
|
|
3
|
+
* consistent with what survives beneath them.
|
|
4
|
+
*
|
|
5
|
+
* The row list interleaves group banners with their descendants, banner first.
|
|
6
|
+
* A predicate written by a user is about DATA, so it is only tested against
|
|
7
|
+
* leaf rows; a banner then survives only if something under it did. Testing a
|
|
8
|
+
* banner directly would drop whole groups because its cells are aggregates, not
|
|
9
|
+
* row values.
|
|
10
|
+
*
|
|
11
|
+
* Note the existing column-filter and facet stages do test banners directly.
|
|
12
|
+
* That is a separate pre-existing inconsistency; this helper is written to be
|
|
13
|
+
* reusable if those are ever brought in line, but changing them is deliberately
|
|
14
|
+
* not bundled into the advanced filter.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Apply `keep` to leaf rows, dropping banners left with no surviving child. */
|
|
18
|
+
export function applyRowPredicate<TRow>(
|
|
19
|
+
rows: ReadonlyArray<TRow>,
|
|
20
|
+
keep: (row: TRow) => boolean,
|
|
21
|
+
isGroup: (row: TRow) => boolean,
|
|
22
|
+
): TRow[] {
|
|
23
|
+
// Fast path: no grouping in play, so every row is a leaf.
|
|
24
|
+
let hasGroup = false
|
|
25
|
+
for (const row of rows) {
|
|
26
|
+
if (isGroup(row)) {
|
|
27
|
+
hasGroup = true
|
|
28
|
+
break
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!hasGroup) return rows.filter(keep)
|
|
32
|
+
|
|
33
|
+
// One reverse pass. `survivorsBelow` counts leaves kept since we last closed
|
|
34
|
+
// out a banner, so a banner is kept when anything after it survived.
|
|
35
|
+
const keepFlags = new Array<boolean>(rows.length).fill(false)
|
|
36
|
+
let survivorsSinceBanner = 0
|
|
37
|
+
for (let i = rows.length - 1; i >= 0; i -= 1) {
|
|
38
|
+
const row = rows[i]!
|
|
39
|
+
if (isGroup(row)) {
|
|
40
|
+
if (survivorsSinceBanner > 0) {
|
|
41
|
+
keepFlags[i] = true
|
|
42
|
+
// The banner itself counts as surviving content for any banner above
|
|
43
|
+
// it, so nested groups keep their ancestors.
|
|
44
|
+
survivorsSinceBanner = 1
|
|
45
|
+
} else {
|
|
46
|
+
keepFlags[i] = false
|
|
47
|
+
}
|
|
48
|
+
} else if (keep(row)) {
|
|
49
|
+
keepFlags[i] = true
|
|
50
|
+
survivorsSinceBanner += 1
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const out: TRow[] = []
|
|
55
|
+
for (let i = 0; i < rows.length; i += 1) if (keepFlags[i]) out.push(rows[i]!)
|
|
56
|
+
return out
|
|
57
|
+
}
|
package/src/flex-render.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
/// <reference types="svelte" />
|
|
2
|
-
|
|
3
|
-
export { default as FlexRender } from './FlexRender.svelte'
|
|
1
|
+
/// <reference types="svelte" />
|
|
2
|
+
|
|
3
|
+
export { default as FlexRender } from './FlexRender.svelte'
|