@platforma-sdk/ui-vue 1.68.0 → 1.68.4
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 +14 -14
- package/.turbo/turbo-formatter$colon$check.log +2 -2
- package/.turbo/turbo-linter$colon$check.log +2 -2
- package/.turbo/turbo-types$colon$check.log +1 -1
- package/CHANGELOG.md +16 -0
- package/dist/AgGridVue/useAgGridOptions.js +10 -10
- package/dist/components/PlAgCsvExporter/export-csv.d.ts +5 -0
- package/dist/components/PlAgCsvExporter/export-csv.d.ts.map +1 -1
- package/dist/components/PlAgCsvExporter/export-csv.js +25 -19
- package/dist/components/PlAgCsvExporter/export-csv.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +18 -18
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
- package/dist/components/PlAgDataTable/compositions/useGrid.js +13 -13
- package/dist/components/PlAgDataTable/index.js +3 -3
- package/dist/components/PlAgDataTable/sources/table-source-v2.js +14 -14
- package/dist/index.js +16 -16
- package/dist/lib.js +7 -7
- package/package.json +7 -7
- package/src/components/PlAgCsvExporter/export-csv.ts +21 -10
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.68.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.68.4 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 12250ms.
|
|
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
|
|
@@ -138,7 +138,7 @@ dist/components/PlAgChartStackedBarCell/PlAgChartStackedBarCell.js
|
|
|
138
138
|
dist/components/PlAnnotations/components/AnnotationsSidebar.vue_vue_type_style_index_0_lang.module.js 0.40 kB │ gzip: 0.25 kB │ map: 0.63 kB
|
|
139
139
|
dist/composition/usePlugin.js 0.41 kB │ gzip: 0.29 kB │ map: 2.76 kB
|
|
140
140
|
dist/computedResult.js 0.41 kB │ gzip: 0.27 kB │ map: 2.29 kB
|
|
141
|
-
dist/components/PlAgDataTable/index.js 0.41 kB │ gzip: 0.
|
|
141
|
+
dist/components/PlAgDataTable/index.js 0.41 kB │ gzip: 0.23 kB │ map: 0.60 kB
|
|
142
142
|
dist/plugins/Monetization/UserCabinetCard.vue_vue_type_style_index_0_lang.module.js 0.42 kB │ gzip: 0.27 kB │ map: 0.67 kB
|
|
143
143
|
dist/plugins/Monetization/RunStatus.vue_vue_type_style_index_0_lang.module.js 0.43 kB │ gzip: 0.27 kB │ map: 0.76 kB
|
|
144
144
|
dist/internal/service_factories.js 0.43 kB │ gzip: 0.26 kB │ map: 1.14 kB
|
|
@@ -188,9 +188,9 @@ dist/components/PlAgDataTable/types.js
|
|
|
188
188
|
dist/components/PlBtnExportArchive/Item.vue_vue_type_script_setup_true_lang.js 1.36 kB │ gzip: 0.63 kB │ map: 2.58 kB
|
|
189
189
|
dist/components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.vue_vue_type_script_setup_true_lang.js 1.46 kB │ gzip: 0.77 kB │ map: 3.56 kB
|
|
190
190
|
dist/internal/createAppModel.js 1.48 kB │ gzip: 0.75 kB │ map: 3.89 kB
|
|
191
|
-
dist/components/PlAgCsvExporter/export-csv.js 1.51 kB │ gzip: 0.78 kB │ map: 4.87 kB
|
|
192
191
|
dist/plugins/Monetization/useInfo.js 1.51 kB │ gzip: 0.77 kB │ map: 3.85 kB
|
|
193
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.73 kB │ gzip: 0.90 kB │ map: 5.60 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
|
|
@@ -215,25 +215,25 @@ dist/components/PlAnnotations/components/AnnotationsSidebar.vue_vue_type_script_
|
|
|
215
215
|
dist/plugins/Monetization/MonetizationSidebar.vue_vue_type_script_setup_true_lang.js 3.96 kB │ gzip: 1.71 kB │ map: 5.71 kB
|
|
216
216
|
dist/components/PlAnnotations/components/FilterSidebar.vue_vue_type_script_setup_true_lang.js 3.97 kB │ gzip: 1.56 kB │ map: 7.42 kB
|
|
217
217
|
dist/internal/createAppV1.js 4.01 kB │ gzip: 1.42 kB │ map: 14.21 kB
|
|
218
|
-
dist/AgGridVue/useAgGridOptions.js 4.23 kB │ gzip: 1.
|
|
219
|
-
dist/index.js 4.53 kB │ gzip: 1.
|
|
218
|
+
dist/AgGridVue/useAgGridOptions.js 4.23 kB │ gzip: 1.32 kB │ map: 14.12 kB
|
|
219
|
+
dist/index.js 4.53 kB │ gzip: 1.37 kB │ map: 0.25 kB
|
|
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
223
|
dist/components/PlAgDataTable/sources/table-state-v2.js 5.73 kB │ gzip: 1.85 kB │ map: 19.41 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.94 kB │ gzip: 2.
|
|
225
|
+
dist/components/PlAgDataTable/sources/table-source-v2.js 6.94 kB │ gzip: 2.68 kB │ map: 23.99 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
|
-
dist/components/PlAgDataTable/PlAgDataTableV2.vue_vue_type_script_setup_true_lang.js 12.31 kB │ gzip: 3.
|
|
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 (
|
|
234
|
-
- vite:css-post (
|
|
235
|
-
- vite:css (
|
|
231
|
+
- sourcemaps (36%)
|
|
232
|
+
- vite:dts (33%)
|
|
233
|
+
- vite:vue (10%)
|
|
234
|
+
- vite:css-post (7%)
|
|
235
|
+
- vite:css (6%)
|
|
236
236
|
See https://rolldown.rs/options/checks#plugintimings for more details.
|
|
237
237
|
[39m
|
|
238
|
-
[32m✓ built in
|
|
238
|
+
[32m✓ built in 13.44s[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.68.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.68.4 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 3484ms on 137 files using 8 threads.
|
|
12
12
|
Format check completed successfully
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
WARN Issue while reading "/home/runner/_work/platforma/platforma/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @platforma-sdk/ui-vue@1.68.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.68.4 linter:check /home/runner/_work/platforma/platforma/sdk/ui-vue
|
|
4
4
|
> ts-builder linter --check
|
|
5
5
|
|
|
6
6
|
Linting project...
|
|
7
7
|
↳ oxlint --config /home/runner/_work/platforma/platforma/sdk/ui-vue/.oxlintrc.json --deny-warnings
|
|
8
8
|
Found 0 warnings and 0 errors.
|
|
9
|
-
Finished in
|
|
9
|
+
Finished in 29ms on 120 files with 98 rules using 8 threads.
|
|
10
10
|
Linting completed successfully
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
WARN Issue while reading "/home/runner/_work/platforma/platforma/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @platforma-sdk/ui-vue@1.68.
|
|
3
|
+
> @platforma-sdk/ui-vue@1.68.4 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,21 @@
|
|
|
1
1
|
# @platforma-sdk/ui-vue
|
|
2
2
|
|
|
3
|
+
## 1.68.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [e5596f5]
|
|
8
|
+
- @milaboratories/pl-model-common@1.36.1
|
|
9
|
+
- @milaboratories/pf-spec-driver@1.3.5
|
|
10
|
+
- @platforma-sdk/model@1.68.4
|
|
11
|
+
- @milaboratories/uikit@2.12.11
|
|
12
|
+
|
|
13
|
+
## 1.68.1
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- ca3cf14: export labeled columns
|
|
18
|
+
|
|
3
19
|
## 1.68.0
|
|
4
20
|
|
|
5
21
|
### Minor Changes
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import r from "../components/PlAgDataTable/
|
|
4
|
-
import { AgGridTheme as i } from "./AgGridTheme.js";
|
|
1
|
+
import e from "../components/PlAgDataTable/PlAgOverlayLoading.js";
|
|
2
|
+
import t from "../components/PlAgDataTable/PlAgOverlayNoRows.js";
|
|
3
|
+
import { autoSizeRowNumberColumn as n, makeRowNumberColDef as r } from "../components/PlAgDataTable/sources/row-number.js";
|
|
5
4
|
import "../components/PlAgDataTable/index.js";
|
|
5
|
+
import { AgGridTheme as i } from "./AgGridTheme.js";
|
|
6
6
|
import { createAgGridColDef as a } from "./createAgGridColDef.js";
|
|
7
7
|
import o from "../components/PlAgCellFile/PlAgCellFile.js";
|
|
8
8
|
import "../components/PlAgCellFile/index.js";
|
|
@@ -83,16 +83,16 @@ function h(h) {
|
|
|
83
83
|
let g = d(), _ = u(() => {
|
|
84
84
|
let u = {
|
|
85
85
|
theme: i,
|
|
86
|
-
loadingOverlayComponent:
|
|
87
|
-
noRowsOverlayComponent:
|
|
88
|
-
onGridReady: (
|
|
89
|
-
g.value =
|
|
86
|
+
loadingOverlayComponent: e,
|
|
87
|
+
noRowsOverlayComponent: t,
|
|
88
|
+
onGridReady: (e) => {
|
|
89
|
+
g.value = e.api, n(e.api);
|
|
90
90
|
}
|
|
91
91
|
}, d = h({
|
|
92
92
|
builder: new m(),
|
|
93
93
|
column: (e) => e
|
|
94
94
|
}), f = Object.assign({}, u, d instanceof m ? d.build() : d);
|
|
95
|
-
return f.rowNumbersColumn && (f.columnDefs = [
|
|
95
|
+
return f.rowNumbersColumn && (f.columnDefs = [r(), ...f.columnDefs ?? []]), f.noRowsText && (f.noRowsOverlayComponentParams = { text: f.noRowsText }), "loadingOverlayComponentParams" in f && console.warn("useAgGridOptions: remove loadingOverlayComponentParams from options, use loading, notReady, loadingText instead"), f.loading = f.notReady || f.loading, f.columnDefs = f.columnDefs?.map((e) => a(e)), f.components = Object.assign({}, f.components ?? {}, {
|
|
96
96
|
PlAgCellFile: o,
|
|
97
97
|
PlAgChartStackedBarCell: s,
|
|
98
98
|
PlAgChartHistogramCell: c,
|
|
@@ -110,7 +110,7 @@ function h(h) {
|
|
|
110
110
|
};
|
|
111
111
|
});
|
|
112
112
|
return p(() => _.value.rowNumbersColumn, () => {
|
|
113
|
-
g.value &&
|
|
113
|
+
g.value && n(g.value);
|
|
114
114
|
}), f([() => _.value.notReady, () => _.value.loading], ([e, t]) => {
|
|
115
115
|
let n = {
|
|
116
116
|
variant: e ? "not-ready" : "loading",
|
|
@@ -24,6 +24,11 @@ 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.
|
|
27
32
|
*/
|
|
28
33
|
export declare function collectVisibleColumnIndices(gridApi: GridApi, specs: PTableColumnSpec[], pframeSpec: PFrameSpecDriver): Nil | number[];
|
|
29
34
|
//# 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,
|
|
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;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,gBAAgB,EAAE,EACzB,UAAU,EAAE,gBAAgB,GAC3B,GAAG,GAAG,MAAM,EAAE,CAmBhB"}
|
|
@@ -1,39 +1,45 @@
|
|
|
1
1
|
import { getServices as e } from "../../internal/getServices.js";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import "../PlAgDataTable/sources/row-number.js";
|
|
3
|
+
import "../PlAgDataTable/index.js";
|
|
4
|
+
import { getPTableColumnId as t, parseJson as n } from "@platforma-sdk/model";
|
|
5
|
+
import { isNil as r } from "es-toolkit";
|
|
4
6
|
//#region src/components/PlAgCsvExporter/export-csv.ts
|
|
5
|
-
async function
|
|
6
|
-
let { dialog:
|
|
7
|
-
if (
|
|
8
|
-
if (
|
|
9
|
-
if (
|
|
10
|
-
let l =
|
|
11
|
-
if (
|
|
12
|
-
let { canceled: u, path: d } = await
|
|
13
|
-
if (!(u ||
|
|
7
|
+
async function i(t, n) {
|
|
8
|
+
let { dialog: i, pframe: o, pframeSpec: c } = e();
|
|
9
|
+
if (r(i)) throw Error("dialog service is not available in the current environment");
|
|
10
|
+
if (r(o)) throw Error("pframe service is not available");
|
|
11
|
+
if (r(c)) throw Error("pframeSpec service is not available");
|
|
12
|
+
let l = s(t, await o.getSpec(n.tableHandle), c);
|
|
13
|
+
if (r(l)) return;
|
|
14
|
+
let { canceled: u, path: d } = await i.showSaveDialog({ defaultFileName: (n.defaultFileName ?? `table_${a(/* @__PURE__ */ new Date())}`) + `.${n.format}.gz` });
|
|
15
|
+
if (!(u || r(d))) return o.writePTableToFs(n.tableHandle, {
|
|
14
16
|
path: d,
|
|
15
|
-
format:
|
|
17
|
+
format: n.format,
|
|
16
18
|
columnIndices: l,
|
|
17
19
|
compression: { type: "gzip" }
|
|
18
20
|
});
|
|
19
21
|
}
|
|
20
|
-
function
|
|
22
|
+
function a(e) {
|
|
21
23
|
let t = (e) => String(e).padStart(2, "0");
|
|
22
24
|
return `${t(e.getDate())}-${t(e.getMonth() + 1)}-${e.getFullYear()}_${t(e.getHours())}-${t(e.getMinutes())}-${t(e.getSeconds())}`;
|
|
23
25
|
}
|
|
24
|
-
function
|
|
26
|
+
function o() {
|
|
25
27
|
try {
|
|
26
28
|
let t = e();
|
|
27
|
-
return !
|
|
29
|
+
return !r(t?.dialog) && !r(t?.pframe);
|
|
28
30
|
} catch {
|
|
29
31
|
return !1;
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
|
-
function
|
|
33
|
-
let
|
|
34
|
-
|
|
34
|
+
function s(e, i, a) {
|
|
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);
|
|
35
41
|
}
|
|
36
42
|
//#endregion
|
|
37
|
-
export {
|
|
43
|
+
export { i as exportCsv, o as isCsvExportAvailable };
|
|
38
44
|
|
|
39
45
|
//# sourceMappingURL=export-csv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-csv.js","names":[],"sources":["../../../src/components/PlAgCsvExporter/export-csv.ts"],"sourcesContent":["import { type ColDef, type ColGroupDef, type GridApi } from \"ag-grid-enterprise\";\nimport type {\n PTableHandle,\n PTableDownloadFormat,\n PTableColumnSpec,\n PFrameSpecDriver,\n WritePTableToFsResult,\n} from \"@platforma-sdk/model\";\nimport { getPTableColumnId } from \"@platforma-sdk/model\";\nimport { isNil } from \"es-toolkit\";\nimport { Nil } from \"@milaboratories/helpers\";\nimport { getServices } from \"../../internal/getServices\";\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
|
|
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 *\n * Each grid column carries a `PlTableColumnId` ({ source, labeled }). When\n * the labeled spec differs from the source (axis replaced by a label\n * column), both indices are emitted so the export contains the raw axis\n * value alongside its human-readable label.\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 const { labeled } = parseJson(def.colId as PlTableColumnIdJson);\n return [labeled];\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;;;AAeX,SAAgB,EACd,GACA,GACA,GACgB;CAChB,IAAM,IAAa,EAAQ,eAAe;AAiB1C,QAhBI,EAAM,EAAW,GACnB,SAeK,CAAC,GAAG,IAAI,IAAI,EAAW,SATT,MAAkD;AAIrE,MAHI,cAAc,KACd,EAAI,SAAS,MACb,EAAM,EAAI,MAAM,IAChB,EAAI,UAAA,4BAAuC,QAAO,EAAE;EACxD,IAAM,EAAE,eAAY,EAAU,EAAI,MAA6B;AAC/D,SAAO,CAAC,EAAQ;GAGgC,CAAC,KAZhC,MACjB,EAAW,gBAAgB,GAAO,EAAkB,EAAK,CAAC,CAWK,CAAC,CAAC,CAAC,QAAQ,MAAQ,MAAQ,GAAG"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { isJsonEqual as e } from "../../lib/util/helpers/dist/objects.js";
|
|
2
2
|
import { promiseTimeout as t } from "../../lib/util/helpers/dist/functions.js";
|
|
3
3
|
import "../../lib/util/helpers/dist/index.js";
|
|
4
|
-
import n from "
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
4
|
+
import { PlAgDataTableRowNumberColId as n } from "./sources/row-number.js";
|
|
5
|
+
import { DeferredCircular as r, ensureNodeVisible as i } from "./sources/focus-row.js";
|
|
6
|
+
import a from "../PlAgCsvExporter/PlAgCsvExporter.js";
|
|
7
|
+
import o from "../PlAgGridColumnManager/PlAgGridColumnManager.js";
|
|
7
8
|
import "../PlAgGridColumnManager/index.js";
|
|
8
|
-
import
|
|
9
|
-
import
|
|
9
|
+
import s from "../PlTableFilters/PlTableFiltersV2.js";
|
|
10
|
+
import c from "../PlTableFastSearch/PlTableFastSearch.js";
|
|
10
11
|
import "../PlTableFastSearch/index.js";
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import { DeferredCircular as ee, ensureNodeVisible as te } from "./sources/focus-row.js";
|
|
12
|
+
import ee from "./PlAgDataTableSheets.js";
|
|
13
|
+
import te from "./PlAgRowCount.js";
|
|
14
14
|
import { calculateGridOptions as ne } from "./sources/table-source-v2.js";
|
|
15
15
|
import { useTableState as l } from "./sources/table-state-v2.js";
|
|
16
16
|
import { useFilterableColumns as u } from "./compositions/useFilterableColumns.js";
|
|
@@ -46,7 +46,7 @@ var N = /* @__PURE__ */ g({
|
|
|
46
46
|
"newDataRendered"
|
|
47
47
|
], ["update:modelValue", "update:selection"]),
|
|
48
48
|
setup(g, { expose: y, emit: N }) {
|
|
49
|
-
let fe = T(g, "modelValue"), P = T(g, "selection"), F = g, { settings: I } = se(F), L = N, R = new
|
|
49
|
+
let fe = T(g, "modelValue"), P = T(g, "selection"), F = g, { settings: I } = se(F), L = N, R = new r(), { gridApi: z, gridOptions: B } = d({
|
|
50
50
|
selection: P,
|
|
51
51
|
noRowsText: F.noRowsText,
|
|
52
52
|
runningText: F.runningText,
|
|
@@ -59,8 +59,8 @@ var N = /* @__PURE__ */ g({
|
|
|
59
59
|
}, B.value.onRowDoubleClicked = (e) => {
|
|
60
60
|
e.data && e.data.axesKey && L("rowDoubleClicked", e.data.axesKey);
|
|
61
61
|
}, B.value.onStateUpdated = (t) => {
|
|
62
|
-
let
|
|
63
|
-
B.value.initialState = H.value =
|
|
62
|
+
let r = J(q(t.state), H.value, t.api);
|
|
63
|
+
B.value.initialState = H.value = r, e(t.sources, ["columnSizing"]) || t.api.autoSizeColumns(t.api.getAllDisplayedColumns().filter((e) => e.getColId() !== n));
|
|
64
64
|
};
|
|
65
65
|
let [pe, me] = u(() => I.value.sourceId, () => B.value.columnDefs ?? null), { gridState: H, sheetsState: U, searchString: W, filtersState: G, defaultFiltersState: K, resetDefaultFilters: he } = l(fe, I, me, f(() => I.value.sourceId === null ? void 0 : I.value.model?.defaultFilters)), ge = f(() => {
|
|
66
66
|
let e = { ...I.value };
|
|
@@ -123,7 +123,7 @@ var N = /* @__PURE__ */ g({
|
|
|
123
123
|
}), y({
|
|
124
124
|
focusRow: async (t) => {
|
|
125
125
|
let n = await R.promise;
|
|
126
|
-
return n.isDestroyed() ? !1 :
|
|
126
|
+
return n.isDestroyed() ? !1 : i(n, (n) => e(n.data?.axesKey, t));
|
|
127
127
|
},
|
|
128
128
|
updateSelection: async ({ axesSpec: n, selectedKeys: r }) => {
|
|
129
129
|
let i = await R.promise;
|
|
@@ -278,15 +278,15 @@ var N = /* @__PURE__ */ g({
|
|
|
278
278
|
});
|
|
279
279
|
}), D(() => {
|
|
280
280
|
!z.value || z.value?.isDestroyed() || z.value.updateGridOptions({ statusBar: B.value.loading ? void 0 : { statusPanels: [{
|
|
281
|
-
statusPanel:
|
|
281
|
+
statusPanel: te,
|
|
282
282
|
align: "left"
|
|
283
283
|
}] } });
|
|
284
284
|
}), (e, t) => (x(), ie("div", { class: b(e.$style.container) }, [
|
|
285
|
-
w(z) && !g.disableColumnsPanel ? (x(), p(w(
|
|
285
|
+
w(z) && !g.disableColumnsPanel ? (x(), p(w(o), {
|
|
286
286
|
key: 0,
|
|
287
287
|
api: w(z)
|
|
288
288
|
}, null, 8, ["api"])) : m("", !0),
|
|
289
|
-
g.disableFiltersPanel ? m("", !0) : (x(), p(
|
|
289
|
+
g.disableFiltersPanel ? m("", !0) : (x(), p(s, {
|
|
290
290
|
key: 1,
|
|
291
291
|
filters: w(G),
|
|
292
292
|
"default-filters": w(K),
|
|
@@ -305,12 +305,12 @@ var N = /* @__PURE__ */ g({
|
|
|
305
305
|
"onResetDefaultFilters",
|
|
306
306
|
"modelValue"
|
|
307
307
|
])),
|
|
308
|
-
w(z) && g.showExportButton ? (x(), p(
|
|
308
|
+
w(z) && g.showExportButton ? (x(), p(a, {
|
|
309
309
|
key: 2,
|
|
310
310
|
api: w(z),
|
|
311
311
|
"table-handle": "model" in w(I) ? w(I)?.model?.visibleTableHandle : void 0
|
|
312
312
|
}, null, 8, ["api", "table-handle"])) : m("", !0),
|
|
313
|
-
h(
|
|
313
|
+
h(ee, {
|
|
314
314
|
modelValue: w(U),
|
|
315
315
|
"onUpdate:modelValue": t[3] ||= (e) => v(U) ? U.value = e : null,
|
|
316
316
|
settings: ge.value
|
|
@@ -323,7 +323,7 @@ var N = /* @__PURE__ */ g({
|
|
|
323
323
|
fn: O(() => [C(e.$slots, "after-sheets")]),
|
|
324
324
|
key: "1"
|
|
325
325
|
} : void 0]), 1032, ["modelValue", "settings"]),
|
|
326
|
-
h(w(
|
|
326
|
+
h(w(c), {
|
|
327
327
|
modelValue: w(W),
|
|
328
328
|
"onUpdate:modelValue": t[4] ||= (e) => v(W) ? W.value = e : null
|
|
329
329
|
}, null, 8, ["modelValue"]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlAgDataTableV2.vue_vue_type_script_setup_true_lang.js","names":["$style","$slots"],"sources":["../../../src/components/PlAgDataTable/PlAgDataTableV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { promiseTimeout, isJsonEqual } from \"@milaboratories/helpers\";\nimport type {\n AxisId,\n PlDataTableGridStateCore,\n PlDataTableStateV2,\n PlSelectionModel,\n PlTableColumnIdJson,\n PTableColumnSpec,\n PTableKey,\n} from \"@platforma-sdk/model\";\nimport {\n getRawPlatformaInstance,\n createPlSelectionModel,\n matchAxisId,\n getAxisId,\n canonicalizeJson,\n isAbortError,\n isColumnOptional,\n} from \"@platforma-sdk/model\";\nimport type { CellRendererSelectorFunc, GridApi, GridState } from \"ag-grid-enterprise\";\nimport { AgGridVue } from \"ag-grid-vue3\";\nimport { computed, effectScope, nextTick, ref, toRefs, watch, watchEffect } from \"vue\";\nimport PlAgCsvExporter from \"../PlAgCsvExporter/PlAgCsvExporter.vue\";\nimport { PlAgGridColumnManager } from \"../PlAgGridColumnManager\";\nimport PlTableFiltersV2 from \"../PlTableFilters/PlTableFiltersV2.vue\";\nimport { PlTableFastSearch } from \"../PlTableFastSearch\";\nimport PlAgDataTableSheets from \"./PlAgDataTableSheets.vue\";\nimport PlAgRowCount from \"./PlAgRowCount.vue\";\nimport { DeferredCircular, ensureNodeVisible } from \"./sources/focus-row\";\nimport { PlAgDataTableRowNumberColId } from \"./sources/row-number\";\nimport type { PlAgCellButtonAxisParams } from \"./sources/table-source-v2\";\nimport { calculateGridOptions } from \"./sources/table-source-v2\";\nimport { useTableState } from \"./sources/table-state-v2\";\nimport type {\n PlAgDataTableV2Controller,\n PlAgDataTableV2Row,\n PlAgOverlayLoadingParams,\n PlAgOverlayNoRowsParams,\n PlDataTableSettingsV2,\n PlDataTableSheetsSettings,\n PlTableRowId,\n} from \"./types\";\nimport { useFilterableColumns } from \"./compositions/useFilterableColumns\";\nimport { useGrid } from \"./compositions/useGrid\";\nimport { AgGridTheme } from \"../../AgGridVue/AgGridTheme\";\n\nconst tableState = defineModel<PlDataTableStateV2>({\n required: true,\n});\n/** Warning: selection model value updates are ignored, use updateSelection instead */\nconst selection = defineModel<PlSelectionModel>(\"selection\");\nconst props = defineProps<{\n /** Required component settings */\n settings: Readonly<PlDataTableSettingsV2>;\n\n /**\n * The disableColumnsPanel prop controls the display of a button that activates\n * the columns management panel in the table. To make the button functional\n * and visible, you must also include the PlAgDataTableToolsPanel component in your layout.\n * This component serves as the target for teleporting the button.\n */\n disableColumnsPanel?: boolean;\n\n /**\n * The disableFiltersPanel prop controls the display of a button that activates\n * the filters management panel in the table. To make the button functional\n * and visible, you must also include the PlAgDataTableToolsPanel component in your layout.\n * This component serves as the target for teleporting the button.\n */\n disableFiltersPanel?: boolean;\n\n /**\n * The showExportButton prop controls the display of a button that allows\n * to export table data in CSV format. To make the button functional\n * and visible, you must also include the PlAgDataTableToolsPanel component in your layout.\n * This component serves as the target for teleporting the button.\n */\n showExportButton?: boolean;\n\n /**\n * The AxisId property is used to configure and display the PlAgTextAndButtonCell component\n */\n showCellButtonForAxisId?: AxisId;\n\n /**\n * If cellButtonInvokeRowsOnDoubleClick = true, clicking a button inside the row\n * triggers the doubleClick event for the entire row.\n *\n * If cellButtonInvokeRowsOnDoubleClick = false, the doubleClick event for the row\n * is not triggered, but will triggered cellButtonClicked event with (key: PTableRowKey) argument.\n */\n cellButtonInvokeRowsOnDoubleClick?: boolean;\n\n /** @see {@link PlAgOverlayLoadingParams.loadingText} */\n loadingText?: string;\n\n /** @see {@link PlAgOverlayLoadingParams.runningText} */\n runningText?: string;\n\n /** @see {@link PlAgOverlayLoadingParams.notReadyText} */\n notReadyText?: string;\n\n /** @see {@link PlAgOverlayNoRowsParams.text} */\n noRowsText?: string;\n\n /**\n * Callback to override the default renderer for a given cell.\n * @see https://www.ag-grid.com/vue-data-grid/component-cell-renderer/#dynamic-component-selection\n */\n cellRendererSelector?: CellRendererSelectorFunc<PlAgDataTableV2Row>;\n}>();\nconst { settings } = toRefs(props);\nconst emit = defineEmits<{\n rowDoubleClicked: [key?: PTableKey];\n cellButtonClicked: [key?: PTableKey];\n newDataRendered: [];\n}>();\n\nconst dataRenderedTracker = new DeferredCircular<GridApi<PlAgDataTableV2Row>>();\nconst { gridApi, gridOptions } = useGrid({\n selection,\n noRowsText: props.noRowsText,\n runningText: props.runningText,\n loadingText: props.loadingText,\n notReadyText: props.notReadyText,\n cellRendererSelector: props.cellRendererSelector,\n});\nlet isReloading = false;\ngridOptions.value.onGridPreDestroyed = (event) => {\n if (!isReloading) {\n gridOptions.value.initialState = gridState.value = normalizeColumnVisibility(\n makePartialState(event.api.getState()),\n gridState.value,\n event.api,\n );\n }\n gridApi.value = null;\n};\ngridOptions.value.onRowDoubleClicked = (event) => {\n if (event.data && event.data.axesKey) emit(\"rowDoubleClicked\", event.data.axesKey);\n};\ngridOptions.value.onStateUpdated = (event) => {\n const partialState = normalizeColumnVisibility(\n makePartialState(event.state),\n gridState.value,\n event.api,\n );\n // We have to keep initialState synchronized with gridState for gridState recovery after key updating.\n gridOptions.value.initialState = gridState.value = partialState;\n\n if (!isJsonEqual(event.sources, [\"columnSizing\"])) {\n event.api.autoSizeColumns(\n event.api\n .getAllDisplayedColumns()\n .filter((column) => column.getColId() !== PlAgDataTableRowNumberColId),\n );\n }\n};\n\nconst [filterableColumns, visibleFilterableColumns] = useFilterableColumns(\n () => settings.value.sourceId,\n () => gridOptions.value.columnDefs ?? null,\n);\nconst defaultFilters = computed(() =>\n settings.value.sourceId !== null ? settings.value.model?.defaultFilters : undefined,\n);\nconst {\n gridState,\n sheetsState,\n searchString,\n filtersState,\n defaultFiltersState,\n resetDefaultFilters,\n} = useTableState(tableState, settings, visibleFilterableColumns, defaultFilters);\nconst sheetsSettings = computed<PlDataTableSheetsSettings>(() => {\n const settingsCopy = { ...settings.value };\n return settingsCopy.sourceId !== null\n ? {\n sheets: settingsCopy.sheets ?? [],\n cachedState: [...sheetsState.value],\n }\n : {\n sheets: [],\n cachedState: [],\n };\n});\ngridOptions.value.initialState = gridState.value;\n\n// Restore proper types erased by AgGrid\nfunction makePartialState(state: GridState): PlDataTableGridStateCore {\n return {\n columnOrder: state.columnOrder as\n | {\n orderedColIds: PlTableColumnIdJson[];\n }\n | undefined,\n sort: state.sort as\n | {\n sortModel: {\n colId: PlTableColumnIdJson;\n sort: \"asc\" | \"desc\";\n }[];\n }\n | undefined,\n columnVisibility: state.columnVisibility as\n | {\n hiddenColIds: PlTableColumnIdJson[];\n }\n | undefined,\n };\n}\n\n// AG Grid returns columnVisibility: undefined when all columns are visible.\n// We need to distinguish \"no state yet\" (use isColumnOptional defaults) from\n// \"user explicitly showed all columns\" (store []). This function normalizes\n// the undefined from AG Grid based on the previous state.\nfunction normalizeColumnVisibility(\n partialState: PlDataTableGridStateCore,\n prevState: PlDataTableGridStateCore,\n api: GridApi<PlAgDataTableV2Row>,\n): PlDataTableGridStateCore {\n if (partialState.columnVisibility !== undefined) return partialState;\n\n if (prevState.columnVisibility !== undefined) {\n // Had explicit visibility state before → user made all columns visible → store [].\n return { ...partialState, columnVisibility: { hiddenColIds: [] } };\n }\n\n // No previous explicit state → compute defaults from current columns\n // to replicate: hide: hiddenColIds?.includes(colId) ?? isColumnOptional(spec.spec)\n const defaultHidden = getDefaultHiddenColIds(api);\n if (defaultHidden.length > 0) {\n return { ...partialState, columnVisibility: { hiddenColIds: defaultHidden } };\n }\n\n return partialState;\n}\n\nfunction getDefaultHiddenColIds(api: GridApi<PlAgDataTableV2Row>): PlTableColumnIdJson[] {\n const cols = api.getAllGridColumns();\n if (!cols) return [];\n\n return cols\n .filter((col) => {\n const spec = col.getColDef().context as PTableColumnSpec | undefined;\n return spec !== undefined && spec.type === \"column\" && isColumnOptional(spec.spec);\n })\n .map((col) => col.getColId() as PlTableColumnIdJson);\n}\n\n// Normalize columnVisibility for comparison: undefined and { hiddenColIds: [] } are equivalent.\nfunction stateForReloadCompare(state: PlDataTableGridStateCore): PlDataTableGridStateCore {\n const cv = state.columnVisibility;\n const normalizedCv = !cv || cv.hiddenColIds.length === 0 ? undefined : state.columnVisibility;\n return { ...state, columnVisibility: normalizedCv };\n}\n\n// Reload AgGrid when new state arrives from server\nconst reloadKey = ref(0);\nwatch(\n () => [gridApi.value, gridState.value] as const,\n ([gridApi, gridState]) => {\n if (!gridApi || gridApi.isDestroyed()) return;\n const selfState = makePartialState(gridApi.getState());\n if (\n !isJsonEqual(gridState, {}) &&\n !isJsonEqual(stateForReloadCompare(gridState), stateForReloadCompare(selfState))\n ) {\n isReloading = true;\n gridOptions.value.initialState = gridState;\n ++reloadKey.value;\n nextTick(() => {\n isReloading = false;\n });\n }\n },\n);\n\n// Make cellRendererSelector reactive\nconst cellRendererSelector = computed(() => props.cellRendererSelector ?? null);\nwatch(\n () => [gridApi.value, cellRendererSelector.value] as const,\n ([gridApi, cellRendererSelector]) => {\n if (!gridApi || gridApi.isDestroyed()) return;\n gridApi.setGridOption(\"defaultColDef\", {\n ...gridOptions.value.defaultColDef,\n cellRendererSelector: cellRendererSelector ?? undefined,\n });\n },\n);\n\ndefineExpose<PlAgDataTableV2Controller>({\n focusRow: async (rowKey) => {\n const gridApi = await dataRenderedTracker.promise;\n if (gridApi.isDestroyed()) return false;\n\n return ensureNodeVisible(gridApi, (row) => isJsonEqual(row.data?.axesKey, rowKey));\n },\n updateSelection: async ({ axesSpec, selectedKeys }) => {\n const gridApi = await dataRenderedTracker.promise;\n if (gridApi.isDestroyed()) return false;\n\n const axes = selection.value?.axesSpec;\n if (!axes || axes.length !== axesSpec.length) return false;\n\n const mapping = axesSpec.map((spec) => {\n const id = getAxisId(spec);\n return axes.findIndex((axis) => matchAxisId(axis, id));\n });\n const mappingSet = new Set(mapping);\n if (mappingSet.has(-1) || mappingSet.size !== axesSpec.length) return false;\n\n const selectedNodes = selectedKeys.map((key) =>\n canonicalizeJson<PlTableRowId>(mapping.map((index) => key[index])),\n );\n const oldSelectedKeys = gridApi.getServerSideSelectionState()?.toggledNodes ?? [];\n if (!isJsonEqual(oldSelectedKeys, selectedNodes)) {\n gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: selectedNodes,\n });\n\n // wait for `onSelectionChanged` to update `selection` model\n const scope = effectScope();\n const { resolve, promise } = Promise.withResolvers();\n scope.run(() => watch(selection, resolve, { once: true }));\n try {\n await promiseTimeout(promise, 500);\n } catch {\n return false;\n } finally {\n scope.stop();\n }\n }\n return true;\n },\n});\n\n// Update AgGrid when settings change\nconst defaultSelection = createPlSelectionModel();\nlet oldSettings: PlDataTableSettingsV2 | null = null;\nconst generation = ref(0);\nwatch(\n () => [gridApi.value, settings.value] as const,\n ([gridApi, settings]) => {\n // Wait for AgGrid reinitialization, gridApi will eventually become initialized\n if (!gridApi || gridApi.isDestroyed()) return;\n // Verify that this is not a false watch trigger\n if (isJsonEqual(settings, oldSettings)) return;\n ++generation.value;\n try {\n // Hide no rows overlay if it is shown, or else loading overlay will not be shown\n gridApi.hideOverlay();\n dataRenderedTracker.reset();\n\n // No data source selected -> reset state to default\n if (settings.sourceId === null) {\n gridApi.updateGridOptions({\n loading: true,\n loadingOverlayComponentParams: {\n ...gridOptions.value.loadingOverlayComponentParams,\n variant: settings.pending ? \"running\" : \"not-ready\",\n } satisfies PlAgOverlayLoadingParams,\n columnDefs: undefined,\n serverSideDatasource: undefined,\n });\n if (selection.value) {\n if (selection.value && !isJsonEqual(selection.value, defaultSelection)) {\n selection.value = createPlSelectionModel();\n }\n gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: [],\n });\n }\n return;\n }\n\n if (\n settings.model?.fullTableHandle === undefined ||\n settings.model?.visibleTableHandle === undefined\n ) {\n return;\n }\n\n // Data source changed -> show full page loader, clear selection\n if (settings.sourceId !== oldSettings?.sourceId) {\n gridApi.updateGridOptions({\n loading: true,\n loadingOverlayComponentParams: {\n ...gridOptions.value.loadingOverlayComponentParams,\n variant: \"loading\",\n } satisfies PlAgOverlayLoadingParams,\n });\n if (selection.value && oldSettings?.sourceId) {\n if (selection.value && !isJsonEqual(selection.value, defaultSelection)) {\n selection.value = createPlSelectionModel();\n }\n gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: [],\n });\n }\n }\n\n // Model updated -> show skeletons instead of data\n const sourceChanged =\n settings.model?.sourceId && settings.model.sourceId !== settings.sourceId;\n if (!settings.model || sourceChanged) {\n const state = gridApi.getServerSideGroupLevelState();\n const rowCount = !sourceChanged && state.length > 0 ? state[0].rowCount : 1;\n return gridApi.updateGridOptions({\n serverSideDatasource: {\n getRows: (params) => {\n params.success({ rowData: [], rowCount });\n },\n },\n });\n }\n\n // Model ready -> calculate new state\n const stateGeneration = generation.value;\n calculateGridOptions({\n generation,\n pfDriver: getRawPlatformaInstance().pFrameDriver,\n fullTableHandle: settings.model?.fullTableHandle,\n visibleTableHandle: settings.model?.visibleTableHandle,\n sheets: settings.sheets ?? [],\n dataRenderedTracker,\n hiddenColIds: gridState.value.columnVisibility?.hiddenColIds,\n cellButtonAxisParams: {\n showCellButtonForAxisId: props.showCellButtonForAxisId,\n cellButtonInvokeRowsOnDoubleClick: props.cellButtonInvokeRowsOnDoubleClick,\n trigger: (key?: PTableKey) => emit(\"cellButtonClicked\", key),\n } satisfies PlAgCellButtonAxisParams,\n })\n .then((result) => {\n if (gridApi.isDestroyed() || stateGeneration !== generation.value) return;\n const { axesSpec, ...options } = result;\n gridApi.updateGridOptions({\n ...options,\n });\n if (selection.value) {\n // Update selection if axesSpec changed, as order of axes may have changed and so we need to remap selected keys\n const { axesSpec: oldAxesSpec, selectedKeys: oldSelectedKeys } = selection.value;\n if (!isJsonEqual(oldAxesSpec, axesSpec)) {\n if (!oldAxesSpec || axesSpec.length !== oldAxesSpec.length) {\n const newSelection: PlSelectionModel = { axesSpec, selectedKeys: [] };\n if (!isJsonEqual(selection.value, newSelection)) {\n selection.value = newSelection;\n }\n return gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: [],\n });\n }\n\n const mapping = oldAxesSpec\n .map(getAxisId)\n .map((id) => axesSpec.findIndex((axis) => matchAxisId(axis, id)));\n const mappingSet = new Set(mapping);\n if (mappingSet.has(-1) || mappingSet.size !== axesSpec.length) {\n const newSelection: PlSelectionModel = { axesSpec, selectedKeys: [] };\n if (!isJsonEqual(selection.value, newSelection)) {\n selection.value = newSelection;\n }\n return gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: [],\n });\n }\n\n const selectedNodes = oldSelectedKeys.map((key) =>\n mapping.map((index) => key[index]),\n );\n const newSelection: PlSelectionModel = { axesSpec, selectedKeys: selectedNodes };\n if (!isJsonEqual(selection.value, newSelection)) {\n selection.value = newSelection;\n }\n return gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: selectedNodes.map((key) => canonicalizeJson<PlTableRowId>(key)),\n });\n }\n }\n })\n .catch((error: unknown) => {\n if (gridApi.isDestroyed() || stateGeneration !== generation.value) return;\n if (isAbortError(error)) return;\n console.trace(error);\n })\n .finally(() => {\n if (gridApi.isDestroyed() || stateGeneration !== generation.value) return;\n gridApi.updateGridOptions({\n loading: false,\n });\n });\n dataRenderedTracker.promise.then(() => emit(\"newDataRendered\"));\n } catch (error: unknown) {\n console.trace(error);\n } finally {\n oldSettings = settings;\n }\n },\n);\n\nwatch(\n () => ({\n gridApi: gridApi.value,\n loadingText: props.loadingText,\n runningText: props.runningText,\n notReadyText: props.notReadyText,\n noRowsText: props.noRowsText,\n }),\n ({ gridApi, loadingText, runningText, notReadyText, noRowsText }) => {\n if (!gridApi || gridApi.isDestroyed()) return;\n gridApi.updateGridOptions({\n loadingOverlayComponentParams: {\n ...gridOptions.value.loadingOverlayComponentParams,\n loadingText,\n runningText,\n notReadyText,\n },\n noRowsOverlayComponentParams: {\n ...gridOptions.value.noRowsOverlayComponentParams,\n text: noRowsText,\n },\n });\n },\n);\n\nwatchEffect(() => {\n if (!gridApi.value || gridApi.value?.isDestroyed()) return;\n gridApi.value.updateGridOptions({\n statusBar: gridOptions.value.loading\n ? undefined\n : {\n statusPanels: [{ statusPanel: PlAgRowCount, align: \"left\" }],\n },\n });\n});\n</script>\n\n<template>\n <div :class=\"$style.container\">\n <PlAgGridColumnManager v-if=\"gridApi && !disableColumnsPanel\" :api=\"gridApi\" />\n <PlTableFiltersV2\n v-if=\"!disableFiltersPanel\"\n :filters=\"filtersState\"\n :default-filters=\"defaultFiltersState\"\n :pframe-handle=\"'model' in settings ? settings?.model?.fullPframeHandle : undefined\"\n :columns=\"filterableColumns\"\n @updateFilters=\"(v) => (filtersState = v)\"\n @resetDefaultFilters=\"resetDefaultFilters\"\n @updateDefaultFilters=\"(v) => (defaultFiltersState = v)\"\n v-model=\"filtersState\"\n />\n <PlAgCsvExporter\n v-if=\"gridApi && showExportButton\"\n :api=\"gridApi\"\n :table-handle=\"'model' in settings ? settings?.model?.visibleTableHandle : undefined\"\n />\n <PlAgDataTableSheets v-model=\"sheetsState\" :settings=\"sheetsSettings\">\n <template v-if=\"$slots['before-sheets']\" #before>\n <slot name=\"before-sheets\" />\n </template>\n <template v-if=\"$slots['after-sheets']\" #after>\n <slot name=\"after-sheets\" />\n </template>\n </PlAgDataTableSheets>\n <PlTableFastSearch v-model=\"searchString\" />\n <AgGridVue\n :key=\"reloadKey\"\n :theme=\"AgGridTheme\"\n :class=\"$style.grid\"\n :grid-options=\"gridOptions\"\n />\n </div>\n</template>\n\n<style lang=\"css\" module>\n.container {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 12px;\n}\n\n.grid {\n flex: 1;\n}\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlAgDataTableV2.vue_vue_type_script_setup_true_lang.js","names":["$style","$slots"],"sources":["../../../src/components/PlAgDataTable/PlAgDataTableV2.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { promiseTimeout, isJsonEqual } from \"@milaboratories/helpers\";\nimport type {\n AxisId,\n PlDataTableGridStateCore,\n PlDataTableStateV2,\n PlSelectionModel,\n PlTableColumnIdJson,\n PTableColumnSpec,\n PTableKey,\n} from \"@platforma-sdk/model\";\nimport {\n getRawPlatformaInstance,\n createPlSelectionModel,\n matchAxisId,\n getAxisId,\n canonicalizeJson,\n isAbortError,\n isColumnOptional,\n} from \"@platforma-sdk/model\";\nimport type { CellRendererSelectorFunc, GridApi, GridState } from \"ag-grid-enterprise\";\nimport { AgGridVue } from \"ag-grid-vue3\";\nimport { computed, effectScope, nextTick, ref, toRefs, watch, watchEffect } from \"vue\";\nimport PlAgCsvExporter from \"../PlAgCsvExporter/PlAgCsvExporter.vue\";\nimport { PlAgGridColumnManager } from \"../PlAgGridColumnManager\";\nimport PlTableFiltersV2 from \"../PlTableFilters/PlTableFiltersV2.vue\";\nimport { PlTableFastSearch } from \"../PlTableFastSearch\";\nimport PlAgDataTableSheets from \"./PlAgDataTableSheets.vue\";\nimport PlAgRowCount from \"./PlAgRowCount.vue\";\nimport { DeferredCircular, ensureNodeVisible } from \"./sources/focus-row\";\nimport { PlAgDataTableRowNumberColId } from \"./sources/row-number\";\nimport type { PlAgCellButtonAxisParams } from \"./sources/table-source-v2\";\nimport { calculateGridOptions } from \"./sources/table-source-v2\";\nimport { useTableState } from \"./sources/table-state-v2\";\nimport type {\n PlAgDataTableV2Controller,\n PlAgDataTableV2Row,\n PlAgOverlayLoadingParams,\n PlAgOverlayNoRowsParams,\n PlDataTableSettingsV2,\n PlDataTableSheetsSettings,\n PlTableRowId,\n} from \"./types\";\nimport { useFilterableColumns } from \"./compositions/useFilterableColumns\";\nimport { useGrid } from \"./compositions/useGrid\";\nimport { AgGridTheme } from \"../../AgGridVue/AgGridTheme\";\n\nconst tableState = defineModel<PlDataTableStateV2>({\n required: true,\n});\n/** Warning: selection model value updates are ignored, use updateSelection instead */\nconst selection = defineModel<PlSelectionModel>(\"selection\");\nconst props = defineProps<{\n /** Required component settings */\n settings: Readonly<PlDataTableSettingsV2>;\n\n /**\n * The disableColumnsPanel prop controls the display of a button that activates\n * the columns management panel in the table. To make the button functional\n * and visible, you must also include the PlAgDataTableToolsPanel component in your layout.\n * This component serves as the target for teleporting the button.\n */\n disableColumnsPanel?: boolean;\n\n /**\n * The disableFiltersPanel prop controls the display of a button that activates\n * the filters management panel in the table. To make the button functional\n * and visible, you must also include the PlAgDataTableToolsPanel component in your layout.\n * This component serves as the target for teleporting the button.\n */\n disableFiltersPanel?: boolean;\n\n /**\n * The showExportButton prop controls the display of a button that allows\n * to export table data in CSV format. To make the button functional\n * and visible, you must also include the PlAgDataTableToolsPanel component in your layout.\n * This component serves as the target for teleporting the button.\n */\n showExportButton?: boolean;\n\n /**\n * The AxisId property is used to configure and display the PlAgTextAndButtonCell component\n */\n showCellButtonForAxisId?: AxisId;\n\n /**\n * If cellButtonInvokeRowsOnDoubleClick = true, clicking a button inside the row\n * triggers the doubleClick event for the entire row.\n *\n * If cellButtonInvokeRowsOnDoubleClick = false, the doubleClick event for the row\n * is not triggered, but will triggered cellButtonClicked event with (key: PTableRowKey) argument.\n */\n cellButtonInvokeRowsOnDoubleClick?: boolean;\n\n /** @see {@link PlAgOverlayLoadingParams.loadingText} */\n loadingText?: string;\n\n /** @see {@link PlAgOverlayLoadingParams.runningText} */\n runningText?: string;\n\n /** @see {@link PlAgOverlayLoadingParams.notReadyText} */\n notReadyText?: string;\n\n /** @see {@link PlAgOverlayNoRowsParams.text} */\n noRowsText?: string;\n\n /**\n * Callback to override the default renderer for a given cell.\n * @see https://www.ag-grid.com/vue-data-grid/component-cell-renderer/#dynamic-component-selection\n */\n cellRendererSelector?: CellRendererSelectorFunc<PlAgDataTableV2Row>;\n}>();\nconst { settings } = toRefs(props);\nconst emit = defineEmits<{\n rowDoubleClicked: [key?: PTableKey];\n cellButtonClicked: [key?: PTableKey];\n newDataRendered: [];\n}>();\n\nconst dataRenderedTracker = new DeferredCircular<GridApi<PlAgDataTableV2Row>>();\nconst { gridApi, gridOptions } = useGrid({\n selection,\n noRowsText: props.noRowsText,\n runningText: props.runningText,\n loadingText: props.loadingText,\n notReadyText: props.notReadyText,\n cellRendererSelector: props.cellRendererSelector,\n});\nlet isReloading = false;\ngridOptions.value.onGridPreDestroyed = (event) => {\n if (!isReloading) {\n gridOptions.value.initialState = gridState.value = normalizeColumnVisibility(\n makePartialState(event.api.getState()),\n gridState.value,\n event.api,\n );\n }\n gridApi.value = null;\n};\ngridOptions.value.onRowDoubleClicked = (event) => {\n if (event.data && event.data.axesKey) emit(\"rowDoubleClicked\", event.data.axesKey);\n};\ngridOptions.value.onStateUpdated = (event) => {\n const partialState = normalizeColumnVisibility(\n makePartialState(event.state),\n gridState.value,\n event.api,\n );\n // We have to keep initialState synchronized with gridState for gridState recovery after key updating.\n gridOptions.value.initialState = gridState.value = partialState;\n\n if (!isJsonEqual(event.sources, [\"columnSizing\"])) {\n event.api.autoSizeColumns(\n event.api\n .getAllDisplayedColumns()\n .filter((column) => column.getColId() !== PlAgDataTableRowNumberColId),\n );\n }\n};\n\nconst [filterableColumns, visibleFilterableColumns] = useFilterableColumns(\n () => settings.value.sourceId,\n () => gridOptions.value.columnDefs ?? null,\n);\nconst defaultFilters = computed(() =>\n settings.value.sourceId !== null ? settings.value.model?.defaultFilters : undefined,\n);\nconst {\n gridState,\n sheetsState,\n searchString,\n filtersState,\n defaultFiltersState,\n resetDefaultFilters,\n} = useTableState(tableState, settings, visibleFilterableColumns, defaultFilters);\nconst sheetsSettings = computed<PlDataTableSheetsSettings>(() => {\n const settingsCopy = { ...settings.value };\n return settingsCopy.sourceId !== null\n ? {\n sheets: settingsCopy.sheets ?? [],\n cachedState: [...sheetsState.value],\n }\n : {\n sheets: [],\n cachedState: [],\n };\n});\ngridOptions.value.initialState = gridState.value;\n\n// Restore proper types erased by AgGrid\nfunction makePartialState(state: GridState): PlDataTableGridStateCore {\n return {\n columnOrder: state.columnOrder as\n | {\n orderedColIds: PlTableColumnIdJson[];\n }\n | undefined,\n sort: state.sort as\n | {\n sortModel: {\n colId: PlTableColumnIdJson;\n sort: \"asc\" | \"desc\";\n }[];\n }\n | undefined,\n columnVisibility: state.columnVisibility as\n | {\n hiddenColIds: PlTableColumnIdJson[];\n }\n | undefined,\n };\n}\n\n// AG Grid returns columnVisibility: undefined when all columns are visible.\n// We need to distinguish \"no state yet\" (use isColumnOptional defaults) from\n// \"user explicitly showed all columns\" (store []). This function normalizes\n// the undefined from AG Grid based on the previous state.\nfunction normalizeColumnVisibility(\n partialState: PlDataTableGridStateCore,\n prevState: PlDataTableGridStateCore,\n api: GridApi<PlAgDataTableV2Row>,\n): PlDataTableGridStateCore {\n if (partialState.columnVisibility !== undefined) return partialState;\n\n if (prevState.columnVisibility !== undefined) {\n // Had explicit visibility state before → user made all columns visible → store [].\n return { ...partialState, columnVisibility: { hiddenColIds: [] } };\n }\n\n // No previous explicit state → compute defaults from current columns\n // to replicate: hide: hiddenColIds?.includes(colId) ?? isColumnOptional(spec.spec)\n const defaultHidden = getDefaultHiddenColIds(api);\n if (defaultHidden.length > 0) {\n return { ...partialState, columnVisibility: { hiddenColIds: defaultHidden } };\n }\n\n return partialState;\n}\n\nfunction getDefaultHiddenColIds(api: GridApi<PlAgDataTableV2Row>): PlTableColumnIdJson[] {\n const cols = api.getAllGridColumns();\n if (!cols) return [];\n\n return cols\n .filter((col) => {\n const spec = col.getColDef().context as PTableColumnSpec | undefined;\n return spec !== undefined && spec.type === \"column\" && isColumnOptional(spec.spec);\n })\n .map((col) => col.getColId() as PlTableColumnIdJson);\n}\n\n// Normalize columnVisibility for comparison: undefined and { hiddenColIds: [] } are equivalent.\nfunction stateForReloadCompare(state: PlDataTableGridStateCore): PlDataTableGridStateCore {\n const cv = state.columnVisibility;\n const normalizedCv = !cv || cv.hiddenColIds.length === 0 ? undefined : state.columnVisibility;\n return { ...state, columnVisibility: normalizedCv };\n}\n\n// Reload AgGrid when new state arrives from server\nconst reloadKey = ref(0);\nwatch(\n () => [gridApi.value, gridState.value] as const,\n ([gridApi, gridState]) => {\n if (!gridApi || gridApi.isDestroyed()) return;\n const selfState = makePartialState(gridApi.getState());\n if (\n !isJsonEqual(gridState, {}) &&\n !isJsonEqual(stateForReloadCompare(gridState), stateForReloadCompare(selfState))\n ) {\n isReloading = true;\n gridOptions.value.initialState = gridState;\n ++reloadKey.value;\n nextTick(() => {\n isReloading = false;\n });\n }\n },\n);\n\n// Make cellRendererSelector reactive\nconst cellRendererSelector = computed(() => props.cellRendererSelector ?? null);\nwatch(\n () => [gridApi.value, cellRendererSelector.value] as const,\n ([gridApi, cellRendererSelector]) => {\n if (!gridApi || gridApi.isDestroyed()) return;\n gridApi.setGridOption(\"defaultColDef\", {\n ...gridOptions.value.defaultColDef,\n cellRendererSelector: cellRendererSelector ?? undefined,\n });\n },\n);\n\ndefineExpose<PlAgDataTableV2Controller>({\n focusRow: async (rowKey) => {\n const gridApi = await dataRenderedTracker.promise;\n if (gridApi.isDestroyed()) return false;\n\n return ensureNodeVisible(gridApi, (row) => isJsonEqual(row.data?.axesKey, rowKey));\n },\n updateSelection: async ({ axesSpec, selectedKeys }) => {\n const gridApi = await dataRenderedTracker.promise;\n if (gridApi.isDestroyed()) return false;\n\n const axes = selection.value?.axesSpec;\n if (!axes || axes.length !== axesSpec.length) return false;\n\n const mapping = axesSpec.map((spec) => {\n const id = getAxisId(spec);\n return axes.findIndex((axis) => matchAxisId(axis, id));\n });\n const mappingSet = new Set(mapping);\n if (mappingSet.has(-1) || mappingSet.size !== axesSpec.length) return false;\n\n const selectedNodes = selectedKeys.map((key) =>\n canonicalizeJson<PlTableRowId>(mapping.map((index) => key[index])),\n );\n const oldSelectedKeys = gridApi.getServerSideSelectionState()?.toggledNodes ?? [];\n if (!isJsonEqual(oldSelectedKeys, selectedNodes)) {\n gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: selectedNodes,\n });\n\n // wait for `onSelectionChanged` to update `selection` model\n const scope = effectScope();\n const { resolve, promise } = Promise.withResolvers();\n scope.run(() => watch(selection, resolve, { once: true }));\n try {\n await promiseTimeout(promise, 500);\n } catch {\n return false;\n } finally {\n scope.stop();\n }\n }\n return true;\n },\n});\n\n// Update AgGrid when settings change\nconst defaultSelection = createPlSelectionModel();\nlet oldSettings: PlDataTableSettingsV2 | null = null;\nconst generation = ref(0);\nwatch(\n () => [gridApi.value, settings.value] as const,\n ([gridApi, settings]) => {\n // Wait for AgGrid reinitialization, gridApi will eventually become initialized\n if (!gridApi || gridApi.isDestroyed()) return;\n // Verify that this is not a false watch trigger\n if (isJsonEqual(settings, oldSettings)) return;\n ++generation.value;\n try {\n // Hide no rows overlay if it is shown, or else loading overlay will not be shown\n gridApi.hideOverlay();\n dataRenderedTracker.reset();\n\n // No data source selected -> reset state to default\n if (settings.sourceId === null) {\n gridApi.updateGridOptions({\n loading: true,\n loadingOverlayComponentParams: {\n ...gridOptions.value.loadingOverlayComponentParams,\n variant: settings.pending ? \"running\" : \"not-ready\",\n } satisfies PlAgOverlayLoadingParams,\n columnDefs: undefined,\n serverSideDatasource: undefined,\n });\n if (selection.value) {\n if (selection.value && !isJsonEqual(selection.value, defaultSelection)) {\n selection.value = createPlSelectionModel();\n }\n gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: [],\n });\n }\n return;\n }\n\n if (\n settings.model?.fullTableHandle === undefined ||\n settings.model?.visibleTableHandle === undefined\n ) {\n return;\n }\n\n // Data source changed -> show full page loader, clear selection\n if (settings.sourceId !== oldSettings?.sourceId) {\n gridApi.updateGridOptions({\n loading: true,\n loadingOverlayComponentParams: {\n ...gridOptions.value.loadingOverlayComponentParams,\n variant: \"loading\",\n } satisfies PlAgOverlayLoadingParams,\n });\n if (selection.value && oldSettings?.sourceId) {\n if (selection.value && !isJsonEqual(selection.value, defaultSelection)) {\n selection.value = createPlSelectionModel();\n }\n gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: [],\n });\n }\n }\n\n // Model updated -> show skeletons instead of data\n const sourceChanged =\n settings.model?.sourceId && settings.model.sourceId !== settings.sourceId;\n if (!settings.model || sourceChanged) {\n const state = gridApi.getServerSideGroupLevelState();\n const rowCount = !sourceChanged && state.length > 0 ? state[0].rowCount : 1;\n return gridApi.updateGridOptions({\n serverSideDatasource: {\n getRows: (params) => {\n params.success({ rowData: [], rowCount });\n },\n },\n });\n }\n\n // Model ready -> calculate new state\n const stateGeneration = generation.value;\n calculateGridOptions({\n generation,\n pfDriver: getRawPlatformaInstance().pFrameDriver,\n fullTableHandle: settings.model?.fullTableHandle,\n visibleTableHandle: settings.model?.visibleTableHandle,\n sheets: settings.sheets ?? [],\n dataRenderedTracker,\n hiddenColIds: gridState.value.columnVisibility?.hiddenColIds,\n cellButtonAxisParams: {\n showCellButtonForAxisId: props.showCellButtonForAxisId,\n cellButtonInvokeRowsOnDoubleClick: props.cellButtonInvokeRowsOnDoubleClick,\n trigger: (key?: PTableKey) => emit(\"cellButtonClicked\", key),\n } satisfies PlAgCellButtonAxisParams,\n })\n .then((result) => {\n if (gridApi.isDestroyed() || stateGeneration !== generation.value) return;\n const { axesSpec, ...options } = result;\n gridApi.updateGridOptions({\n ...options,\n });\n if (selection.value) {\n // Update selection if axesSpec changed, as order of axes may have changed and so we need to remap selected keys\n const { axesSpec: oldAxesSpec, selectedKeys: oldSelectedKeys } = selection.value;\n if (!isJsonEqual(oldAxesSpec, axesSpec)) {\n if (!oldAxesSpec || axesSpec.length !== oldAxesSpec.length) {\n const newSelection: PlSelectionModel = { axesSpec, selectedKeys: [] };\n if (!isJsonEqual(selection.value, newSelection)) {\n selection.value = newSelection;\n }\n return gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: [],\n });\n }\n\n const mapping = oldAxesSpec\n .map(getAxisId)\n .map((id) => axesSpec.findIndex((axis) => matchAxisId(axis, id)));\n const mappingSet = new Set(mapping);\n if (mappingSet.has(-1) || mappingSet.size !== axesSpec.length) {\n const newSelection: PlSelectionModel = { axesSpec, selectedKeys: [] };\n if (!isJsonEqual(selection.value, newSelection)) {\n selection.value = newSelection;\n }\n return gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: [],\n });\n }\n\n const selectedNodes = oldSelectedKeys.map((key) =>\n mapping.map((index) => key[index]),\n );\n const newSelection: PlSelectionModel = { axesSpec, selectedKeys: selectedNodes };\n if (!isJsonEqual(selection.value, newSelection)) {\n selection.value = newSelection;\n }\n return gridApi.setServerSideSelectionState({\n selectAll: false,\n toggledNodes: selectedNodes.map((key) => canonicalizeJson<PlTableRowId>(key)),\n });\n }\n }\n })\n .catch((error: unknown) => {\n if (gridApi.isDestroyed() || stateGeneration !== generation.value) return;\n if (isAbortError(error)) return;\n console.trace(error);\n })\n .finally(() => {\n if (gridApi.isDestroyed() || stateGeneration !== generation.value) return;\n gridApi.updateGridOptions({\n loading: false,\n });\n });\n dataRenderedTracker.promise.then(() => emit(\"newDataRendered\"));\n } catch (error: unknown) {\n console.trace(error);\n } finally {\n oldSettings = settings;\n }\n },\n);\n\nwatch(\n () => ({\n gridApi: gridApi.value,\n loadingText: props.loadingText,\n runningText: props.runningText,\n notReadyText: props.notReadyText,\n noRowsText: props.noRowsText,\n }),\n ({ gridApi, loadingText, runningText, notReadyText, noRowsText }) => {\n if (!gridApi || gridApi.isDestroyed()) return;\n gridApi.updateGridOptions({\n loadingOverlayComponentParams: {\n ...gridOptions.value.loadingOverlayComponentParams,\n loadingText,\n runningText,\n notReadyText,\n },\n noRowsOverlayComponentParams: {\n ...gridOptions.value.noRowsOverlayComponentParams,\n text: noRowsText,\n },\n });\n },\n);\n\nwatchEffect(() => {\n if (!gridApi.value || gridApi.value?.isDestroyed()) return;\n gridApi.value.updateGridOptions({\n statusBar: gridOptions.value.loading\n ? undefined\n : {\n statusPanels: [{ statusPanel: PlAgRowCount, align: \"left\" }],\n },\n });\n});\n</script>\n\n<template>\n <div :class=\"$style.container\">\n <PlAgGridColumnManager v-if=\"gridApi && !disableColumnsPanel\" :api=\"gridApi\" />\n <PlTableFiltersV2\n v-if=\"!disableFiltersPanel\"\n :filters=\"filtersState\"\n :default-filters=\"defaultFiltersState\"\n :pframe-handle=\"'model' in settings ? settings?.model?.fullPframeHandle : undefined\"\n :columns=\"filterableColumns\"\n @updateFilters=\"(v) => (filtersState = v)\"\n @resetDefaultFilters=\"resetDefaultFilters\"\n @updateDefaultFilters=\"(v) => (defaultFiltersState = v)\"\n v-model=\"filtersState\"\n />\n <PlAgCsvExporter\n v-if=\"gridApi && showExportButton\"\n :api=\"gridApi\"\n :table-handle=\"'model' in settings ? settings?.model?.visibleTableHandle : undefined\"\n />\n <PlAgDataTableSheets v-model=\"sheetsState\" :settings=\"sheetsSettings\">\n <template v-if=\"$slots['before-sheets']\" #before>\n <slot name=\"before-sheets\" />\n </template>\n <template v-if=\"$slots['after-sheets']\" #after>\n <slot name=\"after-sheets\" />\n </template>\n </PlAgDataTableSheets>\n <PlTableFastSearch v-model=\"searchString\" />\n <AgGridVue\n :key=\"reloadKey\"\n :theme=\"AgGridTheme\"\n :class=\"$style.grid\"\n :grid-options=\"gridOptions\"\n />\n </div>\n</template>\n\n<style lang=\"css\" module>\n.container {\n display: flex;\n flex-direction: column;\n height: 100%;\n gap: 12px;\n}\n\n.grid {\n flex: 1;\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isJsonEqual as e } from "../../../lib/util/helpers/dist/objects.js";
|
|
2
2
|
import "../../../lib/util/helpers/dist/index.js";
|
|
3
|
-
import
|
|
4
|
-
import n from "../
|
|
5
|
-
import r from "../
|
|
3
|
+
import t from "../PlAgOverlayLoading.js";
|
|
4
|
+
import n from "../PlAgOverlayNoRows.js";
|
|
5
|
+
import { autoSizeRowNumberColumn as r } from "../sources/row-number.js";
|
|
6
6
|
import { shallowRef as i } from "vue";
|
|
7
7
|
import { parseJson as a } from "@platforma-sdk/model";
|
|
8
8
|
import { isNil as o } from "es-toolkit";
|
|
@@ -46,8 +46,8 @@ function s({ selection: s, noRowsText: c, loadingText: l, runningText: u, notRea
|
|
|
46
46
|
runningText: u,
|
|
47
47
|
notReadyText: d
|
|
48
48
|
},
|
|
49
|
-
loadingOverlayComponent:
|
|
50
|
-
noRowsOverlayComponent:
|
|
49
|
+
loadingOverlayComponent: t,
|
|
50
|
+
noRowsOverlayComponent: n,
|
|
51
51
|
noRowsOverlayComponentParams: { text: c },
|
|
52
52
|
defaultCsvExportParams: {
|
|
53
53
|
suppressQuotes: !0,
|
|
@@ -56,22 +56,22 @@ function s({ selection: s, noRowsText: c, loadingText: l, runningText: u, notRea
|
|
|
56
56
|
},
|
|
57
57
|
getContextMenuItems: (e) => (e.defaultItems ?? []).filter((e) => e !== "export" && e !== "csvExport" && e !== "excelExport"),
|
|
58
58
|
onGridReady: (e) => {
|
|
59
|
-
let
|
|
60
|
-
t
|
|
61
|
-
let
|
|
59
|
+
let t = e.api;
|
|
60
|
+
r(t);
|
|
61
|
+
let n = (e, n) => {
|
|
62
62
|
let r = { ...m.value };
|
|
63
|
-
r[e] =
|
|
63
|
+
r[e] = n, m.value = r, t.setGridOption(e, n);
|
|
64
64
|
}, i = (e) => {
|
|
65
65
|
m.value = {
|
|
66
66
|
...m.value,
|
|
67
67
|
...e
|
|
68
|
-
},
|
|
68
|
+
}, t.updateGridOptions(e);
|
|
69
69
|
};
|
|
70
|
-
p.value = new Proxy(
|
|
70
|
+
p.value = new Proxy(t, { get(e, t, r) {
|
|
71
71
|
switch (t) {
|
|
72
|
-
case "setGridOption": return
|
|
72
|
+
case "setGridOption": return n;
|
|
73
73
|
case "updateGridOptions": return i;
|
|
74
|
-
default: return Reflect.get(e, t,
|
|
74
|
+
default: return Reflect.get(e, t, r);
|
|
75
75
|
}
|
|
76
76
|
} });
|
|
77
77
|
},
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import "./PlAgOverlayLoading.js";
|
|
2
|
+
import "./PlAgOverlayNoRows.js";
|
|
3
|
+
import "./types.js";
|
|
1
4
|
import "./sources/row-number.js";
|
|
2
5
|
import "./sources/focus-row.js";
|
|
3
6
|
import "./sources/menu-items.js";
|
|
4
|
-
import "./PlAgOverlayLoading.js";
|
|
5
|
-
import "./PlAgOverlayNoRows.js";
|
|
6
7
|
import "./PlAgDataTableV2.js";
|
|
7
|
-
import "./types.js";
|
|
8
8
|
import { activateAgGrid as e } from "../../composition/AgGrid/index.js";
|
|
9
9
|
import "../../lib.js";
|
|
10
10
|
//#region src/components/PlAgDataTable/index.ts
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { isJsonEqual as e } from "../../../lib/util/helpers/dist/objects.js";
|
|
2
2
|
import "../../../lib/util/helpers/dist/index.js";
|
|
3
3
|
import { PlAgDataTableRowNumberColId as t, makeRowNumberColDef as n } from "./row-number.js";
|
|
4
|
-
import r from "
|
|
4
|
+
import { defaultMainMenuItems as r } from "./menu-items.js";
|
|
5
|
+
import i from "../../PlAgColumnHeader/PlAgColumnHeader.js";
|
|
5
6
|
import "../../PlAgColumnHeader/index.js";
|
|
6
|
-
import
|
|
7
|
+
import a from "../../PlAgTextAndButtonCell/PlAgTextAndButtonCell.js";
|
|
7
8
|
import "../../PlAgTextAndButtonCell/index.js";
|
|
8
|
-
import { PTableHidden as
|
|
9
|
-
import { defaultMainMenuItems as o } from "./menu-items.js";
|
|
9
|
+
import { PTableHidden as o } from "./common.js";
|
|
10
10
|
import { getColumnRenderingSpec as s } from "./value-rendering.js";
|
|
11
11
|
import { Annotation as c, ValueType as l, canonicalizeJson as u, getAxisId as d, getPTableColumnId as f, isColumnHidden as p, isColumnOptional as m, isLabelColumn as h, isLinkerColumn as g, matchAxisId as _, pTableValue as v, readAnnotation as y, readAnnotationJson as b } from "@platforma-sdk/model";
|
|
12
12
|
import { isNil as x, uniq as S } from "es-toolkit";
|
|
13
13
|
//#region src/components/PlAgDataTable/sources/table-source-v2.ts
|
|
14
14
|
function C(e, t, n, r) {
|
|
15
15
|
let i = [];
|
|
16
|
-
for (let
|
|
17
|
-
let s = r.map((e) => v(t[e],
|
|
16
|
+
for (let a = 0; a < t[0].data.length; ++a) {
|
|
17
|
+
let s = r.map((e) => v(t[e], a)), c = u(s), l = e.reduce((e, r, i) => (e[r.toString()] = n[i] === -1 ? o : v(t[n[i]], a), e), {
|
|
18
18
|
id: c,
|
|
19
19
|
axesKey: s
|
|
20
20
|
});
|
|
@@ -69,28 +69,28 @@ async function w({ generation: r, pfDriver: i, sheets: a, fullTableHandle: o, vi
|
|
|
69
69
|
} }
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
|
-
function T(t, n,
|
|
72
|
+
function T(t, n, o, d, f) {
|
|
73
73
|
let p = u({
|
|
74
74
|
source: n,
|
|
75
|
-
labeled:
|
|
75
|
+
labeled: o
|
|
76
76
|
}), m = n.type === "axis" ? n.spec.type : n.spec.valueType, h = s(n), g = {};
|
|
77
77
|
h.fontFamily && (h.fontFamily === "monospace" ? (g.fontFamily = "Spline Sans Mono", g.fontWeight = 300) : g.fontFamily = h.fontFamily);
|
|
78
|
-
let _ = y(
|
|
78
|
+
let _ = y(o.spec, c.Label)?.trim() ?? y(n.spec, c.Label)?.trim() ?? `Unlabeled ${n.type} ${t}`;
|
|
79
79
|
return {
|
|
80
80
|
colId: p,
|
|
81
|
-
mainMenuItems:
|
|
81
|
+
mainMenuItems: r,
|
|
82
82
|
context: n,
|
|
83
83
|
field: `${t}`,
|
|
84
84
|
headerName: _,
|
|
85
85
|
lockPosition: n.type === "axis",
|
|
86
86
|
hide: d !== void 0 && d.includes(p),
|
|
87
87
|
valueFormatter: h.valueFormatter,
|
|
88
|
-
headerComponent:
|
|
88
|
+
headerComponent: i,
|
|
89
89
|
cellRendererSelector: f?.showCellButtonForAxisId ? (t) => {
|
|
90
90
|
if (n.type !== "axis") return;
|
|
91
91
|
let r = t.colDef?.context?.id;
|
|
92
92
|
if (e(r, f.showCellButtonForAxisId)) return {
|
|
93
|
-
component:
|
|
93
|
+
component: a,
|
|
94
94
|
params: {
|
|
95
95
|
invokeRowsOnDoubleClick: f.cellButtonInvokeRowsOnDoubleClick,
|
|
96
96
|
onClick: (e) => {
|
|
@@ -112,8 +112,8 @@ function T(t, n, a, d, f) {
|
|
|
112
112
|
default: throw Error(`unsupported data type: ${m}`);
|
|
113
113
|
}
|
|
114
114
|
})(),
|
|
115
|
-
tooltip: y(n.spec, c.Description)?.trim() ?? y(
|
|
116
|
-
info: y(n.spec, c.Table.Info)?.trim() ?? y(
|
|
115
|
+
tooltip: y(n.spec, c.Description)?.trim() ?? y(o.spec, c.Description)?.trim(),
|
|
116
|
+
info: y(n.spec, c.Table.Info)?.trim() ?? y(o.spec, c.Table.Info)?.trim()
|
|
117
117
|
},
|
|
118
118
|
cellDataType: (() => {
|
|
119
119
|
switch (m) {
|
package/dist/index.js
CHANGED
|
@@ -3,21 +3,21 @@ import { MultiError as e, UnresolvedError as t, ensureError as n, ensureOutputHa
|
|
|
3
3
|
import { createModel as u } from "./createModel.js";
|
|
4
4
|
import { defineApp as d, defineAppV3 as f, pluginDataKey as p, useFeatureFlags as m, useSdkPlugin as h } from "./defineApp.js";
|
|
5
5
|
import g from "./components/BlockLayout.js";
|
|
6
|
-
import _ from "./components/
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import S from "./components/
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import D from "./components/
|
|
14
|
-
import O from "./components/
|
|
15
|
-
import {
|
|
16
|
-
import ee from "./components/
|
|
17
|
-
import A from "./components/
|
|
18
|
-
import
|
|
19
|
-
import M from "./
|
|
20
|
-
import
|
|
6
|
+
import _ from "./components/PlAgDataTable/PlAgOverlayLoading.js";
|
|
7
|
+
import v from "./components/PlAgDataTable/PlAgOverlayNoRows.js";
|
|
8
|
+
import { usePlDataTableSettingsV2 as y } from "./components/PlAgDataTable/types.js";
|
|
9
|
+
import { PlAgDataTableRowNumberColId as b, autoSizeRowNumberColumn as x, makeRowNumberColDef as S } from "./components/PlAgDataTable/sources/row-number.js";
|
|
10
|
+
import { DeferredCircular as C, ensureNodeVisible as w } from "./components/PlAgDataTable/sources/focus-row.js";
|
|
11
|
+
import { defaultMainMenuItems as T } from "./components/PlAgDataTable/sources/menu-items.js";
|
|
12
|
+
import E from "./components/PlAgCsvExporter/PlAgCsvExporter.js";
|
|
13
|
+
import D from "./components/PlAgGridColumnManager/PlAgGridColumnManager.js";
|
|
14
|
+
import O from "./components/PlAdvancedFilter/PlAdvancedFilter.js";
|
|
15
|
+
import { PlAdvancedFilterSupportedFilters as k } from "./components/PlAdvancedFilter/index.js";
|
|
16
|
+
import ee from "./components/PlTableFilters/PlTableFiltersV2.js";
|
|
17
|
+
import A from "./components/PlAgColumnHeader/PlAgColumnHeader.js";
|
|
18
|
+
import j from "./components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.js";
|
|
19
|
+
import { AgGridTheme as M } from "./AgGridVue/AgGridTheme.js";
|
|
20
|
+
import N from "./components/PlAgDataTable/PlAgDataTableV2.js";
|
|
21
21
|
import P from "./components/PlAgCellProgress/PlAgCellProgress.js";
|
|
22
22
|
import { createAgGridColDef as F } from "./AgGridVue/createAgGridColDef.js";
|
|
23
23
|
import I from "./components/PlAgCellFile/PlAgCellFile.js";
|
|
@@ -41,6 +41,6 @@ import { setAutoFreeze as re } from "immer";
|
|
|
41
41
|
export * from "@milaboratories/uikit";
|
|
42
42
|
re(!1);
|
|
43
43
|
//#endregion
|
|
44
|
-
export {
|
|
44
|
+
export { M as AgGridTheme, g as BlockLayout, C as DeferredCircular, e as MultiError, O as PlAdvancedFilterComponent, k as PlAdvancedFilterSupportedFilters, I as PlAgCellFile, P as PlAgCellProgress, z as PlAgCellStatusTag, R as PlAgChartHistogramCell, L as PlAgChartStackedBarCell, A as PlAgColumnHeader, E as PlAgCsvExporter, b as PlAgDataTableRowNumberColId, N as PlAgDataTableV2, D as PlAgGridColumnManager, _ as PlAgOverlayLoading, v as PlAgOverlayNoRows, j as PlAgTextAndButtonCell, K as PlAnnotations, q as PlAnnotationsModal, J as PlBtnExportArchive, N as PlDataTableV2, Y as PlDatasetSelector, ee as PlTableFiltersV2, ne as ReactiveFileContent, t as UnresolvedError, Q as activateAgGrid, x as autoSizeRowNumberColumn, te as computedResult, F as createAgGridColDef, u as createModel, T as defaultMainMenuItems, d as defineApp, f as defineAppV3, Z as defineStore, V as deselectAll, n as ensureError, w as ensureNodeVisible, r as ensureOutputHasStableFlag, i as formatZodError, H as getSelectedRowsCount, U as getTotalRowsCount, a as identity, o as isDefined, W as isSelectionEnabled, s as isZodError, S as makeRowNumberColDef, $ as objectHash, p as pluginDataKey, G as selectAll, c as unwrapOutput, B as useAgGridOptions, m as useFeatureFlags, y as usePlDataTableSettingsV2, X as usePlugin, h as useSdkPlugin, l as wrapOptionalResult };
|
|
45
45
|
|
|
46
46
|
//# sourceMappingURL=index.js.map
|
package/dist/lib.js
CHANGED
|
@@ -4,25 +4,25 @@ import "./utils.js";
|
|
|
4
4
|
import "./createModel.js";
|
|
5
5
|
import "./defineApp.js";
|
|
6
6
|
import "./components/BlockLayout.js";
|
|
7
|
-
import "./components/
|
|
7
|
+
import "./components/PlAgDataTable/PlAgOverlayLoading.js";
|
|
8
|
+
import "./components/PlAgDataTable/PlAgOverlayNoRows.js";
|
|
9
|
+
import "./components/PlAgDataTable/types.js";
|
|
8
10
|
import "./components/PlAgDataTable/sources/row-number.js";
|
|
11
|
+
import "./components/PlAgDataTable/sources/focus-row.js";
|
|
12
|
+
import "./components/PlAgDataTable/sources/menu-items.js";
|
|
13
|
+
import "./components/PlAgDataTable/index.js";
|
|
14
|
+
import "./components/PlAgCsvExporter/PlAgCsvExporter.js";
|
|
9
15
|
import "./components/PlAgGridColumnManager/PlAgGridColumnManager.js";
|
|
10
16
|
import "./components/PlAgGridColumnManager/index.js";
|
|
11
17
|
import "./components/PlAdvancedFilter/PlAdvancedFilter.js";
|
|
12
18
|
import "./components/PlAdvancedFilter/index.js";
|
|
13
19
|
import "./components/PlTableFilters/PlTableFiltersV2.js";
|
|
14
|
-
import "./components/PlAgDataTable/sources/focus-row.js";
|
|
15
20
|
import "./components/PlAgColumnHeader/PlAgColumnHeader.js";
|
|
16
21
|
import "./components/PlAgColumnHeader/index.js";
|
|
17
22
|
import "./components/PlAgTextAndButtonCell/PlAgTextAndButtonCell.js";
|
|
18
23
|
import "./components/PlAgTextAndButtonCell/index.js";
|
|
19
|
-
import "./components/PlAgDataTable/sources/menu-items.js";
|
|
20
|
-
import "./components/PlAgDataTable/PlAgOverlayLoading.js";
|
|
21
|
-
import "./components/PlAgDataTable/PlAgOverlayNoRows.js";
|
|
22
24
|
import "./AgGridVue/AgGridTheme.js";
|
|
23
25
|
import "./components/PlAgDataTable/PlAgDataTableV2.js";
|
|
24
|
-
import "./components/PlAgDataTable/types.js";
|
|
25
|
-
import "./components/PlAgDataTable/index.js";
|
|
26
26
|
import "./components/PlAgCellProgress/PlAgCellProgress.js";
|
|
27
27
|
import "./components/PlAgCellProgress/index.js";
|
|
28
28
|
import "./AgGridVue/createAgGridColDef.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/ui-vue",
|
|
3
|
-
"version": "1.68.
|
|
3
|
+
"version": "1.68.4",
|
|
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/
|
|
30
|
-
"@milaboratories/
|
|
31
|
-
"@
|
|
32
|
-
"@
|
|
29
|
+
"@milaboratories/pf-spec-driver": "1.3.5",
|
|
30
|
+
"@milaboratories/pl-model-common": "1.36.1",
|
|
31
|
+
"@milaboratories/uikit": "2.12.11",
|
|
32
|
+
"@platforma-sdk/model": "1.68.4"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@faker-js/faker": "^9.2.0",
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
"typescript": "~5.9.3",
|
|
46
46
|
"vite": "^8.0.6",
|
|
47
47
|
"vitest": "^4.1.3",
|
|
48
|
-
"@milaboratories/ts-builder": "1.3.2",
|
|
49
48
|
"@milaboratories/build-configs": "2.0.0",
|
|
50
49
|
"@milaboratories/helpers": "1.14.1",
|
|
51
|
-
"@milaboratories/ts-configs": "1.2.3"
|
|
50
|
+
"@milaboratories/ts-configs": "1.2.3",
|
|
51
|
+
"@milaboratories/ts-builder": "1.3.2"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"dev": "ts-builder serve --target browser-lib",
|
|
@@ -5,11 +5,13 @@ import type {
|
|
|
5
5
|
PTableColumnSpec,
|
|
6
6
|
PFrameSpecDriver,
|
|
7
7
|
WritePTableToFsResult,
|
|
8
|
+
PlTableColumnIdJson,
|
|
8
9
|
} from "@platforma-sdk/model";
|
|
9
|
-
import { getPTableColumnId } from "@platforma-sdk/model";
|
|
10
|
+
import { getPTableColumnId, parseJson } from "@platforma-sdk/model";
|
|
10
11
|
import { isNil } from "es-toolkit";
|
|
11
12
|
import { Nil } from "@milaboratories/helpers";
|
|
12
13
|
import { getServices } from "../../internal/getServices";
|
|
14
|
+
import { PlAgDataTableRowNumberColId } from "../PlAgDataTable";
|
|
13
15
|
|
|
14
16
|
/** Options for the native CSV export path. */
|
|
15
17
|
export interface ExportOptions {
|
|
@@ -88,6 +90,11 @@ export function isCsvExportAvailable(): boolean {
|
|
|
88
90
|
* ag-grid column defs, remapped onto the provided PTable spec array so the
|
|
89
91
|
* indices match the current table handle (ColDef.field indices may be stale
|
|
90
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.
|
|
91
98
|
*/
|
|
92
99
|
export function collectVisibleColumnIndices(
|
|
93
100
|
gridApi: GridApi,
|
|
@@ -99,13 +106,17 @@ export function collectVisibleColumnIndices(
|
|
|
99
106
|
return;
|
|
100
107
|
}
|
|
101
108
|
|
|
102
|
-
|
|
103
|
-
.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
)
|
|
110
|
-
|
|
109
|
+
const findIndex = (spec: PTableColumnSpec) =>
|
|
110
|
+
pframeSpec.findTableColumn(specs, getPTableColumnId(spec));
|
|
111
|
+
|
|
112
|
+
const specsForDef = (def: ColDef | ColGroupDef): PTableColumnSpec[] => {
|
|
113
|
+
if ("children" in def) return [];
|
|
114
|
+
if (def.hide === true) return [];
|
|
115
|
+
if (isNil(def.colId)) return [];
|
|
116
|
+
if (def.colId === PlAgDataTableRowNumberColId) return [];
|
|
117
|
+
const { labeled } = parseJson(def.colId as PlTableColumnIdJson);
|
|
118
|
+
return [labeled];
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
return [...new Set(columnDefs.flatMap(specsForDef).map(findIndex))].filter((idx) => idx !== -1);
|
|
111
122
|
}
|