@platforma-sdk/ui-vue 1.63.12 → 1.64.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/.turbo/turbo-build.log +24 -18
  2. package/.turbo/turbo-formatter$colon$check.log +2 -2
  3. package/.turbo/turbo-linter$colon$check.log +2 -2
  4. package/.turbo/turbo-types$colon$check.log +1 -1
  5. package/CHANGELOG.md +12 -0
  6. package/dist/components/PlAgDataTable/PlAgDataTableV2.js.map +1 -1
  7. package/dist/components/PlAgDataTable/PlAgDataTableV2.style.js.map +1 -1
  8. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts.map +1 -1
  9. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +1 -1
  10. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  11. package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js +3 -3
  12. package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js.map +1 -1
  13. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
  14. package/dist/components/PlAgDataTable/sources/table-source-v2.js +124 -90
  15. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  16. package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts.map +1 -1
  17. package/dist/components/PlAgDataTable/sources/table-state-v2.js +1 -1
  18. package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
  19. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.js.map +1 -1
  20. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.style.js.map +1 -1
  21. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue.d.ts.map +1 -1
  22. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js +37 -42
  23. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js.map +1 -1
  24. package/dist/components/PlAgGridColumnManager/useFilteredItems.d.ts +5 -5
  25. package/dist/components/PlAgGridColumnManager/useFilteredItems.d.ts.map +1 -1
  26. package/dist/components/PlAgGridColumnManager/useFilteredItems.js +2 -2
  27. package/dist/components/PlAgGridColumnManager/useFilteredItems.js.map +1 -1
  28. package/dist/components/PlAgGridColumnManager/useGridColumns.js +14 -0
  29. package/dist/components/PlAgGridColumnManager/useGridColumns.js.map +1 -0
  30. package/dist/components/PlTableFilters/PlTableFiltersV2.js.map +1 -1
  31. package/dist/components/PlTableFilters/PlTableFiltersV2.style.js.map +1 -1
  32. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts.map +1 -1
  33. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +2 -8
  34. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
  35. package/package.json +5 -5
  36. package/src/components/PlAgDataTable/PlAgDataTableV2.vue +2 -1
  37. package/src/components/PlAgDataTable/compositions/useFilterableColumns.ts +4 -4
  38. package/src/components/PlAgDataTable/sources/table-source-v2.ts +224 -126
  39. package/src/components/PlAgDataTable/sources/table-state-v2.ts +4 -10
  40. package/src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue +17 -35
  41. package/src/components/PlAgGridColumnManager/useFilteredItems.ts +9 -11
  42. package/src/components/PlAgGridColumnManager/useGridColumns.ts +26 -0
  43. package/src/components/PlTableFilters/PlTableFiltersV2.vue +2 -6
@@ -1,75 +1,70 @@
1
1
  import { PlAgDataTableRowNumberColId as e } from "../PlAgDataTable/sources/row-number.js";
2
2
  import { useFilteredItems as t } from "./useFilteredItems.js";
3
- import { Fragment as n, Teleport as r, computed as i, createBlock as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createTextVNode as l, createVNode as u, defineComponent as d, normalizeClass as f, openBlock as p, ref as m, renderList as h, toDisplayString as g, toRefs as _, unref as v, watch as y, withCtx as b, withModifiers as x } from "vue";
4
- import { PlBtnGhost as S, PlElementList as C, PlSearchField as w, PlSlideModal as T, usePlBlockPageTitleTeleportTarget as E } from "@milaboratories/uikit";
3
+ import { useGridColumns as n } from "./useGridColumns.js";
4
+ import { Fragment as r, Teleport as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createTextVNode as u, createVNode as d, defineComponent as f, normalizeClass as p, openBlock as m, ref as h, renderList as g, toDisplayString as _, unref as v, withCtx as y, withModifiers as b } from "vue";
5
+ import { PlBtnGhost as x, PlElementList as S, PlSearchField as C, PlSlideModal as w, usePlBlockPageTitleTeleportTarget as T } from "@milaboratories/uikit";
5
6
  //#region src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue?vue&type=script&setup=true&lang.ts
