@platforma-sdk/ui-vue 1.76.7 → 1.77.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.
@@ -1,6 +1,6 @@
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.76.7 build /home/runner/_work/platforma/platforma/sdk/ui-vue
3
+ > @platforma-sdk/ui-vue@1.77.0 build /home/runner/_work/platforma/platforma/sdk/ui-vue
4
4
  > ts-builder build --target browser-lib
5
5
 
6
6
  Building browser-lib project...
@@ -16,7 +16,7 @@ Building browser-lib project...
16
16
  rendering chunks...
17
17
 
18
18
  [vite:dts] Start generate declaration files...
19
- [vite:dts] Declaration files built in 4664ms.
19
+ [vite:dts] Declaration files built in 5316ms.
20
20
 
21
21
  computing gzip size...
22
22
  dist/components/PlAnnotations/components/PlAnnotations.vue?vue&type=style&index=0&lang.css 0.04 kB │ gzip: 0.06 kB
@@ -159,12 +159,12 @@ dist/plugins/Monetization/LimitCard.vue_vue_type_style_index_0_lang.module.js
159
159
  dist/_virtual/_rolldown/runtime.js 0.73 kB │ gzip: 0.43 kB
160
160
  dist/components/PlAgDataTable/PlAgOverlayNoRows.vue_vue_type_script_setup_true_lang.js 0.76 kB │ gzip: 0.49 kB │ map: 1.56 kB
161
161
  dist/plugins/Monetization/EndOfPeriod.vue_vue_type_script_setup_true_lang.js 0.81 kB │ gzip: 0.51 kB │ map: 1.65 kB
162
+ dist/components/PlAgDataTable/compositions/useFilterableColumns.js 0.87 kB │ gzip: 0.48 kB │ map: 2.94 kB
162
163
  dist/components/PlAgChartStackedBarCell/PlAgChartStackedBarCell.vue_vue_type_script_setup_true_lang.js 0.87 kB │ gzip: 0.50 kB │ map: 1.35 kB
163
164
  dist/components/BlockLoader.vue_vue_type_script_setup_true_lang.js 0.88 kB │ gzip: 0.54 kB │ map: 1.21 kB
164
165
  dist/lib/util/helpers/dist/utils.js 0.89 kB │ gzip: 0.46 kB │ map: 7.27 kB
165
166
  dist/components/PlAdvancedFilter/OperandButton.vue_vue_type_script_setup_true_lang.js 0.91 kB │ gzip: 0.57 kB │ map: 1.72 kB
166
167
  dist/components/NotFound.vue_vue_type_script_setup_true_lang.js 0.92 kB │ gzip: 0.58 kB │ map: 0.96 kB
167
- dist/components/PlAgDataTable/compositions/useFilterableColumns.js 0.92 kB │ gzip: 0.50 kB │ map: 3.03 kB
168
168
  dist/components/PlAgDataTable/sources/focus-row.js 0.95 kB │ gzip: 0.51 kB │ map: 2.22 kB
169
169
  dist/plugins/Monetization/validation.js 0.99 kB │ gzip: 0.49 kB │ map: 2.58 kB
170
170
  dist/AgGridVue/selection.js 1.00 kB │ gzip: 0.42 kB │ map: 3.18 kB
@@ -188,8 +188,8 @@ dist/components/PlBtnExportArchive/Item.vue_vue_type_script_setup_true_lang.js
188
188
  dist/components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue_vue_type_script_setup_true_lang.js 1.46 kB │ gzip: 0.77 kB │ map: 3.56 kB
189
189
  dist/internal/createAppModel.js 1.48 kB │ gzip: 0.75 kB │ map: 3.89 kB
190
190
  dist/plugins/Monetization/useInfo.js 1.51 kB │ gzip: 0.77 kB │ map: 3.85 kB
191
+ dist/components/PlAgCsvExporter/export-csv.js 1.66 kB │ gzip: 0.87 kB │ map: 5.19 kB
191
192
  dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue_vue_type_script_setup_true_lang.js 1.67 kB │ gzip: 0.84 kB │ map: 2.62 kB
192
- dist/components/PlAgCsvExporter/export-csv.js 1.68 kB │ gzip: 0.88 kB │ map: 5.25 kB
193
193
  dist/components/PlAnnotations/components/PlAnnotationsModal.vue_vue_type_script_setup_true_lang.js 1.75 kB │ gzip: 0.75 kB │ map: 1.78 kB
194
194
  dist/AgGridVue/createAgGridColDef.js 1.76 kB │ gzip: 0.75 kB │ map: 9.21 kB
195
195
  dist/components/PlAdvancedFilter/utils.js 1.76 kB │ gzip: 0.81 kB │ map: 6.00 kB
@@ -219,20 +219,20 @@ dist/index.js
219
219
  dist/components/PlTableFilters/PlTableFiltersV2.vue_vue_type_script_setup_true_lang.js 4.63 kB │ gzip: 1.91 kB │ map: 9.02 kB
220
220
  dist/components/PlBtnExportArchive/PlBtnExportArchive.vue_vue_type_script_setup_true_lang.js 5.19 kB │ gzip: 2.16 kB │ map: 10.36 kB
221
221
  dist/internal/createAppV2.js 5.26 kB │ gzip: 1.98 kB │ map: 17.78 kB
222
- dist/components/PlAgDataTable/sources/table-state-v2.js 5.72 kB │ gzip: 1.84 kB │ map: 19.38 kB
222
+ dist/components/PlAgDataTable/sources/table-state-v2.js 5.67 kB │ gzip: 1.82 kB │ map: 19.28 kB
223
223
  dist/internal/createAppV3.js 6.19 kB │ gzip: 2.34 kB │ map: 21.40 kB
224
- dist/components/PlAgDataTable/sources/table-source-v2.js 6.61 kB │ gzip: 2.59 kB │ map: 22.42 kB
224
+ dist/components/PlAgDataTable/sources/table-source-v2.js 6.62 kB │ gzip: 2.60 kB │ map: 22.47 kB
225
225
  dist/components/PlAdvancedFilter/PlAdvancedFilter.vue_vue_type_script_setup_true_lang.js 8.54 kB │ gzip: 2.59 kB │ map: 18.44 kB
226
226
  dist/components/PlAdvancedFilter/FilterEditor.vue_vue_type_script_setup_true_lang.js 10.24 kB │ gzip: 3.04 kB │ map: 23.20 kB
227
227
  dist/components/PlAgDataTable/PlAgDataTableV2.vue_vue_type_script_setup_true_lang.js 12.31 kB │ gzip: 3.90 kB │ map: 29.22 kB
228
228
 
229
229
  [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugins. Here is a breakdown:
230
- - sourcemaps (41%)
231
- - vite:dts (21%)
232
- - vite:css-post (10%)
233
- - vite:vue (10%)
230
+ - sourcemaps (34%)
231
+ - vite:dts (27%)
232
+ - vite:vue (11%)
233
+ - vite:css-post (9%)
234
234
  - vite:css (7%)
235
235
  See https://rolldown.rs/options/checks#plugintimings for more details.
236
236
  
237
- ✓ built in 5.57s
237
+ ✓ built in 6.08s
238
238
  Build completed successfully
@@ -1,6 +1,6 @@
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.76.7 formatter:check /home/runner/_work/platforma/platforma/sdk/ui-vue
3
+ > @platforma-sdk/ui-vue@1.77.0 formatter:check /home/runner/_work/platforma/platforma/sdk/ui-vue
4
4
  > ts-builder formatter --check
5
5
 
6
6
  Checking formatting...
@@ -8,5 +8,5 @@ Checking formatting...
8
8
  Checking formatting...
9
9
 
10
10
  All matched files use the correct format.
11
- Finished in 1076ms on 137 files using 8 threads.
11
+ Finished in 2677ms on 137 files using 8 threads.
12
12
  Format check completed successfully
@@ -1,10 +1,10 @@
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.76.7 linter:check /home/runner/_work/platforma/platforma/sdk/ui-vue
3
+ > @platforma-sdk/ui-vue@1.77.0 linter:check /home/runner/_work/platforma/platforma/sdk/ui-vue
4
4
  > ts-builder linter --check
5
5
 
6
6
  Linting project...
7
7
  ↳ oxlint --config /home/runner/_work/platforma/platforma/sdk/ui-vue/.oxlintrc.json --deny-warnings
8
8
  Found 0 warnings and 0 errors.
9
- Finished in 25ms on 120 files with 98 rules using 8 threads.
9
+ Finished in 33ms on 120 files with 98 rules using 8 threads.
10
10
  Linting completed successfully
@@ -1,6 +1,6 @@
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.76.7 types:check /home/runner/_work/platforma/platforma/sdk/ui-vue
3
+ > @platforma-sdk/ui-vue@1.77.0 types:check /home/runner/_work/platforma/platforma/sdk/ui-vue
4
4
  > ts-builder type-check --target browser-lib
5
5
 
6
6
  ↳ vue-tsc.js --noEmit --project ./tsconfig.json --customConditions ,
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @platforma-sdk/ui-vue
2
2
 
3
+ ## 1.77.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f302c2f: PlAgDataTableV2: shrink persisted grid colIds by ~16×
8
+
9
+ The AG Grid `colId` produced by `PlAgDataTableV2` is now `canonicalizeJson<PTableColumnId>(getPTableColumnId(spec))` instead of `canonicalizeJson<PTableColumnSpec>(spec)`. The full column spec (including all annotations and the `pl7.app/trace` chain) used to be embedded in every entry of `orderedColIds` and `hiddenColIds`; for tables with ~1,500+ columns this could push persisted block storage past 10 MB and trip the QuickJS heap cap during `mutate-block-storage`.
10
+
11
+ Measured on a real ~1,600-column overlap table: persisted block-storage payload drops from 11.5 MB to 0.7 MB.
12
+
13
+ The full `PTableColumnSpec` remains available on each `ColDef.context` for callsites that have a live ColDef (`useFilterableColumns`, CSV export). State-only callsites (sort model, hidden column ids) now parse the colId directly as a `PTableColumnId` instead of a full spec.
14
+
15
+ State version bumped to 7; a v6→v7 migration rewrites every persisted colId in place. v4 and v5 chains pass through v6 first.
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies [f302c2f]
20
+ - Updated dependencies [f302c2f]
21
+ - @platforma-sdk/model@1.77.0
22
+ - @milaboratories/uikit@2.14.10
23
+
3
24
  ## 1.76.7
4
25
 
5
26
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"export-csv.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgCsvExporter/export-csv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EAEtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAI9C,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,YAAY,CAAC;IAC1B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,SAAS,GAAG,qBAAqB,CAAC,CAiC5C;AAUD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAO9C;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,gBAAgB,EAAE,EACzB,UAAU,EAAE,gBAAgB,GAC3B,GAAG,GAAG,MAAM,EAAE,CAkBhB"}
1
+ {"version":3,"file":"export-csv.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgCsvExporter/export-csv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAI9C,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,YAAY,CAAC;IAC1B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,SAAS,GAAG,qBAAqB,CAAC,CAiC5C;AAUD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAO9C;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,gBAAgB,EAAE,EACzB,UAAU,EAAE,gBAAgB,GAC3B,GAAG,GAAG,MAAM,EAAE,CAkBhB"}
@@ -1,41 +1,41 @@
1
1
  import { getServices as e } from "../../internal/getServices.js";
2
2
  import "../PlAgDataTable/sources/row-number.js";
3
3
  import "../PlAgDataTable/index.js";
4
- import { getPTableColumnId as t, parseJson as n } from "@platforma-sdk/model";
5
- import { isNil as r } from "es-toolkit";
4
+ import { getPTableColumnId as t } from "@platforma-sdk/model";
5
+ import { isNil as n } from "es-toolkit";
6
6
  //#region src/components/PlAgCsvExporter/export-csv.ts
