@platforma-sdk/ui-vue 1.63.12 → 1.64.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/.turbo/turbo-build.log +24 -18
  2. package/.turbo/turbo-formatter$colon$check.log +2 -2
  3. package/.turbo/turbo-linter$colon$check.log +2 -2
  4. package/.turbo/turbo-types$colon$check.log +1 -1
  5. package/CHANGELOG.md +12 -0
  6. package/dist/components/PlAgDataTable/PlAgDataTableV2.js.map +1 -1
  7. package/dist/components/PlAgDataTable/PlAgDataTableV2.style.js.map +1 -1
  8. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts.map +1 -1
  9. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +1 -1
  10. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  11. package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js +3 -3
  12. package/dist/components/PlAgDataTable/compositions/useFilterableColumns.js.map +1 -1
  13. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
  14. package/dist/components/PlAgDataTable/sources/table-source-v2.js +124 -90
  15. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  16. package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts.map +1 -1
  17. package/dist/components/PlAgDataTable/sources/table-state-v2.js +1 -1
  18. package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
  19. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.js.map +1 -1
  20. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.style.js.map +1 -1
  21. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue.d.ts.map +1 -1
  22. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js +37 -42
  23. package/dist/components/PlAgGridColumnManager/PlAgGridColumnManager.vue2.js.map +1 -1
  24. package/dist/components/PlAgGridColumnManager/useFilteredItems.d.ts +5 -5
  25. package/dist/components/PlAgGridColumnManager/useFilteredItems.d.ts.map +1 -1
  26. package/dist/components/PlAgGridColumnManager/useFilteredItems.js +2 -2
  27. package/dist/components/PlAgGridColumnManager/useFilteredItems.js.map +1 -1
  28. package/dist/components/PlAgGridColumnManager/useGridColumns.js +14 -0
  29. package/dist/components/PlAgGridColumnManager/useGridColumns.js.map +1 -0
  30. package/dist/components/PlTableFilters/PlTableFiltersV2.js.map +1 -1
  31. package/dist/components/PlTableFilters/PlTableFiltersV2.style.js.map +1 -1
  32. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts.map +1 -1
  33. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +2 -8
  34. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
  35. package/package.json +5 -5
  36. package/src/components/PlAgDataTable/PlAgDataTableV2.vue +2 -1
  37. package/src/components/PlAgDataTable/compositions/useFilterableColumns.ts +4 -4
  38. package/src/components/PlAgDataTable/sources/table-source-v2.ts +224 -126
  39. package/src/components/PlAgDataTable/sources/table-state-v2.ts +4 -10
  40. package/src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue +17 -35
  41. package/src/components/PlAgGridColumnManager/useFilteredItems.ts +9 -11
  42. package/src/components/PlAgGridColumnManager/useGridColumns.ts +26 -0
  43. package/src/components/PlTableFilters/PlTableFiltersV2.vue +2 -6
@@ -1 +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,EAER,sBAAsB,EACtB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,MAAM,EACX,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EAEd,KAAK,mBAAmB,EASzB,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;AAEpD,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,IAAI,sBAAsB,CAExF;AAyBD,6DAA6D;AAC7D,wBAAsB,oBAAoB,CAAC,EACzC,UAAU,EACV,QAAQ,EACR,KAAK,EACL,MAAM,EACN,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,GACrB,EAAE;IACD,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,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,CAmMA;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,WAAW,EAAE,gBAAgB,EAC7B,YAAY,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAC/C,oBAAoB,CAAC,EAAE,wBAAwB,GAC9C,MAAM,CAAC,kBAAkB,EAAE,WAAW,GAAG,YAAY,CAAC,CA+ExD"}
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,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,MAAM,EACX,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EAEd,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,KAAK,EACL,MAAM,EACN,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,GACrB,EAAE;IACD,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,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,CA8HA;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,WAAW,EAAE,gBAAgB,EAC7B,YAAY,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAC/C,oBAAoB,CAAC,EAAE,wBAAwB,GAC9C,MAAM,CAAC,kBAAkB,EAAE,WAAW,GAAG,YAAY,CAAC,CAkFxD"}
@@ -8,126 +8,83 @@ import "../../PlAgTextAndButtonCell/index.js";
8
8
  import { PTableHidden as a } from "./common.js";
9
9
  import { defaultMainMenuItems as o } from "./menu-items.js";
10
10
  import { getColumnRenderingSpec as s } from "./value-rendering.js";
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, matchAxisId as g, pTableValue as _, readAnnotation as v, readAnnotationJson as y } from "@platforma-sdk/model";
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
+ import { isNil as x, uniq as S } from "es-toolkit";
12
13
  //#region src/components/PlAgDataTable/sources/table-source-v2.ts