6
- var D = /* @__PURE__ */ d({
7
+ var E = /* @__PURE__ */ f({
7
8
  __name: "PlAgGridColumnManager",
8
9
  props: {
9
10
  api: {},
10
11
  width: {}
11
12
  },
12
- setup(d) {
13
- let { api: D } = _(d), O = m([]);
14
- y(() => D.value, (e) => {
15
- e.isDestroyed() || (e.addEventListener("displayedColumnsChanged", (e) => {
16
- O.value = e.api.getAllGridColumns();
17
- }), O.value = e.getAllGridColumns(), O.value.length > 0 && e.moveColumns(O.value, 0));
18
- }, { immediate: !0 });
19
- let k = i(() => O.value.map((e) => ({
20
- column: e,
21
- id: e.getId(),
22
- label: e.getColDef().headerName
23
- }))), A = m(""), j = m(!1), M = E("PlAgGridColumnManager"), { filteredItems: N, segments: P } = t(() => ({
24
- items: k.value,
25
- query: A.value,
13
+ setup(f) {
14
+ let E = f, D = h(""), O = h(!1), k = T("PlAgGridColumnManager"), A = n(E), { filteredItems: j, segments: M } = t({
15
+ items: a(() => A.value.map((e, t) => ({
16
+ column: e,
17
+ id: e.getId(),
18
+ label: e.getColDef().headerName ?? `Unnamed Column (${t + 1})`
19
+ }))),
20
+ query: D,
26
21
  getStrings: (e) => [e.label]
27
- }));
28
- return (t, i) => (p(), s(n, null, [v(M) ? (p(), a(r, {
22
+ });
23
+ return (t, n) => (m(), c(r, null, [v(k) ? (m(), o(i, {
29
24
  key: 0,
30
- to: v(M)
31
- }, [u(v(S), {
25
+ to: v(k)
26
+ }, [d(v(x), {
32
27
  icon: "columns",
33
- onClick: i[0] ||= x((e) => j.value = !j.value, ["stop"])
28
+ onClick: n[0] ||= b((e) => O.value = !O.value, ["stop"])
34
29
  }, {
35
- default: b(() => [...i[3] ||= [l(" Columns ", -1)]]),
30
+ default: y(() => [...n[3] ||= [u(" Columns ", -1)]]),
36
31
  _: 1
37
- })], 8, ["to"])) : o("", !0), u(v(T), {
38
- modelValue: j.value,
39
- "onUpdate:modelValue": i[2] ||= (e) => j.value = e,
40
- width: d.width,
32
+ })], 8, ["to"])) : s("", !0), d(v(w), {
33
+ modelValue: O.value,
34
+ "onUpdate:modelValue": n[2] ||= (e) => O.value = e,
35
+ width: f.width,
41
36
  "close-on-outside-click": ""
42
37
  }, {
43
- title: b(() => [...i[4] ||= [l("Manage Columns", -1)]]),
44
- default: b(() => [u(v(w), {
45
- modelValue: A.value,
46
- "onUpdate:modelValue": i[1] ||= (e) => A.value = e,
38
+ title: y(() => [...n[4] ||= [u("Manage Columns", -1)]]),
39
+ default: y(() => [d(v(C), {
40
+ modelValue: D.value,
41
+ "onUpdate:modelValue": n[1] ||= (e) => D.value = e,
47
42
  clearable: ""
48
- }, null, 8, ["modelValue"]), u(v(C), {
49
- items: v(N),
43
+ }, null, 8, ["modelValue"]), d(v(S), {
44
+ items: v(j),
50
45
  "get-item-key": (e) => e.id,
51
46
  "is-draggable": (e) => !e.column.getColDef().lockPosition,
52
47
  "on-sort": (e, t) => {
53
- if (!v(D).isDestroyed()) {
54
- let n = O.value[e];
55
- v(D).moveColumns([n], t);
48
+ if (!E.api.isDestroyed()) {
49
+ let n = v(A)[e];
50
+ E.api.moveColumns([n], t);
56
51
  }
57
52
  return !0;
58
53
  },
59
54
  "on-toggle": (e) => {
60
- v(D).isDestroyed() || v(D).setColumnsVisible([e.column], !e.column.isVisible());
55
+ E.api.isDestroyed() || E.api.setColumnsVisible([e.column], !e.column.isVisible());
61
56
  },
62
57
  "is-toggled": (e) => !e.column.isVisible(),
63
58
  "is-toggable": (t) => t.id !== v(e),
64
59
  "is-pinned": (e) => !!e.column.getColDef().lockPosition,
65
60
  "is-pinnable": () => !1,
66
- "disable-dragging": A.value.length > 0,
61
+ "disable-dragging": D.value.length > 0,
67
62
  "disable-removing": ""
68
63
  }, {
69
- "item-title": b(({ item: e }) => [c("span", null, [(p(!0), s(n, null, h(v(P).get(e.label), (e, n) => (p(), s("span", {
64
+ "item-title": y(({ item: e }) => [l("span", null, [(m(!0), c(r, null, g(v(M).get(e.label), (e, n) => (m(), c("span", {
70
65
  key: n,
71
- class: f({ [t.$style.match]: e.match })
72
- }, g(e.value), 3))), 128))])]),
66
+ class: p({ [t.$style.match]: e.match })
67
+ }, _(e.value), 3))), 128))])]),
73
68
  _: 1
74
69
  }, 8, [
75
70
  "items",
@@ -87,6 +82,6 @@ var D = /* @__PURE__ */ d({
87
82
  }
88
83
  });
89
84
  //#endregion
90
- export { D as default };
85
+ export { E as default };
91
86
 
92
87
  //# sourceMappingURL=PlAgGridColumnManager.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlAgGridColumnManager.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlBtnGhost,\n PlElementList,\n PlSearchField,\n PlSlideModal,\n usePlBlockPageTitleTeleportTarget,\n} 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 <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost icon=\"columns\" @click.stop=\"slideModal = !slideModal\"> Columns </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=\"\n (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 \"\n :on-toggle=\"\n (item) => {\n if (!gridApi.isDestroyed()) {\n gridApi.setColumnsVisible([item.column], !item.column.isVisible());\n }\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 >\n </span>\n </template>\n </PlElementList>\n </PlSlideModal>\n</template>\n\n<style module>\n.match {\n background-color: var(--color-active-select);\n border-radius: 2px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;EA2BA,IAAM,EAAE,KAAK,MAAY,EAdX,EAcwB,EAEhC,IAAU,EAAc,EAAE,CAAC;AACjC,UACQ,EAAQ,QACb,MAAY;AACP,KAAQ,aAAa,KAEzB,EAAQ,iBAAiB,4BAA4B,MAAwC;AAC3F,MAAQ,QAAQ,EAAM,IAAI,mBAAmB;KAC7C,EAEF,EAAQ,QAAQ,EAAQ,mBAAmB,EACvC,EAAQ,MAAM,SAAS,KACzB,EAAQ,YAAY,EAAQ,OAAO,EAAE;KAGzC,EAAE,WAAW,IAAM,CACpB;EAED,IAAM,IAAQ,QACL,EAAQ,MAAM,KAAK,OAAS;GACjC,QAAQ;GACR,IAAI,EAAI,OAAO;GACf,OAAO,EAAI,WAAW,CAAC;GACxB,EAAE,CACH,EAEI,IAAQ,EAAI,GAAG,EAEf,IAAa,EAAI,GAAM,EACvB,IAAiB,EAAkC,wBAAwB,EAE3E,EAAE,kBAAe,gBAAa,SAAwB;GAC1D,OAAO,EAAM;GACb,OAAO,EAAM;GACb,aAAa,MAAS,CAAC,EAAK,MAAM;GACnC,EAAE;qCAIe,EAAA,EAAc,IAAA,GAAA,EAA9B,EAEW,GAAA;;GAFsB,IAAI,EAAA,EAAc;MACjD,EAAwF,EAAA,EAAA,EAAA;GAA5E,MAAK;GAAW,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAU,CAAI,EAAA,OAAU,CAAA,OAAA,CAAA;;oBAAW,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAT,aAAS,GAAA,CAAA,CAAA,CAAA;;gCAG7E,EAyCe,EAAA,EAAA,EAAA;eAzCQ,EAAA;4CAAU,QAAA;GAAG,OAAO,EAAA;GAAO,0BAAA;;GACrC,OAAK,QAAe,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAd,kBAAc,GAAA,CAAA,CAAA,CAAA;oBACY,CAA3C,EAA2C,EAAA,EAAA,EAAA;gBAAnB,EAAA;6CAAK,QAAA;IAAE,WAAA;gCAC/B,EAqCgB,EAAA,EAAA,EAAA;IApCb,OAAO,EAAA,EAAa;IACpB,iBAAe,MAAS,EAAK;IAC7B,iBAAe,MAAI,CAAM,EAAK,OAAO,WAAS,CAAG;IACjD,YAAmB,GAAW,MAAO;UAAsB,EAAA,EAAO,CAAC,aAAW,EAAA;UAAwB,IAAe,EAAA,MAAQ;AAAwB,QAAA,EAAO,CAAC,YAAW,CAAE,EAAY,EAAG,EAAO;;;;IAShM,cAAqB,MAAI;KAAsB,EAAA,EAAO,CAAC,aAAW,IAAkB,EAAA,EAAO,CAAC,kBAAiB,CAAE,EAAK,OAAM,EAAA,CAAI,EAAK,OAAO,WAAS,CAAA;;IAOnJ,eAAa,MAAI,CAAM,EAAK,OAAO,WAAS;IAC5C,gBAAc,MAAS,EAAK,OAAO,EAAA,EAA2B;IAC9D,cAAY,MAAI,CAAA,CAAO,EAAK,OAAO,WAAS,CAAG;IAC/C,qBAAa;IACb,oBAAkB,EAAA,MAAM,SAAM;IAC/B,oBAAA;;IAEW,cAAU,GAQZ,EARgB,cAAI,CAC3B,EAOO,QAAA,MAAA,EAAA,EAAA,GAAA,EANL,EAKC,GAAA,MAAA,EAJwB,EAAA,EAAQ,CAAC,IAAI,EAAK,MAAK,GAAtC,GAAS,YADnB,EAKC,QAAA;KAHE,KAAK;KACL,OAAK,EAAA,GAAKA,EAAAA,OAAO,QAAQ,EAAQ,OAAK,CAAA;SACnC,EAAQ,MAAK,EAAA,EAAA"}
1
+ {"version":3,"file":"PlAgGridColumnManager.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlBtnGhost,\n PlElementList,\n PlSearchField,\n PlSlideModal,\n usePlBlockPageTitleTeleportTarget,\n} from \"@milaboratories/uikit\";\nimport { type GridApi } from \"ag-grid-enterprise\";\nimport { computed, ref } from \"vue\";\nimport { PlAgDataTableRowNumberColId } from \"../PlAgDataTable/sources/row-number\";\nimport { useFilteredItems } from \"./useFilteredItems\";\nimport { useGridColumns } from \"./useGridColumns\";\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 query = ref(\"\");\nconst slideModal = ref(false);\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlAgGridColumnManager\");\n\nconst columns = useGridColumns(props);\n\nconst items = computed(() => {\n return columns.value.map((col, i) => ({\n column: col,\n id: col.getId(),\n label: col.getColDef().headerName ?? `Unnamed Column (${i + 1})`,\n }));\n});\n\nconst { filteredItems, segments } = useFilteredItems({\n items,\n query,\n getStrings: (item) => [item.label],\n});\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost icon=\"columns\" @click.stop=\"slideModal = !slideModal\"> Columns </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=\"\n (fromIndex, toIndex) => {\n if (!props.api.isDestroyed()) {\n const columnToMove = columns[fromIndex];\n props.api.moveColumns([columnToMove], toIndex);\n }\n return true; // Let PlElementList handle the visual update\n }\n \"\n :on-toggle=\"\n (item) => {\n if (!props.api.isDestroyed()) {\n props.api.setColumnsVisible([item.column], !item.column.isVisible());\n }\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 >\n </span>\n </template>\n </PlElementList>\n </PlSlideModal>\n</template>\n\n<style module>\n.match {\n background-color: var(--color-active-select);\n border-radius: 2px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;EAcA,IAAM,IAAQ,GAcR,IAAQ,EAAI,GAAG,EACf,IAAa,EAAI,GAAM,EACvB,IAAiB,EAAkC,wBAAwB,EAE3E,IAAU,EAAe,EAAM,EAU/B,EAAE,kBAAe,gBAAa,EAAiB;GACnD,OATY,QACL,EAAQ,MAAM,KAAK,GAAK,OAAO;IACpC,QAAQ;IACR,IAAI,EAAI,OAAO;IACf,OAAO,EAAI,WAAW,CAAC,cAAc,mBAAmB,IAAI,EAAE;IAC/D,EAAE,CACH;GAIA;GACA,aAAa,MAAS,CAAC,EAAK,MAAM;GACnC,CAAC;qCAIgB,EAAA,EAAc,IAAA,GAAA,EAA9B,EAEW,GAAA;;GAFsB,IAAI,EAAA,EAAc;MACjD,EAAwF,EAAA,EAAA,EAAA;GAA5E,MAAK;GAAW,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAU,CAAI,EAAA,OAAU,CAAA,OAAA,CAAA;;oBAAW,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAT,aAAS,GAAA,CAAA,CAAA,CAAA;;gCAG7E,EAyCe,EAAA,EAAA,EAAA;eAzCQ,EAAA;4CAAU,QAAA;GAAG,OAAO,EAAA;GAAO,0BAAA;;GACrC,OAAK,QAAe,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAd,kBAAc,GAAA,CAAA,CAAA,CAAA;oBACY,CAA3C,EAA2C,EAAA,EAAA,EAAA;gBAAnB,EAAA;6CAAK,QAAA;IAAE,WAAA;gCAC/B,EAqCgB,EAAA,EAAA,EAAA;IApCb,OAAO,EAAA,EAAa;IACpB,iBAAe,MAAS,EAAK;IAC7B,iBAAe,MAAI,CAAM,EAAK,OAAO,WAAS,CAAG;IACjD,YAAmB,GAAW,MAAO;UAAsB,EAAM,IAAI,aAAW,EAAA;UAAwB,IAAe,EAAA,EAAO,CAAC;AAAwB,QAAM,IAAI,YAAW,CAAE,EAAY,EAAG,EAAO;;;;IASpM,cAAqB,MAAI;KAAsB,EAAM,IAAI,aAAW,IAAkB,EAAM,IAAI,kBAAiB,CAAE,EAAK,OAAM,EAAA,CAAI,EAAK,OAAO,WAAS,CAAA;;IAOvJ,eAAa,MAAI,CAAM,EAAK,OAAO,WAAS;IAC5C,gBAAc,MAAS,EAAK,OAAO,EAAA,EAA2B;IAC9D,cAAY,MAAI,CAAA,CAAO,EAAK,OAAO,WAAS,CAAG;IAC/C,qBAAa;IACb,oBAAkB,EAAA,MAAM,SAAM;IAC/B,oBAAA;;IAEW,cAAU,GAQZ,EARgB,cAAI,CAC3B,EAOO,QAAA,MAAA,EAAA,EAAA,GAAA,EANL,EAKC,GAAA,MAAA,EAJwB,EAAA,EAAQ,CAAC,IAAI,EAAK,MAAK,GAAtC,GAAS,YADnB,EAKC,QAAA;KAHE,KAAK;KACL,OAAK,EAAA,GAAKA,EAAAA,OAAO,QAAQ,EAAQ,OAAK,CAAA;SACnC,EAAQ,MAAK,EAAA,EAAA"}
@@ -1,9 +1,9 @@
1
- import { MaybeRefOrGetter } from 'vue';
2
- export declare function useFilteredItems<T>(props: MaybeRefOrGetter<{
3
- items: T[];
4
- query: string;
1
+ import { Ref } from 'vue';
2
+ export declare function useFilteredItems<T>(props: {
3
+ items: Ref<T[]>;
4
+ query: Ref<string>;
5
5
  getStrings: (item: T) => Iterable<string>;
6
- }>): {
6
+ }): {
7
7
  filteredItems: import('vue').ComputedRef<T[]>;
8
8
  segments: import('vue').ComputedRef<Map<string, StringSegment[]>>;
9
9
  };
@@ -1 +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"}
1
+ {"version":3,"file":"useFilteredItems.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgGridColumnManager/useFilteredItems.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,KAAK,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE;IACzC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC3C;;;EAyBA;AA+BD,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC"}
@@ -3,11 +3,11 @@ import { computed as e, toValue as t } from "vue";
3
3
  function n(n) {
4
4
  let i = e(() => {
5
5
  let { items: e, query: i, getStrings: a } = t(n), o = [], s = /* @__PURE__ */ new Map();
6
- for (let t of e) {
6
+ for (let t of e.value) {
7
7
  let e = !1;
8
8
  for (let n of a(t)) {
9
9
  let a = s.get(n);
10
- a || (a = r(n, i), s.set(n, a)), !e && (!i || a.some(({ match: e }) => e)) && (o.push(t), e = !0);
10
+ a || (a = r(n, i.value), s.set(n, a)), !e && (!i.value || a.some(({ match: e }) => e)) && (o.push(t), e = !0);
11
11
  }
12
12
  }
13
13
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"useFilteredItems.js","names":[],"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"],"mappings":";;AAEA,SAAgB,EACd,GAKA;CACA,IAAM,IAAS,QAAe;EAC5B,IAAM,EAAE,UAAO,UAAO,kBAAe,EAAQ,EAAM,EAC7C,IAAqB,EAAE,EACvB,oBAAW,IAAI,KAA8B;AACnD,OAAK,IAAM,KAAQ,GAAO;GACxB,IAAI,IAAO;AACX,QAAK,IAAM,KAAU,EAAW,EAAK,EAAE;IACrC,IAAI,IAAiB,EAAS,IAAI,EAAO;AAKzC,IAJK,MACH,IAAiB,EAAgB,GAAQ,EAAM,EAC/C,EAAS,IAAI,GAAQ,EAAe,GAElC,CAAC,MAAS,CAAC,KAAS,EAAe,MAAM,EAAE,eAAY,EAAM,MAC/D,EAAc,KAAK,EAAK,EACxB,IAAO;;;AAIb,SAAO;GAAE;GAAe;GAAU;GAClC;AACF,QAAO;EACL,eAAe,QAAe,EAAO,MAAM,cAAc;EACzD,UAAU,QAAe,EAAO,MAAM,SAAS;EAChD;;AAKH,SAAS,EAAgB,GAAkB,GAAiC;AAC1E,KAAI,CAAC,EAAQ,QAAO,CAAC;EAAE,OAAO;EAAU,OAAO;EAAO,CAAC;CACvD,IAAM,IAAgB,EAAS,aAAa,EACtC,IAAc,EAAO,aAAa,EAClC,IAA0B,EAAE,EAC9B,IAAU;AACd,UAAa;EACX,IAAM,IAAQ,EAAc,QAAQ,GAAa,EAAQ,EACnD,IAAM,IAAQ,EAAO;AAC3B,MAAI,IAAQ,EAAG;AACf,EAAI,MAAY,KACd,EAAO,KAAK;GAAE,OAAO,EAAS,MAAM,GAAS,EAAM;GAAE,OAAO;GAAO,CAAC;EAEtE,IAAM,IAAc,EAAO,GAAG,GAAG;AAMjC,EALI,GAAa,QACf,EAAY,SAAS,EAAS,MAAM,GAAO,EAAI,GAE/C,EAAO,KAAK;GAAE,OAAO,EAAS,MAAM,GAAO,EAAI;GAAE,OAAO;GAAM,CAAC,EAEjE,IAAU;;AAKZ,QAHI,IAAU,EAAS,UACrB,EAAO,KAAK;EAAE,OAAO,EAAS,MAAM,EAAQ;EAAE,OAAO;EAAO,CAAC,EAExD"}
1
+ {"version":3,"file":"useFilteredItems.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/useFilteredItems.ts"],"sourcesContent":["import { Ref, computed, toValue } from \"vue\";\n\nexport function useFilteredItems<T>(props: {\n items: Ref<T[]>;\n query: Ref<string>;\n getStrings: (item: T) => Iterable<string>;\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.value) {\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.value);\n segments.set(string, stringSegments);\n }\n if (!kept && (!query.value || 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"],"mappings":";;AAEA,SAAgB,EAAoB,GAIjC;CACD,IAAM,IAAS,QAAe;EAC5B,IAAM,EAAE,UAAO,UAAO,kBAAe,EAAQ,EAAM,EAC7C,IAAqB,EAAE,EACvB,oBAAW,IAAI,KAA8B;AACnD,OAAK,IAAM,KAAQ,EAAM,OAAO;GAC9B,IAAI,IAAO;AACX,QAAK,IAAM,KAAU,EAAW,EAAK,EAAE;IACrC,IAAI,IAAiB,EAAS,IAAI,EAAO;AAKzC,IAJK,MACH,IAAiB,EAAgB,GAAQ,EAAM,MAAM,EACrD,EAAS,IAAI,GAAQ,EAAe,GAElC,CAAC,MAAS,CAAC,EAAM,SAAS,EAAe,MAAM,EAAE,eAAY,EAAM,MACrE,EAAc,KAAK,EAAK,EACxB,IAAO;;;AAIb,SAAO;GAAE;GAAe;GAAU;GAClC;AACF,QAAO;EACL,eAAe,QAAe,EAAO,MAAM,cAAc;EACzD,UAAU,QAAe,EAAO,MAAM,SAAS;EAChD;;AAKH,SAAS,EAAgB,GAAkB,GAAiC;AAC1E,KAAI,CAAC,EAAQ,QAAO,CAAC;EAAE,OAAO;EAAU,OAAO;EAAO,CAAC;CACvD,IAAM,IAAgB,EAAS,aAAa,EACtC,IAAc,EAAO,aAAa,EAClC,IAA0B,EAAE,EAC9B,IAAU;AACd,UAAa;EACX,IAAM,IAAQ,EAAc,QAAQ,GAAa,EAAQ,EACnD,IAAM,IAAQ,EAAO;AAC3B,MAAI,IAAQ,EAAG;AACf,EAAI,MAAY,KACd,EAAO,KAAK;GAAE,OAAO,EAAS,MAAM,GAAS,EAAM;GAAE,OAAO;GAAO,CAAC;EAEtE,IAAM,IAAc,EAAO,GAAG,GAAG;AAMjC,EALI,GAAa,QACf,EAAY,SAAS,EAAS,MAAM,GAAO,EAAI,GAE/C,EAAO,KAAK;GAAE,OAAO,EAAS,MAAM,GAAO,EAAI;GAAE,OAAO;GAAM,CAAC,EAEjE,IAAU;;AAKZ,QAHI,IAAU,EAAS,UACrB,EAAO,KAAK;EAAE,OAAO,EAAS,MAAM,EAAQ;EAAE,OAAO;EAAO,CAAC,EAExD"}
@@ -0,0 +1,14 @@
1
+ import { ref as e, watch as t } from "vue";
2
+ //#region src/components/PlAgGridColumnManager/useGridColumns.ts
3
+ function n(n) {
4
+ let r = e([]), i = () => {
5
+ r.value = n.api.getAllGridColumns();
6
+ };
7
+ return t(() => n.api, (e, t, n) => {
8
+ e.isDestroyed() || (e.addEventListener("displayedColumnsChanged", i), n(() => e.removeEventListener("displayedColumnsChanged", i)), r.value = e.getAllGridColumns(), r.value.length > 0 && e.moveColumns(r.value, 0));
9
+ }, { immediate: !0 }), r;
10
+ }
11
+ //#endregion
12
+ export { n as useGridColumns };
13
+
14
+ //# sourceMappingURL=useGridColumns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGridColumns.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/useGridColumns.ts"],"sourcesContent":["import { Column, GridApi } from \"ag-grid-enterprise\";\nimport { ref, watch } from \"vue\";\n\nexport function useGridColumns(props: { api: GridApi }) {\n const columns = ref<Column[]>([]);\n const syncColumns = () => {\n columns.value = props.api.getAllGridColumns();\n };\n watch(\n () => props.api,\n (gridApi, _, onCleanup) => {\n if (gridApi.isDestroyed()) return;\n\n gridApi.addEventListener(\"displayedColumnsChanged\", syncColumns);\n onCleanup(() => gridApi.removeEventListener(\"displayedColumnsChanged\", syncColumns));\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\n return columns;\n}\n"],"mappings":";;AAGA,SAAgB,EAAe,GAAyB;CACtD,IAAM,IAAU,EAAc,EAAE,CAAC,EAC3B,UAAoB;AACxB,IAAQ,QAAQ,EAAM,IAAI,mBAAmB;;AAkB/C,QAhBA,QACQ,EAAM,MACX,GAAS,GAAG,MAAc;AACrB,IAAQ,aAAa,KAEzB,EAAQ,iBAAiB,2BAA2B,EAAY,EAChE,QAAgB,EAAQ,oBAAoB,2BAA2B,EAAY,CAAC,EAEpF,EAAQ,QAAQ,EAAQ,mBAAmB,EACvC,EAAQ,MAAM,SAAS,KACzB,EAAQ,YAAY,EAAQ,OAAO,EAAE;IAGzC,EAAE,WAAW,IAAM,CACpB,EAEM"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlTableFiltersV2.js","names":[],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getAxisId,\n getUniqueSourceValuesWithLabels,\n parseJson,\n} from \"@platforma-sdk/model\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isNil } from \"es-toolkit\";\n\nconst model = defineModel<PlDataTableFiltersWithMeta>({ required: true });\nconst props = defineProps<{\n pframeHandle: Nil | PFrameHandle;\n columns: PTableColumnSpec[];\n}>();\n\n// Teleport for \"Filters\" button\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\n\n// Check if any filters are active\nconst filtersOn = computed(() => {\n return model.value.filters.length > 0;\n});\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n const id: PTableColumnId =\n spec.type === \"axis\"\n ? { type: \"axis\", id: getAxisId(spec.spec) }\n : { type: \"column\", id: spec.id };\n return canonicalizeJson<PTableColumnId>(id);\n}\n\nconst items = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n v-model:filters=\"model as PlAdvancedFilter\"\n :items=\"items\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n />\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"PlTableFiltersV2.js","names":[],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getUniqueSourceValuesWithLabels,\n parseJson,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isNil } from \"es-toolkit\";\n\nconst model = defineModel<PlDataTableFiltersWithMeta>({ required: true });\nconst props = defineProps<{\n pframeHandle: Nil | PFrameHandle;\n columns: PTableColumnSpec[];\n}>();\n\n// Teleport for \"Filters\" button\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\n\n// Check if any filters are active\nconst filtersOn = computed(() => {\n return model.value.filters.length > 0;\n});\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n return canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n}\n\nconst items = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n v-model:filters=\"model as PlAdvancedFilter\"\n :items=\"items\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n />\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"PlTableFiltersV2.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getAxisId,\n getUniqueSourceValuesWithLabels,\n parseJson,\n} from \"@platforma-sdk/model\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isNil } from \"es-toolkit\";\n\nconst model = defineModel<PlDataTableFiltersWithMeta>({ required: true });\nconst props = defineProps<{\n pframeHandle: Nil | PFrameHandle;\n columns: PTableColumnSpec[];\n}>();\n\n// Teleport for \"Filters\" button\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\n\n// Check if any filters are active\nconst filtersOn = computed(() => {\n return model.value.filters.length > 0;\n});\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n const id: PTableColumnId =\n spec.type === \"axis\"\n ? { type: \"axis\", id: getAxisId(spec.spec) }\n : { type: \"column\", id: spec.id };\n return canonicalizeJson<PTableColumnId>(id);\n}\n\nconst items = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n v-model:filters=\"model as PlAdvancedFilter\"\n :items=\"items\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n />\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"PlTableFiltersV2.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getUniqueSourceValuesWithLabels,\n parseJson,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isNil } from \"es-toolkit\";\n\nconst model = defineModel<PlDataTableFiltersWithMeta>({ required: true });\nconst props = defineProps<{\n pframeHandle: Nil | PFrameHandle;\n columns: PTableColumnSpec[];\n}>();\n\n// Teleport for \"Filters\" button\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\n\n// Check if any filters are active\nconst filtersOn = computed(() => {\n return model.value.filters.length > 0;\n});\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n return canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n}\n\nconst items = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n v-model:filters=\"model as PlAdvancedFilter\"\n :items=\"items\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n />\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"PlTableFiltersV2.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"names":[],"mappings":"AAwJA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EAGb,MAAM,sBAAsB,CAAC;AAoB9B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAInD,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,GAAG,GAAG,YAAY,CAAC;IACjC,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAyFF,KAAK,iBAAiB,GAAG;IACzB,UAAU,EAAE,0BAA0B,CAAC;CACtC,GAAG,WAAW,CAAC;;;;;;AA8HhB,wBAOG"}
1
+ {"version":3,"file":"PlTableFiltersV2.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"names":[],"mappings":"AAoJA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EAGb,MAAM,sBAAsB,CAAC;AAoB9B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAInD,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,GAAG,GAAG,YAAY,CAAC;IACjC,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAqFF,KAAK,iBAAiB,GAAG;IACzB,UAAU,EAAE,0BAA0B,CAAC;CACtC,GAAG,WAAW,CAAC;;;;;;AA8HhB,wBAOG"}
@@ -1,7 +1,7 @@
1
1
  import e from "../PlAdvancedFilter/PlAdvancedFilter.js";
2
2
  import "../PlAdvancedFilter/index.js";
3
3
  import { Fragment as t, Teleport as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, mergeModels as d, normalizeClass as f, onMounted as p, openBlock as m, ref as h, unref as g, useModel as _, withCtx as v, withModifiers as y } from "vue";
4
- import { Annotation as b, Domain as x, canonicalizeJson as S, getAxisId as C, getUniqueSourceValuesWithLabels as w, parseJson as T, readAnnotation as E, readDomain as D } from "@platforma-sdk/model";
4
+ import { Annotation as b, Domain as x, canonicalizeJson as S, getPTableColumnId as C, getUniqueSourceValuesWithLabels as w, parseJson as T, readAnnotation as E, readDomain as D } from "@platforma-sdk/model";
5
5
  import { PlBtnGhost as O, PlSlideModal as k, usePlBlockPageTitleTeleportTarget as A } from "@milaboratories/uikit";
6
6
  import { isNil as j } from "es-toolkit";
7
7
  //#region src/components/PlTableFilters/PlTableFiltersV2.vue?vue&type=script&setup=true&lang.ts
@@ -22,13 +22,7 @@ var M = /* @__PURE__ */ u({
22
22
  });
23
23
  let P = A("PlTableFiltersV2"), F = h(!1), I = r(() => d.value.filters.length > 0);
24
24
  function L(e) {
25
- return S(e.type === "axis" ? {
26
- type: "axis",
27
- id: C(e.spec)
28
- } : {
29
- type: "column",
30
- id: e.id
31
- });
25
+ return S(C(e));
32
26
  }
33
27
  let R = r(() => M.columns.map((e, t) => {
34
28
  let n = L(e), r = E(e.spec, b.Label)?.trim() ?? `Unlabeled ${e.type} ${t}`, i = D(e.spec, x.Alphabet) ?? E(e.spec, b.Alphabet);
@@ -1 +1 @@
1
- {"version":3,"file":"PlTableFiltersV2.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getAxisId,\n getUniqueSourceValuesWithLabels,\n parseJson,\n} from \"@platforma-sdk/model\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isNil } from \"es-toolkit\";\n\nconst model = defineModel<PlDataTableFiltersWithMeta>({ required: true });\nconst props = defineProps<{\n pframeHandle: Nil | PFrameHandle;\n columns: PTableColumnSpec[];\n}>();\n\n// Teleport for \"Filters\" button\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\n\n// Check if any filters are active\nconst filtersOn = computed(() => {\n return model.value.filters.length > 0;\n});\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n const id: PTableColumnId =\n spec.type === \"axis\"\n ? { type: \"axis\", id: getAxisId(spec.spec) }\n : { type: \"column\", id: spec.id };\n return canonicalizeJson<PTableColumnId>(id);\n}\n\nconst items = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n v-model:filters=\"model as PlAdvancedFilter\"\n :items=\"items\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n />\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;EA8BA,IAAM,IAAQ,EAAuC,GAAA,aAAoB,EACnE,IAAQ,GAMR,IAAU,EAAI,GAAM;AAC1B,UAAgB;AACd,KAAQ,QAAQ;IAChB;EACF,IAAM,IAAiB,EAAkC,mBAAmB,EACtE,IAAc,EAAI,GAAM,EAGxB,IAAY,QACT,EAAM,MAAM,QAAQ,SAAS,EACpC;EAEF,SAAS,EAAmB,GAA2D;AAKrF,UAAO,EAHL,EAAK,SAAS,SACV;IAAE,MAAM;IAAQ,IAAI,EAAU,EAAK,KAAK;IAAC,GACzC;IAAE,MAAM;IAAU,IAAI,EAAK;IAAI,CACM;;EAG7C,IAAM,IAAQ,QACL,EAAM,QAAQ,KAAK,GAAK,MAAQ;GACrC,IAAM,IAAK,EAAmB,EAAI,EAC5B,IACJ,EAAe,EAAI,MAAM,EAAW,MAAM,EAAE,MAAM,IAAI,aAAa,EAAI,KAAK,GAAG,KAC3E,IACJ,EAAW,EAAI,MAAM,EAAO,SAAS,IAAI,EAAe,EAAI,MAAM,EAAW,SAAS;AACxF,UAAO;IACL;IACA;IACA,MAAM,EAAI;IACV,UAAU,KAAY,KAAA;IACvB;IACD,CACF,EAGI,IAAmB;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EAGD,SAAS,EAAqB,GAK3B;AACD,OAAI,EAAM,EAAM,aAAa,CAE3B,QADA,QAAQ,KAAK,+DAA+D,EACrE,EAAE;GAGX,IAAM,IAAQ,EAAO,UACf,IAAgB,EAA0B,EAAM;AAEtD,OAAI,EAAc,SAAS,SACzB,OAAU,MAAM,0DAA0D;AAG5E,UAAO,EAAgC,EAAM,cAAc;IACzD,UAAU,EAAc;IACxB,SAAS,EAAO;IAChB,OAAO;IACP,aAAa,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IAChE,kBAAkB,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IACtE,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO;;qCAKR,EAAA,SAAW,EAAA,EAAc,IAAA,GAAA,EAAzC,EAIW,GAAA;;GAJiC,IAAI,EAAA,EAAc;MAC5D,EAEa,EAAA,EAAA,EAAA;GAFA,MAAM,EAAA,QAAS,cAAA;GAA4B,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAW,IAAA,CAAA,OAAA,CAAA;;oBAE/E,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAFwF,aAExF,GAAA,CAAA,CAAA,CAAA;;6CAGF,EAae,EAAA,EAAA,EAAA;eAbQ,EAAA;4CAAW,QAAA;GAAG,0BAAwB;;GAChD,OAAK,QAAe,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAd,kBAAc,GAAA,CAAA,CAAA,CAAA;oBAWzB,CATN,EASM,OAAA,EATA,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAA,CACtB,EAOE,EAAA,EAAA,EAAA;IANQ,SAAS,EAAA;0CAAA,QAAK;IACrB,OAAO,EAAA;IACP,qBAAmB;IACnB,uBAAqB;IACrB,cAAY;IACZ,2BAAyB"}
1
+ {"version":3,"file":"PlTableFiltersV2.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlTableFilters/PlTableFiltersV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type {\n PTableColumnSpec,\n PlDataTableFiltersWithMeta,\n PFrameHandle,\n PTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n Annotation,\n Domain,\n readAnnotation,\n readDomain,\n getUniqueSourceValuesWithLabels,\n parseJson,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport { computed, onMounted, ref } from \"vue\";\nimport { PlBtnGhost, PlSlideModal, usePlBlockPageTitleTeleportTarget } from \"@milaboratories/uikit\";\nimport {\n PlAdvancedFilter,\n PlAdvancedFilterComponent,\n PlAdvancedFilterSupportedFilters,\n type PlAdvancedFilterItem,\n} from \"../PlAdvancedFilter\";\nimport type { PlAdvancedFilterColumnId } from \"../PlAdvancedFilter/types\";\nimport type { Nil } from \"@milaboratories/helpers\";\nimport { isNil } from \"es-toolkit\";\n\nconst model = defineModel<PlDataTableFiltersWithMeta>({ required: true });\nconst props = defineProps<{\n pframeHandle: Nil | PFrameHandle;\n columns: PTableColumnSpec[];\n}>();\n\n// Teleport for \"Filters\" button\nconst mounted = ref(false);\nonMounted(() => {\n mounted.value = true;\n});\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlTableFiltersV2\");\nconst showManager = ref(false);\n\n// Check if any filters are active\nconst filtersOn = computed(() => {\n return model.value.filters.length > 0;\n});\n\nfunction makeFilterColumnId(spec: PTableColumnSpec): CanonicalizedJson<PTableColumnId> {\n return canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n}\n\nconst items = computed<PlAdvancedFilterItem[]>(() => {\n return props.columns.map((col, idx) => {\n const id = makeFilterColumnId(col);\n const label =\n readAnnotation(col.spec, Annotation.Label)?.trim() ?? `Unlabeled ${col.type} ${idx}`;\n const alphabet =\n readDomain(col.spec, Domain.Alphabet) ?? readAnnotation(col.spec, Annotation.Alphabet);\n return {\n id,\n label,\n spec: col.spec,\n alphabet: alphabet ?? undefined,\n };\n });\n});\n\n// Supported filters (same set as FilterSidebar)\nconst supportedFilters = [\n \"isNA\",\n \"isNotNA\",\n \"greaterThan\",\n \"greaterThanOrEqual\",\n \"lessThan\",\n \"lessThanOrEqual\",\n \"patternEquals\",\n \"patternNotEquals\",\n \"patternContainSubsequence\",\n \"patternNotContainSubsequence\",\n \"patternMatchesRegularExpression\",\n \"patternFuzzyContainSubsequence\",\n \"equal\",\n \"notEqual\",\n] as (typeof PlAdvancedFilterSupportedFilters)[number][];\n\n// getSuggestOptions - provide discrete values from column annotations\nfunction handleSuggestOptions(params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchStr: string;\n searchType: \"value\" | \"label\";\n}) {\n if (isNil(props.pframeHandle)) {\n console.warn(\"PFrame handle is not available, cannot fetch suggest options\");\n return [];\n }\n\n const strId = params.columnId as CanonicalizedJson<PTableColumnId>;\n const tableColumnId = parseJson<PTableColumnId>(strId);\n\n if (tableColumnId.type !== \"column\") {\n throw new Error(\"ColumnId should be of type 'column' for suggest options\");\n }\n\n return getUniqueSourceValuesWithLabels(props.pframeHandle, {\n columnId: tableColumnId.id,\n axisIdx: params.axisIdx,\n limit: 100,\n searchQuery: params.searchType === \"label\" ? params.searchStr : undefined,\n searchQueryValue: params.searchType === \"value\" ? params.searchStr : undefined,\n }).then((v) => v.values);\n}\n</script>\n\n<template>\n <Teleport v-if=\"mounted && teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost :icon=\"filtersOn ? 'filter-on' : 'filter'\" @click.stop=\"showManager = true\">\n Filters\n </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"showManager\" :close-on-outside-click=\"false\">\n <template #title>Manage Filters</template>\n\n <div :class=\"$style.root\">\n <PlAdvancedFilterComponent\n v-model:filters=\"model as PlAdvancedFilter\"\n :items=\"items\"\n :supported-filters=\"supportedFilters\"\n :get-suggest-options=\"handleSuggestOptions\"\n :enable-dnd=\"false\"\n :enable-add-group-button=\"true\"\n />\n </div>\n </PlSlideModal>\n</template>\n\n<style module>\n.root {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;EA8BA,IAAM,IAAQ,EAAuC,GAAA,aAAoB,EACnE,IAAQ,GAMR,IAAU,EAAI,GAAM;AAC1B,UAAgB;AACd,KAAQ,QAAQ;IAChB;EACF,IAAM,IAAiB,EAAkC,mBAAmB,EACtE,IAAc,EAAI,GAAM,EAGxB,IAAY,QACT,EAAM,MAAM,QAAQ,SAAS,EACpC;EAEF,SAAS,EAAmB,GAA2D;AACrF,UAAO,EAAiC,EAAkB,EAAK,CAAC;;EAGlE,IAAM,IAAQ,QACL,EAAM,QAAQ,KAAK,GAAK,MAAQ;GACrC,IAAM,IAAK,EAAmB,EAAI,EAC5B,IACJ,EAAe,EAAI,MAAM,EAAW,MAAM,EAAE,MAAM,IAAI,aAAa,EAAI,KAAK,GAAG,KAC3E,IACJ,EAAW,EAAI,MAAM,EAAO,SAAS,IAAI,EAAe,EAAI,MAAM,EAAW,SAAS;AACxF,UAAO;IACL;IACA;IACA,MAAM,EAAI;IACV,UAAU,KAAY,KAAA;IACvB;IACD,CACF,EAGI,IAAmB;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;EAGD,SAAS,EAAqB,GAK3B;AACD,OAAI,EAAM,EAAM,aAAa,CAE3B,QADA,QAAQ,KAAK,+DAA+D,EACrE,EAAE;GAGX,IAAM,IAAQ,EAAO,UACf,IAAgB,EAA0B,EAAM;AAEtD,OAAI,EAAc,SAAS,SACzB,OAAU,MAAM,0DAA0D;AAG5E,UAAO,EAAgC,EAAM,cAAc;IACzD,UAAU,EAAc;IACxB,SAAS,EAAO;IAChB,OAAO;IACP,aAAa,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IAChE,kBAAkB,EAAO,eAAe,UAAU,EAAO,YAAY,KAAA;IACtE,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO;;qCAKR,EAAA,SAAW,EAAA,EAAc,IAAA,GAAA,EAAzC,EAIW,GAAA;;GAJiC,IAAI,EAAA,EAAc;MAC5D,EAEa,EAAA,EAAA,EAAA;GAFA,MAAM,EAAA,QAAS,cAAA;GAA4B,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAA,QAAW,IAAA,CAAA,OAAA,CAAA;;oBAE/E,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAFwF,aAExF,GAAA,CAAA,CAAA,CAAA;;6CAGF,EAae,EAAA,EAAA,EAAA;eAbQ,EAAA;4CAAW,QAAA;GAAG,0BAAwB;;GAChD,OAAK,QAAe,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAd,kBAAc,GAAA,CAAA,CAAA,CAAA;oBAWzB,CATN,EASM,OAAA,EATA,OAAK,EAAEA,EAAAA,OAAO,KAAI,EAAA,EAAA,CACtB,EAOE,EAAA,EAAA,EAAA;IANQ,SAAS,EAAA;0CAAA,QAAK;IACrB,OAAO,EAAA;IACP,qBAAmB;IACnB,uBAAqB;IACrB,cAAY;IACZ,2BAAyB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/ui-vue",
3
- "version": "1.63.12",
3
+ "version": "1.64.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -26,9 +26,9 @@
26
26
  "vue": "^3.5.24",
27
27
  "zod": "~3.25.76",
28
28
  "@milaboratories/pf-spec-driver": "1.2.5",
29
+ "@milaboratories/uikit": "2.11.9",
29
30
  "@milaboratories/pl-model-common": "1.31.2",
30
- "@platforma-sdk/model": "1.63.12",
31
- "@milaboratories/uikit": "2.11.8"
31
+ "@platforma-sdk/model": "1.64.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@faker-js/faker": "^9.2.0",
@@ -42,10 +42,10 @@
42
42
  "typescript": "~5.9.3",
43
43
  "vite": "^8.0.6",
44
44
  "vitest": "^4.1.3",
45
- "@milaboratories/build-configs": "2.0.0",
45
+ "@milaboratories/helpers": "1.14.1",
46
46
  "@milaboratories/ts-builder": "1.3.1",
47
47
  "@milaboratories/ts-configs": "1.2.3",
48
- "@milaboratories/helpers": "1.14.1"
48
+ "@milaboratories/build-configs": "2.0.0"
49
49
  },
50
50
  "scripts": {
51
51
  "dev": "ts-builder serve --target browser-lib",
@@ -234,10 +234,11 @@ function normalizeColumnVisibility(
234
234
  function getDefaultHiddenColIds(api: GridApi<PlAgDataTableV2Row>): PlTableColumnIdJson[] {
235
235
  const cols = api.getAllGridColumns();
236
236
  if (!cols) return [];
237
+
237
238
  return cols
238
239
  .filter((col) => {
239
240
  const spec = col.getColDef().context as PTableColumnSpec | undefined;
240
- return spec && isColumnOptional(spec.spec);
241
+ return spec !== undefined && spec.type === "column" && isColumnOptional(spec.spec);
241
242
  })
242
243
  .map((col) => col.getColId() as PlTableColumnIdJson);
243
244
  }
@@ -32,13 +32,13 @@ export function useFilterableColumns(
32
32
  const dataColDefs = getDataColDefs(columnDefs);
33
33
  const cols = dataColDefs
34
34
  .filter((def): def is typeof def & { colId: string } => !isNil(def.colId))
35
- .flatMap((def) => ({
36
- id: parseJson(def.colId satisfies string as PlTableColumnIdJson).labeled,
35
+ .map((def) => ({
36
+ item: parseJson(def.colId satisfies string as PlTableColumnIdJson).labeled,
37
37
  hide: def.hide,
38
38
  }));
39
39
 
40
- filterableColumns.value = cols.map((c) => c.id);
41
- visibleFilterableColumns.value = cols.filter((c) => !c.hide).map((c) => c.id);
40
+ filterableColumns.value = cols.map((c) => c.item);
41
+ visibleFilterableColumns.value = cols.filter((c) => !c.hide).map((c) => c.item);
42
42
  },
43
43
  { immediate: true },
44
44
  );