@platforma-sdk/ui-vue 1.42.18 → 1.42.19
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/.turbo/turbo-build.log +11 -7
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +6 -0
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +38 -38
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue.d.ts.map +1 -1
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue.js +7 -86
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue.js.map +1 -1
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js +103 -2
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js.map +1 -1
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue3.js +9 -0
- package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue3.js.map +1 -0
- package/dist/components/PlAgGridColumnManager/useFilteredItems.d.ts +15 -0
- package/dist/components/PlAgGridColumnManager/useFilteredItems.d.ts.map +1 -0
- package/dist/components/PlAgGridColumnManager/useFilteredItems.js +35 -0
- package/dist/components/PlAgGridColumnManager/useFilteredItems.js.map +1 -0
- package/package.json +4 -4
- package/src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue +28 -4
- package/src/components/PlAgGridColumnManager/useFilteredItems.ts +68 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
WARN Issue while reading "/home/runner/_work/platforma/platforma/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @platforma-sdk/ui-vue@1.42.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.42.19 build /home/runner/_work/platforma/platforma/sdk/ui-vue
|
|
4
4
|
> vite build
|
|
5
5
|
|
|
6
6
|
[36mvite v6.3.5 [32mbuilding for production...[36m[39m
|
|
7
7
|
transforming...
|
|
8
|
-
[32m✓[39m
|
|
8
|
+
[32m✓[39m 903 modules transformed.
|
|
9
|
+
[33mExport "default" of module "src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue" was reexported through module "src/components/PlAgGridColumnManager/index.ts" while both modules are dependencies of each other and will end up in different chunks by current Rollup settings. This scenario is not well supported at the moment as it will produce a circular dependency between chunks and will likely lead to broken execution order.
|
|
10
|
+
Either change the import in "src/components/PlAgDataTable/PlAgDataTableV2.vue?vue&type=script&setup=true&lang.ts" to point directly to the exporting module or do not use "output.preserveModules" to ensure these modules end up in the same chunk.[39m
|
|
9
11
|
rendering chunks...
|
|
10
12
|
|
|
11
13
|
[vite:dts] Start generate declaration files...
|
|
12
14
|
computing gzip size...
|
|
13
|
-
[vite:dts] Declaration files built in
|
|
15
|
+
[vite:dts] Declaration files built in 5734ms.
|
|
14
16
|
|
|
15
17
|
[2mdist/[22m[36m_virtual/re.js [39m[1m[2m 0.08 kB[22m[1m[22m[2m │ gzip: 0.10 kB[22m[2m │ map: 0.09 kB[22m
|
|
16
18
|
[2mdist/[22m[36mlib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/constant.js [39m[1m[2m 0.09 kB[22m[1m[22m[2m │ gzip: 0.10 kB[22m[2m │ map: 0.32 kB[22m
|
|
@@ -48,7 +50,6 @@ computing gzip size...
|
|
|
48
50
|
[2mdist/[22m[36mcomponents/PlTableFilters/PlTableAddFilterV2.vue2.js [39m[1m[2m 0.12 kB[22m[1m[22m[2m │ gzip: 0.12 kB[22m[2m │ map: 0.11 kB[22m
|
|
49
51
|
[2mdist/[22m[36mplugins/Monetization/MonetizationSidebar.vue2.js [39m[1m[2m 0.13 kB[22m[1m[22m[2m │ gzip: 0.12 kB[22m[2m │ map: 0.11 kB[22m
|
|
50
52
|
[2mdist/[22m[36mcomponents/PlTableFilters/PlTableFilterEntryV2.vue2.js [39m[1m[2m 0.13 kB[22m[1m[22m[2m │ gzip: 0.12 kB[22m[2m │ map: 0.11 kB[22m
|
|
51
|
-
[2mdist/[22m[36mcomponents/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js [39m[1m[2m 0.13 kB[22m[1m[22m[2m │ gzip: 0.12 kB[22m[2m │ map: 0.11 kB[22m
|
|
52
53
|
[2mdist/[22m[36mcomponents/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue2.js [39m[1m[2m 0.13 kB[22m[1m[22m[2m │ gzip: 0.12 kB[22m[2m │ map: 0.11 kB[22m
|
|
53
54
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/PlRadio/keys.js [39m[1m[2m 0.13 kB[22m[1m[22m[2m │ gzip: 0.13 kB[22m[2m │ map: 0.46 kB[22m
|
|
54
55
|
[2mdist/[22m[36mlib/ui/uikit/dist/node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/selection/size.js [39m[1m[2m 0.13 kB[22m[1m[22m[2m │ gzip: 0.13 kB[22m[2m │ map: 0.49 kB[22m
|
|
@@ -238,13 +239,14 @@ computing gzip size...
|
|
|
238
239
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/16_arrow-right.svg.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.25 kB[22m[2m │ map: 0.52 kB[22m
|
|
239
240
|
[2mdist/[22m[36m_virtual/stringify.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.10 kB[22m
|
|
240
241
|
[2mdist/[22m[36mcomponents/PlAnnotations/components/PlAnnotationsModal.vue.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.11 kB[22m
|
|
241
|
-
[2mdist/[22m[36mcomponents/PlAgDataTable/PlAgDataTableSheets.vue.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.11 kB[22m
|
|
242
242
|
[2mdist/[22m[36mcomponents/PlAnnotations/components/AnnotationsSidebar.vue.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.11 kB[22m
|
|
243
|
+
[2mdist/[22m[36mcomponents/PlAgDataTable/PlAgDataTableSheets.vue.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.11 kB[22m
|
|
243
244
|
[2mdist/[22m[36mnode_modules/.pnpm/semver@7.7.2/node_modules/semver/ranges/valid.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.22 kB[22m[2m │ map: 0.76 kB[22m
|
|
244
245
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_chevron-first.svg.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.25 kB[22m[2m │ map: 0.53 kB[22m
|
|
245
246
|
[2mdist/[22m[36mlib/ui/uikit/dist/node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/namespaces.js [39m[1m[2m 0.31 kB[22m[1m[22m[2m │ gzip: 0.19 kB[22m[2m │ map: 0.65 kB[22m
|
|
246
247
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/16_chevron-last.svg.js [39m[1m[2m 0.32 kB[22m[1m[22m[2m │ gzip: 0.25 kB[22m[2m │ map: 0.53 kB[22m
|
|
247
248
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_radio-button-checked.svg.js [39m[1m[2m 0.32 kB[22m[1m[22m[2m │ gzip: 0.25 kB[22m[2m │ map: 0.57 kB[22m
|
|
249
|
+
[2mdist/[22m[36mcomponents/PlAgGridColumnManager/PlAgGridColumnManager.vue.js [39m[1m[2m 0.32 kB[22m[1m[22m[2m │ gzip: 0.23 kB[22m[2m │ map: 0.12 kB[22m
|
|
248
250
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_chevron-last.svg.js [39m[1m[2m 0.32 kB[22m[1m[22m[2m │ gzip: 0.26 kB[22m[2m │ map: 0.53 kB[22m
|
|
249
251
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_sort.svg.js [39m[1m[2m 0.32 kB[22m[1m[22m[2m │ gzip: 0.25 kB[22m[2m │ map: 0.51 kB[22m
|
|
250
252
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/PlChartHistogram/drawThreshold.js [39m[1m[2m 0.32 kB[22m[1m[22m[2m │ gzip: 0.23 kB[22m[2m │ map: 1.03 kB[22m
|
|
@@ -370,6 +372,7 @@ computing gzip size...
|
|
|
370
372
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/16_y-axis.svg.js [39m[1m[2m 0.45 kB[22m[1m[22m[2m │ gzip: 0.30 kB[22m[2m │ map: 0.68 kB[22m
|
|
371
373
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_delete-circle.svg.js [39m[1m[2m 0.45 kB[22m[1m[22m[2m │ gzip: 0.31 kB[22m[2m │ map: 0.68 kB[22m
|
|
372
374
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_zoom-in.svg.js [39m[1m[2m 0.45 kB[22m[1m[22m[2m │ gzip: 0.30 kB[22m[2m │ map: 0.68 kB[22m
|
|
375
|
+
[2mdist/[22m[36mcomponents/PlAgGridColumnManager/PlAgGridColumnManager.vue3.js [39m[1m[2m 0.45 kB[22m[1m[22m[2m │ gzip: 0.33 kB[22m[2m │ map: 0.11 kB[22m
|
|
373
376
|
[2mdist/[22m[36mcomputedResult.js [39m[1m[2m 0.45 kB[22m[1m[22m[2m │ gzip: 0.27 kB[22m[2m │ map: 2.41 kB[22m
|
|
374
377
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/images/24_checkbox-light-enabled-checked.svg.js [39m[1m[2m 0.45 kB[22m[1m[22m[2m │ gzip: 0.33 kB[22m[2m │ map: 0.74 kB[22m
|
|
375
378
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_frame-type-all.svg.js [39m[1m[2m 0.46 kB[22m[1m[22m[2m │ gzip: 0.31 kB[22m[2m │ map: 0.68 kB[22m
|
|
@@ -634,6 +637,7 @@ computing gzip size...
|
|
|
634
637
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_dna-import.svg.js [39m[1m[2m 1.11 kB[22m[1m[22m[2m │ gzip: 0.67 kB[22m[2m │ map: 1.34 kB[22m
|
|
635
638
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_progress.svg.js [39m[1m[2m 1.11 kB[22m[1m[22m[2m │ gzip: 0.64 kB[22m[2m │ map: 1.32 kB[22m
|
|
636
639
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_settings.svg.js [39m[1m[2m 1.13 kB[22m[1m[22m[2m │ gzip: 0.60 kB[22m[2m │ map: 1.35 kB[22m
|
|
640
|
+
[2mdist/[22m[36mcomponents/PlAgGridColumnManager/useFilteredItems.js [39m[1m[2m 1.13 kB[22m[1m[22m[2m │ gzip: 0.58 kB[22m[2m │ map: 3.94 kB[22m
|
|
637
641
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/PlTabs/Tab.vue.js [39m[1m[2m 1.13 kB[22m[1m[22m[2m │ gzip: 0.62 kB[22m[2m │ map: 1.58 kB[22m
|
|
638
642
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/PlSplash/PlSplash.vue.js [39m[1m[2m 1.14 kB[22m[1m[22m[2m │ gzip: 0.56 kB[22m[2m │ map: 0.13 kB[22m
|
|
639
643
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/PlChartStackedBar/PlChartStackedBar.vue2.js [39m[1m[2m 1.14 kB[22m[1m[22m[2m │ gzip: 0.58 kB[22m[2m │ map: 1.64 kB[22m
|
|
@@ -784,7 +788,6 @@ computing gzip size...
|
|
|
784
788
|
[2mdist/[22m[36mcomponents/PlAgColumnHeader/PlAgColumnHeader.vue.js [39m[1m[2m 3.32 kB[22m[1m[22m[2m │ gzip: 1.34 kB[22m[2m │ map: 4.05 kB[22m
|
|
785
789
|
[2mdist/[22m[36mcomponents/PlAgDataTable/sources/table-state-v2.js [39m[1m[2m 3.33 kB[22m[1m[22m[2m │ gzip: 1.16 kB[22m[2m │ map: 9.95 kB[22m
|
|
786
790
|
[2mdist/[22m[36mnode_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch/module/duplex.js [39m[1m[2m 3.33 kB[22m[1m[22m[2m │ gzip: 1.22 kB[22m[2m │ map: 10.70 kB[22m
|
|
787
|
-
[2mdist/[22m[36mcomponents/PlAgGridColumnManager/PlAgGridColumnManager.vue.js [39m[1m[2m 3.34 kB[22m[1m[22m[2m │ gzip: 1.30 kB[22m[2m │ map: 4.05 kB[22m
|
|
788
791
|
[2mdist/[22m[36mcomponents/PlTableFilters/PlTableAddFilterV2.vue.js [39m[1m[2m 3.42 kB[22m[1m[22m[2m │ gzip: 1.28 kB[22m[2m │ map: 3.95 kB[22m
|
|
789
792
|
[2mdist/[22m[36mlib/ui/uikit/dist/generated/icons-24.js [39m[1m[2m 3.43 kB[22m[1m[22m[2m │ gzip: 1.10 kB[22m[2m │ map: 5.86 kB[22m
|
|
790
793
|
[2mdist/[22m[36mlib/ui/uikit/dist/node_modules/.pnpm/d3-axis@3.0.0/node_modules/d3-axis/src/axis.js [39m[1m[2m 3.49 kB[22m[1m[22m[2m │ gzip: 1.30 kB[22m[2m │ map: 10.47 kB[22m
|
|
@@ -809,6 +812,7 @@ computing gzip size...
|
|
|
809
812
|
[2mdist/[22m[36mnode_modules/.pnpm/semver@7.7.2/node_modules/semver/internal/re.js [39m[1m[2m 4.03 kB[22m[1m[22m[2m │ gzip: 1.23 kB[22m[2m │ map: 12.96 kB[22m
|
|
810
813
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/PlChip/PlChip.vue.js [39m[1m[2m 4.05 kB[22m[1m[22m[2m │ gzip: 1.61 kB[22m[2m │ map: 1.36 kB[22m
|
|
811
814
|
[2mdist/[22m[36mcomponents/PlAnnotations/components/PlAnnotationsModal.vue2.js [39m[1m[2m 4.10 kB[22m[1m[22m[2m │ gzip: 1.41 kB[22m[2m │ map: 5.48 kB[22m
|
|
815
|
+
[2mdist/[22m[36mcomponents/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js [39m[1m[2m 4.20 kB[22m[1m[22m[2m │ gzip: 1.57 kB[22m[2m │ map: 5.00 kB[22m
|
|
812
816
|
[2mdist/[22m[36mlib/ui/uikit/dist/assets/icons/icon-assets-min/24_heatmap.svg.js [39m[1m[2m 4.38 kB[22m[1m[22m[2m │ gzip: 0.99 kB[22m[2m │ map: 4.71 kB[22m
|
|
813
817
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/PlBtnGhost/PlBtnGhost.vue.js [39m[1m[2m 4.39 kB[22m[1m[22m[2m │ gzip: 1.66 kB[22m[2m │ map: 2.39 kB[22m
|
|
814
818
|
[2mdist/[22m[36mlib/ui/uikit/dist/composition/useSortable2.js [39m[1m[2m 4.41 kB[22m[1m[22m[2m │ gzip: 1.51 kB[22m[2m │ map: 13.13 kB[22m
|
|
@@ -880,4 +884,4 @@ computing gzip size...
|
|
|
880
884
|
[2mdist/[22m[36mlib/ui/uikit/dist/index.js [39m[1m[2m497.77 kB[22m[1m[22m[2m │ gzip: 191.75 kB[22m[2m │ map: 0.18 kB[22m
|
|
881
885
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/PlSlideModal/PlPureSlideModal.vue.js [39m[1m[33m600.06 kB[39m[22m[2m │ gzip: 204.69 kB[22m[2m │ map: 0.21 kB[22m
|
|
882
886
|
[2mdist/[22m[36mlib/ui/uikit/dist/components/DataTable/TableComponent.vue.js [39m[1m[33m601.95 kB[39m[22m[2m │ gzip: 205.54 kB[22m[2m │ map: 0.27 kB[22m
|
|
883
|
-
[32m✓ built in
|
|
887
|
+
[32m✓ built in 9.81s[39m
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
WARN Issue while reading "/home/runner/_work/platforma/platforma/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @platforma-sdk/ui-vue@1.42.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.42.19 type-check /home/runner/_work/platforma/platforma/sdk/ui-vue
|
|
4
4
|
> vue-tsc --noEmit --project ./tsconfig.json
|
|
5
5
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(function(){"use strict";try{if(typeof document<"u"){var E=document.createElement("style");E.appendChild(document.createTextNode(".grid-overlay-container{height:calc(100% - 1px);margin-top:1px;width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background-color:var(--bg-base-light)}.grid-icon-sad-cat{background-image:url(data:image/png;base64,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);background-repeat:no-repeat}.grid-overlay-container>div{height:300px;width:300px;background-size:contain;background-position:center}.grid-overlay-container>span{color:var(--txt-mask)}")),document.head.appendChild(E)}}catch(h){console.error("vite-plugin-css-injected-by-js",h)}})();
|
|
2
|
-
import { defineComponent as ue, mergeModels as U, useModel as q, toRefs as de, computed as
|
|
2
|
+
import { defineComponent as ue, mergeModels as U, useModel as q, toRefs as de, computed as M, ref as F, shallowRef as H, watch as R, effectScope as ce, createElementBlock as me, openBlock as I, normalizeClass as Q, createBlock as T, createCommentVNode as z, createVNode as fe, unref as b, isRef as W, withCtx as j, renderSlot as X } from "vue";
|
|
3
3
|
import { isJsonEqual as i, promiseTimeout as ve } from "../../lib/util/helpers/dist/index.js";
|
|
4
|
-
import { createPlSelectionModel as
|
|
4
|
+
import { createPlSelectionModel as $, getRawPlatformaInstance as pe } from "../../sdk/model/dist/index.js";
|
|
5
5
|
import { AgGridVue as Se } from "ag-grid-vue3";
|
|
6
6
|
import { AgGridTheme as ye } from "../../aggrid.js";
|
|
7
7
|
import ge from "../PlAgCsvExporter/PlAgCsvExporter.vue.js";
|
|
@@ -13,13 +13,13 @@ import De from "./PlAgOverlayNoRows.vue.js";
|
|
|
13
13
|
|
|
14
14
|
import Oe from "./PlAgRowCount.vue.js";
|
|
15
15
|
import { DeferredCircular as xe, ensureNodeVisible as Ie } from "./sources/focus-row.js";
|
|
16
|
-
import { PlAgDataTableRowNumberColId as
|
|
16
|
+
import { PlAgDataTableRowNumberColId as Y, autoSizeRowNumberColumn as be } from "./sources/row-number.js";
|
|
17
17
|
import { calculateGridOptions as Pe } from "./sources/table-source-v2.js";
|
|
18
18
|
import { useTableState as ke } from "./sources/table-state-v2.js";
|
|
19
19
|
import "../../lib/ui/uikit/dist/index.js";
|
|
20
20
|
import { watchCached as Te } from "../../lib/ui/uikit/dist/composition/watchCached.js";
|
|
21
|
-
import { parseJson as
|
|
22
|
-
const
|
|
21
|
+
import { parseJson as Z, getAxisId as _, matchAxisId as ee, canonicalizeJson as te } from "../../lib/model/common/dist/index.js";
|
|
22
|
+
const Ye = /* @__PURE__ */ ue({
|
|
23
23
|
__name: "PlAgDataTableV2",
|
|
24
24
|
props: /* @__PURE__ */ U({
|
|
25
25
|
settings: {},
|
|
@@ -41,8 +41,8 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
41
41
|
selectionModifiers: {}
|
|
42
42
|
}),
|
|
43
43
|
emits: /* @__PURE__ */ U(["rowDoubleClicked", "cellButtonClicked", "newDataRendered"], ["update:modelValue", "update:selection"]),
|
|
44
|
-
setup(
|
|
45
|
-
const ae = q(
|
|
44
|
+
setup(G, { expose: le, emit: oe }) {
|
|
45
|
+
const ae = q(G, "modelValue"), o = q(G, "selection"), d = G, { settings: D } = de(d), B = oe, { gridState: O, sheetsState: P, filtersState: k } = ke(ae, D), se = M(() => {
|
|
46
46
|
const e = { ...D.value };
|
|
47
47
|
return e.sourceId !== null ? {
|
|
48
48
|
sheets: e.sheets ?? [],
|
|
@@ -51,7 +51,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
51
51
|
sheets: [],
|
|
52
52
|
cachedState: []
|
|
53
53
|
};
|
|
54
|
-
}), V =
|
|
54
|
+
}), V = F([]), ne = M(() => {
|
|
55
55
|
const e = { ...D.value }, t = V.value;
|
|
56
56
|
return e.sourceId !== null && t.length > 0 ? {
|
|
57
57
|
columns: t,
|
|
@@ -62,7 +62,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
62
62
|
config: () => ({}),
|
|
63
63
|
cachedState: []
|
|
64
64
|
};
|
|
65
|
-
}), c =
|
|
65
|
+
}), c = H(null), x = new xe(), r = H({
|
|
66
66
|
animateRows: !1,
|
|
67
67
|
suppressColumnMoveAnimation: !0,
|
|
68
68
|
cellSelection: !o.value,
|
|
@@ -79,12 +79,12 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
79
79
|
onSelectionChanged: (e) => {
|
|
80
80
|
var t;
|
|
81
81
|
if (o.value) {
|
|
82
|
-
const l = e.api.getServerSideSelectionState(), a = ((t = l == null ? void 0 : l.toggledNodes) == null ? void 0 : t.map((s) =>
|
|
82
|
+
const l = e.api.getServerSideSelectionState(), a = ((t = l == null ? void 0 : l.toggledNodes) == null ? void 0 : t.map((s) => Z(s))) ?? [];
|
|
83
83
|
i(o.value.selectedKeys, a) || (o.value = { ...o.value, selectedKeys: a });
|
|
84
84
|
}
|
|
85
85
|
},
|
|
86
86
|
onRowDoubleClicked: (e) => {
|
|
87
|
-
e.data && e.data.axesKey &&
|
|
87
|
+
e.data && e.data.axesKey && B("rowDoubleClicked", e.data.axesKey);
|
|
88
88
|
},
|
|
89
89
|
defaultColDef: {
|
|
90
90
|
suppressHeaderMenuButton: !0,
|
|
@@ -155,7 +155,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
155
155
|
e.state
|
|
156
156
|
), e.api.autoSizeColumns(
|
|
157
157
|
e.api.getAllDisplayedColumns().filter(
|
|
158
|
-
(t) => t.getColId() !==
|
|
158
|
+
(t) => t.getColId() !== Y
|
|
159
159
|
)
|
|
160
160
|
);
|
|
161
161
|
},
|
|
@@ -172,7 +172,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
172
172
|
columnVisibility: e.columnVisibility
|
|
173
173
|
};
|
|
174
174
|
}
|
|
175
|
-
const E =
|
|
175
|
+
const E = F(0);
|
|
176
176
|
R(
|
|
177
177
|
() => [c.value, O.value],
|
|
178
178
|
([e, t]) => {
|
|
@@ -192,7 +192,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
192
192
|
},
|
|
193
193
|
{ immediate: !0 }
|
|
194
194
|
);
|
|
195
|
-
const re =
|
|
195
|
+
const re = M(() => d.cellRendererSelector ?? null);
|
|
196
196
|
R(
|
|
197
197
|
() => [c.value, re.value],
|
|
198
198
|
([e, t]) => {
|
|
@@ -216,7 +216,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
216
216
|
const a = (h = o.value) == null ? void 0 : h.axesSpec;
|
|
217
217
|
if (!a || a.length !== e.length) return !1;
|
|
218
218
|
const s = e.map((p) => {
|
|
219
|
-
const S =
|
|
219
|
+
const S = _(p);
|
|
220
220
|
return a.findIndex((w) => ee(w, S));
|
|
221
221
|
}), u = new Set(s);
|
|
222
222
|
if (u.has(-1) || u.size !== e.length) return !1;
|
|
@@ -241,7 +241,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
241
241
|
});
|
|
242
242
|
function ie(e) {
|
|
243
243
|
const t = (l) => !("children" in l);
|
|
244
|
-
return e ? e.filter(t).filter((l) => l.colId && l.colId !==
|
|
244
|
+
return e ? e.filter(t).filter((l) => l.colId && l.colId !== Y) : [];
|
|
245
245
|
}
|
|
246
246
|
Te(
|
|
247
247
|
() => r.value.columnDefs,
|
|
@@ -250,14 +250,14 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
250
250
|
V.value = [];
|
|
251
251
|
else {
|
|
252
252
|
const l = ie(e);
|
|
253
|
-
V.value = l.map((a) =>
|
|
253
|
+
V.value = l.map((a) => Z(a.colId).labeled);
|
|
254
254
|
}
|
|
255
255
|
},
|
|
256
256
|
{ immediate: !0 }
|
|
257
257
|
);
|
|
258
|
-
const
|
|
258
|
+
const A = $();
|
|
259
259
|
let v = null;
|
|
260
|
-
const C =
|
|
260
|
+
const C = F(0);
|
|
261
261
|
return R(
|
|
262
262
|
() => [c.value, D.value],
|
|
263
263
|
([e, t]) => {
|
|
@@ -274,7 +274,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
274
274
|
},
|
|
275
275
|
columnDefs: void 0,
|
|
276
276
|
serverSideDatasource: void 0
|
|
277
|
-
}), o.value && (o.value && !i(o.value,
|
|
277
|
+
}), o.value && (o.value && !i(o.value, A) && (o.value = $()), e.setServerSideSelectionState({
|
|
278
278
|
selectAll: !1,
|
|
279
279
|
toggledNodes: []
|
|
280
280
|
}));
|
|
@@ -286,7 +286,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
286
286
|
...r.value.loadingOverlayComponentParams,
|
|
287
287
|
notReady: !1
|
|
288
288
|
}
|
|
289
|
-
}), o.value && (v != null && v.sourceId) && (o.value && !i(o.value,
|
|
289
|
+
}), o.value && (v != null && v.sourceId) && (o.value && !i(o.value, A) && (o.value = $()), e.setServerSideSelectionState({
|
|
290
290
|
selectAll: !1,
|
|
291
291
|
toggledNodes: []
|
|
292
292
|
})));
|
|
@@ -312,7 +312,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
312
312
|
cellButtonAxisParams: {
|
|
313
313
|
showCellButtonForAxisId: d.showCellButtonForAxisId,
|
|
314
314
|
cellButtonInvokeRowsOnDoubleClick: d.cellButtonInvokeRowsOnDoubleClick,
|
|
315
|
-
trigger: (n) =>
|
|
315
|
+
trigger: (n) => B("cellButtonClicked", n)
|
|
316
316
|
}
|
|
317
317
|
}).then((n) => {
|
|
318
318
|
if (e.isDestroyed() || u !== C.value) return;
|
|
@@ -329,7 +329,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
329
329
|
toggledNodes: []
|
|
330
330
|
});
|
|
331
331
|
}
|
|
332
|
-
const S = g.map(
|
|
332
|
+
const S = g.map(_).map((f) => m.findIndex((K) => ee(K, f))), w = new Set(S);
|
|
333
333
|
if (w.has(-1) || w.size !== m.length) {
|
|
334
334
|
const f = { axesSpec: m, selectedKeys: [] };
|
|
335
335
|
return i(o.value, f) || (o.value = f), e.setServerSideSelectionState({
|
|
@@ -337,10 +337,10 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
337
337
|
toggledNodes: []
|
|
338
338
|
});
|
|
339
339
|
}
|
|
340
|
-
const
|
|
340
|
+
const L = p.map((f) => S.map((K) => f[K])), J = { axesSpec: m, selectedKeys: L };
|
|
341
341
|
return i(o.value, J) || (o.value = J), e.setServerSideSelectionState({
|
|
342
342
|
selectAll: !1,
|
|
343
|
-
toggledNodes:
|
|
343
|
+
toggledNodes: L.map((f) => te(f))
|
|
344
344
|
});
|
|
345
345
|
}
|
|
346
346
|
}
|
|
@@ -350,7 +350,7 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
350
350
|
e.isDestroyed() || u !== C.value || e.updateGridOptions({
|
|
351
351
|
loading: !1
|
|
352
352
|
});
|
|
353
|
-
}), x.promise.then(() =>
|
|
353
|
+
}), x.promise.then(() => B("newDataRendered"));
|
|
354
354
|
} catch (s) {
|
|
355
355
|
console.trace(s);
|
|
356
356
|
} finally {
|
|
@@ -379,45 +379,45 @@ const Xe = /* @__PURE__ */ ue({
|
|
|
379
379
|
});
|
|
380
380
|
}
|
|
381
381
|
), (e, t) => (I(), me("div", {
|
|
382
|
-
class:
|
|
382
|
+
class: Q(e.$style.container)
|
|
383
383
|
}, [
|
|
384
384
|
c.value && !e.disableColumnsPanel ? (I(), T(b(Ce), {
|
|
385
385
|
key: 0,
|
|
386
386
|
api: c.value
|
|
387
|
-
}, null, 8, ["api"])) :
|
|
388
|
-
e.disableFiltersPanel ?
|
|
387
|
+
}, null, 8, ["api"])) : z("", !0),
|
|
388
|
+
e.disableFiltersPanel ? z("", !0) : (I(), T(he, {
|
|
389
389
|
key: 1,
|
|
390
390
|
modelValue: b(k),
|
|
391
|
-
"onUpdate:modelValue": t[0] || (t[0] = (l) =>
|
|
391
|
+
"onUpdate:modelValue": t[0] || (t[0] = (l) => W(k) ? k.value = l : null),
|
|
392
392
|
settings: ne.value
|
|
393
393
|
}, null, 8, ["modelValue", "settings"])),
|
|
394
394
|
c.value && e.showExportButton ? (I(), T(ge, {
|
|
395
395
|
key: 2,
|
|
396
396
|
api: c.value
|
|
397
|
-
}, null, 8, ["api"])) :
|
|
397
|
+
}, null, 8, ["api"])) : z("", !0),
|
|
398
398
|
fe(we, {
|
|
399
399
|
modelValue: b(P),
|
|
400
|
-
"onUpdate:modelValue": t[1] || (t[1] = (l) =>
|
|
400
|
+
"onUpdate:modelValue": t[1] || (t[1] = (l) => W(P) ? P.value = l : null),
|
|
401
401
|
settings: se.value
|
|
402
402
|
}, {
|
|
403
|
-
before:
|
|
404
|
-
|
|
403
|
+
before: j(() => [
|
|
404
|
+
X(e.$slots, "before-sheets")
|
|
405
405
|
]),
|
|
406
|
-
after:
|
|
407
|
-
|
|
406
|
+
after: j(() => [
|
|
407
|
+
X(e.$slots, "after-sheets")
|
|
408
408
|
]),
|
|
409
409
|
_: 3
|
|
410
410
|
}, 8, ["modelValue", "settings"]),
|
|
411
411
|
(I(), T(b(Se), {
|
|
412
412
|
key: E.value,
|
|
413
413
|
theme: b(ye),
|
|
414
|
-
class:
|
|
414
|
+
class: Q(e.$style.grid),
|
|
415
415
|
"grid-options": r.value
|
|
416
416
|
}, null, 8, ["theme", "class", "grid-options"]))
|
|
417
417
|
], 2));
|
|
418
418
|
}
|
|
419
419
|
});
|
|
420
420
|
export {
|
|
421
|
-
|
|
421
|
+
Ye as default
|
|
422
422
|
};
|
|
423
423
|
//# sourceMappingURL=PlAgDataTableV2.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlAgGridColumnManager.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PlAgGridColumnManager.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"names":[],"mappings":"AAsHA,OAAO,EAAkD,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAKlG,KAAK,WAAW,GAAG;IACjB;;;;;OAKG;IACH,GAAG,EAAE,OAAO,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;;AA+NF,wBAOG"}
|
|
@@ -1,89 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import "
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import A from "../../lib/ui/uikit/dist/components/PlElementList/PlElementList.vue.js";
|
|
8
|
-
const j = /* @__PURE__ */ b({
|
|
9
|
-
__name: "PlAgGridColumnManager",
|
|
10
|
-
props: {
|
|
11
|
-
api: {},
|
|
12
|
-
width: {}
|
|
13
|
-
},
|
|
14
|
-
setup(p) {
|
|
15
|
-
const f = p, { api: n } = k(f), i = d([]);
|
|
16
|
-
V(
|
|
17
|
-
() => n.value,
|
|
18
|
-
(o) => {
|
|
19
|
-
o.isDestroyed() || (o.addEventListener("displayedColumnsChanged", (t) => {
|
|
20
|
-
i.value = t.api.getAllGridColumns();
|
|
21
|
-
}), i.value = o.getAllGridColumns(), i.value.length > 0 && o.moveColumns(i.value, 0));
|
|
22
|
-
},
|
|
23
|
-
{ immediate: !0 }
|
|
24
|
-
);
|
|
25
|
-
const c = w(() => i.value.map((o) => ({
|
|
26
|
-
column: o,
|
|
27
|
-
id: o.getId(),
|
|
28
|
-
label: o.getColDef().headerName
|
|
29
|
-
}))), s = d(!1), u = G("PlAgGridColumnManager");
|
|
30
|
-
return (o, t) => (g(), y("div", null, [
|
|
31
|
-
l(u) ? (g(), D(P, {
|
|
32
|
-
key: 0,
|
|
33
|
-
to: l(u)
|
|
34
|
-
}, [
|
|
35
|
-
r(l(h), {
|
|
36
|
-
icon: "columns",
|
|
37
|
-
onClick: t[0] || (t[0] = M((e) => s.value = !s.value, ["stop"]))
|
|
38
|
-
}, {
|
|
39
|
-
default: a(() => t[2] || (t[2] = [
|
|
40
|
-
m(" Columns ")
|
|
41
|
-
])),
|
|
42
|
-
_: 1
|
|
43
|
-
})
|
|
44
|
-
], 8, ["to"])) : T("", !0),
|
|
45
|
-
r(l(x), {
|
|
46
|
-
modelValue: s.value,
|
|
47
|
-
"onUpdate:modelValue": t[1] || (t[1] = (e) => s.value = e),
|
|
48
|
-
width: o.width,
|
|
49
|
-
"close-on-outside-click": ""
|
|
50
|
-
}, {
|
|
51
|
-
title: a(() => t[3] || (t[3] = [
|
|
52
|
-
m("Manage Columns")
|
|
53
|
-
])),
|
|
54
|
-
default: a(() => [
|
|
55
|
-
r(l(A), {
|
|
56
|
-
items: c.value,
|
|
57
|
-
"get-item-key": (e) => e.id,
|
|
58
|
-
"is-draggable": (e) => !e.column.getColDef().lockPosition,
|
|
59
|
-
"on-sort": (e, v) => {
|
|
60
|
-
if (!l(n).isDestroyed()) {
|
|
61
|
-
const C = i.value[e];
|
|
62
|
-
l(n).moveColumns([C], v);
|
|
63
|
-
}
|
|
64
|
-
return !0;
|
|
65
|
-
},
|
|
66
|
-
"on-toggle": (e) => {
|
|
67
|
-
l(n).isDestroyed() || l(n).setColumnsVisible([e.column], !e.column.isVisible());
|
|
68
|
-
},
|
|
69
|
-
"is-toggled": (e) => !e.column.isVisible(),
|
|
70
|
-
"is-toggable": (e) => e.id !== l(B),
|
|
71
|
-
"is-pinned": (e) => !!e.column.getColDef().lockPosition,
|
|
72
|
-
"is-pinnable": () => !1,
|
|
73
|
-
"disable-removing": ""
|
|
74
|
-
}, {
|
|
75
|
-
"item-title": a(({ item: e }) => [
|
|
76
|
-
m(N(e.label), 1)
|
|
77
|
-
]),
|
|
78
|
-
_: 1
|
|
79
|
-
}, 8, ["items", "get-item-key", "is-draggable", "on-sort", "on-toggle", "is-toggled", "is-toggable", "is-pinned"])
|
|
80
|
-
]),
|
|
81
|
-
_: 1
|
|
82
|
-
}, 8, ["modelValue", "width"])
|
|
83
|
-
]));
|
|
84
|
-
}
|
|
85
|
-
});
|
|
1
|
+
import o from "./PlAgGridColumnManager.vue2.js";
|
|
2
|
+
import s from "./PlAgGridColumnManager.vue3.js";
|
|
3
|
+
import r from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
+
const t = {
|
|
5
|
+
$style: s
|
|
6
|
+
}, c = /* @__PURE__ */ r(o, [["__cssModules", t]]);
|
|
86
7
|
export {
|
|
87
|
-
|
|
8
|
+
c as default
|
|
88
9
|
};
|
|
89
10
|
//# sourceMappingURL=PlAgGridColumnManager.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlAgGridColumnManager.vue.js","sources":[
|
|
1
|
+
{"version":3,"file":"PlAgGridColumnManager.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -1,5 +1,106 @@
|
|
|
1
|
-
import f from "
|
|
1
|
+
import { defineComponent as w, toRefs as D, ref as p, watch as T, computed as P, createElementBlock as f, openBlock as m, createBlock as M, createCommentVNode as N, createVNode as u, unref as t, Teleport as h, withModifiers as B, withCtx as d, createTextVNode as v, createElementVNode as G, Fragment as I, renderList as A, normalizeClass as E, toDisplayString as R } from "vue";
|
|
2
|
+
import "../../lib/ui/uikit/dist/index.js";
|
|
3
|
+
import { PlAgDataTableRowNumberColId as $ } from "../PlAgDataTable/sources/row-number.js";
|
|
4
|
+
import { useFilteredItems as q } from "./useFilteredItems.js";
|
|
5
|
+
import { usePlBlockPageTitleTeleportTarget as x } from "../../lib/ui/uikit/dist/layout/PlBlockPage/usePlBlockPageTitleTeleportTarget.js";
|
|
6
|
+
import F from "../../lib/ui/uikit/dist/components/PlBtnGhost/PlBtnGhost.vue.js";
|
|
7
|
+
import L from "../../lib/ui/uikit/dist/components/PlSlideModal/PlSlideModal.vue.js";
|
|
8
|
+
import S from "../../lib/ui/uikit/dist/components/PlSearchField/PlSearchField.vue.js";
|
|
9
|
+
import U from "../../lib/ui/uikit/dist/components/PlElementList/PlElementList.vue.js";
|
|
10
|
+
const Y = /* @__PURE__ */ w({
|
|
11
|
+
__name: "PlAgGridColumnManager",
|
|
12
|
+
props: {
|
|
13
|
+
api: {},
|
|
14
|
+
width: {}
|
|
15
|
+
},
|
|
16
|
+
setup(C) {
|
|
17
|
+
const b = C, { api: n } = D(b), i = p([]);
|
|
18
|
+
T(
|
|
19
|
+
() => n.value,
|
|
20
|
+
(l) => {
|
|
21
|
+
l.isDestroyed() || (l.addEventListener("displayedColumnsChanged", (o) => {
|
|
22
|
+
i.value = o.api.getAllGridColumns();
|
|
23
|
+
}), i.value = l.getAllGridColumns(), i.value.length > 0 && l.moveColumns(i.value, 0));
|
|
24
|
+
},
|
|
25
|
+
{ immediate: !0 }
|
|
26
|
+
);
|
|
27
|
+
const V = P(() => i.value.map((l) => ({
|
|
28
|
+
column: l,
|
|
29
|
+
id: l.getId(),
|
|
30
|
+
label: l.getColDef().headerName
|
|
31
|
+
}))), s = p(""), a = p(!1), c = x("PlAgGridColumnManager"), { filteredItems: k, segments: y } = q(() => ({
|
|
32
|
+
items: V.value,
|
|
33
|
+
query: s.value,
|
|
34
|
+
getStrings: (l) => [l.label]
|
|
35
|
+
}));
|
|
36
|
+
return (l, o) => (m(), f("div", null, [
|
|
37
|
+
t(c) ? (m(), M(h, {
|
|
38
|
+
key: 0,
|
|
39
|
+
to: t(c)
|
|
40
|
+
}, [
|
|
41
|
+
u(t(F), {
|
|
42
|
+
icon: "columns",
|
|
43
|
+
onClick: o[0] || (o[0] = B((e) => a.value = !a.value, ["stop"]))
|
|
44
|
+
}, {
|
|
45
|
+
default: d(() => o[3] || (o[3] = [
|
|
46
|
+
v(" Columns ")
|
|
47
|
+
])),
|
|
48
|
+
_: 1
|
|
49
|
+
})
|
|
50
|
+
], 8, ["to"])) : N("", !0),
|
|
51
|
+
u(t(L), {
|
|
52
|
+
modelValue: a.value,
|
|
53
|
+
"onUpdate:modelValue": o[2] || (o[2] = (e) => a.value = e),
|
|
54
|
+
width: l.width,
|
|
55
|
+
"close-on-outside-click": ""
|
|
56
|
+
}, {
|
|
57
|
+
title: d(() => o[4] || (o[4] = [
|
|
58
|
+
v("Manage Columns")
|
|
59
|
+
])),
|
|
60
|
+
default: d(() => [
|
|
61
|
+
u(t(S), {
|
|
62
|
+
modelValue: s.value,
|
|
63
|
+
"onUpdate:modelValue": o[1] || (o[1] = (e) => s.value = e),
|
|
64
|
+
clearable: ""
|
|
65
|
+
}, null, 8, ["modelValue"]),
|
|
66
|
+
u(t(U), {
|
|
67
|
+
items: t(k),
|
|
68
|
+
"get-item-key": (e) => e.id,
|
|
69
|
+
"is-draggable": (e) => !e.column.getColDef().lockPosition,
|
|
70
|
+
"on-sort": (e, r) => {
|
|
71
|
+
if (!t(n).isDestroyed()) {
|
|
72
|
+
const g = i.value[e];
|
|
73
|
+
t(n).moveColumns([g], r);
|
|
74
|
+
}
|
|
75
|
+
return !0;
|
|
76
|
+
},
|
|
77
|
+
"on-toggle": (e) => {
|
|
78
|
+
t(n).isDestroyed() || t(n).setColumnsVisible([e.column], !e.column.isVisible());
|
|
79
|
+
},
|
|
80
|
+
"is-toggled": (e) => !e.column.isVisible(),
|
|
81
|
+
"is-toggable": (e) => e.id !== t($),
|
|
82
|
+
"is-pinned": (e) => !!e.column.getColDef().lockPosition,
|
|
83
|
+
"is-pinnable": () => !1,
|
|
84
|
+
"disable-dragging": s.value.length > 0,
|
|
85
|
+
"disable-removing": ""
|
|
86
|
+
}, {
|
|
87
|
+
"item-title": d(({ item: e }) => [
|
|
88
|
+
G("span", null, [
|
|
89
|
+
(m(!0), f(I, null, A(t(y).get(e.label), (r, g) => (m(), f("span", {
|
|
90
|
+
key: g,
|
|
91
|
+
class: E({ [l.$style.match]: r.match })
|
|
92
|
+
}, R(r.value), 3))), 128))
|
|
93
|
+
])
|
|
94
|
+
]),
|
|
95
|
+
_: 1
|
|
96
|
+
}, 8, ["items", "get-item-key", "is-draggable", "on-sort", "on-toggle", "is-toggled", "is-toggable", "is-pinned", "disable-dragging"])
|
|
97
|
+
]),
|
|
98
|
+
_: 1
|
|
99
|
+
}, 8, ["modelValue", "width"])
|
|
100
|
+
]));
|
|
101
|
+
}
|
|
102
|
+
});
|
|
2
103
|
export {
|
|
3
|
-
|
|
104
|
+
Y as default
|
|
4
105
|
};
|
|
5
106
|
//# sourceMappingURL=PlAgGridColumnManager.vue2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlAgGridColumnManager.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"PlAgGridColumnManager.vue2.js","sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlBtnGhost, PlElementList, PlSearchField, PlSlideModal, usePlBlockPageTitleTeleportTarget } from '@milaboratories/uikit';\nimport { type Column, type DisplayedColumnsChangedEvent, type GridApi } from 'ag-grid-enterprise';\nimport { computed, ref, toRefs, watch } from 'vue';\nimport { PlAgDataTableRowNumberColId } from '../PlAgDataTable/sources/row-number';\nimport { useFilteredItems } from './useFilteredItems';\n\nconst props = defineProps<{\n /**\n * The GridApi is an API interface provided by the table/grid component\n * for interacting programmatically with the grid's features and functionality.\n * It allows you to control and manipulate grid behavior, access data, and\n * trigger specific actions.\n */\n api: GridApi;\n /**\n * Css Column Manager (Panel) modal width (default value is `368px`)\n */\n width?: string;\n}>();\n\nconst { api: gridApi } = toRefs(props);\n\nconst columns = ref<Column[]>([]);\nwatch(\n () => gridApi.value,\n (gridApi) => {\n if (gridApi.isDestroyed()) return;\n\n gridApi.addEventListener('displayedColumnsChanged', (event: DisplayedColumnsChangedEvent) => {\n columns.value = event.api.getAllGridColumns();\n });\n\n columns.value = gridApi.getAllGridColumns();\n if (columns.value.length > 0) {\n gridApi.moveColumns(columns.value, 0);\n }\n },\n { immediate: true },\n);\n\nconst items = computed(() => {\n return columns.value.map((col) => ({\n column: col,\n id: col.getId(),\n label: col.getColDef().headerName!,\n }));\n});\n\nconst query = ref('');\n\nconst slideModal = ref(false);\nconst teleportTarget = usePlBlockPageTitleTeleportTarget('PlAgGridColumnManager');\n\nconst { filteredItems, segments } = useFilteredItems(() => ({\n items: items.value,\n query: query.value,\n getStrings: (item) => [item.label],\n}));\n</script>\n\n<template>\n <div>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost icon=\"columns\" @click.stop=\"slideModal = !slideModal\">\n Columns\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"slideModal\" :width=\"width\" close-on-outside-click>\n <template #title>Manage Columns</template>\n <PlSearchField v-model=\"query\" clearable />\n <PlElementList\n :items=\"filteredItems\"\n :get-item-key=\"(item) => item.id\"\n :is-draggable=\"(item) => !item.column.getColDef().lockPosition\"\n :on-sort=\"(fromIndex, toIndex) => {\n if (!gridApi.isDestroyed()) {\n const columnToMove = columns[fromIndex];\n gridApi.moveColumns([columnToMove], toIndex);\n }\n return true; // Let PlElementList handle the visual update\n }\"\n :on-toggle=\"(item) => {\n if (!gridApi.isDestroyed()) {\n gridApi.setColumnsVisible([item.column], !item.column.isVisible());\n }\n }\"\n :is-toggled=\"(item) => !item.column.isVisible()\"\n :is-toggable=\"(item) => item.id !== PlAgDataTableRowNumberColId\"\n :is-pinned=\"(item) => !!item.column.getColDef().lockPosition\"\n :is-pinnable=\"() => false\"\n :disable-dragging=\"query.length > 0\"\n disable-removing\n >\n <template #item-title=\"{ item }\">\n <span>\n <span\n v-for=\"(segment, i) of segments.get(item.label)\"\n :key=\"i\"\n :class=\"{ [$style.match]: segment.match }\"\n >{{ segment.value }}</span>\n </span>\n </template>\n </PlElementList>\n </PlSlideModal>\n </div>\n</template>\n\n<style module>\n.match {\n background-color: var(--color-active-select);\n border-radius: 2px;\n}\n</style>\n"],"names":["props","__props","gridApi","toRefs","columns","ref","watch","event","items","computed","col","query","slideModal","teleportTarget","usePlBlockPageTitleTeleportTarget","filteredItems","segments","useFilteredItems","item"],"mappings":";;;;;;;;;;;;;;;;AAOA,UAAMA,IAAQC,GAcR,EAAE,KAAKC,MAAYC,EAAOH,CAAK,GAE/BI,IAAUC,EAAc,EAAE;AAChC,IAAAC;AAAA,MACE,MAAMJ,EAAQ;AAAA,MACd,CAACA,MAAY;AACPA,QAAAA,EAAQ,kBAEZA,EAAQ,iBAAiB,2BAA2B,CAACK,MAAwC;AACnF,UAAAH,EAAA,QAAQG,EAAM,IAAI,kBAAkB;AAAA,QAAA,CAC7C,GAEOH,EAAA,QAAQF,EAAQ,kBAAkB,GACtCE,EAAQ,MAAM,SAAS,KACzBF,EAAQ,YAAYE,EAAQ,OAAO,CAAC;AAAA,MAExC;AAAA,MACA,EAAE,WAAW,GAAK;AAAA,IACpB;AAEM,UAAAI,IAAQC,EAAS,MACdL,EAAQ,MAAM,IAAI,CAACM,OAAS;AAAA,MACjC,QAAQA;AAAA,MACR,IAAIA,EAAI,MAAM;AAAA,MACd,OAAOA,EAAI,YAAY;AAAA,IAAA,EACvB,CACH,GAEKC,IAAQN,EAAI,EAAE,GAEdO,IAAaP,EAAI,EAAK,GACtBQ,IAAiBC,EAAkC,uBAAuB,GAE1E,EAAE,eAAAC,GAAe,UAAAC,EAAS,IAAIC,EAAiB,OAAO;AAAA,MAC1D,OAAOT,EAAM;AAAA,MACb,OAAOG,EAAM;AAAA,MACb,YAAY,CAACO,MAAS,CAACA,EAAK,KAAK;AAAA,IAAA,EACjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._match_pckgk_2{background-color:var(--color-active-select);border-radius:2px}")),document.head.appendChild(e)}}catch(c){console.error("vite-plugin-css-injected-by-js",c)}})();
|
|
2
|
+
const t = "_match_pckgk_2", c = {
|
|
3
|
+
match: t
|
|
4
|
+
};
|
|
5
|
+
export {
|
|
6
|
+
c as default,
|
|
7
|
+
t as match
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=PlAgGridColumnManager.vue3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlAgGridColumnManager.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MaybeRefOrGetter } from 'vue';
|
|
2
|
+
export declare function useFilteredItems<T>(props: MaybeRefOrGetter<{
|
|
3
|
+
items: T[];
|
|
4
|
+
query: string;
|
|
5
|
+
getStrings: (item: T) => Iterable<string>;
|
|
6
|
+
}>): {
|
|
7
|
+
filteredItems: import('vue').ComputedRef<T[]>;
|
|
8
|
+
segments: import('vue').ComputedRef<Map<string, StringSegment[]>>;
|
|
9
|
+
};
|
|
10
|
+
type StringSegment = {
|
|
11
|
+
value: string;
|
|
12
|
+
match: boolean;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=useFilteredItems.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFilteredItems.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgGridColumnManager/useFilteredItems.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,gBAAgB,EAAW,MAAM,KAAK,CAAC;AAE/D,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,KAAK,EAAE,gBAAgB,CAAC;IACtB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC3C,CAAC;;;EA0BH;AA+BD,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { computed as m, toValue as g } from "vue";
|
|
2
|
+
function d(t) {
|
|
3
|
+
const o = m(() => {
|
|
4
|
+
const { items: f, query: u, getStrings: r } = g(t), s = [], e = /* @__PURE__ */ new Map();
|
|
5
|
+
for (const l of f) {
|
|
6
|
+
let n = !1;
|
|
7
|
+
for (const c of r(l)) {
|
|
8
|
+
let i = e.get(c);
|
|
9
|
+
i || (i = p(c, u), e.set(c, i)), !n && (!u || i.some(({ match: a }) => a)) && (s.push(l), n = !0);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return { filteredItems: s, segments: e };
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
filteredItems: m(() => o.value.filteredItems),
|
|
16
|
+
segments: m(() => o.value.segments)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function p(t, o) {
|
|
20
|
+
if (!o) return [{ value: t, match: !1 }];
|
|
21
|
+
const f = t.toLowerCase(), u = o.toLowerCase(), r = [];
|
|
22
|
+
let s = 0;
|
|
23
|
+
for (; ; ) {
|
|
24
|
+
const e = f.indexOf(u, s), l = e + o.length;
|
|
25
|
+
if (e < 0) break;
|
|
26
|
+
s !== e && r.push({ value: t.slice(s, e), match: !1 });
|
|
27
|
+
const n = r.at(-1);
|
|
28
|
+
n != null && n.match ? n.value += t.slice(e, l) : r.push({ value: t.slice(e, l), match: !0 }), s = l;
|
|
29
|
+
}
|
|
30
|
+
return s < t.length && r.push({ value: t.slice(s), match: !1 }), r;
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
d as useFilteredItems
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=useFilteredItems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFilteredItems.js","sources":["../../../src/components/PlAgGridColumnManager/useFilteredItems.ts"],"sourcesContent":["import { computed, type MaybeRefOrGetter, toValue } from 'vue';\n\nexport function useFilteredItems<T>(\n props: MaybeRefOrGetter<{\n items: T[];\n query: string;\n getStrings: (item: T) => Iterable<string>;\n }>,\n) {\n const result = computed(() => {\n const { items, query, getStrings } = toValue(props);\n const filteredItems: T[] = [];\n const segments = new Map<string, StringSegment[]>();\n for (const item of items) {\n let kept = false;\n for (const string of getStrings(item)) {\n let stringSegments = segments.get(string);\n if (!stringSegments) {\n stringSegments = matchSubstrings(string, query);\n segments.set(string, stringSegments);\n }\n if (!kept && (!query || stringSegments.some(({ match }) => match))) {\n filteredItems.push(item);\n kept = true;\n }\n }\n }\n return { filteredItems, segments };\n });\n return {\n filteredItems: computed(() => result.value.filteredItems),\n segments: computed(() => result.value.segments),\n };\n}\n\n// Very naïve implementation of substring matching, doesn't handle Unicode well\n// Maybe one day we'll have nice things: https://github.com/tc39/ecma402/issues/506\nfunction matchSubstrings(haystack: string, needle: string): StringSegment[] {\n if (!needle) return [{ value: haystack, match: false }];\n const haystackLower = haystack.toLowerCase();\n const needleLower = needle.toLowerCase();\n const result: StringSegment[] = [];\n let prevEnd = 0;\n while (true) {\n const start = haystackLower.indexOf(needleLower, prevEnd);\n const end = start + needle.length;\n if (start < 0) break;\n if (prevEnd !== start) {\n result.push({ value: haystack.slice(prevEnd, start), match: false });\n }\n const prevSegment = result.at(-1);\n if (prevSegment?.match) {\n prevSegment.value += haystack.slice(start, end);\n } else {\n result.push({ value: haystack.slice(start, end), match: true });\n }\n prevEnd = end;\n }\n if (prevEnd < haystack.length) {\n result.push({ value: haystack.slice(prevEnd), match: false });\n }\n return result;\n}\n\ntype StringSegment = {\n value: string;\n match: boolean;\n};\n"],"names":["useFilteredItems","props","result","computed","items","query","getStrings","toValue","filteredItems","segments","item","kept","string","stringSegments","matchSubstrings","match","haystack","needle","haystackLower","needleLower","prevEnd","start","end","prevSegment"],"mappings":";AAEO,SAASA,EACdC,GAKA;AACM,QAAAC,IAASC,EAAS,MAAM;AAC5B,UAAM,EAAE,OAAAC,GAAO,OAAAC,GAAO,YAAAC,EAAW,IAAIC,EAAQN,CAAK,GAC5CO,IAAqB,CAAC,GACtBC,wBAAe,IAA6B;AAClD,eAAWC,KAAQN,GAAO;AACxB,UAAIO,IAAO;AACA,iBAAAC,KAAUN,EAAWI,CAAI,GAAG;AACjC,YAAAG,IAAiBJ,EAAS,IAAIG,CAAM;AACxC,QAAKC,MACcA,IAAAC,EAAgBF,GAAQP,CAAK,GACrCI,EAAA,IAAIG,GAAQC,CAAc,IAEjC,CAACF,MAAS,CAACN,KAASQ,EAAe,KAAK,CAAC,EAAE,OAAAE,EAAA,MAAYA,CAAK,OAC9DP,EAAc,KAAKE,CAAI,GAChBC,IAAA;AAAA,MACT;AAAA,IACF;AAEK,WAAA,EAAE,eAAAH,GAAe,UAAAC,EAAS;AAAA,EAAA,CAClC;AACM,SAAA;AAAA,IACL,eAAeN,EAAS,MAAMD,EAAO,MAAM,aAAa;AAAA,IACxD,UAAUC,EAAS,MAAMD,EAAO,MAAM,QAAQ;AAAA,EAChD;AACF;AAIA,SAASY,EAAgBE,GAAkBC,GAAiC;AACtE,MAAA,CAACA,EAAe,QAAA,CAAC,EAAE,OAAOD,GAAU,OAAO,IAAO;AAChD,QAAAE,IAAgBF,EAAS,YAAY,GACrCG,IAAcF,EAAO,YAAY,GACjCf,IAA0B,CAAC;AACjC,MAAIkB,IAAU;AACd,aAAa;AACX,UAAMC,IAAQH,EAAc,QAAQC,GAAaC,CAAO,GAClDE,IAAMD,IAAQJ,EAAO;AAC3B,QAAII,IAAQ,EAAG;AACf,IAAID,MAAYC,KACPnB,EAAA,KAAK,EAAE,OAAOc,EAAS,MAAMI,GAASC,CAAK,GAAG,OAAO,IAAO;AAE/D,UAAAE,IAAcrB,EAAO,GAAG,EAAE;AAChC,IAAIqB,KAAA,QAAAA,EAAa,QACfA,EAAY,SAASP,EAAS,MAAMK,GAAOC,CAAG,IAEvCpB,EAAA,KAAK,EAAE,OAAOc,EAAS,MAAMK,GAAOC,CAAG,GAAG,OAAO,IAAM,GAEtDF,IAAAE;AAAA,EAAA;AAER,SAAAF,IAAUJ,EAAS,UACdd,EAAA,KAAK,EAAE,OAAOc,EAAS,MAAMI,CAAO,GAAG,OAAO,IAAO,GAEvDlB;AACT;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/ui-vue",
|
|
3
|
-
"version": "1.42.
|
|
3
|
+
"version": "1.42.19",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/lib.js",
|
|
6
6
|
"styles": "dist/lib.js",
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
"yarpm": "^1.2.0",
|
|
44
44
|
"fast-json-patch": "^3.1.1",
|
|
45
45
|
"@faker-js/faker": "^9.2.0",
|
|
46
|
-
"@milaboratories/ts-configs": "1.0.5",
|
|
47
|
-
"@milaboratories/eslint-config": "^1.0.4",
|
|
48
46
|
"@milaboratories/build-configs": "1.0.5",
|
|
49
|
-
"@milaboratories/
|
|
47
|
+
"@milaboratories/ts-configs": "1.0.5",
|
|
48
|
+
"@milaboratories/helpers": "^1.6.19",
|
|
49
|
+
"@milaboratories/eslint-config": "^1.0.4"
|
|
50
50
|
},
|
|
51
51
|
"scripts": {
|
|
52
52
|
"test": "vitest run --passWithNoTests",
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
+
import { PlBtnGhost, PlElementList, PlSearchField, PlSlideModal, usePlBlockPageTitleTeleportTarget } from '@milaboratories/uikit';
|
|
2
3
|
import { type Column, type DisplayedColumnsChangedEvent, type GridApi } from 'ag-grid-enterprise';
|
|
3
|
-
import {
|
|
4
|
-
import { ref, toRefs, watch, computed } from 'vue';
|
|
4
|
+
import { computed, ref, toRefs, watch } from 'vue';
|
|
5
5
|
import { PlAgDataTableRowNumberColId } from '../PlAgDataTable/sources/row-number';
|
|
6
|
+
import { useFilteredItems } from './useFilteredItems';
|
|
6
7
|
|
|
7
8
|
const props = defineProps<{
|
|
8
9
|
/**
|
|
@@ -46,8 +47,16 @@ const items = computed(() => {
|
|
|
46
47
|
}));
|
|
47
48
|
});
|
|
48
49
|
|
|
50
|
+
const query = ref('');
|
|
51
|
+
|
|
49
52
|
const slideModal = ref(false);
|
|
50
53
|
const teleportTarget = usePlBlockPageTitleTeleportTarget('PlAgGridColumnManager');
|
|
54
|
+
|
|
55
|
+
const { filteredItems, segments } = useFilteredItems(() => ({
|
|
56
|
+
items: items.value,
|
|
57
|
+
query: query.value,
|
|
58
|
+
getStrings: (item) => [item.label],
|
|
59
|
+
}));
|
|
51
60
|
</script>
|
|
52
61
|
|
|
53
62
|
<template>
|
|
@@ -60,8 +69,9 @@ const teleportTarget = usePlBlockPageTitleTeleportTarget('PlAgGridColumnManager'
|
|
|
60
69
|
|
|
61
70
|
<PlSlideModal v-model="slideModal" :width="width" close-on-outside-click>
|
|
62
71
|
<template #title>Manage Columns</template>
|
|
72
|
+
<PlSearchField v-model="query" clearable />
|
|
63
73
|
<PlElementList
|
|
64
|
-
:items="
|
|
74
|
+
:items="filteredItems"
|
|
65
75
|
:get-item-key="(item) => item.id"
|
|
66
76
|
:is-draggable="(item) => !item.column.getColDef().lockPosition"
|
|
67
77
|
:on-sort="(fromIndex, toIndex) => {
|
|
@@ -80,12 +90,26 @@ const teleportTarget = usePlBlockPageTitleTeleportTarget('PlAgGridColumnManager'
|
|
|
80
90
|
:is-toggable="(item) => item.id !== PlAgDataTableRowNumberColId"
|
|
81
91
|
:is-pinned="(item) => !!item.column.getColDef().lockPosition"
|
|
82
92
|
:is-pinnable="() => false"
|
|
93
|
+
:disable-dragging="query.length > 0"
|
|
83
94
|
disable-removing
|
|
84
95
|
>
|
|
85
96
|
<template #item-title="{ item }">
|
|
86
|
-
|
|
97
|
+
<span>
|
|
98
|
+
<span
|
|
99
|
+
v-for="(segment, i) of segments.get(item.label)"
|
|
100
|
+
:key="i"
|
|
101
|
+
:class="{ [$style.match]: segment.match }"
|
|
102
|
+
>{{ segment.value }}</span>
|
|
103
|
+
</span>
|
|
87
104
|
</template>
|
|
88
105
|
</PlElementList>
|
|
89
106
|
</PlSlideModal>
|
|
90
107
|
</div>
|
|
91
108
|
</template>
|
|
109
|
+
|
|
110
|
+
<style module>
|
|
111
|
+
.match {
|
|
112
|
+
background-color: var(--color-active-select);
|
|
113
|
+
border-radius: 2px;
|
|
114
|
+
}
|
|
115
|
+
</style>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { computed, type MaybeRefOrGetter, toValue } from 'vue';
|
|
2
|
+
|
|
3
|
+
export function useFilteredItems<T>(
|
|
4
|
+
props: MaybeRefOrGetter<{
|
|
5
|
+
items: T[];
|
|
6
|
+
query: string;
|
|
7
|
+
getStrings: (item: T) => Iterable<string>;
|
|
8
|
+
}>,
|
|
9
|
+
) {
|
|
10
|
+
const result = computed(() => {
|
|
11
|
+
const { items, query, getStrings } = toValue(props);
|
|
12
|
+
const filteredItems: T[] = [];
|
|
13
|
+
const segments = new Map<string, StringSegment[]>();
|
|
14
|
+
for (const item of items) {
|
|
15
|
+
let kept = false;
|
|
16
|
+
for (const string of getStrings(item)) {
|
|
17
|
+
let stringSegments = segments.get(string);
|
|
18
|
+
if (!stringSegments) {
|
|
19
|
+
stringSegments = matchSubstrings(string, query);
|
|
20
|
+
segments.set(string, stringSegments);
|
|
21
|
+
}
|
|
22
|
+
if (!kept && (!query || stringSegments.some(({ match }) => match))) {
|
|
23
|
+
filteredItems.push(item);
|
|
24
|
+
kept = true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { filteredItems, segments };
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
filteredItems: computed(() => result.value.filteredItems),
|
|
32
|
+
segments: computed(() => result.value.segments),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Very naïve implementation of substring matching, doesn't handle Unicode well
|
|
37
|
+
// Maybe one day we'll have nice things: https://github.com/tc39/ecma402/issues/506
|
|
38
|
+
function matchSubstrings(haystack: string, needle: string): StringSegment[] {
|
|
39
|
+
if (!needle) return [{ value: haystack, match: false }];
|
|
40
|
+
const haystackLower = haystack.toLowerCase();
|
|
41
|
+
const needleLower = needle.toLowerCase();
|
|
42
|
+
const result: StringSegment[] = [];
|
|
43
|
+
let prevEnd = 0;
|
|
44
|
+
while (true) {
|
|
45
|
+
const start = haystackLower.indexOf(needleLower, prevEnd);
|
|
46
|
+
const end = start + needle.length;
|
|
47
|
+
if (start < 0) break;
|
|
48
|
+
if (prevEnd !== start) {
|
|
49
|
+
result.push({ value: haystack.slice(prevEnd, start), match: false });
|
|
50
|
+
}
|
|
51
|
+
const prevSegment = result.at(-1);
|
|
52
|
+
if (prevSegment?.match) {
|
|
53
|
+
prevSegment.value += haystack.slice(start, end);
|
|
54
|
+
} else {
|
|
55
|
+
result.push({ value: haystack.slice(start, end), match: true });
|
|
56
|
+
}
|
|
57
|
+
prevEnd = end;
|
|
58
|
+
}
|
|
59
|
+
if (prevEnd < haystack.length) {
|
|
60
|
+
result.push({ value: haystack.slice(prevEnd), match: false });
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
type StringSegment = {
|
|
66
|
+
value: string;
|
|
67
|
+
match: boolean;
|
|
68
|
+
};
|