@platforma-sdk/ui-vue 1.74.0 → 1.75.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.
- package/.turbo/turbo-build.log +11 -11
- package/.turbo/turbo-formatter$colon$check.log +2 -2
- package/.turbo/turbo-linter$colon$check.log +1 -1
- package/.turbo/turbo-types$colon$check.log +1 -1
- package/CHANGELOG.md +14 -0
- package/dist/components/PlAgCsvExporter/export-csv.d.ts +0 -5
- package/dist/components/PlAgCsvExporter/export-csv.d.ts.map +1 -1
- package/dist/components/PlAgCsvExporter/export-csv.js +1 -5
- package/dist/components/PlAgCsvExporter/export-csv.js.map +1 -1
- package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js +1 -1
- package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts +1 -1
- package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-source-v2.js +42 -56
- package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-state-v2.js +2 -2
- package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
- package/package.json +6 -6
- package/src/components/PlAgCsvExporter/export-csv.ts +1 -7
- package/src/components/PlAgDataTable/compositions/useFilterableColumns.ts +1 -1
- package/src/components/PlAgDataTable/sources/table-source-v2.ts +25 -69
- package/src/components/PlAgDataTable/sources/table-state-v2.ts +2 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -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.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.75.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
|
|
19
|
+
[vite:dts] Declaration files built in 4803ms.
|
|
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
|
|
@@ -165,7 +165,7 @@ dist/components/BlockLoader.vue_vue_type_script_setup_true_lang.js
|
|
|
165
165
|
dist/lib/util/helpers/dist/utils.js 0.89 kB │ gzip: 0.46 kB │ map: 7.27 kB
|
|
166
166
|
dist/components/PlAdvancedFilter/OperandButton.vue_vue_type_script_setup_true_lang.js 0.91 kB │ gzip: 0.57 kB │ map: 1.72 kB
|
|
167
167
|
dist/components/NotFound.vue_vue_type_script_setup_true_lang.js 0.92 kB │ gzip: 0.58 kB │ map: 0.96 kB
|
|
168
|
-
dist/components/PlAgDataTable/compositions/useFilterableColumns.js 0.
|
|
168
|
+
dist/components/PlAgDataTable/compositions/useFilterableColumns.js 0.92 kB │ gzip: 0.50 kB │ map: 3.03 kB
|
|
169
169
|
dist/components/PlAgDataTable/sources/focus-row.js 0.95 kB │ gzip: 0.51 kB │ map: 2.22 kB
|
|
170
170
|
dist/plugins/Monetization/validation.js 0.99 kB │ gzip: 0.49 kB │ map: 2.58 kB
|
|
171
171
|
dist/AgGridVue/selection.js 1.00 kB │ gzip: 0.42 kB │ map: 3.18 kB
|
|
@@ -190,7 +190,7 @@ dist/components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue_vue_type_script_
|
|
|
190
190
|
dist/internal/createAppModel.js 1.48 kB │ gzip: 0.75 kB │ map: 3.89 kB
|
|
191
191
|
dist/plugins/Monetization/useInfo.js 1.51 kB │ gzip: 0.77 kB │ map: 3.85 kB
|
|
192
192
|
dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue_vue_type_script_setup_true_lang.js 1.67 kB │ gzip: 0.84 kB │ map: 2.62 kB
|
|
193
|
-
dist/components/PlAgCsvExporter/export-csv.js 1.
|
|
193
|
+
dist/components/PlAgCsvExporter/export-csv.js 1.68 kB │ gzip: 0.88 kB │ map: 5.25 kB
|
|
194
194
|
dist/components/PlAnnotations/components/PlAnnotationsModal.vue_vue_type_script_setup_true_lang.js 1.75 kB │ gzip: 0.75 kB │ map: 1.78 kB
|
|
195
195
|
dist/AgGridVue/createAgGridColDef.js 1.76 kB │ gzip: 0.75 kB │ map: 9.21 kB
|
|
196
196
|
dist/components/PlAdvancedFilter/utils.js 1.76 kB │ gzip: 0.81 kB │ map: 6.00 kB
|
|
@@ -220,20 +220,20 @@ dist/index.js
|
|
|
220
220
|
dist/components/PlTableFilters/PlTableFiltersV2.vue_vue_type_script_setup_true_lang.js 4.63 kB │ gzip: 1.91 kB │ map: 9.02 kB
|
|
221
221
|
dist/components/PlBtnExportArchive/PlBtnExportArchive.vue_vue_type_script_setup_true_lang.js 5.19 kB │ gzip: 2.16 kB │ map: 10.36 kB
|
|
222
222
|
dist/internal/createAppV2.js 5.26 kB │ gzip: 1.98 kB │ map: 17.78 kB
|
|
223
|
-
dist/components/PlAgDataTable/sources/table-state-v2.js 5.
|
|
223
|
+
dist/components/PlAgDataTable/sources/table-state-v2.js 5.72 kB │ gzip: 1.84 kB │ map: 19.38 kB
|
|
224
224
|
dist/internal/createAppV3.js 5.77 kB │ gzip: 2.21 kB │ map: 20.16 kB
|
|
225
|
-
dist/components/PlAgDataTable/sources/table-source-v2.js 6.
|
|
225
|
+
dist/components/PlAgDataTable/sources/table-source-v2.js 6.56 kB │ gzip: 2.60 kB │ map: 22.26 kB
|
|
226
226
|
dist/components/PlAdvancedFilter/PlAdvancedFilter.vue_vue_type_script_setup_true_lang.js 8.54 kB │ gzip: 2.59 kB │ map: 18.44 kB
|
|
227
227
|
dist/components/PlAdvancedFilter/FilterEditor.vue_vue_type_script_setup_true_lang.js 10.24 kB │ gzip: 3.04 kB │ map: 23.20 kB
|
|
228
228
|
dist/components/PlAgDataTable/PlAgDataTableV2.vue_vue_type_script_setup_true_lang.js 12.31 kB │ gzip: 3.90 kB │ map: 29.22 kB
|
|
229
229
|
|
|
230
230
|
[33m[33m[PLUGIN_TIMINGS] Warning:[0m Your build spent significant time in plugins. Here is a breakdown:
|
|
231
|
-
- sourcemaps (
|
|
232
|
-
- vite:dts (
|
|
233
|
-
- vite:vue (
|
|
231
|
+
- sourcemaps (37%)
|
|
232
|
+
- vite:dts (19%)
|
|
233
|
+
- vite:vue (10%)
|
|
234
234
|
- vite:css-post (10%)
|
|
235
|
-
- vite:css (
|
|
235
|
+
- vite:css (8%)
|
|
236
236
|
See https://rolldown.rs/options/checks#plugintimings for more details.
|
|
237
237
|
[39m
|
|
238
|
-
[32m✓ built in
|
|
238
|
+
[32m✓ built in 6.04s[39m
|
|
239
239
|
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.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.75.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
|
|
11
|
+
Finished in 2663ms on 137 files using 8 threads.
|
|
12
12
|
Format check 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.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.75.0 linter:check /home/runner/_work/platforma/platforma/sdk/ui-vue
|
|
4
4
|
> ts-builder linter --check
|
|
5
5
|
|
|
6
6
|
Linting project...
|
|
@@ -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.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.75.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,19 @@
|
|
|
1
1
|
# @platforma-sdk/ui-vue
|
|
2
2
|
|
|
3
|
+
## 1.75.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- cb9e0ba: Label columns for predefined columns and show in table label columns always
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [cb9e0ba]
|
|
12
|
+
- @milaboratories/pl-model-common@1.41.0
|
|
13
|
+
- @platforma-sdk/model@1.75.0
|
|
14
|
+
- @milaboratories/pf-spec-driver@1.3.12
|
|
15
|
+
- @milaboratories/uikit@2.14.1
|
|
16
|
+
|
|
3
17
|
## 1.74.0
|
|
4
18
|
|
|
5
19
|
### Minor Changes
|
|
@@ -24,11 +24,6 @@ export declare function isCsvExportAvailable(): boolean;
|
|
|
24
24
|
* ag-grid column defs, remapped onto the provided PTable spec array so the
|
|
25
25
|
* indices match the current table handle (ColDef.field indices may be stale
|
|
26
26
|
* or diverge from the spec order).
|
|
27
|
-
*
|
|
28
|
-
* Each grid column carries a `PlTableColumnId` ({ source, labeled }). When
|
|
29
|
-
* the labeled spec differs from the source (axis replaced by a label
|
|
30
|
-
* column), both indices are emitted so the export contains the raw axis
|
|
31
|
-
* value alongside its human-readable label.
|
|
32
27
|
*/
|
|
33
28
|
export declare function collectVisibleColumnIndices(gridApi: GridApi, specs: PTableColumnSpec[], pframeSpec: PFrameSpecDriver): Nil | number[];
|
|
34
29
|
//# sourceMappingURL=export-csv.d.ts.map
|
|
@@ -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
|
|
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"}
|
|
@@ -33,11 +33,7 @@ function o() {
|
|
|
33
33
|
}
|
|
34
34
|
function s(e, i, a) {
|
|
35
35
|
let o = e.getColumnDefs();
|
|
36
|
-
return r(o) ? void 0 : [...new Set(o.flatMap((e) =>
|
|
37
|
-
if ("children" in e || e.hide === !0 || r(e.colId) || e.colId === "\"##RowNumberColumnId##\"") return [];
|
|
38
|
-
let { labeled: t } = n(e.colId);
|
|
39
|
-
return [t];
|
|
40
|
-
}).map((e) => a.findTableColumn(i, t(e))))].filter((e) => e !== -1);
|
|
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);
|
|
41
37
|
}
|
|
42
38
|
//#endregion
|
|
43
39
|
export { i as exportCsv, o as isCsvExportAvailable };
|
|
@@ -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
|
|
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 +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)
|
|
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"}
|
|
@@ -26,5 +26,5 @@ export type PlAgCellButtonAxisParams = {
|
|
|
26
26
|
/**
|
|
27
27
|
* Calculates column definition for a given p-table column
|
|
28
28
|
*/
|
|
29
|
-
export declare function makeColDef(iCol: number, spec: PTableColumnSpec,
|
|
29
|
+
export declare function makeColDef(iCol: number, spec: PTableColumnSpec, hiddenColIds: PlTableColumnIdJson[] | undefined, cellButtonAxisParams?: PlAgCellButtonAxisParams): ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>;
|
|
30
30
|
//# sourceMappingURL=table-source-v2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-source-v2.d.ts","sourceRoot":"","sources":["../../../../src/components/PlAgDataTable/sources/table-source-v2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAGR,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,MAAM,EACX,KAAK,gBAAgB,EACrB,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"table-source-v2.d.ts","sourceRoot":"","sources":["../../../../src/components/PlAgDataTable/sources/table-source-v2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAGR,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,MAAM,EACX,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,mBAAmB,EAWzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAEV,MAAM,EACN,OAAO,EAIP,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIxC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,sBAAsB,CAExF;AA6BD,6DAA6D;AAC7D,wBAAsB,oBAAoB,CAAC,EACzC,UAAU,EACV,QAAQ,EACR,MAAM,EACN,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,GACrB,EAAE;IACD,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,eAAe,EAAE,YAAY,CAAC;IAC9B,kBAAkB,EAAE,YAAY,CAAC;IACjC,mBAAmB,EAAE,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnE,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACrC,oBAAoB,CAAC,EAAE,wBAAwB,CAAC;CACjD,GAAG,OAAO,CACT,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,YAAY,GAAG,sBAAsB,CAAC,GAAG;IACpF,QAAQ,EAAE,QAAQ,CAAC;CACpB,CACF,CAkHA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAC/C,oBAAoB,CAAC,EAAE,wBAAwB,GAC9C,MAAM,CAAC,kBAAkB,EAAE,WAAW,GAAG,YAAY,CAAC,CA+ExD"}
|
|
@@ -25,42 +25,42 @@ function C(e, t, n, r) {
|
|
|
25
25
|
async function w({ generation: r, pfDriver: i, sheets: a, fullTableHandle: o, visibleTableHandle: s, dataRenderedTracker: c, hiddenColIds: l, cellButtonAxisParams: u }) {
|
|
26
26
|
let d = r.value, [f, p] = await Promise.all([i.getSpec(o), i.getSpec(s)]);
|
|
27
27
|
if (d !== r.value) throw Error("table state generation changed");
|
|
28
|
-
let m = E(f, p), h = D(a), g =
|
|
28
|
+
let m = E(f, p), h = D(a), g = A(k(f, h, O(f, h)), f), _ = l ?? j(g, f), v = [n(), ...g.map((e) => T(e, f[e], _, u))], y = M(p), { requestIndices: b, axesResultIndices: x, fieldResultMapping: S } = N(g, y.map(([e]) => e), m), w = -1, P;
|
|
29
29
|
return {
|
|
30
|
-
axesSpec:
|
|
31
|
-
columnDefs:
|
|
30
|
+
axesSpec: y.map(([, { spec: e }]) => e),
|
|
31
|
+
columnDefs: v,
|
|
32
32
|
serverSideDatasource: { getRows: async (n) => {
|
|
33
33
|
if (d !== r.value) return n.fail();
|
|
34
34
|
try {
|
|
35
|
-
if (
|
|
35
|
+
if (w === -1) {
|
|
36
36
|
let e = await i.getShape(s);
|
|
37
37
|
if (d !== r.value || n.api.isDestroyed()) return n.fail();
|
|
38
|
-
|
|
38
|
+
w = e.rows;
|
|
39
39
|
}
|
|
40
|
-
if (
|
|
40
|
+
if (w == 0) {
|
|
41
41
|
n.success({
|
|
42
42
|
rowData: [],
|
|
43
|
-
rowCount:
|
|
43
|
+
rowCount: w
|
|
44
44
|
}), n.api.setGridOption("loading", !1), n.api.showNoRowsOverlay();
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
|
-
if (
|
|
47
|
+
if (P && !e(P.request.sortModel, n.request.sortModel)) return n.success({
|
|
48
48
|
rowData: [],
|
|
49
|
-
rowCount:
|
|
49
|
+
rowCount: w
|
|
50
50
|
});
|
|
51
|
-
|
|
51
|
+
P = n;
|
|
52
52
|
let a = 0, o = [];
|
|
53
|
-
if (
|
|
54
|
-
let e = await i.getData(s,
|
|
53
|
+
if (w > 0 && n.request.startRow !== void 0 && n.request.endRow !== void 0 && (a = Math.min(w, n.request.endRow) - n.request.startRow, a > 0)) {
|
|
54
|
+
let e = await i.getData(s, b, {
|
|
55
55
|
offset: n.request.startRow,
|
|
56
56
|
length: a
|
|
57
57
|
});
|
|
58
58
|
if (d !== r.value || n.api.isDestroyed()) return n.fail();
|
|
59
|
-
o = C(
|
|
59
|
+
o = C(g, e, S, x);
|
|
60
60
|
}
|
|
61
61
|
n.success({
|
|
62
62
|
rowData: o,
|
|
63
|
-
rowCount:
|
|
63
|
+
rowCount: w
|
|
64
64
|
}), n.api.autoSizeColumns(n.api.getAllDisplayedColumns().filter((e) => e.getColId() !== t)), n.api.setGridOption("loading", !1), c.resolve(n.api);
|
|
65
65
|
} catch (e) {
|
|
66
66
|
if (d !== r.value || n.api.isDestroyed()) return n.fail();
|
|
@@ -69,32 +69,29 @@ async function w({ generation: r, pfDriver: i, sheets: a, fullTableHandle: o, vi
|
|
|
69
69
|
} }
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
|
-
function T(t, n, o, d
|
|
73
|
-
let
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}), m = n.type === "axis" ? n.spec.type : n.spec.valueType, h = s(n), g = {};
|
|
77
|
-
h.fontFamily && (h.fontFamily === "monospace" ? (g.fontFamily = "Spline Sans Mono", g.fontWeight = 300) : g.fontFamily = h.fontFamily);
|
|
78
|
-
let _ = y(o.spec, c.Label)?.trim() ?? y(n.spec, c.Label)?.trim() ?? `Unlabeled ${n.type} ${t}`;
|
|
72
|
+
function T(t, n, o, d) {
|
|
73
|
+
let f = u(n), p = n.type === "axis" ? n.spec.type : n.spec.valueType, m = s(n), g = {};
|
|
74
|
+
m.fontFamily && (m.fontFamily === "monospace" ? (g.fontFamily = "Spline Sans Mono", g.fontWeight = 300) : g.fontFamily = m.fontFamily);
|
|
75
|
+
let _ = y(n.spec, c.Label)?.trim() ?? `Unlabeled ${n.type} ${t}`;
|
|
79
76
|
return {
|
|
80
|
-
colId:
|
|
77
|
+
colId: f,
|
|
81
78
|
mainMenuItems: r,
|
|
82
79
|
context: n,
|
|
83
80
|
field: `${t}`,
|
|
84
81
|
headerName: _,
|
|
85
|
-
lockPosition: n.type === "axis",
|
|
86
|
-
hide:
|
|
87
|
-
valueFormatter:
|
|
82
|
+
lockPosition: n.type === "axis" || h(n.spec) && n.spec.axesSpec.length === 1,
|
|
83
|
+
hide: o !== void 0 && o.includes(f),
|
|
84
|
+
valueFormatter: m.valueFormatter,
|
|
88
85
|
headerComponent: i,
|
|
89
|
-
cellRendererSelector:
|
|
86
|
+
cellRendererSelector: d?.showCellButtonForAxisId ? (t) => {
|
|
90
87
|
if (n.type !== "axis") return;
|
|
91
88
|
let r = t.colDef?.context?.id;
|
|
92
|
-
if (e(r,
|
|
89
|
+
if (e(r, d.showCellButtonForAxisId)) return {
|
|
93
90
|
component: a,
|
|
94
91
|
params: {
|
|
95
|
-
invokeRowsOnDoubleClick:
|
|
92
|
+
invokeRowsOnDoubleClick: d.cellButtonInvokeRowsOnDoubleClick,
|
|
96
93
|
onClick: (e) => {
|
|
97
|
-
|
|
94
|
+
d.trigger(e.data?.axesKey);
|
|
98
95
|
}
|
|
99
96
|
}
|
|
100
97
|
};
|
|
@@ -102,27 +99,27 @@ function T(t, n, o, d, f) {
|
|
|
102
99
|
cellStyle: g,
|
|
103
100
|
headerComponentParams: {
|
|
104
101
|
type: (() => {
|
|
105
|
-
switch (
|
|
102
|
+
switch (p) {
|
|
106
103
|
case l.Int:
|
|
107
104
|
case l.Long:
|
|
108
105
|
case l.Float:
|
|
109
106
|
case l.Double: return "Number";
|
|
110
107
|
case l.String:
|
|
111
108
|
case l.Bytes: return "Text";
|
|
112
|
-
default: throw Error(`unsupported data type: ${
|
|
109
|
+
default: throw Error(`unsupported data type: ${p}`);
|
|
113
110
|
}
|
|
114
111
|
})(),
|
|
115
|
-
tooltip: y(n.spec, c.Description)?.trim()
|
|
112
|
+
tooltip: y(n.spec, c.Description)?.trim()
|
|
116
113
|
},
|
|
117
114
|
cellDataType: (() => {
|
|
118
|
-
switch (
|
|
115
|
+
switch (p) {
|
|
119
116
|
case l.Int:
|
|
120
117
|
case l.Long:
|
|
121
118
|
case l.Float:
|
|
122
119
|
case l.Double: return "number";
|
|
123
120
|
case l.String:
|
|
124
121
|
case l.Bytes: return "text";
|
|
125
|
-
default: throw Error(`unsupported data type: ${
|
|
122
|
+
default: throw Error(`unsupported data type: ${p}`);
|
|
126
123
|
}
|
|
127
124
|
})()
|
|
128
125
|
};
|
|
@@ -159,39 +156,28 @@ function O(e, t) {
|
|
|
159
156
|
function k(e, t, n) {
|
|
160
157
|
return e.entries().filter(([, e]) => {
|
|
161
158
|
switch (e.type) {
|
|
162
|
-
case "axis": return (
|
|
163
|
-
case "column": return !p(e.spec) && !
|
|
159
|
+
case "axis": return !(n(e.id) > -1 || p(e.spec)) && !t(e.id);
|
|
160
|
+
case "column": return !p(e.spec) && !g(e.spec);
|
|
164
161
|
}
|
|
165
162
|
}).map(([e]) => e).toArray();
|
|
166
163
|
}
|
|
167
164
|
function A(e, t) {
|
|
168
165
|
let n = (e) => {
|
|
169
|
-
let n = t[e];
|
|
170
|
-
return
|
|
166
|
+
let n = t[e], r = n.type === "axis" || h(n.spec) ? Infinity : Number(b(n.spec, c.Table.OrderPriority));
|
|
167
|
+
return isNaN(r) ? 0 : r;
|
|
171
168
|
};
|
|
172
|
-
return [...e].sort((e,
|
|
169
|
+
return [...e].sort((e, t) => n(t) - n(e));
|
|
173
170
|
}
|
|
174
|
-
function j(e, t
|
|
175
|
-
return e.
|
|
176
|
-
let r = t[
|
|
177
|
-
return
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
function M(e, t, n) {
|
|
181
|
-
return e.reduce((e, r, i) => {
|
|
182
|
-
let a = n[r];
|
|
183
|
-
if (a.type !== "column" || !m(a.spec)) return e;
|
|
184
|
-
let o = n[t[i]];
|
|
185
|
-
return [...e, u({
|
|
186
|
-
source: a,
|
|
187
|
-
labeled: o
|
|
188
|
-
})];
|
|
171
|
+
function j(e, t) {
|
|
172
|
+
return e.reduce((e, n) => {
|
|
173
|
+
let r = t[n];
|
|
174
|
+
return r.type === "column" && m(r.spec) ? [...e, u(r)] : e;
|
|
189
175
|
}, []);
|
|
190
176
|
}
|
|
191
|
-
function
|
|
177
|
+
function M(e) {
|
|
192
178
|
return e.entries().filter((e) => e[1].type === "axis").toArray();
|
|
193
179
|
}
|
|
194
|
-
function
|
|
180
|
+
function N(e, t, n) {
|
|
195
181
|
let r = e.map((e) => {
|
|
196
182
|
let t = n.get(e);
|
|
197
183
|
return x(t) || t === -1 ? null : t;
|
|
@@ -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 PlTableColumnId,\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 (for axis→label replacement later)\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 // same as fields, but each axis replaced by its label column index when available\n const indices = replaceAxesWithLabelColumns(fields, tableSpecs, getLabelColumnIndex);\n\n // default hidden columns derived from Optional annotation when no saved state\n const resolvedHiddenColIds =\n hiddenColIds ?? computeDefaultHiddenColIds(fields, indices, tableSpecs);\n\n const columnDefs: ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] = [\n makeRowNumberColDef(),\n ...fields.map((field, index) =>\n makeColDef(\n field,\n tableSpecs[field],\n tableSpecs[indices[index]],\n resolvedHiddenColIds,\n cellButtonAxisParams,\n ),\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: non-hidden display fields + visible axes for row selection keys.\n // Axes replaced by label columns request label data (display); original axis values\n // are fetched via visibleAxes (row keys).\n const { requestIndices, axesResultIndices, fieldResultMapping } = buildRequestIndices(\n indices,\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 labeledSpec: PTableColumnSpec,\n hiddenColIds: PlTableColumnIdJson[] | undefined,\n cellButtonAxisParams?: PlAgCellButtonAxisParams,\n): ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden> {\n const colId = canonicalizeJson<PlTableColumnId>({\n source: spec,\n labeled: labeledSpec,\n });\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(labeledSpec.spec, Annotation.Label)?.trim() ??\n readAnnotation(spec.spec, Annotation.Label)?.trim() ??\n `Unlabeled ${spec.type} ${iCol}`;\n\n return {\n colId,\n mainMenuItems: defaultMainMenuItems,\n context: spec,\n field: `${iCol}`,\n headerName,\n lockPosition: spec.type === \"axis\",\n hide: hiddenColIds !== undefined && hiddenColIds.includes(colId),\n valueFormatter: columnRenderingSpec.valueFormatter,\n headerComponent: PlAgColumnHeader,\n cellRendererSelector: cellButtonAxisParams?.showCellButtonForAxisId\n ? (params: ICellRendererParams) => {\n if (spec.type !== \"axis\") return;\n\n const axisId = (params.colDef?.context as PTableColumnSpec)?.id as AxisId;\n if (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:\n readAnnotation(spec.spec, Annotation.Description)?.trim() ??\n readAnnotation(labeledSpec.spec, Annotation.Description)?.trim(),\n // info:\n // readAnnotation(spec.spec, Annotation.Table.Info)?.trim() ??\n // readAnnotation(labeledSpec.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 // show axis if not hidden or if it has a label column\n (!isColumnHidden(spec.spec) ? true : getLabelColumnIndex(spec.id) > -1) &&\n !isPartitionedAxis(spec.id)\n );\n case \"column\":\n return (\n !isColumnHidden(spec.spec) &&\n // hide label columns (their labeled axes are shown instead)\n !isLabelColumnSpec(spec.spec) &&\n !isLinkerColumnSpec(spec.spec)\n );\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 return spec.type === \"column\"\n ? (readAnnotationJson(spec.spec, Annotation.Table.OrderPriority) ?? 0)\n : 0;\n };\n return [...indices].sort((a, b) => {\n if (tableSpecs[a].type !== tableSpecs[b].type) {\n return tableSpecs[a].type === \"axis\" ? -1 : 1;\n }\n return priorityOf(b) - priorityOf(a);\n });\n}\n\n/** For each axis entry substitute the index of its matching label column when one exists. */\nfunction replaceAxesWithLabelColumns(\n fields: number[],\n tableSpecs: PTableColumnSpec[],\n getLabelColumnIndex: (axisId: AxisId) => number,\n): number[] {\n return fields.map((i) => {\n const spec = tableSpecs[i];\n const labelIdx = spec.type === \"axis\" ? getLabelColumnIndex(spec.id) : -1;\n return labelIdx === -1 ? i : labelIdx;\n });\n}\n\n/** Default hidden col ids built from columns marked with the Optional annotation. */\nfunction computeDefaultHiddenColIds(\n fields: number[],\n indices: number[],\n tableSpecs: PTableColumnSpec[],\n): PlTableColumnIdJson[] {\n return fields.reduce<PlTableColumnIdJson[]>((acc, field, i) => {\n const spec = tableSpecs[field];\n if (spec.type !== \"column\" || !isColumnOptional(spec.spec)) return acc;\n const labeledSpec = tableSpecs[indices[i]];\n return [...acc, canonicalizeJson<PlTableColumnId>({ source: spec, labeled: labeledSpec })];\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<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 ? (params: ICellRendererParams) => {\n if (spec.type !== \"axis\") return;\n\n const axisId = (params.colDef?.context as PTableColumnSpec)?.id as AxisId;\n if (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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"}
|
|
@@ -225,7 +225,7 @@ function w(e) {
|
|
|
225
225
|
}
|
|
226
226
|
function T(e) {
|
|
227
227
|
return e?.sortModel.map((e) => {
|
|
228
|
-
let { spec: t, ...n } = u(e.colId)
|
|
228
|
+
let { spec: t, ...n } = u(e.colId);
|
|
229
229
|
return {
|
|
230
230
|
column: n,
|
|
231
231
|
ascending: e.sort === "asc",
|
|
@@ -234,7 +234,7 @@ function T(e) {
|
|
|
234
234
|
}) ?? [];
|
|
235
235
|
}
|
|
236
236
|
function E(e) {
|
|
237
|
-
return e?.hiddenColIds?.map((e) => l(u(e)
|
|
237
|
+
return e?.hiddenColIds?.map((e) => l(u(e))) ?? null;
|
|
238
238
|
}
|
|
239
239
|
function D() {
|
|
240
240
|
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).labeled;\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).source)) ?? 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 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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/ui-vue",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.75.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"lru-cache": "^11.2.2",
|
|
27
27
|
"vue": "^3.5.24",
|
|
28
28
|
"zod": "~3.25.76",
|
|
29
|
-
"@milaboratories/pf-spec-driver": "1.3.
|
|
30
|
-
"@milaboratories/
|
|
31
|
-
"@
|
|
32
|
-
"@
|
|
29
|
+
"@milaboratories/pf-spec-driver": "1.3.12",
|
|
30
|
+
"@milaboratories/pl-model-common": "1.41.0",
|
|
31
|
+
"@milaboratories/uikit": "2.14.1",
|
|
32
|
+
"@platforma-sdk/model": "1.75.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@faker-js/faker": "^9.2.0",
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
"typescript": "~5.9.3",
|
|
46
46
|
"vite": "^8.0.6",
|
|
47
47
|
"vitest": "^4.1.3",
|
|
48
|
-
"@milaboratories/ts-builder": "1.4.0",
|
|
49
48
|
"@milaboratories/helpers": "1.14.1",
|
|
50
49
|
"@milaboratories/build-configs": "2.0.0",
|
|
50
|
+
"@milaboratories/ts-builder": "1.4.0",
|
|
51
51
|
"@milaboratories/ts-configs": "1.2.3"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
@@ -90,11 +90,6 @@ export function isCsvExportAvailable(): boolean {
|
|
|
90
90
|
* ag-grid column defs, remapped onto the provided PTable spec array so the
|
|
91
91
|
* indices match the current table handle (ColDef.field indices may be stale
|
|
92
92
|
* or diverge from the spec order).
|
|
93
|
-
*
|
|
94
|
-
* Each grid column carries a `PlTableColumnId` ({ source, labeled }). When
|
|
95
|
-
* the labeled spec differs from the source (axis replaced by a label
|
|
96
|
-
* column), both indices are emitted so the export contains the raw axis
|
|
97
|
-
* value alongside its human-readable label.
|
|
98
93
|
*/
|
|
99
94
|
export function collectVisibleColumnIndices(
|
|
100
95
|
gridApi: GridApi,
|
|
@@ -114,8 +109,7 @@ export function collectVisibleColumnIndices(
|
|
|
114
109
|
if (def.hide === true) return [];
|
|
115
110
|
if (isNil(def.colId)) return [];
|
|
116
111
|
if (def.colId === PlAgDataTableRowNumberColId) return [];
|
|
117
|
-
|
|
118
|
-
return [labeled];
|
|
112
|
+
return [parseJson(def.colId as PlTableColumnIdJson)];
|
|
119
113
|
};
|
|
120
114
|
|
|
121
115
|
return [...new Set(columnDefs.flatMap(specsForDef).map(findIndex))].filter((idx) => idx !== -1);
|
|
@@ -33,7 +33,7 @@ export function useFilterableColumns(
|
|
|
33
33
|
const cols = dataColDefs
|
|
34
34
|
.filter((def): def is typeof def & { colId: string } => !isNil(def.colId))
|
|
35
35
|
.map((def) => ({
|
|
36
|
-
item: parseJson(def.colId satisfies string as PlTableColumnIdJson)
|
|
36
|
+
item: parseJson(def.colId satisfies string as PlTableColumnIdJson),
|
|
37
37
|
hide: def.hide,
|
|
38
38
|
}));
|
|
39
39
|
|
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
type AxisId,
|
|
17
17
|
type PTableColumnSpec,
|
|
18
18
|
type PTableKey,
|
|
19
|
-
type PlTableColumnId,
|
|
20
19
|
type PlTableColumnIdJson,
|
|
21
20
|
isLabelColumn as isLabelColumnSpec,
|
|
22
21
|
isLinkerColumn as isLinkerColumnSpec,
|
|
@@ -121,7 +120,7 @@ export async function calculateGridOptions({
|
|
|
121
120
|
|
|
122
121
|
const isPartitionedAxis = createPartitionedAxisPredicate(sheets);
|
|
123
122
|
|
|
124
|
-
// label columns indexed by labeled axis (for
|
|
123
|
+
// label columns indexed by labeled axis (used for displayability filter)
|
|
125
124
|
const getLabelColumnIndex = collectLabelColumnsByAxis(tableSpecs, isPartitionedAxis);
|
|
126
125
|
|
|
127
126
|
// displayable column indices ordered: axes first, then columns by OrderPriority
|
|
@@ -130,34 +129,22 @@ export async function calculateGridOptions({
|
|
|
130
129
|
tableSpecs,
|
|
131
130
|
);
|
|
132
131
|
|
|
133
|
-
// same as fields, but each axis replaced by its label column index when available
|
|
134
|
-
const indices = replaceAxesWithLabelColumns(fields, tableSpecs, getLabelColumnIndex);
|
|
135
|
-
|
|
136
132
|
// default hidden columns derived from Optional annotation when no saved state
|
|
137
|
-
const resolvedHiddenColIds =
|
|
138
|
-
hiddenColIds ?? computeDefaultHiddenColIds(fields, indices, tableSpecs);
|
|
133
|
+
const resolvedHiddenColIds = hiddenColIds ?? computeDefaultHiddenColIds(fields, tableSpecs);
|
|
139
134
|
|
|
140
135
|
const columnDefs: ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] = [
|
|
141
136
|
makeRowNumberColDef(),
|
|
142
|
-
...fields.map((field
|
|
143
|
-
makeColDef(
|
|
144
|
-
field,
|
|
145
|
-
tableSpecs[field],
|
|
146
|
-
tableSpecs[indices[index]],
|
|
147
|
-
resolvedHiddenColIds,
|
|
148
|
-
cellButtonAxisParams,
|
|
149
|
-
),
|
|
137
|
+
...fields.map((field) =>
|
|
138
|
+
makeColDef(field, tableSpecs[field], resolvedHiddenColIds, cellButtonAxisParams),
|
|
150
139
|
),
|
|
151
140
|
];
|
|
152
141
|
|
|
153
142
|
// axes — taken directly from visible table (always present as part of join)
|
|
154
143
|
const visibleAxes = collectVisibleAxes(visibleTableSpecs);
|
|
155
144
|
|
|
156
|
-
// request indices:
|
|
157
|
-
// Axes replaced by label columns request label data (display); original axis values
|
|
158
|
-
// are fetched via visibleAxes (row keys).
|
|
145
|
+
// request indices: display fields + visible axes for row selection keys.
|
|
159
146
|
const { requestIndices, axesResultIndices, fieldResultMapping } = buildRequestIndices(
|
|
160
|
-
|
|
147
|
+
fields,
|
|
161
148
|
visibleAxes.map(([idx]) => idx),
|
|
162
149
|
specsToVisibleSpecsMapping,
|
|
163
150
|
);
|
|
@@ -245,14 +232,10 @@ export type PlAgCellButtonAxisParams = {
|
|
|
245
232
|
export function makeColDef(
|
|
246
233
|
iCol: number,
|
|
247
234
|
spec: PTableColumnSpec,
|
|
248
|
-
labeledSpec: PTableColumnSpec,
|
|
249
235
|
hiddenColIds: PlTableColumnIdJson[] | undefined,
|
|
250
236
|
cellButtonAxisParams?: PlAgCellButtonAxisParams,
|
|
251
237
|
): ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden> {
|
|
252
|
-
const colId = canonicalizeJson<
|
|
253
|
-
source: spec,
|
|
254
|
-
labeled: labeledSpec,
|
|
255
|
-
});
|
|
238
|
+
const colId = canonicalizeJson<PTableColumnSpec>(spec);
|
|
256
239
|
const valueType = spec.type === "axis" ? spec.spec.type : spec.spec.valueType;
|
|
257
240
|
const columnRenderingSpec = getColumnRenderingSpec(spec);
|
|
258
241
|
const cellStyle: CellStyle = {};
|
|
@@ -265,9 +248,7 @@ export function makeColDef(
|
|
|
265
248
|
}
|
|
266
249
|
}
|
|
267
250
|
const headerName =
|
|
268
|
-
readAnnotation(
|
|
269
|
-
readAnnotation(spec.spec, Annotation.Label)?.trim() ??
|
|
270
|
-
`Unlabeled ${spec.type} ${iCol}`;
|
|
251
|
+
readAnnotation(spec.spec, Annotation.Label)?.trim() ?? `Unlabeled ${spec.type} ${iCol}`;
|
|
271
252
|
|
|
272
253
|
return {
|
|
273
254
|
colId,
|
|
@@ -275,7 +256,8 @@ export function makeColDef(
|
|
|
275
256
|
context: spec,
|
|
276
257
|
field: `${iCol}`,
|
|
277
258
|
headerName,
|
|
278
|
-
lockPosition:
|
|
259
|
+
lockPosition:
|
|
260
|
+
spec.type === "axis" || (isLabelColumnSpec(spec.spec) && spec.spec.axesSpec.length === 1),
|
|
279
261
|
hide: hiddenColIds !== undefined && hiddenColIds.includes(colId),
|
|
280
262
|
valueFormatter: columnRenderingSpec.valueFormatter,
|
|
281
263
|
headerComponent: PlAgColumnHeader,
|
|
@@ -313,12 +295,8 @@ export function makeColDef(
|
|
|
313
295
|
throw Error(`unsupported data type: ${valueType}`);
|
|
314
296
|
}
|
|
315
297
|
})(),
|
|
316
|
-
tooltip:
|
|
317
|
-
|
|
318
|
-
readAnnotation(labeledSpec.spec, Annotation.Description)?.trim(),
|
|
319
|
-
// info:
|
|
320
|
-
// readAnnotation(spec.spec, Annotation.Table.Info)?.trim() ??
|
|
321
|
-
// readAnnotation(labeledSpec.spec, Annotation.Table.Info)?.trim(),
|
|
298
|
+
tooltip: readAnnotation(spec.spec, Annotation.Description)?.trim(),
|
|
299
|
+
// info: readAnnotation(spec.spec, Annotation.Table.Info)?.trim(),
|
|
322
300
|
} satisfies PlAgHeaderComponentParams,
|
|
323
301
|
cellDataType: (() => {
|
|
324
302
|
switch (valueType) {
|
|
@@ -396,17 +374,11 @@ function selectDisplayableIndices(
|
|
|
396
374
|
switch (spec.type) {
|
|
397
375
|
case "axis":
|
|
398
376
|
return (
|
|
399
|
-
|
|
400
|
-
(!isColumnHidden(spec.spec) ? true : getLabelColumnIndex(spec.id) > -1) &&
|
|
377
|
+
!(getLabelColumnIndex(spec.id) > -1 ? true : isColumnHidden(spec.spec)) &&
|
|
401
378
|
!isPartitionedAxis(spec.id)
|
|
402
379
|
);
|
|
403
380
|
case "column":
|
|
404
|
-
return (
|
|
405
|
-
!isColumnHidden(spec.spec) &&
|
|
406
|
-
// hide label columns (their labeled axes are shown instead)
|
|
407
|
-
!isLabelColumnSpec(spec.spec) &&
|
|
408
|
-
!isLinkerColumnSpec(spec.spec)
|
|
409
|
-
);
|
|
381
|
+
return !isColumnHidden(spec.spec) && !isLinkerColumnSpec(spec.spec);
|
|
410
382
|
}
|
|
411
383
|
})
|
|
412
384
|
.map(([i]) => i)
|
|
@@ -417,42 +389,26 @@ function selectDisplayableIndices(
|
|
|
417
389
|
function sortIndicesByTypeAndPriority(indices: number[], tableSpecs: PTableColumnSpec[]): number[] {
|
|
418
390
|
const priorityOf = (i: number): number => {
|
|
419
391
|
const spec = tableSpecs[i];
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
return [...indices].sort((a, b) => {
|
|
425
|
-
if (tableSpecs[a].type !== tableSpecs[b].type) {
|
|
426
|
-
return tableSpecs[a].type === "axis" ? -1 : 1;
|
|
427
|
-
}
|
|
428
|
-
return priorityOf(b) - priorityOf(a);
|
|
429
|
-
});
|
|
430
|
-
}
|
|
392
|
+
const prior =
|
|
393
|
+
spec.type === "axis" || isLabelColumnSpec(spec.spec)
|
|
394
|
+
? Infinity
|
|
395
|
+
: Number(readAnnotationJson(spec.spec, Annotation.Table.OrderPriority));
|
|
431
396
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
tableSpecs: PTableColumnSpec[],
|
|
436
|
-
getLabelColumnIndex: (axisId: AxisId) => number,
|
|
437
|
-
): number[] {
|
|
438
|
-
return fields.map((i) => {
|
|
439
|
-
const spec = tableSpecs[i];
|
|
440
|
-
const labelIdx = spec.type === "axis" ? getLabelColumnIndex(spec.id) : -1;
|
|
441
|
-
return labelIdx === -1 ? i : labelIdx;
|
|
442
|
-
});
|
|
397
|
+
return isNaN(prior) ? 0 : prior;
|
|
398
|
+
};
|
|
399
|
+
return [...indices].sort((a, b) => priorityOf(b) - priorityOf(a));
|
|
443
400
|
}
|
|
444
401
|
|
|
445
402
|
/** Default hidden col ids built from columns marked with the Optional annotation. */
|
|
446
403
|
function computeDefaultHiddenColIds(
|
|
447
404
|
fields: number[],
|
|
448
|
-
indices: number[],
|
|
449
405
|
tableSpecs: PTableColumnSpec[],
|
|
450
406
|
): PlTableColumnIdJson[] {
|
|
451
|
-
return fields.reduce<PlTableColumnIdJson[]>((acc, field
|
|
407
|
+
return fields.reduce<PlTableColumnIdJson[]>((acc, field) => {
|
|
452
408
|
const spec = tableSpecs[field];
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
409
|
+
return spec.type === "column" && isColumnOptional(spec.spec)
|
|
410
|
+
? [...acc, canonicalizeJson<PTableColumnSpec>(spec)]
|
|
411
|
+
: acc;
|
|
456
412
|
}, []);
|
|
457
413
|
}
|
|
458
414
|
|
|
@@ -417,7 +417,7 @@ function convertPartitionFiltersToFilterSpec(
|
|
|
417
417
|
function convertAgSortingToPTableSorting(state: PlDataTableGridStateCore["sort"]): PTableSorting[] {
|
|
418
418
|
return (
|
|
419
419
|
state?.sortModel.map((item) => {
|
|
420
|
-
const { spec: _, ...column } = parseJson(item.colId)
|
|
420
|
+
const { spec: _, ...column } = parseJson(item.colId);
|
|
421
421
|
return {
|
|
422
422
|
column,
|
|
423
423
|
ascending: item.sort === "asc",
|
|
@@ -430,7 +430,7 @@ function convertAgSortingToPTableSorting(state: PlDataTableGridStateCore["sort"]
|
|
|
430
430
|
function getHiddenColIds(
|
|
431
431
|
state: PlDataTableGridStateCore["columnVisibility"],
|
|
432
432
|
): PTableColumnId[] | null {
|
|
433
|
-
return state?.hiddenColIds?.map((json) => getPTableColumnId(parseJson(json)
|
|
433
|
+
return state?.hiddenColIds?.map((json) => getPTableColumnId(parseJson(json))) ?? null;
|
|
434
434
|
}
|
|
435
435
|
|
|
436
436
|
function makeDefaultState(): PlDataTableStateV2CacheEntryNullable {
|