@svgrid/grid 2.6.1 → 2.6.2
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 +162 -162
- 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.js +22 -10
- package/dist/SvGrid.css +2814 -2814
- package/dist/SvGrid.svelte +3490 -3490
- 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 +202 -202
- package/dist/SvSwitchButton.svelte +108 -108
- package/dist/SvTagsInput.svelte +114 -114
- 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/cdn/{GridMenus-DfmxE2Tb.js → GridMenus-BoVKgAv8.js} +9 -9
- package/dist/cdn/{GridMenus-CaaYtSpU.js → GridMenus-DL1zrDwf.js} +9 -9
- package/dist/cdn/{SvDateTimePicker-DSUhIta8.js → SvDateTimePicker-CHnUkWcH.js} +2 -2
- package/dist/cdn/{SvDateTimePicker-h9kPyszT.js → SvDateTimePicker-CRQH_U7E.js} +2 -2
- package/dist/cdn/{SvGridChart-CwhFz7GV.js → SvGridChart-BEJmNNx9.js} +1 -1
- package/dist/cdn/{SvGridChart-Bs2GIR2Q.js → SvGridChart-BwVos976.js} +1 -1
- package/dist/cdn/{SvGridChartPanel-1WXuStzM.js → SvGridChartPanel-BOknOkrP.js} +1 -1
- package/dist/cdn/{SvGridChartPanel-e5_nqNP9.js → SvGridChartPanel-D2PjII4O.js} +1 -1
- package/dist/cdn/{SvGridChartView-SmPW10dI.js → SvGridChartView-00LPUHL1.js} +1 -1
- package/dist/cdn/{SvGridChartView-eSPuJE6g.js → SvGridChartView-BhUEJ5ki.js} +1 -1
- package/dist/cdn/{SvGridDropdown-B1ZcLpgs.js → SvGridDropdown-D0VdjeR8.js} +1 -1
- package/dist/cdn/{SvGridDropdown-CtdbHcIS.js → SvGridDropdown-D13MtJ2j.js} +1 -1
- package/dist/cdn/{src-BIIhU1uh.js → src-CEpw6Ato.js} +2885 -2863
- package/dist/cdn/{src-DisUdSk9.js → src-M2NfKnjX.js} +2106 -2084
- package/dist/cdn/svgrid.js +8 -8
- package/dist/cdn/svgrid.svelte-external.js +8 -8
- package/dist/chart-export.js +8 -8
- package/dist/filtering/excel-filters.d.ts +14 -0
- package/dist/filtering/excel-filters.js +67 -32
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +11 -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 +162 -162
- 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 +3691 -3680
- package/src/SvGrid.css +2814 -2814
- package/src/SvGrid.svelte +3490 -3490
- package/src/SvGrid.types.ts +1708 -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 +202 -202
- package/src/SvSwitchButton.svelte +108 -108
- package/src/SvTagsInput.svelte +114 -114
- 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.contract.test.ts +49 -49
- package/src/a11y.test.ts +59 -59
- package/src/a11y.ts +61 -61
- package/src/ai.test.ts +502 -502
- package/src/ai.ts +1391 -1391
- package/src/build-api.coverage.test.ts +633 -633
- package/src/build-api.ts +805 -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 +157 -157
- package/src/filtering/excel-filters.ts +71 -34
- package/src/flex-render.ts +3 -3
- package/src/form-field.ts +127 -127
- package/src/group-display.test.ts +167 -167
- package/src/group-display.ts +200 -200
- package/src/index.ts +726 -724
- 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/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 +289 -289
- package/src/server-data-source.ts +413 -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 +526 -526
- package/src/svgrid.async-editor-options.test.ts +271 -271
- package/src/svgrid.auto-row-height.test.ts +204 -204
- package/src/svgrid.behavior.test.ts +705 -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.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.new-features.wrapper.test.ts +251 -251
- package/src/svgrid.tree-data.test.ts +186 -186
- package/src/svgrid.wrapper.test.ts +42 -40
- package/src/svgriddropdown.async-panel.svelte.test.ts +195 -195
- package/src/test-setup.ts +62 -62
- package/src/themes/index.ts +278 -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/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +0 -178
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +0 -3843
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +0 -23
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +0 -1925
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +0 -206
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +0 -20
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +0 -264
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +0 -698
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +0 -3
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +0 -135
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +0 -57
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +0 -2
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +0 -46691
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +0 -239
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +0 -2
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +0 -6
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +0 -7
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +0 -6
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +0 -7
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +0 -7
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +0 -7
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +0 -6
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +0 -85
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +0 -561
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +0 -26
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +0 -124
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +0 -2
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +0 -91
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +0 -242
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +0 -497
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +0 -4929
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +0 -192
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +0 -10
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +0 -1
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +0 -140
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +0 -178
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +0 -3843
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +0 -23
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +0 -1925
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +0 -206
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +0 -20
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +0 -264
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +0 -698
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +0 -3
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +0 -135
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +0 -57
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +0 -2
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +0 -46691
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +0 -239
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +0 -2
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +0 -6
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +0 -7
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +0 -6
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +0 -7
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +0 -7
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +0 -7
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +0 -6
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +0 -85
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +0 -561
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +0 -26
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +0 -124
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +0 -2
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +0 -91
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +0 -242
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +0 -497
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +0 -4929
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +0 -192
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +0 -10
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +0 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +0 -140
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +0 -1
package/src/filter-operators.ts
CHANGED
|
@@ -1,157 +1,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
|
-
|
|
7
|
-
export const filterOperatorOptions: Array<FilterOption> = [
|
|
8
|
-
{ value: "contains", label: "Contains", iconName: "op-contains" },
|
|
9
|
-
{ value: "notContains", label: "Not contains", iconName: "op-notContains" },
|
|
10
|
-
{ value: "equals", label: "Equals", iconName: "op-equals" },
|
|
11
|
-
{ value: "notEquals", label: "Not equals", iconName: "op-notEquals" },
|
|
12
|
-
{ value: "startsWith", label: "Starts with", iconName: "op-startsWith" },
|
|
13
|
-
{ value: "endsWith", label: "Ends with", iconName: "op-endsWith" },
|
|
14
|
-
{ value: "regex", label: "Regex", iconName: "op-regex" },
|
|
15
|
-
{ value: "in", label: "In", iconName: "op-in" },
|
|
16
|
-
{ value: "notIn", label: "Not in", iconName: "op-notIn" },
|
|
17
|
-
{ value: "greaterThan", label: "Greater than", iconName: "op-greaterThan" },
|
|
18
|
-
{ value: "lessThan", label: "Less than", iconName: "op-lessThan" },
|
|
19
|
-
{ value: "between", label: "Between", iconName: "op-between" },
|
|
20
|
-
{ value: "isBlank", label: "Blank", iconName: "op-isBlank" },
|
|
21
|
-
{ value: "isNotBlank", label: "Not blank", iconName: "op-isNotBlank" },
|
|
22
|
-
];
|
|
23
|
-
/** Operators whose predicate is a set-membership test over a token list.
|
|
24
|
-
* The filter row renders a multi-value chip input for these instead of a
|
|
25
|
-
* single text box. */
|
|
26
|
-
export const SET_OPERATORS: ReadonlyArray<FilterOperator> = ["in", "notIn"];
|
|
27
|
-
/** Operators that need no value input - they act on emptiness alone. */
|
|
28
|
-
export const VALUELESS_OPERATORS: ReadonlyArray<FilterOperator> = [
|
|
29
|
-
"isBlank",
|
|
30
|
-
"isNotBlank",
|
|
31
|
-
];
|
|
32
|
-
/** Which operators make sense for each column editor type. */
|
|
33
|
-
export const TEXT_OPERATORS: Array<FilterOperator> = [
|
|
34
|
-
"contains",
|
|
35
|
-
"notContains",
|
|
36
|
-
"equals",
|
|
37
|
-
"notEquals",
|
|
38
|
-
"startsWith",
|
|
39
|
-
"endsWith",
|
|
40
|
-
"regex",
|
|
41
|
-
"in",
|
|
42
|
-
"notIn",
|
|
43
|
-
"isBlank",
|
|
44
|
-
"isNotBlank",
|
|
45
|
-
];
|
|
46
|
-
export const NUMBER_OPERATORS: Array<FilterOperator> = [
|
|
47
|
-
"equals",
|
|
48
|
-
"notEquals",
|
|
49
|
-
"greaterThan",
|
|
50
|
-
"lessThan",
|
|
51
|
-
"between",
|
|
52
|
-
"in",
|
|
53
|
-
"notIn",
|
|
54
|
-
"isBlank",
|
|
55
|
-
"isNotBlank",
|
|
56
|
-
];
|
|
57
|
-
export const DATE_OPERATORS: Array<FilterOperator> = [
|
|
58
|
-
"equals",
|
|
59
|
-
"notEquals",
|
|
60
|
-
"lessThan",
|
|
61
|
-
"greaterThan",
|
|
62
|
-
"between",
|
|
63
|
-
"isBlank",
|
|
64
|
-
"isNotBlank",
|
|
65
|
-
];
|
|
66
|
-
export const CHECKBOX_OPERATORS: Array<FilterOperator> = [
|
|
67
|
-
"equals",
|
|
68
|
-
"isBlank",
|
|
69
|
-
"isNotBlank",
|
|
70
|
-
];
|
|
71
|
-
export const fallbackOperatorOption: FilterOption = {
|
|
72
|
-
value: "contains",
|
|
73
|
-
label: "Contains",
|
|
74
|
-
iconName: "op-contains",
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export function operatorOption(value: FilterOperator): FilterOption {
|
|
78
|
-
return (
|
|
79
|
-
filterOperatorOptions.find((option) => option.value === value) ??
|
|
80
|
-
fallbackOperatorOption
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** Returns the operators that make sense for the given column's data type. */
|
|
85
|
-
export function operatorsForColumn<TData extends RowData>(
|
|
86
|
-
column: Column<TData> | undefined,
|
|
87
|
-
): Array<FilterOption> {
|
|
88
|
-
const editorType = column?.columnDef.editorType ?? "text";
|
|
89
|
-
const ids =
|
|
90
|
-
editorType === "number"
|
|
91
|
-
? NUMBER_OPERATORS
|
|
92
|
-
: editorType === "date" || editorType === "datetime"
|
|
93
|
-
? DATE_OPERATORS
|
|
94
|
-
: editorType === "checkbox"
|
|
95
|
-
? CHECKBOX_OPERATORS
|
|
96
|
-
: TEXT_OPERATORS;
|
|
97
|
-
return ids
|
|
98
|
-
.map((id) => filterOperatorOptions.find((option) => option.value === id))
|
|
99
|
-
.filter((option): option is FilterOption => Boolean(option));
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/** Default operator for a column (first one valid for its type). */
|
|
103
|
-
export function defaultOperatorFor<TData extends RowData>(
|
|
104
|
-
column: Column<TData> | undefined,
|
|
105
|
-
): FilterOperator {
|
|
106
|
-
return operatorsForColumn(column)[0]?.value ?? "contains";
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/** Date columns get friendlier labels for "less / greater than". */
|
|
110
|
-
export function operatorLabelFor<TData extends RowData>(
|
|
111
|
-
option: FilterOption,
|
|
112
|
-
column: Column<TData> | undefined,
|
|
113
|
-
): string {
|
|
114
|
-
const editorType = column?.columnDef.editorType;
|
|
115
|
-
if (editorType === "date" || editorType === "datetime") {
|
|
116
|
-
if (option.value === "lessThan") return "Before";
|
|
117
|
-
if (option.value === "greaterThan") return "After";
|
|
118
|
-
}
|
|
119
|
-
return option.label;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** GridMessages key for each operator's label (see grid-messages.ts). */
|
|
123
|
-
const OPERATOR_MESSAGE_KEY: Record<FilterOperator, string> = {
|
|
124
|
-
contains: "opContains",
|
|
125
|
-
notContains: "opNotContains",
|
|
126
|
-
equals: "opEquals",
|
|
127
|
-
notEquals: "opNotEquals",
|
|
128
|
-
startsWith: "opStartsWith",
|
|
129
|
-
endsWith: "opEndsWith",
|
|
130
|
-
regex: "opRegex",
|
|
131
|
-
in: "opIn",
|
|
132
|
-
notIn: "opNotIn",
|
|
133
|
-
greaterThan: "opGreaterThan",
|
|
134
|
-
lessThan: "opLessThan",
|
|
135
|
-
between: "opBetween",
|
|
136
|
-
isBlank: "opIsBlank",
|
|
137
|
-
isNotBlank: "opIsNotBlank",
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Localized operator label: honors date `Before`/`After` relabels, then the
|
|
142
|
-
* `localeText` override for the operator, falling back to the English
|
|
143
|
-
* `option.label`. `messages` is a loose string map to avoid a type cycle.
|
|
144
|
-
*/
|
|
145
|
-
export function localizeOperatorLabel<TData extends RowData>(
|
|
146
|
-
option: FilterOption,
|
|
147
|
-
column: Column<TData> | undefined,
|
|
148
|
-
messages?: Record<string, string> | null,
|
|
149
|
-
): string {
|
|
150
|
-
const editorType = column?.columnDef.editorType;
|
|
151
|
-
if (editorType === "date" || editorType === "datetime") {
|
|
152
|
-
if (option.value === "lessThan") return messages?.opBefore || "Before";
|
|
153
|
-
if (option.value === "greaterThan") return messages?.opAfter || "After";
|
|
154
|
-
}
|
|
155
|
-
const key = OPERATOR_MESSAGE_KEY[option.value];
|
|
156
|
-
return (key && messages?.[key]) || option.label;
|
|
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
|
+
|
|
7
|
+
export const filterOperatorOptions: Array<FilterOption> = [
|
|
8
|
+
{ value: "contains", label: "Contains", iconName: "op-contains" },
|
|
9
|
+
{ value: "notContains", label: "Not contains", iconName: "op-notContains" },
|
|
10
|
+
{ value: "equals", label: "Equals", iconName: "op-equals" },
|
|
11
|
+
{ value: "notEquals", label: "Not equals", iconName: "op-notEquals" },
|
|
12
|
+
{ value: "startsWith", label: "Starts with", iconName: "op-startsWith" },
|
|
13
|
+
{ value: "endsWith", label: "Ends with", iconName: "op-endsWith" },
|
|
14
|
+
{ value: "regex", label: "Regex", iconName: "op-regex" },
|
|
15
|
+
{ value: "in", label: "In", iconName: "op-in" },
|
|
16
|
+
{ value: "notIn", label: "Not in", iconName: "op-notIn" },
|
|
17
|
+
{ value: "greaterThan", label: "Greater than", iconName: "op-greaterThan" },
|
|
18
|
+
{ value: "lessThan", label: "Less than", iconName: "op-lessThan" },
|
|
19
|
+
{ value: "between", label: "Between", iconName: "op-between" },
|
|
20
|
+
{ value: "isBlank", label: "Blank", iconName: "op-isBlank" },
|
|
21
|
+
{ value: "isNotBlank", label: "Not blank", iconName: "op-isNotBlank" },
|
|
22
|
+
];
|
|
23
|
+
/** Operators whose predicate is a set-membership test over a token list.
|
|
24
|
+
* The filter row renders a multi-value chip input for these instead of a
|
|
25
|
+
* single text box. */
|
|
26
|
+
export const SET_OPERATORS: ReadonlyArray<FilterOperator> = ["in", "notIn"];
|
|
27
|
+
/** Operators that need no value input - they act on emptiness alone. */
|
|
28
|
+
export const VALUELESS_OPERATORS: ReadonlyArray<FilterOperator> = [
|
|
29
|
+
"isBlank",
|
|
30
|
+
"isNotBlank",
|
|
31
|
+
];
|
|
32
|
+
/** Which operators make sense for each column editor type. */
|
|
33
|
+
export const TEXT_OPERATORS: Array<FilterOperator> = [
|
|
34
|
+
"contains",
|
|
35
|
+
"notContains",
|
|
36
|
+
"equals",
|
|
37
|
+
"notEquals",
|
|
38
|
+
"startsWith",
|
|
39
|
+
"endsWith",
|
|
40
|
+
"regex",
|
|
41
|
+
"in",
|
|
42
|
+
"notIn",
|
|
43
|
+
"isBlank",
|
|
44
|
+
"isNotBlank",
|
|
45
|
+
];
|
|
46
|
+
export const NUMBER_OPERATORS: Array<FilterOperator> = [
|
|
47
|
+
"equals",
|
|
48
|
+
"notEquals",
|
|
49
|
+
"greaterThan",
|
|
50
|
+
"lessThan",
|
|
51
|
+
"between",
|
|
52
|
+
"in",
|
|
53
|
+
"notIn",
|
|
54
|
+
"isBlank",
|
|
55
|
+
"isNotBlank",
|
|
56
|
+
];
|
|
57
|
+
export const DATE_OPERATORS: Array<FilterOperator> = [
|
|
58
|
+
"equals",
|
|
59
|
+
"notEquals",
|
|
60
|
+
"lessThan",
|
|
61
|
+
"greaterThan",
|
|
62
|
+
"between",
|
|
63
|
+
"isBlank",
|
|
64
|
+
"isNotBlank",
|
|
65
|
+
];
|
|
66
|
+
export const CHECKBOX_OPERATORS: Array<FilterOperator> = [
|
|
67
|
+
"equals",
|
|
68
|
+
"isBlank",
|
|
69
|
+
"isNotBlank",
|
|
70
|
+
];
|
|
71
|
+
export const fallbackOperatorOption: FilterOption = {
|
|
72
|
+
value: "contains",
|
|
73
|
+
label: "Contains",
|
|
74
|
+
iconName: "op-contains",
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export function operatorOption(value: FilterOperator): FilterOption {
|
|
78
|
+
return (
|
|
79
|
+
filterOperatorOptions.find((option) => option.value === value) ??
|
|
80
|
+
fallbackOperatorOption
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Returns the operators that make sense for the given column's data type. */
|
|
85
|
+
export function operatorsForColumn<TData extends RowData>(
|
|
86
|
+
column: Column<TData> | undefined,
|
|
87
|
+
): Array<FilterOption> {
|
|
88
|
+
const editorType = column?.columnDef.editorType ?? "text";
|
|
89
|
+
const ids =
|
|
90
|
+
editorType === "number"
|
|
91
|
+
? NUMBER_OPERATORS
|
|
92
|
+
: editorType === "date" || editorType === "datetime"
|
|
93
|
+
? DATE_OPERATORS
|
|
94
|
+
: editorType === "checkbox"
|
|
95
|
+
? CHECKBOX_OPERATORS
|
|
96
|
+
: TEXT_OPERATORS;
|
|
97
|
+
return ids
|
|
98
|
+
.map((id) => filterOperatorOptions.find((option) => option.value === id))
|
|
99
|
+
.filter((option): option is FilterOption => Boolean(option));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Default operator for a column (first one valid for its type). */
|
|
103
|
+
export function defaultOperatorFor<TData extends RowData>(
|
|
104
|
+
column: Column<TData> | undefined,
|
|
105
|
+
): FilterOperator {
|
|
106
|
+
return operatorsForColumn(column)[0]?.value ?? "contains";
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Date columns get friendlier labels for "less / greater than". */
|
|
110
|
+
export function operatorLabelFor<TData extends RowData>(
|
|
111
|
+
option: FilterOption,
|
|
112
|
+
column: Column<TData> | undefined,
|
|
113
|
+
): string {
|
|
114
|
+
const editorType = column?.columnDef.editorType;
|
|
115
|
+
if (editorType === "date" || editorType === "datetime") {
|
|
116
|
+
if (option.value === "lessThan") return "Before";
|
|
117
|
+
if (option.value === "greaterThan") return "After";
|
|
118
|
+
}
|
|
119
|
+
return option.label;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** GridMessages key for each operator's label (see grid-messages.ts). */
|
|
123
|
+
const OPERATOR_MESSAGE_KEY: Record<FilterOperator, string> = {
|
|
124
|
+
contains: "opContains",
|
|
125
|
+
notContains: "opNotContains",
|
|
126
|
+
equals: "opEquals",
|
|
127
|
+
notEquals: "opNotEquals",
|
|
128
|
+
startsWith: "opStartsWith",
|
|
129
|
+
endsWith: "opEndsWith",
|
|
130
|
+
regex: "opRegex",
|
|
131
|
+
in: "opIn",
|
|
132
|
+
notIn: "opNotIn",
|
|
133
|
+
greaterThan: "opGreaterThan",
|
|
134
|
+
lessThan: "opLessThan",
|
|
135
|
+
between: "opBetween",
|
|
136
|
+
isBlank: "opIsBlank",
|
|
137
|
+
isNotBlank: "opIsNotBlank",
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Localized operator label: honors date `Before`/`After` relabels, then the
|
|
142
|
+
* `localeText` override for the operator, falling back to the English
|
|
143
|
+
* `option.label`. `messages` is a loose string map to avoid a type cycle.
|
|
144
|
+
*/
|
|
145
|
+
export function localizeOperatorLabel<TData extends RowData>(
|
|
146
|
+
option: FilterOption,
|
|
147
|
+
column: Column<TData> | undefined,
|
|
148
|
+
messages?: Record<string, string> | null,
|
|
149
|
+
): string {
|
|
150
|
+
const editorType = column?.columnDef.editorType;
|
|
151
|
+
if (editorType === "date" || editorType === "datetime") {
|
|
152
|
+
if (option.value === "lessThan") return messages?.opBefore || "Before";
|
|
153
|
+
if (option.value === "greaterThan") return messages?.opAfter || "After";
|
|
154
|
+
}
|
|
155
|
+
const key = OPERATOR_MESSAGE_KEY[option.value];
|
|
156
|
+
return (key && messages?.[key]) || option.label;
|
|
157
|
+
}
|
|
@@ -159,61 +159,89 @@ function scanInTokens(value: unknown): { tokens: string[]; trailing: string } {
|
|
|
159
159
|
return { tokens, trailing: take() }
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
/** A filter with its needle-side work already done. Call per row. */
|
|
163
|
+
export type CompiledExcelFilter = (cellValue: unknown) => boolean
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Compile a filter once, then test many rows against it.
|
|
167
|
+
*
|
|
168
|
+
* Everything that depends only on the FILTER - folding the needle, splitting
|
|
169
|
+
* `in` tokens, building the regex, coercing range endpoints - happens here,
|
|
170
|
+
* so the per-row closure does the minimum. Filtering 100k rows used to redo
|
|
171
|
+
* all of it 100k times.
|
|
172
|
+
*
|
|
173
|
+
* `applyExcelFilter` is defined in terms of this, so there is exactly one
|
|
174
|
+
* copy of the operator semantics.
|
|
175
|
+
*/
|
|
176
|
+
export function compileExcelFilter(
|
|
164
177
|
filter: ExcelFilter,
|
|
165
178
|
options?: ExcelFilterOptions,
|
|
166
|
-
) {
|
|
167
|
-
const
|
|
168
|
-
const
|
|
169
|
-
const
|
|
179
|
+
): CompiledExcelFilter {
|
|
180
|
+
const locale = options?.locale
|
|
181
|
+
const fold = (v: unknown) => normalizeForFilter(String(v ?? ''), locale)
|
|
182
|
+
const needle = fold(filter.value)
|
|
183
|
+
|
|
170
184
|
switch (filter.operator) {
|
|
171
185
|
case 'contains':
|
|
172
|
-
return
|
|
186
|
+
return (cellValue) => fold(cellValue).includes(needle)
|
|
173
187
|
case 'notContains':
|
|
174
188
|
// An empty needle is no constraint (mirrors `contains` returning true),
|
|
175
189
|
// so nothing is excluded until the user types something.
|
|
176
|
-
|
|
190
|
+
if (needle === '') return () => true
|
|
191
|
+
return (cellValue) => !fold(cellValue).includes(needle)
|
|
177
192
|
case 'equals':
|
|
178
|
-
return
|
|
193
|
+
return (cellValue) => fold(cellValue) === needle
|
|
179
194
|
case 'notEquals':
|
|
180
|
-
|
|
195
|
+
if (needle === '') return () => true
|
|
196
|
+
return (cellValue) => fold(cellValue) !== needle
|
|
181
197
|
case 'startsWith':
|
|
182
|
-
return
|
|
198
|
+
return (cellValue) => fold(cellValue).startsWith(needle)
|
|
183
199
|
case 'endsWith':
|
|
184
|
-
return
|
|
200
|
+
return (cellValue) => fold(cellValue).endsWith(needle)
|
|
185
201
|
case 'regex': {
|
|
186
202
|
// Case-insensitive by default (matches the accent/case-folded feel of
|
|
187
203
|
// the other text operators). An invalid pattern matches nothing rather
|
|
188
204
|
// than throwing, so a half-typed regex never crashes the row model.
|
|
205
|
+
// Note this tests the RAW text, not the folded text.
|
|
189
206
|
const pattern = String(filter.value ?? '')
|
|
190
|
-
if (!pattern) return true
|
|
207
|
+
if (!pattern) return () => true
|
|
208
|
+
let re: RegExp
|
|
191
209
|
try {
|
|
192
|
-
|
|
210
|
+
re = new RegExp(pattern, 'i')
|
|
193
211
|
} catch {
|
|
194
|
-
return false
|
|
212
|
+
return () => false
|
|
195
213
|
}
|
|
214
|
+
return (cellValue) => re.test(String(cellValue ?? ''))
|
|
196
215
|
}
|
|
197
216
|
case 'in':
|
|
198
217
|
case 'notIn': {
|
|
199
218
|
const tokens = splitInTokens(filter.value)
|
|
200
|
-
if (tokens.length === 0) return true
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
)
|
|
204
|
-
|
|
219
|
+
if (tokens.length === 0) return () => true
|
|
220
|
+
// A Set of pre-folded tokens turns the old per-row `tokens.some(...)`
|
|
221
|
+
// (which re-folded every token for every row) into one lookup.
|
|
222
|
+
const wanted = new Set(tokens.map((t) => normalizeForFilter(t, locale)))
|
|
223
|
+
if (filter.operator === 'in') return (cellValue) => wanted.has(fold(cellValue))
|
|
224
|
+
return (cellValue) => !wanted.has(fold(cellValue))
|
|
205
225
|
}
|
|
206
226
|
case 'greaterThan': {
|
|
207
|
-
const a = Number(cellValue)
|
|
208
227
|
const b = Number(filter.value)
|
|
209
|
-
|
|
210
|
-
|
|
228
|
+
const bFinite = Number.isFinite(b)
|
|
229
|
+
const bText = String(filter.value ?? '')
|
|
230
|
+
return (cellValue) => {
|
|
231
|
+
const a = Number(cellValue)
|
|
232
|
+
if (bFinite && Number.isFinite(a)) return a > b
|
|
233
|
+
return String(cellValue ?? '') > bText
|
|
234
|
+
}
|
|
211
235
|
}
|
|
212
236
|
case 'lessThan': {
|
|
213
|
-
const a = Number(cellValue)
|
|
214
237
|
const b = Number(filter.value)
|
|
215
|
-
|
|
216
|
-
|
|
238
|
+
const bFinite = Number.isFinite(b)
|
|
239
|
+
const bText = String(filter.value ?? '')
|
|
240
|
+
return (cellValue) => {
|
|
241
|
+
const a = Number(cellValue)
|
|
242
|
+
if (bFinite && Number.isFinite(a)) return a < b
|
|
243
|
+
return String(cellValue ?? '') < bText
|
|
244
|
+
}
|
|
217
245
|
}
|
|
218
246
|
case 'between': {
|
|
219
247
|
// Two paths: numeric (coerce both endpoints with the historical
|
|
@@ -223,21 +251,30 @@ export function applyExcelFilter(
|
|
|
223
251
|
// see the historical inclusive-range behaviour.
|
|
224
252
|
const lo = filter.value == null ? 0 : Number(filter.value)
|
|
225
253
|
const hi = filter.valueTo == null ? 0 : Number(filter.valueTo)
|
|
226
|
-
const
|
|
227
|
-
if (Number.isFinite(a) && Number.isFinite(lo) && Number.isFinite(hi)) {
|
|
228
|
-
return a >= lo && a <= hi
|
|
229
|
-
}
|
|
254
|
+
const rangeFinite = Number.isFinite(lo) && Number.isFinite(hi)
|
|
230
255
|
// Either endpoint is non-numeric (ISO date string, etc). Compare
|
|
231
256
|
// lexicographically - YYYY-MM-DD orders chronologically so the
|
|
232
257
|
// result matches user intent.
|
|
233
|
-
const s = String(cellValue ?? '')
|
|
234
258
|
const sl = String(filter.value ?? '')
|
|
235
259
|
const sh = String(filter.valueTo ?? '')
|
|
236
|
-
return
|
|
260
|
+
return (cellValue) => {
|
|
261
|
+
const a = Number(cellValue ?? 0)
|
|
262
|
+
if (rangeFinite && Number.isFinite(a)) return a >= lo && a <= hi
|
|
263
|
+
const s = String(cellValue ?? '')
|
|
264
|
+
return s >= sl && s <= sh
|
|
265
|
+
}
|
|
237
266
|
}
|
|
238
267
|
case 'isBlank':
|
|
239
|
-
return
|
|
268
|
+
return (cellValue) => String(cellValue ?? '').trim().length === 0
|
|
240
269
|
case 'isNotBlank':
|
|
241
|
-
return
|
|
270
|
+
return (cellValue) => String(cellValue ?? '').trim().length > 0
|
|
242
271
|
}
|
|
243
272
|
}
|
|
273
|
+
|
|
274
|
+
export function applyExcelFilter(
|
|
275
|
+
cellValue: unknown,
|
|
276
|
+
filter: ExcelFilter,
|
|
277
|
+
options?: ExcelFilterOptions,
|
|
278
|
+
) {
|
|
279
|
+
return compileExcelFilter(filter, options)(cellValue)
|
|
280
|
+
}
|
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'
|