7
- async function i(t, n) {
8
- let { dialog: i, pframe: o, pframeSpec: c } = e();
9
- if (r(i)) throw Error("dialog service is not available in the current environment");
10
- if (r(o)) throw Error("pframe service is not available");
11
- if (r(c)) throw Error("pframeSpec service is not available");
12
- let l = s(t, await o.getSpec(n.tableHandle), c);
13
- if (r(l)) return;
14
- let { canceled: u, path: d } = await i.showSaveDialog({ defaultFileName: (n.defaultFileName ?? `table_${a(/* @__PURE__ */ new Date())}`) + `.${n.format}.gz` });
15
- if (!(u || r(d))) return o.writePTableToFs(n.tableHandle, {
7
+ async function r(t, r) {
8
+ let { dialog: a, pframe: s, pframeSpec: c } = e();
9
+ if (n(a)) throw Error("dialog service is not available in the current environment");
10
+ if (n(s)) throw Error("pframe service is not available");
11
+ if (n(c)) throw Error("pframeSpec service is not available");
12
+ let l = o(t, await s.getSpec(r.tableHandle), c);
13
+ if (n(l)) return;
14
+ let { canceled: u, path: d } = await a.showSaveDialog({ defaultFileName: (r.defaultFileName ?? `table_${i(/* @__PURE__ */ new Date())}`) + `.${r.format}.gz` });
15
+ if (!(u || n(d))) return s.writePTableToFs(r.tableHandle, {
16
16
  path: d,
17
- format: n.format,
17
+ format: r.format,
18
18
  columnIndices: l,
19
19
  compression: { type: "gzip" }
20
20
  });
21
21
  }
22
- function a(e) {
22
+ function i(e) {
23
23
  let t = (e) => String(e).padStart(2, "0");
24
24
  return `${t(e.getDate())}-${t(e.getMonth() + 1)}-${e.getFullYear()}_${t(e.getHours())}-${t(e.getMinutes())}-${t(e.getSeconds())}`;
25
25
  }
26
- function o() {
26
+ function a() {
27
27
  try {
28
28
  let t = e();
29
- return !r(t?.dialog) && !r(t?.pframe);
29
+ return !n(t?.dialog) && !n(t?.pframe);
30
30
  } catch {
31
31
  return !1;
32
32
  }
33
33
  }
34
- function s(e, i, a) {
35
- let o = e.getColumnDefs();
36
- return r(o) ? void 0 : [...new Set(o.flatMap((e) => "children" in e || e.hide === !0 || r(e.colId) || e.colId === "\"##RowNumberColumnId##\"" ? [] : [n(e.colId)]).map((e) => a.findTableColumn(i, t(e))))].filter((e) => e !== -1);
34
+ function o(e, r, i) {
35
+ let a = e.getColumnDefs();
36
+ return n(a) ? void 0 : [...new Set(a.flatMap((e) => "children" in e || e.hide === !0 || n(e.colId) || e.colId === "\"##RowNumberColumnId##\"" ? [] : [e.context]).map((e) => i.findTableColumn(r, t(e))))].filter((e) => e !== -1);
37
37
  }
38
38
  //#endregion
39
- export { i as exportCsv, o as isCsvExportAvailable };
39
+ export { r as exportCsv, a as isCsvExportAvailable };
40
40
 
41
41
  //# sourceMappingURL=export-csv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"export-csv.js","names":[],"sources":["../../../src/components/PlAgCsvExporter/export-csv.ts"],"sourcesContent":["import { type ColDef, type ColGroupDef, type GridApi } from \"ag-grid-enterprise\";\nimport type {\n PTableHandle,\n PTableDownloadFormat,\n PTableColumnSpec,\n PFrameSpecDriver,\n WritePTableToFsResult,\n PlTableColumnIdJson,\n} from \"@platforma-sdk/model\";\nimport { getPTableColumnId, parseJson } from \"@platforma-sdk/model\";\nimport { isNil } from \"es-toolkit\";\nimport { Nil } from \"@milaboratories/helpers\";\nimport { getServices } from \"../../internal/getServices\";\nimport { PlAgDataTableRowNumberColId } from \"../PlAgDataTable\";\n\n/** Options for the native CSV export path. */\nexport interface ExportOptions {\n tableHandle: PTableHandle;\n format: PTableDownloadFormat;\n defaultFileName?: string;\n}\n\n/**\n * CSV export via the platforma desktop runtime. Prompts for a save\n * destination via the `Dialog` service, then streams the PTable to the\n * chosen path via `PFrame.writePTableToFs`.\n */\nexport async function exportCsv(\n gridApi: GridApi,\n nativeOptions: ExportOptions,\n): Promise<undefined | WritePTableToFsResult> {\n const { dialog, pframe, pframeSpec } = getServices();\n if (isNil(dialog)) {\n throw new Error(\"dialog service is not available in the current environment\");\n }\n if (isNil(pframe)) {\n throw new Error(\"pframe service is not available\");\n }\n if (isNil(pframeSpec)) {\n throw new Error(\"pframeSpec service is not available\");\n }\n\n const specs = await pframe.getSpec(nativeOptions.tableHandle);\n const columnIndices = collectVisibleColumnIndices(gridApi, specs, pframeSpec);\n if (isNil(columnIndices)) {\n return undefined;\n }\n\n const { canceled, path } = await dialog.showSaveDialog({\n defaultFileName:\n (nativeOptions.defaultFileName ?? `table_${formatTimestamp(new Date())}`) +\n `.${nativeOptions.format}.gz`,\n });\n if (canceled || isNil(path)) {\n return undefined;\n }\n\n return pframe.writePTableToFs(nativeOptions.tableHandle, {\n path,\n format: nativeOptions.format,\n columnIndices,\n compression: { type: \"gzip\" },\n });\n}\n\nfunction formatTimestamp(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return (\n `${pad(d.getDate())}-${pad(d.getMonth() + 1)}-${d.getFullYear()}` +\n `_${pad(d.getHours())}-${pad(d.getMinutes())}-${pad(d.getSeconds())}`\n );\n}\n\n/**\n * Checks whether the native CSV export capability is available in the\n * current platforma runtime environment. Both `Dialog` and `PFrame`\n * services must be present — desktop-app wires them, web/preview do not.\n */\nexport function isCsvExportAvailable(): boolean {\n try {\n const services = getServices();\n return !isNil(services?.dialog) && !isNil(services?.pframe);\n } catch {\n return false;\n }\n}\n\n/**\n * Collect unified column indices for visible (non-hidden) columns from the\n * ag-grid column defs, remapped onto the provided PTable spec array so the\n * indices match the current table handle (ColDef.field indices may be stale\n * or diverge from the spec order).\n */\nexport function collectVisibleColumnIndices(\n gridApi: GridApi,\n specs: PTableColumnSpec[],\n pframeSpec: PFrameSpecDriver,\n): Nil | number[] {\n const columnDefs = gridApi.getColumnDefs();\n if (isNil(columnDefs)) {\n return;\n }\n\n const findIndex = (spec: PTableColumnSpec) =>\n pframeSpec.findTableColumn(specs, getPTableColumnId(spec));\n\n const specsForDef = (def: ColDef | ColGroupDef): PTableColumnSpec[] => {\n if (\"children\" in def) return [];\n if (def.hide === true) return [];\n if (isNil(def.colId)) return [];\n if (def.colId === PlAgDataTableRowNumberColId) return [];\n return [parseJson(def.colId as PlTableColumnIdJson)];\n };\n\n return [...new Set(columnDefs.flatMap(specsForDef).map(findIndex))].filter((idx) => idx !== -1);\n}\n"],"mappings":";;;;;;AA2BA,eAAsB,EACpB,GACA,GAC4C;CAC5C,IAAM,EAAE,WAAQ,WAAQ,kBAAe,GAAa;AACpD,KAAI,EAAM,EAAO,CACf,OAAU,MAAM,6DAA6D;AAE/E,KAAI,EAAM,EAAO,CACf,OAAU,MAAM,kCAAkC;AAEpD,KAAI,EAAM,EAAW,CACnB,OAAU,MAAM,sCAAsC;CAIxD,IAAM,IAAgB,EAA4B,GADpC,MAAM,EAAO,QAAQ,EAAc,YAAY,EACK,EAAW;AAC7E,KAAI,EAAM,EAAc,CACtB;CAGF,IAAM,EAAE,aAAU,YAAS,MAAM,EAAO,eAAe,EACrD,kBACG,EAAc,mBAAmB,SAAS,kBAAgB,IAAI,MAAM,CAAC,MACtE,IAAI,EAAc,OAAO,MAC5B,CAAC;AACE,YAAY,EAAM,EAAK,EAI3B,QAAO,EAAO,gBAAgB,EAAc,aAAa;EACvD;EACA,QAAQ,EAAc;EACtB;EACA,aAAa,EAAE,MAAM,QAAQ;EAC9B,CAAC;;AAGJ,SAAS,EAAgB,GAAiB;CACxC,IAAM,KAAO,MAAc,OAAO,EAAE,CAAC,SAAS,GAAG,IAAI;AACrD,QACE,GAAG,EAAI,EAAE,SAAS,CAAC,CAAC,GAAG,EAAI,EAAE,UAAU,GAAG,EAAE,CAAC,GAAG,EAAE,aAAa,CAAA,GAC3D,EAAI,EAAE,UAAU,CAAC,CAAC,GAAG,EAAI,EAAE,YAAY,CAAC,CAAC,GAAG,EAAI,EAAE,YAAY,CAAC;;AASvE,SAAgB,IAAgC;AAC9C,KAAI;EACF,IAAM,IAAW,GAAa;AAC9B,SAAO,CAAC,EAAM,GAAU,OAAO,IAAI,CAAC,EAAM,GAAU,OAAO;SACrD;AACN,SAAO;;;AAUX,SAAgB,EACd,GACA,GACA,GACgB;CAChB,IAAM,IAAa,EAAQ,eAAe;AAgB1C,QAfI,EAAM,EAAW,GACnB,SAcK,CAAC,GAAG,IAAI,IAAI,EAAW,SART,MACf,cAAc,KACd,EAAI,SAAS,MACb,EAAM,EAAI,MAAM,IAChB,EAAI,UAAA,8BAA8C,EAAE,GACjD,CAAC,EAAU,EAAI,MAA6B,CAAC,CAGJ,CAAC,KAXhC,MACjB,EAAW,gBAAgB,GAAO,EAAkB,EAAK,CAAC,CAUK,CAAC,CAAC,CAAC,QAAQ,MAAQ,MAAQ,GAAG"}
1
+ {"version":3,"file":"export-csv.js","names":[],"sources":["../../../src/components/PlAgCsvExporter/export-csv.ts"],"sourcesContent":["import { type ColDef, type ColGroupDef, type GridApi } from \"ag-grid-enterprise\";\nimport type {\n PTableHandle,\n PTableDownloadFormat,\n PTableColumnSpec,\n PFrameSpecDriver,\n WritePTableToFsResult,\n} from \"@platforma-sdk/model\";\nimport { getPTableColumnId } from \"@platforma-sdk/model\";\nimport { isNil } from \"es-toolkit\";\nimport { Nil } from \"@milaboratories/helpers\";\nimport { getServices } from \"../../internal/getServices\";\nimport { PlAgDataTableRowNumberColId } from \"../PlAgDataTable\";\n\n/** Options for the native CSV export path. */\nexport interface ExportOptions {\n tableHandle: PTableHandle;\n format: PTableDownloadFormat;\n defaultFileName?: string;\n}\n\n/**\n * CSV export via the platforma desktop runtime. Prompts for a save\n * destination via the `Dialog` service, then streams the PTable to the\n * chosen path via `PFrame.writePTableToFs`.\n */\nexport async function exportCsv(\n gridApi: GridApi,\n nativeOptions: ExportOptions,\n): Promise<undefined | WritePTableToFsResult> {\n const { dialog, pframe, pframeSpec } = getServices();\n if (isNil(dialog)) {\n throw new Error(\"dialog service is not available in the current environment\");\n }\n if (isNil(pframe)) {\n throw new Error(\"pframe service is not available\");\n }\n if (isNil(pframeSpec)) {\n throw new Error(\"pframeSpec service is not available\");\n }\n\n const specs = await pframe.getSpec(nativeOptions.tableHandle);\n const columnIndices = collectVisibleColumnIndices(gridApi, specs, pframeSpec);\n if (isNil(columnIndices)) {\n return undefined;\n }\n\n const { canceled, path } = await dialog.showSaveDialog({\n defaultFileName:\n (nativeOptions.defaultFileName ?? `table_${formatTimestamp(new Date())}`) +\n `.${nativeOptions.format}.gz`,\n });\n if (canceled || isNil(path)) {\n return undefined;\n }\n\n return pframe.writePTableToFs(nativeOptions.tableHandle, {\n path,\n format: nativeOptions.format,\n columnIndices,\n compression: { type: \"gzip\" },\n });\n}\n\nfunction formatTimestamp(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return (\n `${pad(d.getDate())}-${pad(d.getMonth() + 1)}-${d.getFullYear()}` +\n `_${pad(d.getHours())}-${pad(d.getMinutes())}-${pad(d.getSeconds())}`\n );\n}\n\n/**\n * Checks whether the native CSV export capability is available in the\n * current platforma runtime environment. Both `Dialog` and `PFrame`\n * services must be present — desktop-app wires them, web/preview do not.\n */\nexport function isCsvExportAvailable(): boolean {\n try {\n const services = getServices();\n return !isNil(services?.dialog) && !isNil(services?.pframe);\n } catch {\n return false;\n }\n}\n\n/**\n * Collect unified column indices for visible (non-hidden) columns from the\n * ag-grid column defs, remapped onto the provided PTable spec array so the\n * indices match the current table handle (ColDef.field indices may be stale\n * or diverge from the spec order).\n */\nexport function collectVisibleColumnIndices(\n gridApi: GridApi,\n specs: PTableColumnSpec[],\n pframeSpec: PFrameSpecDriver,\n): Nil | number[] {\n const columnDefs = gridApi.getColumnDefs();\n if (isNil(columnDefs)) {\n return;\n }\n\n const findIndex = (spec: PTableColumnSpec) =>\n pframeSpec.findTableColumn(specs, getPTableColumnId(spec));\n\n const specsForDef = (def: ColDef | ColGroupDef): PTableColumnSpec[] => {\n if (\"children\" in def) return [];\n if (def.hide === true) return [];\n if (isNil(def.colId)) return [];\n if (def.colId === PlAgDataTableRowNumberColId) return [];\n return [def.context as PTableColumnSpec];\n };\n\n return [...new Set(columnDefs.flatMap(specsForDef).map(findIndex))].filter((idx) => idx !== -1);\n}\n"],"mappings":";;;;;;AA0BA,eAAsB,EACpB,GACA,GAC4C;CAC5C,IAAM,EAAE,WAAQ,WAAQ,kBAAe,GAAa;AACpD,KAAI,EAAM,EAAO,CACf,OAAU,MAAM,6DAA6D;AAE/E,KAAI,EAAM,EAAO,CACf,OAAU,MAAM,kCAAkC;AAEpD,KAAI,EAAM,EAAW,CACnB,OAAU,MAAM,sCAAsC;CAIxD,IAAM,IAAgB,EAA4B,GADpC,MAAM,EAAO,QAAQ,EAAc,YAAY,EACK,EAAW;AAC7E,KAAI,EAAM,EAAc,CACtB;CAGF,IAAM,EAAE,aAAU,YAAS,MAAM,EAAO,eAAe,EACrD,kBACG,EAAc,mBAAmB,SAAS,kBAAgB,IAAI,MAAM,CAAC,MACtE,IAAI,EAAc,OAAO,MAC5B,CAAC;AACE,YAAY,EAAM,EAAK,EAI3B,QAAO,EAAO,gBAAgB,EAAc,aAAa;EACvD;EACA,QAAQ,EAAc;EACtB;EACA,aAAa,EAAE,MAAM,QAAQ;EAC9B,CAAC;;AAGJ,SAAS,EAAgB,GAAiB;CACxC,IAAM,KAAO,MAAc,OAAO,EAAE,CAAC,SAAS,GAAG,IAAI;AACrD,QACE,GAAG,EAAI,EAAE,SAAS,CAAC,CAAC,GAAG,EAAI,EAAE,UAAU,GAAG,EAAE,CAAC,GAAG,EAAE,aAAa,CAAA,GAC3D,EAAI,EAAE,UAAU,CAAC,CAAC,GAAG,EAAI,EAAE,YAAY,CAAC,CAAC,GAAG,EAAI,EAAE,YAAY,CAAC;;AASvE,SAAgB,IAAgC;AAC9C,KAAI;EACF,IAAM,IAAW,GAAa;AAC9B,SAAO,CAAC,EAAM,GAAU,OAAO,IAAI,CAAC,EAAM,GAAU,OAAO;SACrD;AACN,SAAO;;;AAUX,SAAgB,EACd,GACA,GACA,GACgB;CAChB,IAAM,IAAa,EAAQ,eAAe;AAgB1C,QAfI,EAAM,EAAW,GACnB,SAcK,CAAC,GAAG,IAAI,IAAI,EAAW,SART,MACf,cAAc,KACd,EAAI,SAAS,MACb,EAAM,EAAI,MAAM,IAChB,EAAI,UAAA,8BAA8C,EAAE,GACjD,CAAC,EAAI,QAA4B,CAGQ,CAAC,KAXhC,MACjB,EAAW,gBAAgB,GAAO,EAAkB,EAAK,CAAC,CAUK,CAAC,CAAC,CAAC,QAAQ,MAAQ,MAAQ,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFilterableColumns.d.ts","sourceRoot":"","sources":["../../../../src/components/PlAgDataTable/compositions/useFilterableColumns.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,gBAAgB,EAChB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAe,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,EAChC,aAAa,EAAE,MAAM,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,kBAAkB,EAAE,WAAW,GAAG,YAAY,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BjG"}
1
+ {"version":3,"file":"useFilterableColumns.d.ts","sourceRoot":"","sources":["../../../../src/components/PlAgDataTable/compositions/useFilterableColumns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAe,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,EAChC,aAAa,EAAE,MAAM,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,kBAAkB,EAAE,WAAW,GAAG,YAAY,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BjG"}
@@ -1,30 +1,29 @@
1
1
  import "../sources/row-number.js";
2
2
  import { ref as e } from "vue";
3
- import { parseJson as t } from "@platforma-sdk/model";
4
- import { isNil as n } from "es-toolkit";
5
- import { watchCached as r } from "@milaboratories/uikit";
3
+ import { isNil as t } from "es-toolkit";
4
+ import { watchCached as n } from "@milaboratories/uikit";
6
5
  //#region src/components/PlAgDataTable/compositions/useFilterableColumns.ts
7
- function i(i, o) {
8
- let s = e([]), c = e([]);
9
- return r(() => [o(), i()], ([e, r]) => {
10
- if (n(r)) {
11
- s.value = [], c.value = [];
6
+ function r(r, a) {
7
+ let o = e([]), s = e([]);
8
+ return n(() => [a(), r()], ([e, n]) => {
9
+ if (t(n)) {
10
+ o.value = [], s.value = [];
12
11
  return;
13
12
  }
14
- let i = a(e).filter((e) => !n(e.colId)).map((e) => ({
15
- item: t(e.colId),
13
+ let r = i(e).filter((e) => !t(e.colId)).map((e) => ({
14
+ item: e.context,
16
15
  hide: e.hide
17
16
  }));
18
- s.value = i.map((e) => e.item), c.value = i.filter((e) => !e.hide).map((e) => e.item);
19
- }, { immediate: !0 }), [s, c];
17
+ o.value = r.map((e) => e.item), s.value = r.filter((e) => !e.hide).map((e) => e.item);
18
+ }, { immediate: !0 }), [o, s];
20
19
  }
21
- function a(e) {
22
- return e ? e.filter(o).filter((e) => e.colId && e.colId !== "\"##RowNumberColumnId##\"") : [];
20
+ function i(e) {
21
+ return e ? e.filter(a).filter((e) => e.colId && e.colId !== "\"##RowNumberColumnId##\"") : [];
23
22
  }
24
- function o(e) {
23
+ function a(e) {
25
24
  return !("children" in e);
26
25
  }
27
26
  //#endregion
28
- export { i as useFilterableColumns };
27
+ export { r as useFilterableColumns };
29
28
 
30
29
  //# sourceMappingURL=useFilterableColumns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFilterableColumns.js","names":[],"sources":["../../../../src/components/PlAgDataTable/compositions/useFilterableColumns.ts"],"sourcesContent":["import { isNil } from \"es-toolkit\";\nimport {\n parseJson,\n PlTableColumnIdJson,\n PTableColumnSpec,\n PTableValue,\n} from \"@platforma-sdk/model\";\nimport { ref } from \"vue\";\nimport { PTableHidden } from \"../sources/common\";\nimport { watchCached } from \"@milaboratories/uikit\";\nimport { ColDef, ColGroupDef } from \"ag-grid-enterprise\";\nimport { PlAgDataTableRowNumberColId } from \"../sources/row-number\";\nimport { PlAgDataTableV2Row } from \"../types\";\n\nexport function useFilterableColumns(\n getSourceId: () => string | null,\n getColumnDefs: () => null | undefined | ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[],\n) {\n const filterableColumns = ref<PTableColumnSpec[]>([]);\n const visibleFilterableColumns = ref<PTableColumnSpec[]>([]);\n\n // Propagate columns for filter component\n watchCached(\n () => [getColumnDefs(), getSourceId()] as const,\n ([columnDefs, sourceId]) => {\n if (isNil(sourceId)) {\n filterableColumns.value = [];\n visibleFilterableColumns.value = [];\n return;\n }\n\n const dataColDefs = getDataColDefs(columnDefs);\n const cols = dataColDefs\n .filter((def): def is typeof def & { colId: string } => !isNil(def.colId))\n .map((def) => ({\n item: parseJson(def.colId satisfies string as PlTableColumnIdJson),\n hide: def.hide,\n }));\n\n filterableColumns.value = cols.map((c) => c.item);\n visibleFilterableColumns.value = cols.filter((c) => !c.hide).map((c) => c.item);\n },\n { immediate: true },\n );\n\n return [filterableColumns, visibleFilterableColumns] as const;\n}\n\nfunction getDataColDefs(\n columnDefs: ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] | null | undefined,\n): ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] {\n if (!columnDefs) return [];\n return columnDefs\n .filter(isColDef)\n .filter((def) => def.colId && def.colId !== PlAgDataTableRowNumberColId);\n}\n\nfunction isColDef<TData, TValue>(\n def: ColDef<TData, TValue> | ColGroupDef<TData>,\n): def is ColDef<TData, TValue> {\n return !(\"children\" in def);\n}\n"],"mappings":";;;;;;AAcA,SAAgB,EACd,GACA,GACA;CACA,IAAM,IAAoB,EAAwB,EAAE,CAAC,EAC/C,IAA2B,EAAwB,EAAE,CAAC;AA0B5D,QAvBA,QACQ,CAAC,GAAe,EAAE,GAAa,CAAC,GACrC,CAAC,GAAY,OAAc;AAC1B,MAAI,EAAM,EAAS,EAAE;AAEnB,GADA,EAAkB,QAAQ,EAAE,EAC5B,EAAyB,QAAQ,EAAE;AACnC;;EAIF,IAAM,IADc,EAAe,EAAW,CAE3C,QAAQ,MAA+C,CAAC,EAAM,EAAI,MAAM,CAAC,CACzE,KAAK,OAAS;GACb,MAAM,EAAU,EAAI,MAA8C;GAClE,MAAM,EAAI;GACX,EAAE;AAGL,EADA,EAAkB,QAAQ,EAAK,KAAK,MAAM,EAAE,KAAK,EACjD,EAAyB,QAAQ,EAAK,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,MAAM,EAAE,KAAK;IAEjF,EAAE,WAAW,IAAM,CACpB,EAEM,CAAC,GAAmB,EAAyB;;AAGtD,SAAS,EACP,GAC0D;AAE1D,QADK,IACE,EACJ,OAAO,EAAS,CAChB,QAAQ,MAAQ,EAAI,SAAS,EAAI,UAAA,4BAAsC,GAHlD,EAAE;;AAM5B,SAAS,EACP,GAC8B;AAC9B,QAAO,EAAE,cAAc"}
1
+ {"version":3,"file":"useFilterableColumns.js","names":[],"sources":["../../../../src/components/PlAgDataTable/compositions/useFilterableColumns.ts"],"sourcesContent":["import { isNil } from \"es-toolkit\";\nimport { PTableColumnSpec, PTableValue } from \"@platforma-sdk/model\";\nimport { ref } from \"vue\";\nimport { PTableHidden } from \"../sources/common\";\nimport { watchCached } from \"@milaboratories/uikit\";\nimport { ColDef, ColGroupDef } from \"ag-grid-enterprise\";\nimport { PlAgDataTableRowNumberColId } from \"../sources/row-number\";\nimport { PlAgDataTableV2Row } from \"../types\";\n\nexport function useFilterableColumns(\n getSourceId: () => string | null,\n getColumnDefs: () => null | undefined | ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[],\n) {\n const filterableColumns = ref<PTableColumnSpec[]>([]);\n const visibleFilterableColumns = ref<PTableColumnSpec[]>([]);\n\n // Propagate columns for filter component\n watchCached(\n () => [getColumnDefs(), getSourceId()] as const,\n ([columnDefs, sourceId]) => {\n if (isNil(sourceId)) {\n filterableColumns.value = [];\n visibleFilterableColumns.value = [];\n return;\n }\n\n const dataColDefs = getDataColDefs(columnDefs);\n const cols = dataColDefs\n .filter((def): def is typeof def & { colId: string } => !isNil(def.colId))\n .map((def) => ({\n item: def.context as PTableColumnSpec,\n hide: def.hide,\n }));\n\n filterableColumns.value = cols.map((c) => c.item);\n visibleFilterableColumns.value = cols.filter((c) => !c.hide).map((c) => c.item);\n },\n { immediate: true },\n );\n\n return [filterableColumns, visibleFilterableColumns] as const;\n}\n\nfunction getDataColDefs(\n columnDefs: ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] | null | undefined,\n): ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] {\n if (!columnDefs) return [];\n return columnDefs\n .filter(isColDef)\n .filter((def) => def.colId && def.colId !== PlAgDataTableRowNumberColId);\n}\n\nfunction isColDef<TData, TValue>(\n def: ColDef<TData, TValue> | ColGroupDef<TData>,\n): def is ColDef<TData, TValue> {\n return !(\"children\" in def);\n}\n"],"mappings":";;;;;AASA,SAAgB,EACd,GACA,GACA;CACA,IAAM,IAAoB,EAAwB,EAAE,CAAC,EAC/C,IAA2B,EAAwB,EAAE,CAAC;AA0B5D,QAvBA,QACQ,CAAC,GAAe,EAAE,GAAa,CAAC,GACrC,CAAC,GAAY,OAAc;AAC1B,MAAI,EAAM,EAAS,EAAE;AAEnB,GADA,EAAkB,QAAQ,EAAE,EAC5B,EAAyB,QAAQ,EAAE;AACnC;;EAIF,IAAM,IADc,EAAe,EAAW,CAE3C,QAAQ,MAA+C,CAAC,EAAM,EAAI,MAAM,CAAC,CACzE,KAAK,OAAS;GACb,MAAM,EAAI;GACV,MAAM,EAAI;GACX,EAAE;AAGL,EADA,EAAkB,QAAQ,EAAK,KAAK,MAAM,EAAE,KAAK,EACjD,EAAyB,QAAQ,EAAK,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,MAAM,EAAE,KAAK;IAEjF,EAAE,WAAW,IAAM,CACpB,EAEM,CAAC,GAAmB,EAAyB;;AAGtD,SAAS,EACP,GAC0D;AAE1D,QADK,IACE,EACJ,OAAO,EAAS,CAChB,QAAQ,MAAQ,EAAI,SAAS,EAAI,UAAA,4BAAsC,GAHlD,EAAE;;AAM5B,SAAS,EACP,GAC8B;AAC9B,QAAO,EAAE,cAAc"}
@@ -69,56 +69,56 @@ async function w({ generation: r, pfDriver: i, sheets: a, fullTableHandle: o, vi
69
69
  } }
70
70
  };
71
71
  }
72
- function T(t, n, o, f) {
73
- let p = u(n), m = n.type === "axis" ? n.spec.type : n.spec.valueType, g = s(n), _ = {};
74
- g.fontFamily && (g.fontFamily === "monospace" ? (_.fontFamily = "Spline Sans Mono", _.fontWeight = 300) : _.fontFamily = g.fontFamily);
75
- let v = y(n.spec, c.Label)?.trim() ?? `Unlabeled ${n.type} ${t}`;
72
+ function T(t, n, o, p) {
73
+ let m = u(f(n)), g = n.type === "axis" ? n.spec.type : n.spec.valueType, _ = s(n), v = {};
74
+ _.fontFamily && (_.fontFamily === "monospace" ? (v.fontFamily = "Spline Sans Mono", v.fontWeight = 300) : v.fontFamily = _.fontFamily);
75
+ let b = y(n.spec, c.Label)?.trim() ?? `Unlabeled ${n.type} ${t}`;
76
76
  return {
77
- colId: p,
77
+ colId: m,
78
78
  mainMenuItems: r,
79
79
  context: n,
80
80
  field: `${t}`,
81
- headerName: v,
81
+ headerName: b,
82
82
  lockPosition: n.type === "axis" || h(n.spec) && n.spec.axesSpec.length === 1,
83
- hide: o !== void 0 && o.includes(p),
84
- valueFormatter: g.valueFormatter,
83
+ hide: o !== void 0 && o.includes(m),
84
+ valueFormatter: _.valueFormatter,
85
85
  headerComponent: i,
86
- cellRendererSelector: f?.showCellButtonForAxisId ? () => {
86
+ cellRendererSelector: p?.showCellButtonForAxisId ? () => {
87
87
  let t = n.type === "axis" ? n.id : h(n.spec) && n.spec.axesSpec.length === 1 ? d(n.spec.axesSpec[0]) : void 0;
88
- if (t && e(t, f.showCellButtonForAxisId)) return {
88
+ if (t && e(t, p.showCellButtonForAxisId)) return {
89
89
  component: a,
90
90
  params: {
91
- invokeRowsOnDoubleClick: f.cellButtonInvokeRowsOnDoubleClick,
91
+ invokeRowsOnDoubleClick: p.cellButtonInvokeRowsOnDoubleClick,
92
92
  onClick: (e) => {
93
- f.trigger(e.data?.axesKey);
93
+ p.trigger(e.data?.axesKey);
94
94
  }
95
95
  }
96
96
  };
97
97
  } : void 0,
98
- cellStyle: _,
98
+ cellStyle: v,
99
99
  headerComponentParams: {
100
100
  type: (() => {
101
- switch (m) {
101
+ switch (g) {
102
102
  case l.Int:
103
103
  case l.Long:
104
104
  case l.Float:
105
105
  case l.Double: return "Number";
106
106
  case l.String:
107
107
  case l.Bytes: return "Text";
108
- default: throw Error(`unsupported data type: ${m}`);
108
+ default: throw Error(`unsupported data type: ${g}`);
109
109
  }
110
110
  })(),
111
111
  tooltip: y(n.spec, c.Description)?.trim()
112
112
  },
113
113
  cellDataType: (() => {
114
- switch (m) {
114
+ switch (g) {
115
115
  case l.Int:
116
116
  case l.Long:
117
117
  case l.Float:
118
118
  case l.Double: return "number";
119
119
  case l.String:
120
120
  case l.Bytes: return "text";
121
- default: throw Error(`unsupported data type: ${m}`);
121
+ default: throw Error(`unsupported data type: ${g}`);
122
122
  }
123
123
  })()
124
124
  };
@@ -170,7 +170,7 @@ function A(e, t) {
170
170
  function j(e, t) {
171
171
  return e.reduce((e, n) => {
172
172
  let r = t[n];
173
- return r.type === "column" && m(r.spec) ? [...e, u(r)] : e;
173
+ return r.type === "column" && m(r.spec) ? [...e, u(f(r))] : e;
174
174
  }, []);
175
175
  }
176
176
  function M(e) {
@@ -1 +1 @@
1
- {"version":3,"file":"table-source-v2.js","names":[],"sources":["../../../../src/components/PlAgDataTable/sources/table-source-v2.ts"],"sourcesContent":["import type {\n AxesSpec,\n PTableColumnId,\n PTableColumnSpecAxis,\n PTableColumnSpecColumn,\n PTableHandle,\n PTableValue,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n getAxisId,\n pTableValue,\n type PFrameDriver,\n type PlDataTableSheet,\n type PTableVector,\n type AxisId,\n type PTableColumnSpec,\n type PTableKey,\n type PlTableColumnIdJson,\n isLabelColumn as isLabelColumnSpec,\n isLinkerColumn as isLinkerColumnSpec,\n isColumnHidden,\n isColumnOptional,\n matchAxisId,\n readAnnotation,\n readAnnotationJson,\n Annotation,\n ValueType,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport type {\n CellStyle,\n ColDef,\n GridApi,\n ICellRendererParams,\n IServerSideDatasource,\n IServerSideGetRowsParams,\n ManagedGridOptions,\n} from \"ag-grid-enterprise\";\nimport type { PlAgHeaderComponentParams, PlAgHeaderComponentType } from \"../../PlAgColumnHeader\";\nimport { PlAgColumnHeader } from \"../../PlAgColumnHeader\";\nimport { PlAgTextAndButtonCell } from \"../../PlAgTextAndButtonCell\";\nimport type { PlAgDataTableV2Row, PlTableRowId } from \"../types\";\nimport { PTableHidden } from \"./common\";\nimport { defaultMainMenuItems } from \"./menu-items\";\nimport { makeRowNumberColDef, PlAgDataTableRowNumberColId } from \"./row-number\";\nimport { getColumnRenderingSpec } from \"./value-rendering\";\nimport type { Ref } from \"vue\";\nimport { isJsonEqual } from \"@milaboratories/helpers\";\nimport type { DeferredCircular } from \"./focus-row\";\nimport { isNil, uniq } from \"es-toolkit\";\n\nexport function isLabelColumn(column: PTableColumnSpec): column is PTableColumnSpecColumn {\n return column.type === \"column\" && isLabelColumnSpec(column.spec);\n}\n\n/** Convert columnar data from the driver to rows, used by ag-grid */\nfunction columns2rows(\n fields: number[],\n columns: PTableVector[],\n fieldResultMapping: number[],\n axesResultIndices: number[],\n): PlAgDataTableV2Row[] {\n const rowData: PlAgDataTableV2Row[] = [];\n for (let rowIdx = 0; rowIdx < columns[0].data.length; ++rowIdx) {\n const axesKey: PTableKey = axesResultIndices.map((ri) => pTableValue(columns[ri], rowIdx));\n const id = canonicalizeJson<PlTableRowId>(axesKey);\n const row = fields.reduce<PlAgDataTableV2Row>(\n (acc, field, colIdx) => {\n acc[field.toString() as `${number}`] =\n fieldResultMapping[colIdx] === -1\n ? PTableHidden\n : pTableValue(columns[fieldResultMapping[colIdx]], rowIdx);\n return acc;\n },\n { id, axesKey },\n );\n\n rowData.push(row);\n }\n return rowData;\n}\n\n/** Calculate GridOptions for selected p-table data source */\nexport async function calculateGridOptions({\n generation,\n pfDriver,\n sheets,\n fullTableHandle,\n visibleTableHandle,\n dataRenderedTracker,\n hiddenColIds,\n cellButtonAxisParams,\n}: {\n sheets: PlDataTableSheet[];\n pfDriver: PFrameDriver;\n generation: Ref<number>;\n fullTableHandle: PTableHandle;\n visibleTableHandle: PTableHandle;\n dataRenderedTracker: DeferredCircular<GridApi<PlAgDataTableV2Row>>;\n hiddenColIds?: PlTableColumnIdJson[];\n cellButtonAxisParams?: PlAgCellButtonAxisParams;\n}): Promise<\n Pick<ManagedGridOptions<PlAgDataTableV2Row>, \"columnDefs\" | \"serverSideDatasource\"> & {\n axesSpec: AxesSpec;\n }\n> {\n const stateGeneration = generation.value;\n\n // get specs of the full table\n const [tableSpecs, visibleTableSpecs] = await Promise.all([\n pfDriver.getSpec(fullTableHandle),\n pfDriver.getSpec(visibleTableHandle),\n ]);\n\n if (stateGeneration !== generation.value) throw new Error(\"table state generation changed\");\n\n // index mapping from full specs to visible subset (hidden columns → -1)\n const specsToVisibleSpecsMapping = buildSpecsToVisibleSpecsMapping(tableSpecs, visibleTableSpecs);\n\n const isPartitionedAxis = createPartitionedAxisPredicate(sheets);\n\n // label columns indexed by labeled axis (used for displayability filter)\n const getLabelColumnIndex = collectLabelColumnsByAxis(tableSpecs, isPartitionedAxis);\n\n // displayable column indices ordered: axes first, then columns by OrderPriority\n const fields = sortIndicesByTypeAndPriority(\n selectDisplayableIndices(tableSpecs, isPartitionedAxis, getLabelColumnIndex),\n tableSpecs,\n );\n\n // default hidden columns derived from Optional annotation when no saved state\n const resolvedHiddenColIds = hiddenColIds ?? computeDefaultHiddenColIds(fields, tableSpecs);\n\n const columnDefs: ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] = [\n makeRowNumberColDef(),\n ...fields.map((field) =>\n makeColDef(field, tableSpecs[field], resolvedHiddenColIds, cellButtonAxisParams),\n ),\n ];\n\n // axes — taken directly from visible table (always present as part of join)\n const visibleAxes = collectVisibleAxes(visibleTableSpecs);\n\n // request indices: display fields + visible axes for row selection keys.\n const { requestIndices, axesResultIndices, fieldResultMapping } = buildRequestIndices(\n fields,\n visibleAxes.map(([idx]) => idx),\n specsToVisibleSpecsMapping,\n );\n\n let rowCount = -1;\n let lastParams: IServerSideGetRowsParams | undefined = undefined;\n const serverSideDatasource: IServerSideDatasource<PlAgDataTableV2Row> = {\n getRows: async (params: IServerSideGetRowsParams) => {\n if (stateGeneration !== generation.value) return params.fail();\n try {\n if (rowCount === -1) {\n const ptShape = await pfDriver.getShape(visibleTableHandle);\n if (stateGeneration !== generation.value || params.api.isDestroyed())\n return params.fail();\n rowCount = ptShape.rows;\n }\n\n if (rowCount == 0) {\n params.success({ rowData: [], rowCount });\n // Warning: AgGrid cannot show two overlays at once,\n // so first hide loading overlay, then show no rows overlay\n params.api.setGridOption(\"loading\", false);\n params.api.showNoRowsOverlay();\n return;\n }\n\n // If sort has changed - show skeletons instead of data\n if (lastParams && !isJsonEqual(lastParams.request.sortModel, params.request.sortModel)) {\n return params.success({ rowData: [], rowCount });\n }\n lastParams = params;\n\n let length = 0;\n let rowData: PlAgDataTableV2Row[] = [];\n if (\n rowCount > 0 &&\n params.request.startRow !== undefined &&\n params.request.endRow !== undefined\n ) {\n length = Math.min(rowCount, params.request.endRow) - params.request.startRow;\n if (length > 0) {\n const data = await pfDriver.getData(visibleTableHandle, requestIndices, {\n offset: params.request.startRow,\n length,\n });\n if (stateGeneration !== generation.value || params.api.isDestroyed())\n return params.fail();\n rowData = columns2rows(fields, data, fieldResultMapping, axesResultIndices);\n }\n }\n\n params.success({ rowData, rowCount });\n params.api.autoSizeColumns(\n params.api\n .getAllDisplayedColumns()\n .filter((column) => column.getColId() !== PlAgDataTableRowNumberColId),\n );\n params.api.setGridOption(\"loading\", false);\n dataRenderedTracker.resolve(params.api);\n } catch (error: unknown) {\n if (stateGeneration !== generation.value || params.api.isDestroyed()) return params.fail();\n params.api.setGridOption(\"loading\", true);\n params.fail();\n console.trace(error);\n }\n },\n };\n\n return {\n axesSpec: visibleAxes.map(([, { spec }]) => spec),\n columnDefs,\n serverSideDatasource,\n };\n}\n\nexport type PlAgCellButtonAxisParams = {\n showCellButtonForAxisId?: AxisId;\n cellButtonInvokeRowsOnDoubleClick?: boolean;\n trigger: (key?: PTableKey) => void;\n};\n\n/**\n * Calculates column definition for a given p-table column\n */\nexport function makeColDef(\n iCol: number,\n spec: PTableColumnSpec,\n hiddenColIds: PlTableColumnIdJson[] | undefined,\n cellButtonAxisParams?: PlAgCellButtonAxisParams,\n): ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden> {\n const colId = canonicalizeJson<PTableColumnSpec>(spec);\n const valueType = spec.type === \"axis\" ? spec.spec.type : spec.spec.valueType;\n const columnRenderingSpec = getColumnRenderingSpec(spec);\n const cellStyle: CellStyle = {};\n if (columnRenderingSpec.fontFamily) {\n if (columnRenderingSpec.fontFamily === \"monospace\") {\n cellStyle.fontFamily = \"Spline Sans Mono\";\n cellStyle.fontWeight = 300;\n } else {\n cellStyle.fontFamily = columnRenderingSpec.fontFamily;\n }\n }\n const headerName =\n readAnnotation(spec.spec, Annotation.Label)?.trim() ?? `Unlabeled ${spec.type} ${iCol}`;\n\n return {\n colId,\n mainMenuItems: defaultMainMenuItems,\n context: spec,\n field: `${iCol}`,\n headerName,\n lockPosition:\n spec.type === \"axis\" || (isLabelColumnSpec(spec.spec) && spec.spec.axesSpec.length === 1),\n hide: hiddenColIds !== undefined && hiddenColIds.includes(colId),\n valueFormatter: columnRenderingSpec.valueFormatter,\n headerComponent: PlAgColumnHeader,\n cellRendererSelector: cellButtonAxisParams?.showCellButtonForAxisId\n ? () => {\n const axisId =\n spec.type === \"axis\"\n ? spec.id\n : isLabelColumnSpec(spec.spec) && spec.spec.axesSpec.length === 1\n ? getAxisId(spec.spec.axesSpec[0])\n : undefined;\n if (axisId && isJsonEqual(axisId, cellButtonAxisParams.showCellButtonForAxisId)) {\n return {\n component: PlAgTextAndButtonCell,\n params: {\n invokeRowsOnDoubleClick: cellButtonAxisParams.cellButtonInvokeRowsOnDoubleClick,\n onClick: (params: ICellRendererParams<PlAgDataTableV2Row>) => {\n cellButtonAxisParams.trigger(params.data?.axesKey);\n },\n },\n };\n }\n }\n : undefined,\n cellStyle,\n headerComponentParams: {\n type: ((): PlAgHeaderComponentType => {\n switch (valueType) {\n case ValueType.Int:\n case ValueType.Long:\n case ValueType.Float:\n case ValueType.Double:\n return \"Number\";\n case ValueType.String:\n case ValueType.Bytes:\n return \"Text\";\n default:\n throw Error(`unsupported data type: ${valueType}`);\n }\n })(),\n tooltip: readAnnotation(spec.spec, Annotation.Description)?.trim(),\n // info: readAnnotation(spec.spec, Annotation.Table.Info)?.trim(),\n } satisfies PlAgHeaderComponentParams,\n cellDataType: (() => {\n switch (valueType) {\n case ValueType.Int:\n case ValueType.Long:\n case ValueType.Float:\n case ValueType.Double:\n return \"number\";\n case ValueType.String:\n case ValueType.Bytes:\n return \"text\";\n default:\n throw Error(`unsupported data type: ${valueType}`);\n }\n })(),\n };\n}\n\n/** Build index mapping from full tableSpecs to their position in visibleTableSpecs (missing → -1). */\nfunction buildSpecsToVisibleSpecsMapping(\n tableSpecs: PTableColumnSpec[],\n visibleTableSpecs: PTableColumnSpec[],\n): Map<number, number> {\n const specId = (spec: PTableColumnSpec) =>\n canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n const visibleSpecsMap = new Map(\n visibleTableSpecs.entries().map(([i, spec]) => [specId(spec), i] as const),\n );\n return new Map(\n tableSpecs.entries().map(([i, spec]) => {\n const visibleSpecIdx = visibleSpecsMap.get(specId(spec));\n return [i, isNil(visibleSpecIdx) ? -1 : visibleSpecIdx];\n }),\n );\n}\n\n/** Predicate that returns true when an axis is one of the sheet partition axes. */\nfunction createPartitionedAxisPredicate(sheets: PlDataTableSheet[]): (axisId: AxisId) => boolean {\n const sheetAxesIds = sheets.map((sheet) => getAxisId(sheet.axis));\n return (axisId) => sheetAxesIds.some((id) => matchAxisId(id, axisId));\n}\n\n/**\n * Collect label columns (skipping partitioned axes and duplicates) and return a\n * lookup function that resolves labeled axisId → label column index (or -1).\n */\nfunction collectLabelColumnsByAxis(\n tableSpecs: PTableColumnSpec[],\n isPartitionedAxis: (axisId: AxisId) => boolean,\n): (axisId: AxisId) => number {\n const labelColumns: { axisId: AxisId; labelColumnIdx: number }[] = [];\n for (const [i, spec] of tableSpecs.entries()) {\n if (spec.type !== \"column\" || !isLabelColumnSpec(spec.spec)) continue;\n const labeledAxisId = getAxisId(spec.spec.axesSpec[0]);\n if (isPartitionedAxis(labeledAxisId)) continue;\n if (labelColumns.some((info) => matchAxisId(info.axisId, labeledAxisId))) {\n console.warn(`multiple label columns match axisId: ${JSON.stringify(labeledAxisId)}`);\n continue;\n }\n labelColumns.push({ axisId: labeledAxisId, labelColumnIdx: i });\n }\n return (axisId) =>\n labelColumns.find((info) => matchAxisId(info.axisId, axisId))?.labelColumnIdx ?? -1;\n}\n\n/** Indices of columns to display: drop partitioned axes, label/linker columns, hidden columns. */\nfunction selectDisplayableIndices(\n tableSpecs: PTableColumnSpec[],\n isPartitionedAxis: (axisId: AxisId) => boolean,\n getLabelColumnIndex: (axisId: AxisId) => number,\n): number[] {\n return tableSpecs\n .entries()\n .filter(([, spec]) => {\n switch (spec.type) {\n case \"axis\":\n return (\n !(getLabelColumnIndex(spec.id) > -1 ? true : isColumnHidden(spec.spec)) &&\n !isPartitionedAxis(spec.id)\n );\n case \"column\":\n return !isColumnHidden(spec.spec) && !isLinkerColumnSpec(spec.spec);\n }\n })\n .map(([i]) => i)\n .toArray();\n}\n\n/** Sort: axes first, then columns by OrderPriority annotation (higher priority = further left). */\nfunction sortIndicesByTypeAndPriority(indices: number[], tableSpecs: PTableColumnSpec[]): number[] {\n const priorityOf = (i: number): number => {\n const spec = tableSpecs[i];\n const prior =\n spec.type === \"axis\" || isLabelColumnSpec(spec.spec)\n ? Infinity\n : Number(readAnnotationJson(spec.spec, Annotation.Table.OrderPriority));\n\n return isNaN(prior) ? 0 : prior;\n };\n return [...indices].sort((a, b) => priorityOf(b) - priorityOf(a));\n}\n\n/** Default hidden col ids built from columns marked with the Optional annotation. */\nfunction computeDefaultHiddenColIds(\n fields: number[],\n tableSpecs: PTableColumnSpec[],\n): PlTableColumnIdJson[] {\n return fields.reduce<PlTableColumnIdJson[]>((acc, field) => {\n const spec = tableSpecs[field];\n return spec.type === \"column\" && isColumnOptional(spec.spec)\n ? [...acc, canonicalizeJson<PTableColumnSpec>(spec)]\n : acc;\n }, []);\n}\n\n/** Extract axis indices and specs from the visible table (always present as part of join). */\nfunction collectVisibleAxes(\n visibleTableSpecs: PTableColumnSpec[],\n): [number, PTableColumnSpecAxis][] {\n return visibleTableSpecs\n .entries()\n .filter((entry): entry is [number, PTableColumnSpecAxis] => entry[1].type === \"axis\")\n .toArray();\n}\n\n/**\n * Compose request indices for the visible table:\n * non-hidden display fields first, then visible axes (deduplicated).\n * Returns fieldResultMapping (display field → position in requestIndices, -1 if not requested)\n * and axesResultIndices (visible axis → position in requestIndices).\n */\nfunction buildRequestIndices(\n indices: number[],\n visibleAxesIndices: number[],\n specsToVisibleSpecsMapping: Map<number, number>,\n): {\n requestIndices: number[];\n axesResultIndices: number[];\n fieldResultMapping: number[];\n} {\n const resolved = indices.map((displayField) => {\n const idx = specsToVisibleSpecsMapping.get(displayField);\n return isNil(idx) || idx === -1 ? null : idx;\n });\n const requestIndices = uniq([\n ...resolved.filter((v): v is number => v !== null),\n ...visibleAxesIndices,\n ]);\n const fieldResultMapping = resolved.map((v) => (v === null ? -1 : requestIndices.indexOf(v)));\n const axesResultIndices = visibleAxesIndices.map((vi) => requestIndices.indexOf(vi));\n\n return { requestIndices, axesResultIndices, fieldResultMapping };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"table-source-v2.js","names":[],"sources":["../../../../src/components/PlAgDataTable/sources/table-source-v2.ts"],"sourcesContent":["import type {\n AxesSpec,\n PTableColumnId,\n PTableColumnSpecAxis,\n PTableColumnSpecColumn,\n PTableHandle,\n PTableValue,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n getAxisId,\n pTableValue,\n type PFrameDriver,\n type PlDataTableSheet,\n type PTableVector,\n type AxisId,\n type PTableColumnSpec,\n type PTableKey,\n type PlTableColumnIdJson,\n isLabelColumn as isLabelColumnSpec,\n isLinkerColumn as isLinkerColumnSpec,\n isColumnHidden,\n isColumnOptional,\n matchAxisId,\n readAnnotation,\n readAnnotationJson,\n Annotation,\n ValueType,\n getPTableColumnId,\n} from \"@platforma-sdk/model\";\nimport type {\n CellStyle,\n ColDef,\n GridApi,\n ICellRendererParams,\n IServerSideDatasource,\n IServerSideGetRowsParams,\n ManagedGridOptions,\n} from \"ag-grid-enterprise\";\nimport type { PlAgHeaderComponentParams, PlAgHeaderComponentType } from \"../../PlAgColumnHeader\";\nimport { PlAgColumnHeader } from \"../../PlAgColumnHeader\";\nimport { PlAgTextAndButtonCell } from \"../../PlAgTextAndButtonCell\";\nimport type { PlAgDataTableV2Row, PlTableRowId } from \"../types\";\nimport { PTableHidden } from \"./common\";\nimport { defaultMainMenuItems } from \"./menu-items\";\nimport { makeRowNumberColDef, PlAgDataTableRowNumberColId } from \"./row-number\";\nimport { getColumnRenderingSpec } from \"./value-rendering\";\nimport type { Ref } from \"vue\";\nimport { isJsonEqual } from \"@milaboratories/helpers\";\nimport type { DeferredCircular } from \"./focus-row\";\nimport { isNil, uniq } from \"es-toolkit\";\n\nexport function isLabelColumn(column: PTableColumnSpec): column is PTableColumnSpecColumn {\n return column.type === \"column\" && isLabelColumnSpec(column.spec);\n}\n\n/** Convert columnar data from the driver to rows, used by ag-grid */\nfunction columns2rows(\n fields: number[],\n columns: PTableVector[],\n fieldResultMapping: number[],\n axesResultIndices: number[],\n): PlAgDataTableV2Row[] {\n const rowData: PlAgDataTableV2Row[] = [];\n for (let rowIdx = 0; rowIdx < columns[0].data.length; ++rowIdx) {\n const axesKey: PTableKey = axesResultIndices.map((ri) => pTableValue(columns[ri], rowIdx));\n const id = canonicalizeJson<PlTableRowId>(axesKey);\n const row = fields.reduce<PlAgDataTableV2Row>(\n (acc, field, colIdx) => {\n acc[field.toString() as `${number}`] =\n fieldResultMapping[colIdx] === -1\n ? PTableHidden\n : pTableValue(columns[fieldResultMapping[colIdx]], rowIdx);\n return acc;\n },\n { id, axesKey },\n );\n\n rowData.push(row);\n }\n return rowData;\n}\n\n/** Calculate GridOptions for selected p-table data source */\nexport async function calculateGridOptions({\n generation,\n pfDriver,\n sheets,\n fullTableHandle,\n visibleTableHandle,\n dataRenderedTracker,\n hiddenColIds,\n cellButtonAxisParams,\n}: {\n sheets: PlDataTableSheet[];\n pfDriver: PFrameDriver;\n generation: Ref<number>;\n fullTableHandle: PTableHandle;\n visibleTableHandle: PTableHandle;\n dataRenderedTracker: DeferredCircular<GridApi<PlAgDataTableV2Row>>;\n hiddenColIds?: PlTableColumnIdJson[];\n cellButtonAxisParams?: PlAgCellButtonAxisParams;\n}): Promise<\n Pick<ManagedGridOptions<PlAgDataTableV2Row>, \"columnDefs\" | \"serverSideDatasource\"> & {\n axesSpec: AxesSpec;\n }\n> {\n const stateGeneration = generation.value;\n\n // get specs of the full table\n const [tableSpecs, visibleTableSpecs] = await Promise.all([\n pfDriver.getSpec(fullTableHandle),\n pfDriver.getSpec(visibleTableHandle),\n ]);\n\n if (stateGeneration !== generation.value) throw new Error(\"table state generation changed\");\n\n // index mapping from full specs to visible subset (hidden columns → -1)\n const specsToVisibleSpecsMapping = buildSpecsToVisibleSpecsMapping(tableSpecs, visibleTableSpecs);\n\n const isPartitionedAxis = createPartitionedAxisPredicate(sheets);\n\n // label columns indexed by labeled axis (used for displayability filter)\n const getLabelColumnIndex = collectLabelColumnsByAxis(tableSpecs, isPartitionedAxis);\n\n // displayable column indices ordered: axes first, then columns by OrderPriority\n const fields = sortIndicesByTypeAndPriority(\n selectDisplayableIndices(tableSpecs, isPartitionedAxis, getLabelColumnIndex),\n tableSpecs,\n );\n\n // default hidden columns derived from Optional annotation when no saved state\n const resolvedHiddenColIds = hiddenColIds ?? computeDefaultHiddenColIds(fields, tableSpecs);\n\n const columnDefs: ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] = [\n makeRowNumberColDef(),\n ...fields.map((field) =>\n makeColDef(field, tableSpecs[field], resolvedHiddenColIds, cellButtonAxisParams),\n ),\n ];\n\n // axes — taken directly from visible table (always present as part of join)\n const visibleAxes = collectVisibleAxes(visibleTableSpecs);\n\n // request indices: display fields + visible axes for row selection keys.\n const { requestIndices, axesResultIndices, fieldResultMapping } = buildRequestIndices(\n fields,\n visibleAxes.map(([idx]) => idx),\n specsToVisibleSpecsMapping,\n );\n\n let rowCount = -1;\n let lastParams: IServerSideGetRowsParams | undefined = undefined;\n const serverSideDatasource: IServerSideDatasource<PlAgDataTableV2Row> = {\n getRows: async (params: IServerSideGetRowsParams) => {\n if (stateGeneration !== generation.value) return params.fail();\n try {\n if (rowCount === -1) {\n const ptShape = await pfDriver.getShape(visibleTableHandle);\n if (stateGeneration !== generation.value || params.api.isDestroyed())\n return params.fail();\n rowCount = ptShape.rows;\n }\n\n if (rowCount == 0) {\n params.success({ rowData: [], rowCount });\n // Warning: AgGrid cannot show two overlays at once,\n // so first hide loading overlay, then show no rows overlay\n params.api.setGridOption(\"loading\", false);\n params.api.showNoRowsOverlay();\n return;\n }\n\n // If sort has changed - show skeletons instead of data\n if (lastParams && !isJsonEqual(lastParams.request.sortModel, params.request.sortModel)) {\n return params.success({ rowData: [], rowCount });\n }\n lastParams = params;\n\n let length = 0;\n let rowData: PlAgDataTableV2Row[] = [];\n if (\n rowCount > 0 &&\n params.request.startRow !== undefined &&\n params.request.endRow !== undefined\n ) {\n length = Math.min(rowCount, params.request.endRow) - params.request.startRow;\n if (length > 0) {\n const data = await pfDriver.getData(visibleTableHandle, requestIndices, {\n offset: params.request.startRow,\n length,\n });\n if (stateGeneration !== generation.value || params.api.isDestroyed())\n return params.fail();\n rowData = columns2rows(fields, data, fieldResultMapping, axesResultIndices);\n }\n }\n\n params.success({ rowData, rowCount });\n params.api.autoSizeColumns(\n params.api\n .getAllDisplayedColumns()\n .filter((column) => column.getColId() !== PlAgDataTableRowNumberColId),\n );\n params.api.setGridOption(\"loading\", false);\n dataRenderedTracker.resolve(params.api);\n } catch (error: unknown) {\n if (stateGeneration !== generation.value || params.api.isDestroyed()) return params.fail();\n params.api.setGridOption(\"loading\", true);\n params.fail();\n console.trace(error);\n }\n },\n };\n\n return {\n axesSpec: visibleAxes.map(([, { spec }]) => spec),\n columnDefs,\n serverSideDatasource,\n };\n}\n\nexport type PlAgCellButtonAxisParams = {\n showCellButtonForAxisId?: AxisId;\n cellButtonInvokeRowsOnDoubleClick?: boolean;\n trigger: (key?: PTableKey) => void;\n};\n\n/**\n * Calculates column definition for a given p-table column\n */\nexport function makeColDef(\n iCol: number,\n spec: PTableColumnSpec,\n hiddenColIds: PlTableColumnIdJson[] | undefined,\n cellButtonAxisParams?: PlAgCellButtonAxisParams,\n): ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden> {\n const colId = canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n const valueType = spec.type === \"axis\" ? spec.spec.type : spec.spec.valueType;\n const columnRenderingSpec = getColumnRenderingSpec(spec);\n const cellStyle: CellStyle = {};\n if (columnRenderingSpec.fontFamily) {\n if (columnRenderingSpec.fontFamily === \"monospace\") {\n cellStyle.fontFamily = \"Spline Sans Mono\";\n cellStyle.fontWeight = 300;\n } else {\n cellStyle.fontFamily = columnRenderingSpec.fontFamily;\n }\n }\n const headerName =\n readAnnotation(spec.spec, Annotation.Label)?.trim() ?? `Unlabeled ${spec.type} ${iCol}`;\n\n return {\n colId,\n mainMenuItems: defaultMainMenuItems,\n context: spec,\n field: `${iCol}`,\n headerName,\n lockPosition:\n spec.type === \"axis\" || (isLabelColumnSpec(spec.spec) && spec.spec.axesSpec.length === 1),\n hide: hiddenColIds !== undefined && hiddenColIds.includes(colId),\n valueFormatter: columnRenderingSpec.valueFormatter,\n headerComponent: PlAgColumnHeader,\n cellRendererSelector: cellButtonAxisParams?.showCellButtonForAxisId\n ? () => {\n const axisId =\n spec.type === \"axis\"\n ? spec.id\n : isLabelColumnSpec(spec.spec) && spec.spec.axesSpec.length === 1\n ? getAxisId(spec.spec.axesSpec[0])\n : undefined;\n if (axisId && isJsonEqual(axisId, cellButtonAxisParams.showCellButtonForAxisId)) {\n return {\n component: PlAgTextAndButtonCell,\n params: {\n invokeRowsOnDoubleClick: cellButtonAxisParams.cellButtonInvokeRowsOnDoubleClick,\n onClick: (params: ICellRendererParams<PlAgDataTableV2Row>) => {\n cellButtonAxisParams.trigger(params.data?.axesKey);\n },\n },\n };\n }\n }\n : undefined,\n cellStyle,\n headerComponentParams: {\n type: ((): PlAgHeaderComponentType => {\n switch (valueType) {\n case ValueType.Int:\n case ValueType.Long:\n case ValueType.Float:\n case ValueType.Double:\n return \"Number\";\n case ValueType.String:\n case ValueType.Bytes:\n return \"Text\";\n default:\n throw Error(`unsupported data type: ${valueType}`);\n }\n })(),\n tooltip: readAnnotation(spec.spec, Annotation.Description)?.trim(),\n // info: readAnnotation(spec.spec, Annotation.Table.Info)?.trim(),\n } satisfies PlAgHeaderComponentParams,\n cellDataType: (() => {\n switch (valueType) {\n case ValueType.Int:\n case ValueType.Long:\n case ValueType.Float:\n case ValueType.Double:\n return \"number\";\n case ValueType.String:\n case ValueType.Bytes:\n return \"text\";\n default:\n throw Error(`unsupported data type: ${valueType}`);\n }\n })(),\n };\n}\n\n/** Build index mapping from full tableSpecs to their position in visibleTableSpecs (missing → -1). */\nfunction buildSpecsToVisibleSpecsMapping(\n tableSpecs: PTableColumnSpec[],\n visibleTableSpecs: PTableColumnSpec[],\n): Map<number, number> {\n const specId = (spec: PTableColumnSpec) =>\n canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n const visibleSpecsMap = new Map(\n visibleTableSpecs.entries().map(([i, spec]) => [specId(spec), i] as const),\n );\n return new Map(\n tableSpecs.entries().map(([i, spec]) => {\n const visibleSpecIdx = visibleSpecsMap.get(specId(spec));\n return [i, isNil(visibleSpecIdx) ? -1 : visibleSpecIdx];\n }),\n );\n}\n\n/** Predicate that returns true when an axis is one of the sheet partition axes. */\nfunction createPartitionedAxisPredicate(sheets: PlDataTableSheet[]): (axisId: AxisId) => boolean {\n const sheetAxesIds = sheets.map((sheet) => getAxisId(sheet.axis));\n return (axisId) => sheetAxesIds.some((id) => matchAxisId(id, axisId));\n}\n\n/**\n * Collect label columns (skipping partitioned axes and duplicates) and return a\n * lookup function that resolves labeled axisId → label column index (or -1).\n */\nfunction collectLabelColumnsByAxis(\n tableSpecs: PTableColumnSpec[],\n isPartitionedAxis: (axisId: AxisId) => boolean,\n): (axisId: AxisId) => number {\n const labelColumns: { axisId: AxisId; labelColumnIdx: number }[] = [];\n for (const [i, spec] of tableSpecs.entries()) {\n if (spec.type !== \"column\" || !isLabelColumnSpec(spec.spec)) continue;\n const labeledAxisId = getAxisId(spec.spec.axesSpec[0]);\n if (isPartitionedAxis(labeledAxisId)) continue;\n if (labelColumns.some((info) => matchAxisId(info.axisId, labeledAxisId))) {\n console.warn(`multiple label columns match axisId: ${JSON.stringify(labeledAxisId)}`);\n continue;\n }\n labelColumns.push({ axisId: labeledAxisId, labelColumnIdx: i });\n }\n return (axisId) =>\n labelColumns.find((info) => matchAxisId(info.axisId, axisId))?.labelColumnIdx ?? -1;\n}\n\n/** Indices of columns to display: drop partitioned axes, label/linker columns, hidden columns. */\nfunction selectDisplayableIndices(\n tableSpecs: PTableColumnSpec[],\n isPartitionedAxis: (axisId: AxisId) => boolean,\n getLabelColumnIndex: (axisId: AxisId) => number,\n): number[] {\n return tableSpecs\n .entries()\n .filter(([, spec]) => {\n switch (spec.type) {\n case \"axis\":\n return (\n !(getLabelColumnIndex(spec.id) > -1 ? true : isColumnHidden(spec.spec)) &&\n !isPartitionedAxis(spec.id)\n );\n case \"column\":\n return !isColumnHidden(spec.spec) && !isLinkerColumnSpec(spec.spec);\n }\n })\n .map(([i]) => i)\n .toArray();\n}\n\n/** Sort: axes first, then columns by OrderPriority annotation (higher priority = further left). */\nfunction sortIndicesByTypeAndPriority(indices: number[], tableSpecs: PTableColumnSpec[]): number[] {\n const priorityOf = (i: number): number => {\n const spec = tableSpecs[i];\n const prior =\n spec.type === \"axis\" || isLabelColumnSpec(spec.spec)\n ? Infinity\n : Number(readAnnotationJson(spec.spec, Annotation.Table.OrderPriority));\n\n return isNaN(prior) ? 0 : prior;\n };\n return [...indices].sort((a, b) => priorityOf(b) - priorityOf(a));\n}\n\n/** Default hidden col ids built from columns marked with the Optional annotation. */\nfunction computeDefaultHiddenColIds(\n fields: number[],\n tableSpecs: PTableColumnSpec[],\n): PlTableColumnIdJson[] {\n return fields.reduce<PlTableColumnIdJson[]>((acc, field) => {\n const spec = tableSpecs[field];\n return spec.type === \"column\" && isColumnOptional(spec.spec)\n ? [...acc, canonicalizeJson<PTableColumnId>(getPTableColumnId(spec))]\n : acc;\n }, []);\n}\n\n/** Extract axis indices and specs from the visible table (always present as part of join). */\nfunction collectVisibleAxes(\n visibleTableSpecs: PTableColumnSpec[],\n): [number, PTableColumnSpecAxis][] {\n return visibleTableSpecs\n .entries()\n .filter((entry): entry is [number, PTableColumnSpecAxis] => entry[1].type === \"axis\")\n .toArray();\n}\n\n/**\n * Compose request indices for the visible table:\n * non-hidden display fields first, then visible axes (deduplicated).\n * Returns fieldResultMapping (display field → position in requestIndices, -1 if not requested)\n * and axesResultIndices (visible axis → position in requestIndices).\n */\nfunction buildRequestIndices(\n indices: number[],\n visibleAxesIndices: number[],\n specsToVisibleSpecsMapping: Map<number, number>,\n): {\n requestIndices: number[];\n axesResultIndices: number[];\n fieldResultMapping: number[];\n} {\n const resolved = indices.map((displayField) => {\n const idx = specsToVisibleSpecsMapping.get(displayField);\n return isNil(idx) || idx === -1 ? null : idx;\n });\n const requestIndices = uniq([\n ...resolved.filter((v): v is number => v !== null),\n ...visibleAxesIndices,\n ]);\n const fieldResultMapping = resolved.map((v) => (v === null ? -1 : requestIndices.indexOf(v)));\n const axesResultIndices = visibleAxesIndices.map((vi) => requestIndices.indexOf(vi));\n\n return { requestIndices, axesResultIndices, fieldResultMapping };\n}\n"],"mappings":"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"}
@@ -224,17 +224,14 @@ function w(e) {
224
224
  });
225
225
  }
226
226
  function T(e) {
227
- return e?.sortModel.map((e) => {
228
- let { spec: t, ...n } = u(e.colId);
229
- return {
230
- column: n,
231
- ascending: e.sort === "asc",
232
- naAndAbsentAreLeastValues: e.sort === "asc"
233
- };
234
- }) ?? [];
227
+ return e?.sortModel.map((e) => ({
228
+ column: u(e.colId),
229
+ ascending: e.sort === "asc",
230
+ naAndAbsentAreLeastValues: e.sort === "asc"
231
+ })) ?? [];
235
232
  }
236
233
  function E(e) {
237
- return e?.hiddenColIds?.map((e) => l(u(e))) ?? null;
234
+ return e?.hiddenColIds?.map((e) => u(e)) ?? null;
238
235
  }
239
236
  function D() {
240
237
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"table-state-v2.js","names":[],"sources":["../../../../src/components/PlAgDataTable/sources/table-state-v2.ts"],"sourcesContent":["import {\n createDefaultPTableParams,\n parseJson,\n canonicalizeJson,\n upgradePlDataTableStateV2,\n type FilterSpec,\n type FilterSpecLeaf,\n type PTableColumnId,\n type PTableColumnSpec,\n type PlDataTableGridStateCore,\n type PlDataTableSheetState,\n type PlDataTableStateV2,\n type PlDataTableStateV2CacheEntry,\n type PlDataTableStateV2Normalized,\n type PTableParamsV2,\n type PTableSorting,\n type PlDataTableFilterSpecLeaf,\n type PlDataTableFilterMeta,\n type PlDataTableFilters,\n distillFilterSpec,\n PlDataTableFiltersWithMeta,\n getPTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport { computed, type Ref, type WritableComputedRef } from \"vue\";\nimport type { PlDataTableSettingsV2 } from \"../types\";\nimport { isJsonEqual, randomInt, getField, Nil } from \"@milaboratories/helpers\";\nimport { computedCached } from \"@milaboratories/uikit\";\nimport { isStringValueType, isNumericValueType } from \"../../PlAdvancedFilter/utils\";\nimport { debounce, isNil } from \"es-toolkit\";\n\nexport function useTableState(\n tableStateDenormalized: Ref<PlDataTableStateV2>,\n settings: Ref<PlDataTableSettingsV2>,\n columns: Ref<PTableColumnSpec[]>,\n defaultFilters: Ref<Nil | PlDataTableFilters>,\n): {\n gridState: WritableComputedRef<PlDataTableGridStateCore>;\n sheetsState: WritableComputedRef<PlDataTableSheetState[]>;\n\n searchString: WritableComputedRef<string>;\n filtersState: Ref<PlDataTableFiltersWithMeta>;\n defaultFiltersState: Ref<null | PlDataTableFiltersWithMeta>;\n resetDefaultFilters: () => void;\n} {\n const tableStateNormalized = computedCached<PlDataTableStateV2Normalized>({\n get: () => upgradePlDataTableStateV2(tableStateDenormalized.value),\n set: debounce((newState) => (tableStateDenormalized.value = newState), 300),\n });\n\n const tableState = computed<PlDataTableStateV2CacheEntryNullable>({\n get: () => {\n const defaultState = makeDefaultState();\n\n const sourceId = settings.value.sourceId;\n const undefinedSourceId = \"error\" in settings.value && settings.value.error == null;\n if (!sourceId && undefinedSourceId) return defaultState;\n\n const suitableSourceId = sourceId ?? tableStateNormalized.value.stateCache.at(-1)?.sourceId;\n if (!suitableSourceId) return defaultState;\n\n const cachedState = tableStateNormalized.value.stateCache.find(\n (entry) => entry.sourceId === suitableSourceId,\n );\n if (!cachedState) return { ...defaultState, sourceId: suitableSourceId };\n\n return cachedState;\n },\n set: (state) => {\n const newState: PlDataTableStateV2Normalized = {\n ...tableStateNormalized.value,\n pTableParams: createDefaultPTableParams(),\n };\n\n if (state.sourceId) {\n newState.pTableParams = createPTableParams(state, columns.value);\n\n const stateIdx = newState.stateCache.findIndex(\n (entry) => entry.sourceId === state.sourceId,\n );\n if (stateIdx !== -1) {\n newState.stateCache.splice(stateIdx, 1);\n }\n const CacheDepth = 5;\n newState.stateCache.push(state);\n newState.stateCache = newState.stateCache.slice(-CacheDepth);\n }\n\n if (!isJsonEqual(tableStateNormalized.value, newState)) {\n tableStateNormalized.value = newState;\n }\n },\n });\n\n const gridState = computed<PlDataTableGridStateCore>({\n get: () => tableState.value.gridState,\n set: (gridState) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n gridState,\n };\n }\n },\n });\n\n const sheetsState = computed<PlDataTableSheetState[]>({\n get: () => tableState.value.sheetsState,\n set: (sheetsState) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n sheetsState,\n };\n }\n },\n });\n\n // --- User filters (editable by user) ---\n const filtersState = computed<PlDataTableFiltersWithMeta>({\n get: () => {\n const raw = tableState.value.filtersState;\n return isNil(raw) ? getEmptyGroupWithMeta() : normalizeFiltersState(raw);\n },\n set: (filtersState: PlDataTableFiltersWithMeta) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n filtersState,\n };\n }\n },\n });\n\n // --- Default filters (from model, separate list) ---\n const defaultFiltersState = computed<null | PlDataTableFiltersWithMeta>({\n get: () => {\n const raw = tableState.value.defaultFiltersState;\n if (!isNil(raw)) {\n return normalizeFiltersState(raw);\n }\n if (!isNil(defaultFilters.value)) {\n return annotateFiltersWithIds(normalizeFiltersState(defaultFilters.value));\n }\n return null;\n },\n set: (defaultFiltersState: null | PlDataTableFiltersWithMeta) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n defaultFiltersState,\n };\n }\n },\n });\n\n function resetDefaultFilters(): void {\n defaultFiltersState.value = isNil(defaultFilters.value)\n ? null\n : annotateFiltersWithIds(normalizeFiltersState(defaultFilters.value));\n }\n\n const searchString = computed<string>({\n get: () => tableState.value.searchString ?? \"\",\n set: (searchString: string) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n searchString,\n };\n }\n },\n });\n\n return {\n gridState,\n sheetsState,\n searchString,\n filtersState,\n defaultFiltersState,\n resetDefaultFilters,\n };\n}\n\n// --- Types ---\n\ntype PlDataTableStateV2CacheEntryNullable =\n | PlDataTableStateV2CacheEntry\n | {\n sourceId: null;\n gridState: Record<string, never>;\n sheetsState: [];\n filtersState: null;\n defaultFiltersState: null;\n searchString?: string;\n };\n\ntype FilterNode = FilterSpec<PlDataTableFilterSpecLeaf>;\ntype AnnotatedFilterSpec = FilterSpec<PlDataTableFilterSpecLeaf, PlDataTableFilterMeta>;\n\n// --- Core ---\n\nfunction createPTableParams(\n state: PlDataTableStateV2CacheEntry,\n filterableColumns: PTableColumnSpec[],\n): PTableParamsV2 {\n // User filters: sheets + user filter state + search\n const searchNode = createSearchFilterNode(filterableColumns, state.searchString);\n const unsuppressedUserFilters = isNil(state.filtersState)\n ? null\n : stripSuppressedFilters(state.filtersState);\n const userParts = [\n ...convertPartitionFiltersToFilterSpec(state.sheetsState),\n ...(isNil(unsuppressedUserFilters) ? [] : [unsuppressedUserFilters]),\n ...(isNil(searchNode) ? [] : [searchNode]),\n ];\n const filters: null | PlDataTableFilters = distillFilterSpec(\n userParts.length === 0\n ? null\n : userParts.length === 1\n ? userParts[0]\n : { type: \"and\", filters: userParts },\n );\n const unsuppressedDefaultFilters = isNil(state.defaultFiltersState)\n ? null\n : stripSuppressedFilters(state.defaultFiltersState);\n const defaultFilters: null | PlDataTableFilters = isNil(unsuppressedDefaultFilters)\n ? null\n : // If all filters are suppressed, we should pass an empty filter group instead of null to prevent fallback to defaults in the model\n (distillFilterSpec(unsuppressedDefaultFilters) ?? getEmptyGroup());\n\n return {\n sourceId: state.sourceId,\n hiddenColIds: getHiddenColIds(state.gridState.columnVisibility),\n sorting: convertAgSortingToPTableSorting(state.gridState.sort),\n filters,\n defaultFilters,\n };\n}\n\n/**\n * Normalizes raw filter state into a valid root filter structure.\n * Valid structure is Root(Group, Group, ...) — double nesting required:\n * root is and/or group, each child is also and/or group containing leaf filters.\n * - null/undefined/invalid → empty root\n * - Leaf node → Root(Group(leaf))\n * - Group with leaf children → Root(Group(leaves...))\n * - Group with group children → as-is\n */\nfunction normalizeFiltersState(raw: FilterNode) {\n // Leaf node → wrap in double nesting: Root(Group(leaf))\n if (raw.type !== \"and\" && raw.type !== \"or\" && raw.type !== \"not\") {\n if (\"type\" in raw && !isNil(raw.type)) {\n return {\n id: randomInt(),\n type: \"and\" as const,\n isExpanded: true,\n filters: [\n {\n id: randomInt(),\n type: \"and\" as const,\n isExpanded: true,\n filters: [raw as AnnotatedFilterSpec],\n } as AnnotatedFilterSpec,\n ],\n };\n }\n return getEmptyGroupWithMeta();\n }\n\n // Already a group — ensure children are also groups (double nesting)\n if ((raw.type === \"and\" || raw.type === \"or\") && \"filters\" in raw && Array.isArray(raw.filters)) {\n const allChildrenAreGroups = raw.filters.every(\n (f: FilterNode) => f.type === \"and\" || f.type === \"or\" || f.type === \"not\",\n );\n if (allChildrenAreGroups) {\n return raw as PlDataTableFiltersWithMeta;\n }\n // Children are leaves — wrap them in a single group\n return {\n id: randomInt(),\n type: raw.type as \"and\" | \"or\",\n isExpanded: true,\n filters: [\n {\n id: randomInt(),\n type: raw.type as \"and\" | \"or\",\n isExpanded: true,\n filters: raw.filters as AnnotatedFilterSpec[],\n } as AnnotatedFilterSpec,\n ],\n };\n }\n\n return getEmptyGroupWithMeta();\n}\n\nfunction getEmptyGroup(): PlDataTableFilters {\n return {\n type: \"and\" as const,\n filters: [],\n };\n}\nfunction getEmptyGroupWithMeta(): PlDataTableFiltersWithMeta {\n return {\n ...getEmptyGroup(),\n id: randomInt(),\n isExpanded: true,\n } as PlDataTableFiltersWithMeta;\n}\n\n/**\n * Recursively removes nodes where isSuppressed === true from a PlDataTableFiltersWithMeta tree.\n */\nfunction stripSuppressedFilters(node: PlDataTableFiltersWithMeta): PlDataTableFiltersWithMeta {\n return {\n ...node,\n filters: node.filters\n .filter((child) => !(\"isSuppressed\" in child && child.isSuppressed === true))\n .map((child) =>\n \"filters\" in child && (child.type === \"and\" || child.type === \"or\")\n ? stripSuppressedFilters(child as PlDataTableFiltersWithMeta)\n : child,\n ),\n };\n}\n\nfunction createSearchFilterNode(\n columns: PTableColumnSpec[],\n search: null | undefined | string,\n): null | FilterSpec<FilterSpecLeaf<CanonicalizedJson<PTableColumnId>>> {\n const trimmed = search?.trim();\n if (isNil(trimmed) || trimmed.length === 0) return null;\n\n const parts: FilterSpec<FilterSpecLeaf<CanonicalizedJson<PTableColumnId>>>[] = [];\n const numericValue = Number(trimmed);\n const isValidNumber = trimmed.length > 0 && !isNaN(numericValue) && isFinite(numericValue);\n\n for (const col of columns) {\n const column = canonicalizeJson<PTableColumnId>(getPTableColumnId(col));\n const spec = col.spec;\n\n if (isStringValueType(spec)) {\n parts.push({ type: \"patternEquals\", column, value: trimmed });\n }\n\n if (isNumericValueType(spec) && isValidNumber) {\n parts.push({ type: \"equal\", column, x: numericValue });\n }\n }\n\n if (parts.length === 0) return null;\n\n return { type: \"or\", filters: parts };\n}\n\n// --- Helpers ---\n\n/**\n * Recursively ensures every node in a filter tree has an `id` field.\n * Does not set `source` meta — defaults are now a separate list.\n */\nfunction annotateFiltersWithIds(\n filters: PlDataTableFilters | PlDataTableFiltersWithMeta,\n): PlDataTableFiltersWithMeta {\n return annotateNodeWithIds(filters) as PlDataTableFiltersWithMeta;\n}\n\nfunction annotateNodeWithIds(\n node: FilterNode | PlDataTableFilters | PlDataTableFiltersWithMeta,\n): AnnotatedFilterSpec {\n switch (node.type) {\n case \"and\":\n return {\n id: getField(node, \"id\") ?? randomInt(),\n isExpanded: getField(node, \"isExpanded\") ?? true,\n type: \"and\" as const,\n filters: node.filters.map((child) => annotateNodeWithIds(child)),\n };\n case \"or\":\n return {\n id: getField(node, \"id\") ?? randomInt(),\n isExpanded: getField(node, \"isExpanded\") ?? true,\n type: \"or\" as const,\n filters: node.filters.map((child) => annotateNodeWithIds(child)),\n };\n case \"not\":\n return {\n id: randomInt(),\n isExpanded: true,\n type: \"not\" as const,\n filter: annotateNodeWithIds(node.filter),\n };\n default:\n return { ...node, id: getField(node, \"id\") ?? randomInt() } as AnnotatedFilterSpec;\n }\n}\n\n// --- Utilities ---\n\nfunction convertPartitionFiltersToFilterSpec(\n sheetsState: PlDataTableSheetState[],\n): FilterSpec<FilterSpecLeaf<CanonicalizedJson<PTableColumnId>>>[] {\n return sheetsState.map((s) => {\n const column = canonicalizeJson<PTableColumnId>({ type: \"axis\", id: s.axisId });\n return typeof s.value === \"number\"\n ? { type: \"equal\" as const, column, x: s.value }\n : { type: \"patternEquals\" as const, column, value: s.value };\n });\n}\n\nfunction convertAgSortingToPTableSorting(state: PlDataTableGridStateCore[\"sort\"]): PTableSorting[] {\n return (\n state?.sortModel.map((item) => {\n const { spec: _, ...column } = parseJson(item.colId);\n return {\n column,\n ascending: item.sort === \"asc\",\n naAndAbsentAreLeastValues: item.sort === \"asc\",\n };\n }) ?? []\n );\n}\n\nfunction getHiddenColIds(\n state: PlDataTableGridStateCore[\"columnVisibility\"],\n): PTableColumnId[] | null {\n return state?.hiddenColIds?.map((json) => getPTableColumnId(parseJson(json))) ?? null;\n}\n\nfunction makeDefaultState(): PlDataTableStateV2CacheEntryNullable {\n return {\n sourceId: null,\n gridState: {},\n sheetsState: [],\n filtersState: null,\n defaultFiltersState: null,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"table-state-v2.js","names":[],"sources":["../../../../src/components/PlAgDataTable/sources/table-state-v2.ts"],"sourcesContent":["import {\n createDefaultPTableParams,\n parseJson,\n canonicalizeJson,\n upgradePlDataTableStateV2,\n type FilterSpec,\n type FilterSpecLeaf,\n type PTableColumnId,\n type PTableColumnSpec,\n type PlDataTableGridStateCore,\n type PlDataTableSheetState,\n type PlDataTableStateV2,\n type PlDataTableStateV2CacheEntry,\n type PlDataTableStateV2Normalized,\n type PTableParamsV2,\n type PTableSorting,\n type PlDataTableFilterSpecLeaf,\n type PlDataTableFilterMeta,\n type PlDataTableFilters,\n distillFilterSpec,\n PlDataTableFiltersWithMeta,\n getPTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport { computed, type Ref, type WritableComputedRef } from \"vue\";\nimport type { PlDataTableSettingsV2 } from \"../types\";\nimport { isJsonEqual, randomInt, getField, Nil } from \"@milaboratories/helpers\";\nimport { computedCached } from \"@milaboratories/uikit\";\nimport { isStringValueType, isNumericValueType } from \"../../PlAdvancedFilter/utils\";\nimport { debounce, isNil } from \"es-toolkit\";\n\nexport function useTableState(\n tableStateDenormalized: Ref<PlDataTableStateV2>,\n settings: Ref<PlDataTableSettingsV2>,\n columns: Ref<PTableColumnSpec[]>,\n defaultFilters: Ref<Nil | PlDataTableFilters>,\n): {\n gridState: WritableComputedRef<PlDataTableGridStateCore>;\n sheetsState: WritableComputedRef<PlDataTableSheetState[]>;\n\n searchString: WritableComputedRef<string>;\n filtersState: Ref<PlDataTableFiltersWithMeta>;\n defaultFiltersState: Ref<null | PlDataTableFiltersWithMeta>;\n resetDefaultFilters: () => void;\n} {\n const tableStateNormalized = computedCached<PlDataTableStateV2Normalized>({\n get: () => upgradePlDataTableStateV2(tableStateDenormalized.value),\n set: debounce((newState) => (tableStateDenormalized.value = newState), 300),\n });\n\n const tableState = computed<PlDataTableStateV2CacheEntryNullable>({\n get: () => {\n const defaultState = makeDefaultState();\n\n const sourceId = settings.value.sourceId;\n const undefinedSourceId = \"error\" in settings.value && settings.value.error == null;\n if (!sourceId && undefinedSourceId) return defaultState;\n\n const suitableSourceId = sourceId ?? tableStateNormalized.value.stateCache.at(-1)?.sourceId;\n if (!suitableSourceId) return defaultState;\n\n const cachedState = tableStateNormalized.value.stateCache.find(\n (entry) => entry.sourceId === suitableSourceId,\n );\n if (!cachedState) return { ...defaultState, sourceId: suitableSourceId };\n\n return cachedState;\n },\n set: (state) => {\n const newState: PlDataTableStateV2Normalized = {\n ...tableStateNormalized.value,\n pTableParams: createDefaultPTableParams(),\n };\n\n if (state.sourceId) {\n newState.pTableParams = createPTableParams(state, columns.value);\n\n const stateIdx = newState.stateCache.findIndex(\n (entry) => entry.sourceId === state.sourceId,\n );\n if (stateIdx !== -1) {\n newState.stateCache.splice(stateIdx, 1);\n }\n const CacheDepth = 5;\n newState.stateCache.push(state);\n newState.stateCache = newState.stateCache.slice(-CacheDepth);\n }\n\n if (!isJsonEqual(tableStateNormalized.value, newState)) {\n tableStateNormalized.value = newState;\n }\n },\n });\n\n const gridState = computed<PlDataTableGridStateCore>({\n get: () => tableState.value.gridState,\n set: (gridState) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n gridState,\n };\n }\n },\n });\n\n const sheetsState = computed<PlDataTableSheetState[]>({\n get: () => tableState.value.sheetsState,\n set: (sheetsState) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n sheetsState,\n };\n }\n },\n });\n\n // --- User filters (editable by user) ---\n const filtersState = computed<PlDataTableFiltersWithMeta>({\n get: () => {\n const raw = tableState.value.filtersState;\n return isNil(raw) ? getEmptyGroupWithMeta() : normalizeFiltersState(raw);\n },\n set: (filtersState: PlDataTableFiltersWithMeta) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n filtersState,\n };\n }\n },\n });\n\n // --- Default filters (from model, separate list) ---\n const defaultFiltersState = computed<null | PlDataTableFiltersWithMeta>({\n get: () => {\n const raw = tableState.value.defaultFiltersState;\n if (!isNil(raw)) {\n return normalizeFiltersState(raw);\n }\n if (!isNil(defaultFilters.value)) {\n return annotateFiltersWithIds(normalizeFiltersState(defaultFilters.value));\n }\n return null;\n },\n set: (defaultFiltersState: null | PlDataTableFiltersWithMeta) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n defaultFiltersState,\n };\n }\n },\n });\n\n function resetDefaultFilters(): void {\n defaultFiltersState.value = isNil(defaultFilters.value)\n ? null\n : annotateFiltersWithIds(normalizeFiltersState(defaultFilters.value));\n }\n\n const searchString = computed<string>({\n get: () => tableState.value.searchString ?? \"\",\n set: (searchString: string) => {\n const oldState = tableState.value;\n if (oldState.sourceId) {\n tableState.value = {\n ...oldState,\n searchString,\n };\n }\n },\n });\n\n return {\n gridState,\n sheetsState,\n searchString,\n filtersState,\n defaultFiltersState,\n resetDefaultFilters,\n };\n}\n\n// --- Types ---\n\ntype PlDataTableStateV2CacheEntryNullable =\n | PlDataTableStateV2CacheEntry\n | {\n sourceId: null;\n gridState: Record<string, never>;\n sheetsState: [];\n filtersState: null;\n defaultFiltersState: null;\n searchString?: string;\n };\n\ntype FilterNode = FilterSpec<PlDataTableFilterSpecLeaf>;\ntype AnnotatedFilterSpec = FilterSpec<PlDataTableFilterSpecLeaf, PlDataTableFilterMeta>;\n\n// --- Core ---\n\nfunction createPTableParams(\n state: PlDataTableStateV2CacheEntry,\n filterableColumns: PTableColumnSpec[],\n): PTableParamsV2 {\n // User filters: sheets + user filter state + search\n const searchNode = createSearchFilterNode(filterableColumns, state.searchString);\n const unsuppressedUserFilters = isNil(state.filtersState)\n ? null\n : stripSuppressedFilters(state.filtersState);\n const userParts = [\n ...convertPartitionFiltersToFilterSpec(state.sheetsState),\n ...(isNil(unsuppressedUserFilters) ? [] : [unsuppressedUserFilters]),\n ...(isNil(searchNode) ? [] : [searchNode]),\n ];\n const filters: null | PlDataTableFilters = distillFilterSpec(\n userParts.length === 0\n ? null\n : userParts.length === 1\n ? userParts[0]\n : { type: \"and\", filters: userParts },\n );\n const unsuppressedDefaultFilters = isNil(state.defaultFiltersState)\n ? null\n : stripSuppressedFilters(state.defaultFiltersState);\n const defaultFilters: null | PlDataTableFilters = isNil(unsuppressedDefaultFilters)\n ? null\n : // If all filters are suppressed, we should pass an empty filter group instead of null to prevent fallback to defaults in the model\n (distillFilterSpec(unsuppressedDefaultFilters) ?? getEmptyGroup());\n\n return {\n sourceId: state.sourceId,\n hiddenColIds: getHiddenColIds(state.gridState.columnVisibility),\n sorting: convertAgSortingToPTableSorting(state.gridState.sort),\n filters,\n defaultFilters,\n };\n}\n\n/**\n * Normalizes raw filter state into a valid root filter structure.\n * Valid structure is Root(Group, Group, ...) — double nesting required:\n * root is and/or group, each child is also and/or group containing leaf filters.\n * - null/undefined/invalid → empty root\n * - Leaf node → Root(Group(leaf))\n * - Group with leaf children → Root(Group(leaves...))\n * - Group with group children → as-is\n */\nfunction normalizeFiltersState(raw: FilterNode) {\n // Leaf node → wrap in double nesting: Root(Group(leaf))\n if (raw.type !== \"and\" && raw.type !== \"or\" && raw.type !== \"not\") {\n if (\"type\" in raw && !isNil(raw.type)) {\n return {\n id: randomInt(),\n type: \"and\" as const,\n isExpanded: true,\n filters: [\n {\n id: randomInt(),\n type: \"and\" as const,\n isExpanded: true,\n filters: [raw as AnnotatedFilterSpec],\n } as AnnotatedFilterSpec,\n ],\n };\n }\n return getEmptyGroupWithMeta();\n }\n\n // Already a group — ensure children are also groups (double nesting)\n if ((raw.type === \"and\" || raw.type === \"or\") && \"filters\" in raw && Array.isArray(raw.filters)) {\n const allChildrenAreGroups = raw.filters.every(\n (f: FilterNode) => f.type === \"and\" || f.type === \"or\" || f.type === \"not\",\n );\n if (allChildrenAreGroups) {\n return raw as PlDataTableFiltersWithMeta;\n }\n // Children are leaves — wrap them in a single group\n return {\n id: randomInt(),\n type: raw.type as \"and\" | \"or\",\n isExpanded: true,\n filters: [\n {\n id: randomInt(),\n type: raw.type as \"and\" | \"or\",\n isExpanded: true,\n filters: raw.filters as AnnotatedFilterSpec[],\n } as AnnotatedFilterSpec,\n ],\n };\n }\n\n return getEmptyGroupWithMeta();\n}\n\nfunction getEmptyGroup(): PlDataTableFilters {\n return {\n type: \"and\" as const,\n filters: [],\n };\n}\nfunction getEmptyGroupWithMeta(): PlDataTableFiltersWithMeta {\n return {\n ...getEmptyGroup(),\n id: randomInt(),\n isExpanded: true,\n } as PlDataTableFiltersWithMeta;\n}\n\n/**\n * Recursively removes nodes where isSuppressed === true from a PlDataTableFiltersWithMeta tree.\n */\nfunction stripSuppressedFilters(node: PlDataTableFiltersWithMeta): PlDataTableFiltersWithMeta {\n return {\n ...node,\n filters: node.filters\n .filter((child) => !(\"isSuppressed\" in child && child.isSuppressed === true))\n .map((child) =>\n \"filters\" in child && (child.type === \"and\" || child.type === \"or\")\n ? stripSuppressedFilters(child as PlDataTableFiltersWithMeta)\n : child,\n ),\n };\n}\n\nfunction createSearchFilterNode(\n columns: PTableColumnSpec[],\n search: null | undefined | string,\n): null | FilterSpec<FilterSpecLeaf<CanonicalizedJson<PTableColumnId>>> {\n const trimmed = search?.trim();\n if (isNil(trimmed) || trimmed.length === 0) return null;\n\n const parts: FilterSpec<FilterSpecLeaf<CanonicalizedJson<PTableColumnId>>>[] = [];\n const numericValue = Number(trimmed);\n const isValidNumber = trimmed.length > 0 && !isNaN(numericValue) && isFinite(numericValue);\n\n for (const col of columns) {\n const column = canonicalizeJson<PTableColumnId>(getPTableColumnId(col));\n const spec = col.spec;\n\n if (isStringValueType(spec)) {\n parts.push({ type: \"patternEquals\", column, value: trimmed });\n }\n\n if (isNumericValueType(spec) && isValidNumber) {\n parts.push({ type: \"equal\", column, x: numericValue });\n }\n }\n\n if (parts.length === 0) return null;\n\n return { type: \"or\", filters: parts };\n}\n\n// --- Helpers ---\n\n/**\n * Recursively ensures every node in a filter tree has an `id` field.\n * Does not set `source` meta — defaults are now a separate list.\n */\nfunction annotateFiltersWithIds(\n filters: PlDataTableFilters | PlDataTableFiltersWithMeta,\n): PlDataTableFiltersWithMeta {\n return annotateNodeWithIds(filters) as PlDataTableFiltersWithMeta;\n}\n\nfunction annotateNodeWithIds(\n node: FilterNode | PlDataTableFilters | PlDataTableFiltersWithMeta,\n): AnnotatedFilterSpec {\n switch (node.type) {\n case \"and\":\n return {\n id: getField(node, \"id\") ?? randomInt(),\n isExpanded: getField(node, \"isExpanded\") ?? true,\n type: \"and\" as const,\n filters: node.filters.map((child) => annotateNodeWithIds(child)),\n };\n case \"or\":\n return {\n id: getField(node, \"id\") ?? randomInt(),\n isExpanded: getField(node, \"isExpanded\") ?? true,\n type: \"or\" as const,\n filters: node.filters.map((child) => annotateNodeWithIds(child)),\n };\n case \"not\":\n return {\n id: randomInt(),\n isExpanded: true,\n type: \"not\" as const,\n filter: annotateNodeWithIds(node.filter),\n };\n default:\n return { ...node, id: getField(node, \"id\") ?? randomInt() } as AnnotatedFilterSpec;\n }\n}\n\n// --- Utilities ---\n\nfunction convertPartitionFiltersToFilterSpec(\n sheetsState: PlDataTableSheetState[],\n): FilterSpec<FilterSpecLeaf<CanonicalizedJson<PTableColumnId>>>[] {\n return sheetsState.map((s) => {\n const column = canonicalizeJson<PTableColumnId>({ type: \"axis\", id: s.axisId });\n return typeof s.value === \"number\"\n ? { type: \"equal\" as const, column, x: s.value }\n : { type: \"patternEquals\" as const, column, value: s.value };\n });\n}\n\nfunction convertAgSortingToPTableSorting(state: PlDataTableGridStateCore[\"sort\"]): PTableSorting[] {\n return (\n state?.sortModel.map((item) => ({\n column: parseJson<PTableColumnId>(item.colId),\n ascending: item.sort === \"asc\",\n naAndAbsentAreLeastValues: item.sort === \"asc\",\n })) ?? []\n );\n}\n\nfunction getHiddenColIds(\n state: PlDataTableGridStateCore[\"columnVisibility\"],\n): PTableColumnId[] | null {\n return state?.hiddenColIds?.map((json) => parseJson<PTableColumnId>(json)) ?? null;\n}\n\nfunction makeDefaultState(): PlDataTableStateV2CacheEntryNullable {\n return {\n sourceId: null,\n gridState: {},\n sheetsState: [],\n filtersState: null,\n defaultFiltersState: null,\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/ui-vue",
3
- "version": "1.76.7",
3
+ "version": "1.77.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -27,9 +27,9 @@
27
27
  "vue": "3.5.24",
28
28
  "zod": "~3.25.76",
29
29
  "@milaboratories/pf-spec-driver": "1.3.16",
30
- "@milaboratories/pl-model-common": "1.42.0",
31
- "@milaboratories/uikit": "2.14.9",
32
- "@platforma-sdk/model": "1.76.5"
30
+ "@platforma-sdk/model": "1.77.0",
31
+ "@milaboratories/uikit": "2.14.10",
32
+ "@milaboratories/pl-model-common": "1.42.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@faker-js/faker": "^9.2.0",
@@ -46,9 +46,9 @@
46
46
  "vite": "^8.0.6",
47
47
  "vitest": "^4.1.3",
48
48
  "@milaboratories/build-configs": "2.0.0",
49
- "@milaboratories/ts-builder": "1.4.0",
49
+ "@milaboratories/helpers": "1.14.2",
50
50
  "@milaboratories/ts-configs": "1.2.3",
51
- "@milaboratories/helpers": "1.14.2"
51
+ "@milaboratories/ts-builder": "1.4.0"
52
52
  },
53
53
  "scripts": {
54
54
  "dev": "ts-builder serve --target browser-lib",
@@ -5,9 +5,8 @@ import type {
5
5
  PTableColumnSpec,
6
6
  PFrameSpecDriver,
7
7
  WritePTableToFsResult,
8
- PlTableColumnIdJson,
9
8
  } from "@platforma-sdk/model";
10
- import { getPTableColumnId, parseJson } from "@platforma-sdk/model";
9
+ import { getPTableColumnId } from "@platforma-sdk/model";
11
10
  import { isNil } from "es-toolkit";
12
11
  import { Nil } from "@milaboratories/helpers";
13
12
  import { getServices } from "../../internal/getServices";
@@ -109,7 +108,7 @@ export function collectVisibleColumnIndices(
109
108
  if (def.hide === true) return [];
110
109
  if (isNil(def.colId)) return [];
111
110
  if (def.colId === PlAgDataTableRowNumberColId) return [];
112
- return [parseJson(def.colId as PlTableColumnIdJson)];
111
+ return [def.context as PTableColumnSpec];
113
112
  };
114
113
 
115
114
  return [...new Set(columnDefs.flatMap(specsForDef).map(findIndex))].filter((idx) => idx !== -1);
@@ -1,10 +1,5 @@
1
1
  import { isNil } from "es-toolkit";
2
- import {
3
- parseJson,
4
- PlTableColumnIdJson,
5
- PTableColumnSpec,
6
- PTableValue,
7
- } from "@platforma-sdk/model";
2
+ import { PTableColumnSpec, PTableValue } from "@platforma-sdk/model";
8
3
  import { ref } from "vue";
9
4
  import { PTableHidden } from "../sources/common";
10
5
  import { watchCached } from "@milaboratories/uikit";
@@ -33,7 +28,7 @@ export function useFilterableColumns(
33
28
  const cols = dataColDefs
34
29
  .filter((def): def is typeof def & { colId: string } => !isNil(def.colId))
35
30
  .map((def) => ({
36
- item: parseJson(def.colId satisfies string as PlTableColumnIdJson),
31
+ item: def.context as PTableColumnSpec,
37
32
  hide: def.hide,
38
33
  }));
39
34
 
@@ -235,7 +235,7 @@ export function makeColDef(
235
235
  hiddenColIds: PlTableColumnIdJson[] | undefined,
236
236
  cellButtonAxisParams?: PlAgCellButtonAxisParams,
237
237
  ): ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden> {
238
- const colId = canonicalizeJson<PTableColumnSpec>(spec);
238
+ const colId = canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));
239
239
  const valueType = spec.type === "axis" ? spec.spec.type : spec.spec.valueType;
240
240
  const columnRenderingSpec = getColumnRenderingSpec(spec);
241
241
  const cellStyle: CellStyle = {};
@@ -410,7 +410,7 @@ function computeDefaultHiddenColIds(
410
410
  return fields.reduce<PlTableColumnIdJson[]>((acc, field) => {
411
411
  const spec = tableSpecs[field];
412
412
  return spec.type === "column" && isColumnOptional(spec.spec)
413
- ? [...acc, canonicalizeJson<PTableColumnSpec>(spec)]
413
+ ? [...acc, canonicalizeJson<PTableColumnId>(getPTableColumnId(spec))]
414
414
  : acc;
415
415
  }, []);
416
416
  }
@@ -416,21 +416,18 @@ function convertPartitionFiltersToFilterSpec(
416
416
 
417
417
  function convertAgSortingToPTableSorting(state: PlDataTableGridStateCore["sort"]): PTableSorting[] {
418
418
  return (
419
- state?.sortModel.map((item) => {
420
- const { spec: _, ...column } = parseJson(item.colId);
421
- return {
422
- column,
423
- ascending: item.sort === "asc",
424
- naAndAbsentAreLeastValues: item.sort === "asc",
425
- };
426
- }) ?? []
419
+ state?.sortModel.map((item) => ({
420
+ column: parseJson<PTableColumnId>(item.colId),
421
+ ascending: item.sort === "asc",
422
+ naAndAbsentAreLeastValues: item.sort === "asc",
423
+ })) ?? []
427
424
  );
428
425
  }
429
426
 
430
427
  function getHiddenColIds(
431
428
  state: PlDataTableGridStateCore["columnVisibility"],
432
429
  ): PTableColumnId[] | null {
433
- return state?.hiddenColIds?.map((json) => getPTableColumnId(parseJson(json))) ?? null;
430
+ return state?.hiddenColIds?.map((json) => parseJson<PTableColumnId>(json)) ?? null;
434
431
  }
435
432
 
436
433
  function makeDefaultState(): PlDataTableStateV2CacheEntryNullable {