13
- function b(e, t, n, r) {
14
+ function C(e, t, n, r) {
14
15
  let i = [];
15
16
  for (let o = 0; o < t[0].data.length; ++o) {
16
- let s = n.map((e) => _(t[r[e]], o)), c = {
17
- id: u(s),
17
+ let s = r.map((e) => v(t[e], o)), c = u(s), l = e.reduce((e, r, i) => (e[r.toString()] = n[i] === -1 ? a : v(t[n[i]], o), e), {
18
+ id: c,
18
19
  axesKey: s
19
- };
20
- e.forEach((e, n) => {
21
- c[e.toString()] = r[n] === -1 ? a : _(t[r[n]], o);
22
- }), i.push(c);
20
+ });
21
+ i.push(l);
23
22
  }
24
23
  return i;
25
24
  }
26
- async function x({ generation: r, pfDriver: i, model: a, sheets: o, dataRenderedTracker: s, hiddenColIds: l, cellButtonAxisParams: m }) {
27
- let _ = r.value, v = /* @__PURE__ */ Error("table state generation changed"), x = await i.getSpec(a.fullTableHandle);
28
- if (_ !== r.value) throw v;
29
- let C = a.visibleTableHandle, w = await i.getSpec(C);
30
- if (_ !== r.value) throw v;
31
- let T = (e) => u(f(e)), E = new Map(w.entries().map(([e, t]) => [T(t), e])), D = new Map(x.entries().map(([e, t]) => {
32
- let n = E.get(T(t)) ?? -1;
33
- if (n === -1 && t.type === "axis") throw Error(`axis ${JSON.stringify(t.spec)} not present in join result`);
34
- return [e, n];
35
- })), O = o.map((e) => d(e.axis)), k = (e) => O.some((t) => g(t, e)), A = [], j = (e, t) => {
36
- A.some((t) => g(t.axisId, e)) ? console.warn(`multiple label columns match axisId: ${JSON.stringify(e)}`) : A.push({
37
- axisId: e,
38
- labelColumnIdx: t
39
- });
40
- }, M = (e) => A.find((t) => g(t.axisId, e))?.labelColumnIdx ?? -1, N = x.entries().filter(([e, t]) => {
41
- switch (t.type) {
42
- case "axis": return !k(t.id);
43
- case "column":
44
- if (h(t.spec)) {
45
- let n = d(t.spec.axesSpec[0]);
46
- return k(n) || j(n, e), !1;
47
- }
48
- return !p(t.spec);
49
- }
50
- }).map(([e]) => e).toArray();
51
- N.sort((e, t) => {
52
- if (x[e].type !== x[t].type) return x[e].type === "axis" ? -1 : 1;
53
- let n = y(x[e].spec, c.Table.OrderPriority), r = y(x[t].spec, c.Table.OrderPriority);
54
- return n === void 0 ? r === void 0 ? 0 : 1 : r === void 0 ? -1 : r - n;
55
- });
56
- let P = [...N];
57
- N = N.map((e) => {
58
- let t = x[e];
59
- if (t.type === "axis") {
60
- let e = M(t.id);
61
- if (e !== -1) return e;
62
- }
63
- return e;
64
- });
65
- let F = [n(), ...P.map((e, t) => S(e, x[e], x[N[t]], l, m))], I = x.values().filter((e) => e.type === "axis").map((e) => e.spec).toArray(), L = I.keys().map((e) => {
66
- let t = N.indexOf(e);
67
- return t === -1 && (t = N.length, N.push(e)), t;
68
- }).toArray(), R = [], z = [];
69
- N.forEach((e) => {
70
- let t = D.get(e);
71
- t === -1 ? z.push(-1) : (z.push(R.length), R.push(t));
72
- });
73
- let B = -1, V;
25
+ async function w({ generation: r, pfDriver: i, model: a, sheets: o, dataRenderedTracker: s, hiddenColIds: c, cellButtonAxisParams: l }) {
26
+ let u = r.value, [d, f] = await Promise.all([i.getSpec(a.fullTableHandle), i.getSpec(a.visibleTableHandle)]);
27
+ if (u !== r.value) throw Error("table state generation changed");
28
+ let p = E(d, f), m = D(o), h = O(d, m), g = A(k(d, m), d), _ = j(g, d, h), v = c ?? M(g, _, d), y = [n(), ...g.map((e, t) => T(e, d[e], d[_[t]], v, l))], b = N(f), { requestIndices: x, fieldResultMapping: S, axesResultIndices: w } = P(_, p, b.map(([e]) => e)), F = -1, I;
74
29
  return {
75
- axesSpec: I,
76
- columnDefs: F,
30
+ axesSpec: b.map(([, { spec: e }]) => e),
31
+ columnDefs: y,
77
32
  serverSideDatasource: { getRows: async (n) => {
78
- if (_ !== r.value) return n.fail();
33
+ if (u !== r.value) return n.fail();
79
34
  try {
80
- if (B === -1) {
81
- let e = await i.getShape(C);
82
- if (_ !== r.value || n.api.isDestroyed()) return n.fail();
83
- B = e.rows;
35
+ if (F === -1) {
36
+ let e = await i.getShape(a.visibleTableHandle);
37
+ if (u !== r.value || n.api.isDestroyed()) return n.fail();
38
+ F = e.rows;
84
39
  }
85
- if (B == 0) {
40
+ if (F == 0) {
86
41
  n.success({
87
42
  rowData: [],
88
- rowCount: B
43
+ rowCount: F
89
44
  }), n.api.setGridOption("loading", !1), n.api.showNoRowsOverlay();
90
45
  return;
91
46
  }
92
- if (V && !e(V.request.sortModel, n.request.sortModel)) return n.success({
47
+ if (I && !e(I.request.sortModel, n.request.sortModel)) return n.success({
93
48
  rowData: [],
94
- rowCount: B
49
+ rowCount: F
95
50
  });
96
- V = n;
97
- let a = 0, o = [];
98
- if (B > 0 && n.request.startRow !== void 0 && n.request.endRow !== void 0 && (a = Math.min(B, n.request.endRow) - n.request.startRow, a > 0)) {
99
- let e = await i.getData(C, R, {
51
+ I = n;
52
+ let o = 0, c = [];
53
+ if (F > 0 && n.request.startRow !== void 0 && n.request.endRow !== void 0 && (o = Math.min(F, n.request.endRow) - n.request.startRow, o > 0)) {
54
+ let e = await i.getData(a.visibleTableHandle, x, {
100
55
  offset: n.request.startRow,
101
- length: a
56
+ length: o
102
57
  });
103
- if (_ !== r.value || n.api.isDestroyed()) return n.fail();
104
- o = b(P, e, L, z);
58
+ if (u !== r.value || n.api.isDestroyed()) return n.fail();
59
+ c = C(g, e, S, w);
105
60
  }
106
61
  n.success({
107
- rowData: o,
108
- rowCount: B
62
+ rowData: c,
63
+ rowCount: F
109
64
  }), n.api.autoSizeColumns(n.api.getAllDisplayedColumns().filter((e) => e.getColId() !== t)), n.api.setGridOption("loading", !1), s.resolve(n.api);
110
65
  } catch (e) {
111
- if (_ !== r.value || n.api.isDestroyed()) return n.fail();
66
+ if (u !== r.value || n.api.isDestroyed()) return n.fail();
112
67
  n.api.setGridOption("loading", !0), n.fail(), console.trace(e);
113
68
  }
114
69
  } }
115
70
  };
116
71
  }
117
- function S(t, n, a, d, f) {
72
+ function T(t, n, a, d, f) {
118
73
  let p = u({
119
74
  source: n,
120
75
  labeled: a
121
- }), h = n.type === "axis" ? n.spec.type : n.spec.valueType, g = s(n), _ = {};
122
- return g.fontFamily && (g.fontFamily === "monospace" ? (_.fontFamily = "Spline Sans Mono", _.fontWeight = 300) : _.fontFamily = g.fontFamily), {
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(a.spec, c.Label)?.trim() ?? y(n.spec, c.Label)?.trim() ?? `Unlabeled ${n.type} ${t}`;
79
+ return {
123
80
  colId: p,
124
81
  mainMenuItems: o,
125
82
  context: n,
126
83
  field: `${t}`,
127
- headerName: v(a.spec, c.Label)?.trim() ?? `Unlabeled ${n.type} ${t}`,
84
+ headerName: _,
128
85
  lockPosition: n.type === "axis",
129
- hide: d?.includes(p) ?? m(n.spec),
130
- valueFormatter: g.valueFormatter,
86
+ hide: d !== void 0 && d.includes(p),
87
+ valueFormatter: h.valueFormatter,
131
88
  headerComponent: r,
132
89
  cellRendererSelector: f?.showCellButtonForAxisId ? (t) => {
133
90
  if (n.type !== "axis") return;
@@ -142,35 +99,112 @@ function S(t, n, a, d, f) {
142
99
  }
143
100
  };
144
101
  } : void 0,
145
- cellStyle: _,
102
+ cellStyle: g,
146
103
  headerComponentParams: {
147
104
  type: (() => {
148
- switch (h) {
105
+ switch (m) {
149
106
  case l.Int:
150
107
  case l.Long:
151
108
  case l.Float:
152
109
  case l.Double: return "Number";
153
110
  case l.String:
154
111
  case l.Bytes: return "Text";
155
- default: throw Error(`unsupported data type: ${h}`);
112
+ default: throw Error(`unsupported data type: ${m}`);
156
113
  }
157
114
  })(),
158
- tooltip: v(a.spec, c.Description)?.trim()
115
+ tooltip: y(a.spec, c.Description)?.trim()
159
116
  },
160
117
  cellDataType: (() => {
161
- switch (h) {
118
+ switch (m) {
162
119
  case l.Int:
163
120
  case l.Long:
164
121
  case l.Float:
165
122
  case l.Double: return "number";
166
123
  case l.String:
167
124
  case l.Bytes: return "text";
168
- default: throw Error(`unsupported data type: ${h}`);
125
+ default: throw Error(`unsupported data type: ${m}`);
169
126
  }
170
127
  })()
171
128
  };
172
129
  }
130
+ function E(e, t) {
131
+ let n = (e) => u(f(e)), r = new Map(t.entries().map(([e, t]) => [n(t), e]));
132
+ return new Map(e.entries().map(([e, t]) => {
133
+ let i = r.get(n(t));
134
+ return [e, x(i) ? -1 : i];
135
+ }));
136
+ }
137
+ function D(e) {
138
+ let t = e.map((e) => d(e.axis));
139
+ return (e) => t.some((t) => _(t, e));
140
+ }
141
+ function O(e, t) {
142
+ let n = [];
143
+ for (let [r, i] of e.entries()) {
144
+ if (i.type !== "column" || !h(i.spec)) continue;
145
+ let e = d(i.spec.axesSpec[0]);
146
+ if (!t(e)) {
147
+ if (n.some((t) => _(t.axisId, e))) {
148
+ console.warn(`multiple label columns match axisId: ${JSON.stringify(e)}`);
149
+ continue;
150
+ }
151
+ n.push({
152
+ axisId: e,
153
+ labelColumnIdx: r
154
+ });
155
+ }
156
+ }
157
+ return (e) => n.find((t) => _(t.axisId, e))?.labelColumnIdx ?? -1;
158
+ }
159
+ function k(e, t) {
160
+ return e.entries().filter(([, e]) => {
161
+ switch (e.type) {
162
+ case "axis": return !t(e.id);
163
+ case "column": return !h(e.spec) && !p(e.spec) && !g(e.spec);
164
+ }
165
+ }).map(([e]) => e).toArray();
166
+ }
167
+ function A(e, t) {
168
+ let n = (e) => {
169
+ let n = t[e];
170
+ return n.type === "column" ? b(n.spec, c.Table.OrderPriority) ?? 0 : 0;
171
+ };
172
+ return [...e].sort((e, r) => t[e].type === t[r].type ? n(r) - n(e) : t[e].type === "axis" ? -1 : 1);
173
+ }
174
+ function j(e, t, n) {
175
+ return e.map((e) => {
176
+ let r = t[e], i = r.type === "axis" ? n(r.id) : -1;
177
+ return i === -1 ? e : i;
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
+ })];
189
+ }, []);
190
+ }
191
+ function N(e) {
192
+ return e.entries().filter((e) => e[1].type === "axis").toArray();
193
+ }
194
+ function P(e, t, n) {
195
+ let r = e.map((e) => {
196
+ let n = t.get(e);
197
+ return n === void 0 || n === -1 ? null : n;
198
+ }), i = r.filter((e) => e !== null), a = [], o = 0;
199
+ for (let e of r) a.push(e === null ? -1 : o++);
200
+ let s = S([...i, ...n]);
201
+ return {
202
+ requestIndices: s,
203
+ fieldResultMapping: a,
204
+ axesResultIndices: n.map((e) => s.indexOf(e))
205
+ };
206
+ }
173
207
  //#endregion
174
- export { x as calculateGridOptions };
208
+ export { w as calculateGridOptions };
175
209
 
176
210
  //# sourceMappingURL=table-source-v2.js.map
@@ -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 PTableColumnSpecColumn,\n PTableValue,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\n getAxisId,\n isColumnOptional,\n pTableValue,\n type PFrameDriver,\n type PlDataTableSheet,\n type PTableVector,\n type AxisId,\n type PlDataTableModel,\n type PTableColumnSpec,\n type PTableKey,\n type PlTableColumnId,\n type PlTableColumnIdJson,\n isLabelColumn as isLabelColumnSpec,\n isColumnHidden,\n matchAxisId,\n readAnnotation,\n Annotation,\n ValueType,\n readAnnotationJson,\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\";\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 axes: number[],\n resultMapping: number[],\n): PlAgDataTableV2Row[] {\n const rowData: PlAgDataTableV2Row[] = [];\n for (let iRow = 0; iRow < columns[0].data.length; ++iRow) {\n const axesKey: PTableKey = axes.map((iAxis) =>\n pTableValue(columns[resultMapping[iAxis]], iRow),\n );\n const id = canonicalizeJson<PlTableRowId>(axesKey);\n const row: PlAgDataTableV2Row = { id, axesKey };\n fields.forEach((field, iCol) => {\n row[field.toString() as `${number}`] =\n resultMapping[iCol] === -1 ? PTableHidden : pTableValue(columns[resultMapping[iCol]], iRow);\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 model,\n sheets,\n dataRenderedTracker,\n hiddenColIds,\n cellButtonAxisParams,\n}: {\n generation: Ref<number>;\n pfDriver: PFrameDriver;\n model: PlDataTableModel;\n sheets: PlDataTableSheet[];\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 const stateChangedError = new Error(\"table state generation changed\");\n\n // get specs of the full table\n const specs = await pfDriver.getSpec(model.fullTableHandle);\n if (stateGeneration !== generation.value) throw stateChangedError;\n\n // get specs of the visible table (with hidden columns omitted)\n const pt = model.visibleTableHandle;\n const dataSpecs = await pfDriver.getSpec(pt);\n if (stateGeneration !== generation.value) throw stateChangedError;\n\n // create index mapping from full specs to visible subset (hidden columns would have -1)\n const specId = (spec: PTableColumnSpec) =>\n canonicalizeJson<PTableColumnId>(getPTableColumnId(spec));\n const dataSpecsMap = new Map(dataSpecs.entries().map(([i, spec]) => [specId(spec), i]));\n const specsToDataSpecsMapping = new Map(\n specs.entries().map(([i, spec]) => {\n const dataSpecIdx = dataSpecsMap.get(specId(spec)) ?? -1;\n if (dataSpecIdx === -1 && spec.type === \"axis\")\n throw new Error(`axis ${JSON.stringify(spec.spec)} not present in join result`);\n return [i, dataSpecIdx];\n }),\n );\n\n // gether indices of columns that would be displayed in the table\n\n const sheetAxesIds = sheets.map((sheet) => getAxisId(sheet.axis));\n const isPartitionedAxis = (axisId: AxisId) => sheetAxesIds.some((id) => matchAxisId(id, axisId));\n\n const labelColumns: { axisId: AxisId; labelColumnIdx: number }[] = [];\n const setLabelColumnIndex = (axisId: AxisId, labelColumnIdx: number) => {\n if (!labelColumns.some((info) => matchAxisId(info.axisId, axisId))) {\n labelColumns.push({ axisId, labelColumnIdx });\n } else {\n console.warn(`multiple label columns match axisId: ${JSON.stringify(axisId)}`);\n }\n };\n const getLabelColumnIndex = (axisId: AxisId) => {\n return labelColumns.find((info) => matchAxisId(info.axisId, axisId))?.labelColumnIdx ?? -1;\n };\n\n // filter out partitioned axes, label columns and hidden columns\n let indices = specs\n .entries()\n .filter(([i, spec]) => {\n switch (spec.type) {\n case \"axis\":\n return !isPartitionedAxis(spec.id);\n case \"column\":\n if (isLabelColumnSpec(spec.spec)) {\n const labeledAxisId = getAxisId(spec.spec.axesSpec[0]);\n if (!isPartitionedAxis(labeledAxisId)) {\n setLabelColumnIndex(labeledAxisId, i);\n }\n return false;\n }\n return !isColumnHidden(spec.spec);\n }\n })\n .map(([i]) => i)\n .toArray();\n\n // order columns by priority\n indices.sort((a, b) => {\n if (specs[a].type !== specs[b].type) return specs[a].type === \"axis\" ? -1 : 1;\n\n const aPriority = readAnnotationJson(specs[a].spec, Annotation.Table.OrderPriority);\n const bPriority = readAnnotationJson(specs[b].spec, Annotation.Table.OrderPriority);\n\n if (aPriority === undefined) return bPriority === undefined ? 0 : 1;\n if (bPriority === undefined) return -1;\n return bPriority - aPriority;\n });\n\n // fields are indices of columns that would go to columnDefs\n const fields = [...indices];\n // replace axes with label columns\n indices = indices.map((i) => {\n const spec = specs[i];\n if (spec.type === \"axis\") {\n const labelColumnIdx = getLabelColumnIndex(spec.id);\n if (labelColumnIdx !== -1) {\n return labelColumnIdx;\n }\n }\n return i;\n });\n const columnDefs: ColDef<PlAgDataTableV2Row, PTableValue | PTableHidden>[] = [\n makeRowNumberColDef(),\n ...fields.map((field, index) =>\n makeColDef(field, specs[field], specs[indices[index]], hiddenColIds, cellButtonAxisParams),\n ),\n ];\n\n // mix in indices of skipped axes (axes that were partitioned or replaced with label columns)\n const axesSpec = specs\n .values()\n .filter((spec) => spec.type === \"axis\")\n .map((spec) => spec.spec)\n .toArray();\n const axes = axesSpec\n .keys()\n .map((i) => {\n let r = indices.indexOf(i);\n if (r === -1) {\n r = indices.length;\n indices.push(i);\n }\n return r;\n })\n .toArray();\n\n const requestIndices: number[] = [];\n const resultMapping: number[] = [];\n indices.forEach((idx) => {\n const dataSpecIdx = specsToDataSpecsMapping.get(idx)!;\n if (dataSpecIdx !== -1) {\n resultMapping.push(requestIndices.length);\n requestIndices.push(dataSpecIdx);\n } else {\n resultMapping.push(-1);\n }\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(pt);\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(pt, 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, axes, resultMapping);\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,\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 return {\n colId,\n mainMenuItems: defaultMainMenuItems,\n context: spec,\n field: `${iCol}`,\n headerName:\n readAnnotation(labeledSpec.spec, Annotation.Label)?.trim() ??\n `Unlabeled ${spec.type} ${iCol}`,\n lockPosition: spec.type === \"axis\",\n hide: hiddenColIds?.includes(colId) ?? isColumnOptional(spec.spec),\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(labeledSpec.spec, Annotation.Description)?.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"],"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 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 PlDataTableModel,\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 iRow = 0; iRow < columns[0].data.length; ++iRow) {\n const axesKey: PTableKey = axesResultIndices.map((ri) => pTableValue(columns[ri], iRow));\n const id = canonicalizeJson<PlTableRowId>(axesKey);\n const row = fields.reduce<PlAgDataTableV2Row>(\n (acc, field, iCol) => {\n acc[field.toString() as `${number}`] =\n fieldResultMapping[iCol] === -1\n ? PTableHidden\n : pTableValue(columns[fieldResultMapping[iCol]], iRow);\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 model,\n sheets,\n dataRenderedTracker,\n hiddenColIds,\n cellButtonAxisParams,\n}: {\n generation: Ref<number>;\n pfDriver: PFrameDriver;\n model: PlDataTableModel;\n sheets: PlDataTableSheet[];\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(model.fullTableHandle),\n pfDriver.getSpec(model.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),\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, fieldResultMapping, axesResultIndices } = buildRequestIndices(\n indices,\n specsToVisibleSpecsMapping,\n visibleAxes.map(([i]) => i),\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(model.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(model.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: readAnnotation(labeledSpec.spec, Annotation.Description)?.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\ntype LabelColumnLookup = (axisId: AxisId) => number;\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): LabelColumnLookup {\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): number[] {\n return tableSpecs\n .entries()\n .filter(([, spec]) => {\n switch (spec.type) {\n case \"axis\":\n return !isPartitionedAxis(spec.id);\n case \"column\":\n return (\n !isLabelColumnSpec(spec.spec) &&\n !isColumnHidden(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: LabelColumnLookup,\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 specsToVisibleSpecsMapping: Map<number, number>,\n visibleAxesIndices: number[],\n): {\n requestIndices: number[];\n fieldResultMapping: number[];\n axesResultIndices: number[];\n} {\n const resolved = indices.map((displayField) => {\n const idx = specsToVisibleSpecsMapping.get(displayField);\n return idx === undefined || idx === -1 ? null : idx;\n });\n const requestedFields = resolved.filter((v): v is number => v !== null);\n\n const fieldResultMapping: number[] = [];\n let pos = 0;\n for (const v of resolved) {\n fieldResultMapping.push(v === null ? -1 : pos++);\n }\n\n const requestIndices = uniq([...requestedFields, ...visibleAxesIndices]);\n const axesResultIndices = visibleAxesIndices.map((vi) => requestIndices.indexOf(vi));\n return { requestIndices, fieldResultMapping, axesResultIndices };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"table-state-v2.d.ts","sourceRoot":"","sources":["../../../../src/components/PlAgDataTable/sources/table-state-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAQvB,0BAA0B,EAG3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAwB,KAAK,GAAG,EAAE,KAAK,mBAAmB,EAAE,MAAM,KAAK,CAAC;AAC/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAMtD,wBAAgB,aAAa,CAC3B,sBAAsB,EAAE,GAAG,CAAC,kBAAkB,CAAC,EAC/C,QAAQ,EAAE,GAAG,CAAC,qBAAqB,CAAC,EACpC,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAC/B;IACD,SAAS,EAAE,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IACzD,WAAW,EAAE,mBAAmB,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC1D,YAAY,EAAE,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC9C,YAAY,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CAC3C,CAwHA"}
1
+ {"version":3,"file":"table-state-v2.d.ts","sourceRoot":"","sources":["../../../../src/components/PlAgDataTable/sources/table-state-v2.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAOvB,0BAA0B,EAG3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAwB,KAAK,GAAG,EAAE,KAAK,mBAAmB,EAAE,MAAM,KAAK,CAAC;AAC/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAMtD,wBAAgB,aAAa,CAC3B,sBAAsB,EAAE,GAAG,CAAC,kBAAkB,CAAC,EAC/C,QAAQ,EAAE,GAAG,CAAC,qBAAqB,CAAC,EACpC,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAC/B;IACD,SAAS,EAAE,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IACzD,WAAW,EAAE,mBAAmB,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC1D,YAAY,EAAE,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC9C,YAAY,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CAC3C,CAwHA"}
@@ -94,7 +94,7 @@ function _() {
94
94
  };
95
95
  }
96
96
  function v(e) {
97
- return e?.hiddenColIds?.map(d).reduce((e, t) => (t.source.type === "column" && e.push(t.source.id), e), []) ?? null;
97
+ return e?.hiddenColIds?.map((e) => u(d(e).source)) ?? null;
98
98
  }
99
99
  function y(e) {
100
100
  return e.map((e) => {
@@ -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 PObjectId,\n type PTableParamsV2,\n type PTableSorting,\n type PlDataTableFilters,\n distillFilterSpec,\n PlDataTableFiltersWithMeta,\n getPTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport { computed, ref, watch, type Ref, type WritableComputedRef } from \"vue\";\nimport type { PlDataTableSettingsV2 } from \"../types\";\nimport { isJsonEqual, randomInt } 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): {\n gridState: WritableComputedRef<PlDataTableGridStateCore>;\n sheetsState: WritableComputedRef<PlDataTableSheetState[]>;\n filtersState: Ref<PlDataTableFiltersWithMeta>;\n searchString: WritableComputedRef<string>;\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 const filtersState = computed<PlDataTableFiltersWithMeta>({\n get: () => {\n const raw = tableState.value.filtersState;\n const isCorrect =\n raw &&\n (raw.type === \"and\" || raw.type === \"or\") &&\n \"filters\" in raw &&\n Array.isArray(raw.filters);\n\n return isCorrect\n ? (raw satisfies PlDataTableFiltersWithMeta)\n : { id: randomInt(), type: \"and\" as const, isExpanded: true, filters: [] };\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 const filtersStateDeepReactive = ref(filtersState);\n watch(\n () => filtersStateDeepReactive.value,\n (newValue) => (filtersState.value = newValue),\n { deep: true },\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 { gridState, sheetsState, filtersState: filtersStateDeepReactive, searchString };\n}\n\ntype PlDataTableStateV2CacheEntryNullable =\n | PlDataTableStateV2CacheEntry\n | {\n sourceId: null;\n gridState: Record<string, never>;\n sheetsState: [];\n filtersState: null;\n searchString?: string;\n };\n\nfunction makeDefaultState(): PlDataTableStateV2CacheEntryNullable {\n return {\n sourceId: null,\n gridState: {},\n sheetsState: [],\n filtersState: null,\n };\n}\n\nfunction getHiddenColIds(state: PlDataTableGridStateCore[\"columnVisibility\"]): PObjectId[] | null {\n return (\n state?.hiddenColIds?.map(parseJson).reduce((acc, c) => {\n if (c.source.type === \"column\") {\n acc.push(c.source.id);\n }\n return acc;\n }, [] as PObjectId[]) ?? null\n );\n}\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 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\nfunction createPTableParams(\n state: PlDataTableStateV2CacheEntry,\n filterableColumns: PTableColumnSpec[],\n): PTableParamsV2 {\n const searchNode = createSearchFilterNode(filterableColumns, state.searchString);\n const parts = [\n ...convertPartitionFiltersToFilterSpec(state.sheetsState),\n ...(state.filtersState ? [state.filtersState] : []),\n ...(searchNode ? [searchNode] : []),\n ];\n const filters: null | PlDataTableFilters = distillFilterSpec(\n parts.length === 0 ? null : parts.length === 1 ? parts[0] : { type: \"and\", filters: parts },\n );\n\n return {\n sourceId: state.sourceId,\n hiddenColIds: getHiddenColIds(state.gridState.columnVisibility),\n filters,\n sorting: convertAgSortingToPTableSorting(state.gridState.sort),\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 PlDataTableFilters,\n distillFilterSpec,\n PlDataTableFiltersWithMeta,\n getPTableColumnId,\n CanonicalizedJson,\n} from \"@platforma-sdk/model\";\nimport { computed, ref, watch, type Ref, type WritableComputedRef } from \"vue\";\nimport type { PlDataTableSettingsV2 } from \"../types\";\nimport { isJsonEqual, randomInt } 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): {\n gridState: WritableComputedRef<PlDataTableGridStateCore>;\n sheetsState: WritableComputedRef<PlDataTableSheetState[]>;\n filtersState: Ref<PlDataTableFiltersWithMeta>;\n searchString: WritableComputedRef<string>;\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 const filtersState = computed<PlDataTableFiltersWithMeta>({\n get: () => {\n const raw = tableState.value.filtersState;\n const isCorrect =\n raw &&\n (raw.type === \"and\" || raw.type === \"or\") &&\n \"filters\" in raw &&\n Array.isArray(raw.filters);\n\n return isCorrect\n ? (raw satisfies PlDataTableFiltersWithMeta)\n : { id: randomInt(), type: \"and\" as const, isExpanded: true, filters: [] };\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 const filtersStateDeepReactive = ref(filtersState);\n watch(\n () => filtersStateDeepReactive.value,\n (newValue) => (filtersState.value = newValue),\n { deep: true },\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 { gridState, sheetsState, filtersState: filtersStateDeepReactive, searchString };\n}\n\ntype PlDataTableStateV2CacheEntryNullable =\n | PlDataTableStateV2CacheEntry\n | {\n sourceId: null;\n gridState: Record<string, never>;\n sheetsState: [];\n filtersState: null;\n searchString?: string;\n };\n\nfunction makeDefaultState(): PlDataTableStateV2CacheEntryNullable {\n return {\n sourceId: null,\n gridState: {},\n sheetsState: [],\n filtersState: null,\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 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 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\nfunction createPTableParams(\n state: PlDataTableStateV2CacheEntry,\n filterableColumns: PTableColumnSpec[],\n): PTableParamsV2 {\n const searchNode = createSearchFilterNode(filterableColumns, state.searchString);\n const parts = [\n ...convertPartitionFiltersToFilterSpec(state.sheetsState),\n ...(state.filtersState ? [state.filtersState] : []),\n ...(searchNode ? [searchNode] : []),\n ];\n const filters: null | PlDataTableFilters = distillFilterSpec(\n parts.length === 0 ? null : parts.length === 1 ? parts[0] : { type: \"and\", filters: parts },\n );\n\n return {\n sourceId: state.sourceId,\n hiddenColIds: getHiddenColIds(state.gridState.columnVisibility),\n filters,\n sorting: convertAgSortingToPTableSorting(state.gridState.sort),\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlAgGridColumnManager.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlBtnGhost,\n PlElementList,\n PlSearchField,\n PlSlideModal,\n usePlBlockPageTitleTeleportTarget,\n} from \"@milaboratories/uikit\";\nimport { type Column, type DisplayedColumnsChangedEvent, type GridApi } from \"ag-grid-enterprise\";\nimport { computed, ref, toRefs, watch } from \"vue\";\nimport { PlAgDataTableRowNumberColId } from \"../PlAgDataTable/sources/row-number\";\nimport { useFilteredItems } from \"./useFilteredItems\";\n\nconst props = defineProps<{\n /**\n * The GridApi is an API interface provided by the table/grid component\n * for interacting programmatically with the grid's features and functionality.\n * It allows you to control and manipulate grid behavior, access data, and\n * trigger specific actions.\n */\n api: GridApi;\n /**\n * Css Column Manager (Panel) modal width (default value is `368px`)\n */\n width?: string;\n}>();\n\nconst { api: gridApi } = toRefs(props);\n\nconst columns = ref<Column[]>([]);\nwatch(\n () => gridApi.value,\n (gridApi) => {\n if (gridApi.isDestroyed()) return;\n\n gridApi.addEventListener(\"displayedColumnsChanged\", (event: DisplayedColumnsChangedEvent) => {\n columns.value = event.api.getAllGridColumns();\n });\n\n columns.value = gridApi.getAllGridColumns();\n if (columns.value.length > 0) {\n gridApi.moveColumns(columns.value, 0);\n }\n },\n { immediate: true },\n);\n\nconst items = computed(() => {\n return columns.value.map((col) => ({\n column: col,\n id: col.getId(),\n label: col.getColDef().headerName!,\n }));\n});\n\nconst query = ref(\"\");\n\nconst slideModal = ref(false);\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlAgGridColumnManager\");\n\nconst { filteredItems, segments } = useFilteredItems(() => ({\n items: items.value,\n query: query.value,\n getStrings: (item) => [item.label],\n}));\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost icon=\"columns\" @click.stop=\"slideModal = !slideModal\"> Columns </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"slideModal\" :width=\"width\" close-on-outside-click>\n <template #title>Manage Columns</template>\n <PlSearchField v-model=\"query\" clearable />\n <PlElementList\n :items=\"filteredItems\"\n :get-item-key=\"(item) => item.id\"\n :is-draggable=\"(item) => !item.column.getColDef().lockPosition\"\n :on-sort=\"\n (fromIndex, toIndex) => {\n if (!gridApi.isDestroyed()) {\n const columnToMove = columns[fromIndex];\n gridApi.moveColumns([columnToMove], toIndex);\n }\n return true; // Let PlElementList handle the visual update\n }\n \"\n :on-toggle=\"\n (item) => {\n if (!gridApi.isDestroyed()) {\n gridApi.setColumnsVisible([item.column], !item.column.isVisible());\n }\n }\n \"\n :is-toggled=\"(item) => !item.column.isVisible()\"\n :is-toggable=\"(item) => item.id !== PlAgDataTableRowNumberColId\"\n :is-pinned=\"(item) => !!item.column.getColDef().lockPosition\"\n :is-pinnable=\"() => false\"\n :disable-dragging=\"query.length > 0\"\n disable-removing\n >\n <template #item-title=\"{ item }\">\n <span>\n <span\n v-for=\"(segment, i) of segments.get(item.label)\"\n :key=\"i\"\n :class=\"{ [$style.match]: segment.match }\"\n >{{ segment.value }}</span\n >\n </span>\n </template>\n </PlElementList>\n </PlSlideModal>\n</template>\n\n<style module>\n.match {\n background-color: var(--color-active-select);\n border-radius: 2px;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"PlAgGridColumnManager.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlBtnGhost,\n PlElementList,\n PlSearchField,\n PlSlideModal,\n usePlBlockPageTitleTeleportTarget,\n} from \"@milaboratories/uikit\";\nimport { type GridApi } from \"ag-grid-enterprise\";\nimport { computed, ref } from \"vue\";\nimport { PlAgDataTableRowNumberColId } from \"../PlAgDataTable/sources/row-number\";\nimport { useFilteredItems } from \"./useFilteredItems\";\nimport { useGridColumns } from \"./useGridColumns\";\n\nconst props = defineProps<{\n /**\n * The GridApi is an API interface provided by the table/grid component\n * for interacting programmatically with the grid's features and functionality.\n * It allows you to control and manipulate grid behavior, access data, and\n * trigger specific actions.\n */\n api: GridApi;\n /**\n * Css Column Manager (Panel) modal width (default value is `368px`)\n */\n width?: string;\n}>();\n\nconst query = ref(\"\");\nconst slideModal = ref(false);\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlAgGridColumnManager\");\n\nconst columns = useGridColumns(props);\n\nconst items = computed(() => {\n return columns.value.map((col, i) => ({\n column: col,\n id: col.getId(),\n label: col.getColDef().headerName ?? `Unnamed Column (${i + 1})`,\n }));\n});\n\nconst { filteredItems, segments } = useFilteredItems({\n items,\n query,\n getStrings: (item) => [item.label],\n});\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost icon=\"columns\" @click.stop=\"slideModal = !slideModal\"> Columns </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"slideModal\" :width=\"width\" close-on-outside-click>\n <template #title>Manage Columns</template>\n <PlSearchField v-model=\"query\" clearable />\n <PlElementList\n :items=\"filteredItems\"\n :get-item-key=\"(item) => item.id\"\n :is-draggable=\"(item) => !item.column.getColDef().lockPosition\"\n :on-sort=\"\n (fromIndex, toIndex) => {\n if (!props.api.isDestroyed()) {\n const columnToMove = columns[fromIndex];\n props.api.moveColumns([columnToMove], toIndex);\n }\n return true; // Let PlElementList handle the visual update\n }\n \"\n :on-toggle=\"\n (item) => {\n if (!props.api.isDestroyed()) {\n props.api.setColumnsVisible([item.column], !item.column.isVisible());\n }\n }\n \"\n :is-toggled=\"(item) => !item.column.isVisible()\"\n :is-toggable=\"(item) => item.id !== PlAgDataTableRowNumberColId\"\n :is-pinned=\"(item) => !!item.column.getColDef().lockPosition\"\n :is-pinnable=\"() => false\"\n :disable-dragging=\"query.length > 0\"\n disable-removing\n >\n <template #item-title=\"{ item }\">\n <span>\n <span\n v-for=\"(segment, i) of segments.get(item.label)\"\n :key=\"i\"\n :class=\"{ [$style.match]: segment.match }\"\n >{{ segment.value }}</span\n >\n </span>\n </template>\n </PlElementList>\n </PlSlideModal>\n</template>\n\n<style module>\n.match {\n background-color: var(--color-active-select);\n border-radius: 2px;\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"PlAgGridColumnManager.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlBtnGhost,\n PlElementList,\n PlSearchField,\n PlSlideModal,\n usePlBlockPageTitleTeleportTarget,\n} from \"@milaboratories/uikit\";\nimport { type Column, type DisplayedColumnsChangedEvent, type GridApi } from \"ag-grid-enterprise\";\nimport { computed, ref, toRefs, watch } from \"vue\";\nimport { PlAgDataTableRowNumberColId } from \"../PlAgDataTable/sources/row-number\";\nimport { useFilteredItems } from \"./useFilteredItems\";\n\nconst props = defineProps<{\n /**\n * The GridApi is an API interface provided by the table/grid component\n * for interacting programmatically with the grid's features and functionality.\n * It allows you to control and manipulate grid behavior, access data, and\n * trigger specific actions.\n */\n api: GridApi;\n /**\n * Css Column Manager (Panel) modal width (default value is `368px`)\n */\n width?: string;\n}>();\n\nconst { api: gridApi } = toRefs(props);\n\nconst columns = ref<Column[]>([]);\nwatch(\n () => gridApi.value,\n (gridApi) => {\n if (gridApi.isDestroyed()) return;\n\n gridApi.addEventListener(\"displayedColumnsChanged\", (event: DisplayedColumnsChangedEvent) => {\n columns.value = event.api.getAllGridColumns();\n });\n\n columns.value = gridApi.getAllGridColumns();\n if (columns.value.length > 0) {\n gridApi.moveColumns(columns.value, 0);\n }\n },\n { immediate: true },\n);\n\nconst items = computed(() => {\n return columns.value.map((col) => ({\n column: col,\n id: col.getId(),\n label: col.getColDef().headerName!,\n }));\n});\n\nconst query = ref(\"\");\n\nconst slideModal = ref(false);\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlAgGridColumnManager\");\n\nconst { filteredItems, segments } = useFilteredItems(() => ({\n items: items.value,\n query: query.value,\n getStrings: (item) => [item.label],\n}));\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost icon=\"columns\" @click.stop=\"slideModal = !slideModal\"> Columns </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"slideModal\" :width=\"width\" close-on-outside-click>\n <template #title>Manage Columns</template>\n <PlSearchField v-model=\"query\" clearable />\n <PlElementList\n :items=\"filteredItems\"\n :get-item-key=\"(item) => item.id\"\n :is-draggable=\"(item) => !item.column.getColDef().lockPosition\"\n :on-sort=\"\n (fromIndex, toIndex) => {\n if (!gridApi.isDestroyed()) {\n const columnToMove = columns[fromIndex];\n gridApi.moveColumns([columnToMove], toIndex);\n }\n return true; // Let PlElementList handle the visual update\n }\n \"\n :on-toggle=\"\n (item) => {\n if (!gridApi.isDestroyed()) {\n gridApi.setColumnsVisible([item.column], !item.column.isVisible());\n }\n }\n \"\n :is-toggled=\"(item) => !item.column.isVisible()\"\n :is-toggable=\"(item) => item.id !== PlAgDataTableRowNumberColId\"\n :is-pinned=\"(item) => !!item.column.getColDef().lockPosition\"\n :is-pinnable=\"() => false\"\n :disable-dragging=\"query.length > 0\"\n disable-removing\n >\n <template #item-title=\"{ item }\">\n <span>\n <span\n v-for=\"(segment, i) of segments.get(item.label)\"\n :key=\"i\"\n :class=\"{ [$style.match]: segment.match }\"\n >{{ segment.value }}</span\n >\n </span>\n </template>\n </PlElementList>\n </PlSlideModal>\n</template>\n\n<style module>\n.match {\n background-color: var(--color-active-select);\n border-radius: 2px;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"PlAgGridColumnManager.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PlBtnGhost,\n PlElementList,\n PlSearchField,\n PlSlideModal,\n usePlBlockPageTitleTeleportTarget,\n} from \"@milaboratories/uikit\";\nimport { type GridApi } from \"ag-grid-enterprise\";\nimport { computed, ref } from \"vue\";\nimport { PlAgDataTableRowNumberColId } from \"../PlAgDataTable/sources/row-number\";\nimport { useFilteredItems } from \"./useFilteredItems\";\nimport { useGridColumns } from \"./useGridColumns\";\n\nconst props = defineProps<{\n /**\n * The GridApi is an API interface provided by the table/grid component\n * for interacting programmatically with the grid's features and functionality.\n * It allows you to control and manipulate grid behavior, access data, and\n * trigger specific actions.\n */\n api: GridApi;\n /**\n * Css Column Manager (Panel) modal width (default value is `368px`)\n */\n width?: string;\n}>();\n\nconst query = ref(\"\");\nconst slideModal = ref(false);\nconst teleportTarget = usePlBlockPageTitleTeleportTarget(\"PlAgGridColumnManager\");\n\nconst columns = useGridColumns(props);\n\nconst items = computed(() => {\n return columns.value.map((col, i) => ({\n column: col,\n id: col.getId(),\n label: col.getColDef().headerName ?? `Unnamed Column (${i + 1})`,\n }));\n});\n\nconst { filteredItems, segments } = useFilteredItems({\n items,\n query,\n getStrings: (item) => [item.label],\n});\n</script>\n\n<template>\n <Teleport v-if=\"teleportTarget\" :to=\"teleportTarget\">\n <PlBtnGhost icon=\"columns\" @click.stop=\"slideModal = !slideModal\"> Columns </PlBtnGhost>\n </Teleport>\n\n <PlSlideModal v-model=\"slideModal\" :width=\"width\" close-on-outside-click>\n <template #title>Manage Columns</template>\n <PlSearchField v-model=\"query\" clearable />\n <PlElementList\n :items=\"filteredItems\"\n :get-item-key=\"(item) => item.id\"\n :is-draggable=\"(item) => !item.column.getColDef().lockPosition\"\n :on-sort=\"\n (fromIndex, toIndex) => {\n if (!props.api.isDestroyed()) {\n const columnToMove = columns[fromIndex];\n props.api.moveColumns([columnToMove], toIndex);\n }\n return true; // Let PlElementList handle the visual update\n }\n \"\n :on-toggle=\"\n (item) => {\n if (!props.api.isDestroyed()) {\n props.api.setColumnsVisible([item.column], !item.column.isVisible());\n }\n }\n \"\n :is-toggled=\"(item) => !item.column.isVisible()\"\n :is-toggable=\"(item) => item.id !== PlAgDataTableRowNumberColId\"\n :is-pinned=\"(item) => !!item.column.getColDef().lockPosition\"\n :is-pinnable=\"() => false\"\n :disable-dragging=\"query.length > 0\"\n disable-removing\n >\n <template #item-title=\"{ item }\">\n <span>\n <span\n v-for=\"(segment, i) of segments.get(item.label)\"\n :key=\"i\"\n :class=\"{ [$style.match]: segment.match }\"\n >{{ segment.value }}</span\n >\n </span>\n </template>\n </PlElementList>\n </PlSlideModal>\n</template>\n\n<style module>\n.match {\n background-color: var(--color-active-select);\n border-radius: 2px;\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"PlAgGridColumnManager.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"names":[],"mappings":"AAmIA,OAAO,EAAkD,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAKlG,KAAK,WAAW,GAAG;IACjB;;;;;OAKG;IACH,GAAG,EAAE,OAAO,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;;AAqOF,wBAMG"}
1
+ {"version":3,"file":"PlAgGridColumnManager.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlAgGridColumnManager/PlAgGridColumnManager.vue"],"names":[],"mappings":"AAiHA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAMlD,KAAK,WAAW,GAAG;IACjB;;;;;OAKG;IACH,GAAG,EAAE,OAAO,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;;AAiNF,wBAMG"}