@platforma-sdk/model 1.70.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/columns/column_snapshot_provider.cjs +26 -2
- package/dist/columns/column_snapshot_provider.cjs.map +1 -1
- package/dist/columns/column_snapshot_provider.d.ts +2 -1
- package/dist/columns/column_snapshot_provider.d.ts.map +1 -1
- package/dist/columns/column_snapshot_provider.js +25 -2
- package/dist/columns/column_snapshot_provider.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +40 -20
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +41 -21
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs +15 -0
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.js +15 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/render/api.cjs +3 -14
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +4 -15
- package/dist/render/api.js.map +1 -1
- package/dist/render/index.cjs +1 -1
- package/dist/render/index.js +1 -1
- package/package.json +8 -8
- package/src/columns/column_snapshot_provider.ts +30 -14
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +58 -43
- package/src/components/PlDataTable/createPlDataTable/utils.ts +25 -2
- package/src/render/api.ts +5 -17
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_accessor = require("../render/accessor.cjs");
|
|
3
|
+
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
1
4
|
//#region src/columns/column_snapshot_provider.ts
|
|
2
5
|
/**
|
|
3
6
|
* Simple provider wrapping an array of PColumns.
|
|
@@ -9,8 +12,8 @@ var ArrayColumnProvider = class {
|
|
|
9
12
|
this.columns = columns.map((col) => ({
|
|
10
13
|
id: col.id,
|
|
11
14
|
spec: col.spec,
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
data: { get: () => col.data },
|
|
16
|
+
dataStatus: this.getStatus(col.data)
|
|
14
17
|
}));
|
|
15
18
|
}
|
|
16
19
|
getAllColumns() {
|
|
@@ -19,6 +22,27 @@ var ArrayColumnProvider = class {
|
|
|
19
22
|
isColumnListComplete() {
|
|
20
23
|
return true;
|
|
21
24
|
}
|
|
25
|
+
getStatus(d) {
|
|
26
|
+
if (d == null) return "absent";
|
|
27
|
+
if (typeof d === "function") return this.getStatus(d());
|
|
28
|
+
if (d instanceof require_accessor.TreeNodeAccessor) {
|
|
29
|
+
if (d.getIsReadyOrError()) return "ready";
|
|
30
|
+
if (d.getIsFinal()) return "absent";
|
|
31
|
+
return "computing";
|
|
32
|
+
}
|
|
33
|
+
if ((0, _milaboratories_pl_model_common.isDataInfo)(d)) {
|
|
34
|
+
let ready = true;
|
|
35
|
+
let final = true;
|
|
36
|
+
(0, _milaboratories_pl_model_common.visitDataInfo)(d, (v) => {
|
|
37
|
+
ready &&= v.getIsReadyOrError();
|
|
38
|
+
final &&= v.getIsFinal();
|
|
39
|
+
});
|
|
40
|
+
if (ready) return "ready";
|
|
41
|
+
if (final) return "absent";
|
|
42
|
+
return "computing";
|
|
43
|
+
}
|
|
44
|
+
return "ready";
|
|
45
|
+
}
|
|
22
46
|
};
|
|
23
47
|
/**
|
|
24
48
|
* Provider wrapping an array of ColumnSnapshots.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column_snapshot_provider.cjs","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"sourcesContent":["import type { PObjectId } from \"@milaboratories/pl-model-common\";\nimport { PColumn } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\nimport type { ColumnDataStatus, ColumnSnapshot } from \"./column_snapshot\";\n\n
|
|
1
|
+
{"version":3,"file":"column_snapshot_provider.cjs","names":["TreeNodeAccessor"],"sources":["../../src/columns/column_snapshot_provider.ts"],"sourcesContent":["import type { PObjectId } from \"@milaboratories/pl-model-common\";\nimport { isDataInfo, PColumn, visitDataInfo } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\nimport type { ColumnDataStatus, ColumnSnapshot } from \"./column_snapshot\";\n\n/**\n * Data source interface for column enumeration.\n *\n * Knows nothing about the render framework, stability tracking, labels,\n * anchoring, or splitting. All that complexity lives in the collection layer.\n */\nexport interface ColumnSnapshotProvider {\n /** Returns all currently known columns. */\n getAllColumns(): ColumnSnapshot<PObjectId>[];\n\n /** Whether the provider has finished enumerating all its columns.\n * Calling this may mark the render context unstable — it touches\n * the reactive tree to check field resolution state. */\n isColumnListComplete(): boolean;\n}\n\n/**\n * Union of types that can serve as column sources for helpers and builders.\n * Does NOT include TreeNodeAccessor — call `.toColumnSource()` on it first.\n */\nexport type ColumnSource =\n | ColumnSnapshotProvider\n | ColumnSnapshot<PObjectId>[]\n | PColumn<PColumnDataUniversal | undefined>[];\n\n/**\n * Simple provider wrapping an array of PColumns.\n * Always complete, data status always 'ready'.\n */\nexport class ArrayColumnProvider implements ColumnSnapshotProvider {\n private readonly columns: ColumnSnapshot<PObjectId>[];\n\n constructor(columns: PColumn<PColumnDataUniversal | undefined>[]) {\n this.columns = columns.map((col) => ({\n id: col.id,\n spec: col.spec,\n data: { get: () => col.data },\n dataStatus: this.getStatus(col.data),\n }));\n }\n\n getAllColumns(): ColumnSnapshot<PObjectId>[] {\n return this.columns;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n\n protected getStatus(\n d: undefined | PColumnDataUniversal | (() => undefined | PColumnDataUniversal),\n ): ColumnDataStatus {\n if (d == null) {\n return \"absent\";\n }\n if (typeof d === \"function\") {\n return this.getStatus(d());\n }\n if (d instanceof TreeNodeAccessor) {\n if (d.getIsReadyOrError()) return \"ready\";\n if (d.getIsFinal()) return \"absent\";\n return \"computing\";\n }\n if (isDataInfo(d)) {\n let ready = true;\n let final = true;\n visitDataInfo(d, (v) => {\n ready &&= v.getIsReadyOrError();\n final &&= v.getIsFinal();\n });\n if (ready) return \"ready\";\n if (final) return \"absent\";\n return \"computing\";\n }\n return \"ready\";\n }\n}\n\n/**\n * Provider wrapping an array of ColumnSnapshots.\n * Always complete. Data status taken from each snapshot.\n */\nexport class SnapshotColumnProvider implements ColumnSnapshotProvider {\n constructor(private readonly snapshots: ColumnSnapshot<PObjectId>[]) {}\n\n getAllColumns(): ColumnSnapshot<PObjectId>[] {\n return this.snapshots;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\nexport interface OutputColumnProviderOpts {\n /** When true and the accessor is final, columns with no ready data get status 'absent'. */\n allowPermanentAbsence?: boolean;\n}\n\n/**\n * Provider wrapping a TreeNodeAccessor (output/prerun resolve result).\n * Detects data status from accessor readiness state.\n */\nexport class OutputColumnProvider implements ColumnSnapshotProvider {\n constructor(\n private readonly accessor: TreeNodeAccessor,\n private readonly opts?: OutputColumnProviderOpts,\n ) {}\n\n getAllColumns(): ColumnSnapshot<PObjectId>[] {\n return this.getColumns();\n }\n\n isColumnListComplete(): boolean {\n return this.accessor.getInputsLocked();\n }\n\n private getColumns(): ColumnSnapshot<PObjectId>[] {\n const pColumns = this.accessor.getPColumns();\n if (pColumns === undefined) return [];\n\n const isFinal = this.accessor.getIsFinal();\n const allowAbsence = this.opts?.allowPermanentAbsence === true;\n\n return pColumns.map((col) => {\n const dataAccessor = col.data;\n const isReady = dataAccessor.getIsReadyOrError();\n\n let dataStatus: ColumnDataStatus;\n if (isReady) {\n dataStatus = \"ready\";\n } else if (allowAbsence && isFinal) {\n dataStatus = \"absent\";\n } else {\n dataStatus = \"computing\";\n }\n\n return {\n id: col.id,\n spec: col.spec,\n dataStatus,\n data: { get: () => (isReady ? dataAccessor : undefined) },\n };\n });\n }\n}\n\n/** Checks if a value is a ColumnSnapshotProvider (duck-typing). */\nexport function isColumnSnapshotProvider(source: unknown): source is ColumnSnapshotProvider {\n return (\n typeof source === \"object\" &&\n source !== null &&\n \"getAllColumns\" in source &&\n \"isColumnListComplete\" in source &&\n typeof (source as ColumnSnapshotProvider).getAllColumns === \"function\" &&\n typeof (source as ColumnSnapshotProvider).isColumnListComplete === \"function\"\n );\n}\n\n/** Checks if a value looks like a PColumn (has id, spec, data). */\nfunction isPColumnArray(source: unknown): source is PColumn<PColumnDataUniversal | undefined>[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as PColumn[]\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"data\" in first && !(\"dataStatus\" in first);\n}\n\n/** Checks if a value looks like a ColumnSnapshot array. */\nfunction isColumnSnapshotArray(source: unknown): source is ColumnSnapshot<PObjectId>[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as snapshots\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"dataStatus\" in first;\n}\n\n/**\n * Normalize any ColumnSource into a ColumnSnapshotProvider.\n * - ColumnSnapshotProvider → returned as-is\n * - ColumnSnapshot<PObjectId>[] → wrapped in SnapshotColumnProvider\n * - PColumn[] → wrapped in ArrayColumnProvider\n */\nexport function toColumnSnapshotProvider(source: ColumnSource): ColumnSnapshotProvider {\n if (isColumnSnapshotProvider(source)) return source;\n if (isColumnSnapshotArray(source)) return new SnapshotColumnProvider(source);\n if (isPColumnArray(source)) return new ArrayColumnProvider(source);\n // Should not reach here given the type union, but be safe\n throw new Error(\"Unknown ColumnSource type\");\n}\n"],"mappings":";;;;;;;;AAmCA,IAAa,sBAAb,MAAmE;CACjE;CAEA,YAAY,SAAsD;AAChE,OAAK,UAAU,QAAQ,KAAK,SAAS;GACnC,IAAI,IAAI;GACR,MAAM,IAAI;GACV,MAAM,EAAE,WAAW,IAAI,MAAM;GAC7B,YAAY,KAAK,UAAU,IAAI,KAAK;GACrC,EAAE;;CAGL,gBAA6C;AAC3C,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;CAGT,UACE,GACkB;AAClB,MAAI,KAAK,KACP,QAAO;AAET,MAAI,OAAO,MAAM,WACf,QAAO,KAAK,UAAU,GAAG,CAAC;AAE5B,MAAI,aAAaA,iBAAAA,kBAAkB;AACjC,OAAI,EAAE,mBAAmB,CAAE,QAAO;AAClC,OAAI,EAAE,YAAY,CAAE,QAAO;AAC3B,UAAO;;AAET,OAAA,GAAA,gCAAA,YAAe,EAAE,EAAE;GACjB,IAAI,QAAQ;GACZ,IAAI,QAAQ;AACZ,IAAA,GAAA,gCAAA,eAAc,IAAI,MAAM;AACtB,cAAU,EAAE,mBAAmB;AAC/B,cAAU,EAAE,YAAY;KACxB;AACF,OAAI,MAAO,QAAO;AAClB,OAAI,MAAO,QAAO;AAClB,UAAO;;AAET,SAAO;;;;;;;AAQX,IAAa,yBAAb,MAAsE;CACpE,YAAY,WAAyD;AAAxC,OAAA,YAAA;;CAE7B,gBAA6C;AAC3C,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAaX,IAAa,uBAAb,MAAoE;CAClE,YACE,UACA,MACA;AAFiB,OAAA,WAAA;AACA,OAAA,OAAA;;CAGnB,gBAA6C;AAC3C,SAAO,KAAK,YAAY;;CAG1B,uBAAgC;AAC9B,SAAO,KAAK,SAAS,iBAAiB;;CAGxC,aAAkD;EAChD,MAAM,WAAW,KAAK,SAAS,aAAa;AAC5C,MAAI,aAAa,KAAA,EAAW,QAAO,EAAE;EAErC,MAAM,UAAU,KAAK,SAAS,YAAY;EAC1C,MAAM,eAAe,KAAK,MAAM,0BAA0B;AAE1D,SAAO,SAAS,KAAK,QAAQ;GAC3B,MAAM,eAAe,IAAI;GACzB,MAAM,UAAU,aAAa,mBAAmB;GAEhD,IAAI;AACJ,OAAI,QACF,cAAa;YACJ,gBAAgB,QACzB,cAAa;OAEb,cAAa;AAGf,UAAO;IACL,IAAI,IAAI;IACR,MAAM,IAAI;IACV;IACA,MAAM,EAAE,WAAY,UAAU,eAAe,KAAA,GAAY;IAC1D;IACD;;;;AAKN,SAAgB,yBAAyB,QAAmD;AAC1F,QACE,OAAO,WAAW,YAClB,WAAW,QACX,mBAAmB,UACnB,0BAA0B,UAC1B,OAAQ,OAAkC,kBAAkB,cAC5D,OAAQ,OAAkC,yBAAyB;;;AAKvE,SAAS,eAAe,QAAwE;AAC9F,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,UAAU,SAAS,EAAE,gBAAgB;;;AAIlF,SAAS,sBAAsB,QAAwD;AACrF,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,gBAAgB;;;;;;;;AAS7D,SAAgB,yBAAyB,QAA8C;AACrF,KAAI,yBAAyB,OAAO,CAAE,QAAO;AAC7C,KAAI,sBAAsB,OAAO,CAAE,QAAO,IAAI,uBAAuB,OAAO;AAC5E,KAAI,eAAe,OAAO,CAAE,QAAO,IAAI,oBAAoB,OAAO;AAElE,OAAM,IAAI,MAAM,4BAA4B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PColumnDataUniversal } from "../render/internal.js";
|
|
2
2
|
import { TreeNodeAccessor } from "../render/accessor.js";
|
|
3
|
-
import { ColumnSnapshot } from "./column_snapshot.js";
|
|
3
|
+
import { ColumnDataStatus, ColumnSnapshot } from "./column_snapshot.js";
|
|
4
4
|
import { PColumn, PObjectId } from "@milaboratories/pl-model-common";
|
|
5
5
|
|
|
6
6
|
//#region src/columns/column_snapshot_provider.d.ts
|
|
@@ -32,6 +32,7 @@ declare class ArrayColumnProvider implements ColumnSnapshotProvider {
|
|
|
32
32
|
constructor(columns: PColumn<PColumnDataUniversal | undefined>[]);
|
|
33
33
|
getAllColumns(): ColumnSnapshot<PObjectId>[];
|
|
34
34
|
isColumnListComplete(): boolean;
|
|
35
|
+
protected getStatus(d: undefined | PColumnDataUniversal | (() => undefined | PColumnDataUniversal)): ColumnDataStatus;
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
38
|
* Provider wrapping an array of ColumnSnapshots.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column_snapshot_provider.d.ts","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"column_snapshot_provider.d.ts","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"mappings":";;;;;;;AAYA;;;;;UAAiB,sBAAA;EAEiB;EAAhC,aAAA,IAAiB,cAAA,CAAe,SAAA;EAKZ;;AAOtB;EAPE,oBAAA;AAAA;;;;;KAOU,YAAA,GACR,sBAAA,GACA,cAAA,CAAe,SAAA,MACf,OAAA,CAAQ,oBAAA;;;;;cAMC,mBAAA,YAA+B,sBAAA;EAAA,iBACzB,OAAA;cAEL,OAAA,EAAS,OAAA,CAAQ,oBAAA;EAS7B,aAAA,CAAA,GAAiB,cAAA,CAAe,SAAA;EAIhC,oBAAA,CAAA;EAAA,UAIU,SAAA,CACR,CAAA,cAAe,oBAAA,sBAA0C,oBAAA,IACxD,gBAAA;AAAA;;;;;cA+BQ,sBAAA,YAAkC,sBAAA;EAAA,iBAChB,SAAA;cAAA,SAAA,EAAW,cAAA,CAAe,SAAA;EAEvD,aAAA,CAAA,GAAiB,cAAA,CAAe,SAAA;EAIhC,oBAAA,CAAA;AAAA;AAAA,UAKe,wBAAA;EAjE2B;EAmE1C,qBAAA;AAAA;;;;;cAOW,oBAAA,YAAgC,sBAAA;EAAA,iBAExB,QAAA;EAAA,iBACA,IAAA;cADA,QAAA,EAAU,gBAAA,EACV,IAAA,GAAO,wBAAA;EAG1B,aAAA,CAAA,GAAiB,cAAA,CAAe,SAAA;EAIhC,oBAAA,CAAA;EAAA,QAIQ,UAAA;AAAA;;iBA+BM,wBAAA,CAAyB,MAAA,YAAkB,MAAA,IAAU,sBAAA;AAlErE;;;;;;AAAA,iBAmGgB,wBAAA,CAAyB,MAAA,EAAQ,YAAA,GAAe,sBAAA"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { TreeNodeAccessor } from "../render/accessor.js";
|
|
2
|
+
import { isDataInfo, visitDataInfo } from "@milaboratories/pl-model-common";
|
|
1
3
|
//#region src/columns/column_snapshot_provider.ts
|
|
2
4
|
/**
|
|
3
5
|
* Simple provider wrapping an array of PColumns.
|
|
@@ -9,8 +11,8 @@ var ArrayColumnProvider = class {
|
|
|
9
11
|
this.columns = columns.map((col) => ({
|
|
10
12
|
id: col.id,
|
|
11
13
|
spec: col.spec,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
data: { get: () => col.data },
|
|
15
|
+
dataStatus: this.getStatus(col.data)
|
|
14
16
|
}));
|
|
15
17
|
}
|
|
16
18
|
getAllColumns() {
|
|
@@ -19,6 +21,27 @@ var ArrayColumnProvider = class {
|
|
|
19
21
|
isColumnListComplete() {
|
|
20
22
|
return true;
|
|
21
23
|
}
|
|
24
|
+
getStatus(d) {
|
|
25
|
+
if (d == null) return "absent";
|
|
26
|
+
if (typeof d === "function") return this.getStatus(d());
|
|
27
|
+
if (d instanceof TreeNodeAccessor) {
|
|
28
|
+
if (d.getIsReadyOrError()) return "ready";
|
|
29
|
+
if (d.getIsFinal()) return "absent";
|
|
30
|
+
return "computing";
|
|
31
|
+
}
|
|
32
|
+
if (isDataInfo(d)) {
|
|
33
|
+
let ready = true;
|
|
34
|
+
let final = true;
|
|
35
|
+
visitDataInfo(d, (v) => {
|
|
36
|
+
ready &&= v.getIsReadyOrError();
|
|
37
|
+
final &&= v.getIsFinal();
|
|
38
|
+
});
|
|
39
|
+
if (ready) return "ready";
|
|
40
|
+
if (final) return "absent";
|
|
41
|
+
return "computing";
|
|
42
|
+
}
|
|
43
|
+
return "ready";
|
|
44
|
+
}
|
|
22
45
|
};
|
|
23
46
|
/**
|
|
24
47
|
* Provider wrapping an array of ColumnSnapshots.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column_snapshot_provider.js","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"sourcesContent":["import type { PObjectId } from \"@milaboratories/pl-model-common\";\nimport { PColumn } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\nimport type { ColumnDataStatus, ColumnSnapshot } from \"./column_snapshot\";\n\n
|
|
1
|
+
{"version":3,"file":"column_snapshot_provider.js","names":[],"sources":["../../src/columns/column_snapshot_provider.ts"],"sourcesContent":["import type { PObjectId } from \"@milaboratories/pl-model-common\";\nimport { isDataInfo, PColumn, visitDataInfo } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { PColumnDataUniversal } from \"../render/internal\";\nimport type { ColumnDataStatus, ColumnSnapshot } from \"./column_snapshot\";\n\n/**\n * Data source interface for column enumeration.\n *\n * Knows nothing about the render framework, stability tracking, labels,\n * anchoring, or splitting. All that complexity lives in the collection layer.\n */\nexport interface ColumnSnapshotProvider {\n /** Returns all currently known columns. */\n getAllColumns(): ColumnSnapshot<PObjectId>[];\n\n /** Whether the provider has finished enumerating all its columns.\n * Calling this may mark the render context unstable — it touches\n * the reactive tree to check field resolution state. */\n isColumnListComplete(): boolean;\n}\n\n/**\n * Union of types that can serve as column sources for helpers and builders.\n * Does NOT include TreeNodeAccessor — call `.toColumnSource()` on it first.\n */\nexport type ColumnSource =\n | ColumnSnapshotProvider\n | ColumnSnapshot<PObjectId>[]\n | PColumn<PColumnDataUniversal | undefined>[];\n\n/**\n * Simple provider wrapping an array of PColumns.\n * Always complete, data status always 'ready'.\n */\nexport class ArrayColumnProvider implements ColumnSnapshotProvider {\n private readonly columns: ColumnSnapshot<PObjectId>[];\n\n constructor(columns: PColumn<PColumnDataUniversal | undefined>[]) {\n this.columns = columns.map((col) => ({\n id: col.id,\n spec: col.spec,\n data: { get: () => col.data },\n dataStatus: this.getStatus(col.data),\n }));\n }\n\n getAllColumns(): ColumnSnapshot<PObjectId>[] {\n return this.columns;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n\n protected getStatus(\n d: undefined | PColumnDataUniversal | (() => undefined | PColumnDataUniversal),\n ): ColumnDataStatus {\n if (d == null) {\n return \"absent\";\n }\n if (typeof d === \"function\") {\n return this.getStatus(d());\n }\n if (d instanceof TreeNodeAccessor) {\n if (d.getIsReadyOrError()) return \"ready\";\n if (d.getIsFinal()) return \"absent\";\n return \"computing\";\n }\n if (isDataInfo(d)) {\n let ready = true;\n let final = true;\n visitDataInfo(d, (v) => {\n ready &&= v.getIsReadyOrError();\n final &&= v.getIsFinal();\n });\n if (ready) return \"ready\";\n if (final) return \"absent\";\n return \"computing\";\n }\n return \"ready\";\n }\n}\n\n/**\n * Provider wrapping an array of ColumnSnapshots.\n * Always complete. Data status taken from each snapshot.\n */\nexport class SnapshotColumnProvider implements ColumnSnapshotProvider {\n constructor(private readonly snapshots: ColumnSnapshot<PObjectId>[]) {}\n\n getAllColumns(): ColumnSnapshot<PObjectId>[] {\n return this.snapshots;\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\nexport interface OutputColumnProviderOpts {\n /** When true and the accessor is final, columns with no ready data get status 'absent'. */\n allowPermanentAbsence?: boolean;\n}\n\n/**\n * Provider wrapping a TreeNodeAccessor (output/prerun resolve result).\n * Detects data status from accessor readiness state.\n */\nexport class OutputColumnProvider implements ColumnSnapshotProvider {\n constructor(\n private readonly accessor: TreeNodeAccessor,\n private readonly opts?: OutputColumnProviderOpts,\n ) {}\n\n getAllColumns(): ColumnSnapshot<PObjectId>[] {\n return this.getColumns();\n }\n\n isColumnListComplete(): boolean {\n return this.accessor.getInputsLocked();\n }\n\n private getColumns(): ColumnSnapshot<PObjectId>[] {\n const pColumns = this.accessor.getPColumns();\n if (pColumns === undefined) return [];\n\n const isFinal = this.accessor.getIsFinal();\n const allowAbsence = this.opts?.allowPermanentAbsence === true;\n\n return pColumns.map((col) => {\n const dataAccessor = col.data;\n const isReady = dataAccessor.getIsReadyOrError();\n\n let dataStatus: ColumnDataStatus;\n if (isReady) {\n dataStatus = \"ready\";\n } else if (allowAbsence && isFinal) {\n dataStatus = \"absent\";\n } else {\n dataStatus = \"computing\";\n }\n\n return {\n id: col.id,\n spec: col.spec,\n dataStatus,\n data: { get: () => (isReady ? dataAccessor : undefined) },\n };\n });\n }\n}\n\n/** Checks if a value is a ColumnSnapshotProvider (duck-typing). */\nexport function isColumnSnapshotProvider(source: unknown): source is ColumnSnapshotProvider {\n return (\n typeof source === \"object\" &&\n source !== null &&\n \"getAllColumns\" in source &&\n \"isColumnListComplete\" in source &&\n typeof (source as ColumnSnapshotProvider).getAllColumns === \"function\" &&\n typeof (source as ColumnSnapshotProvider).isColumnListComplete === \"function\"\n );\n}\n\n/** Checks if a value looks like a PColumn (has id, spec, data). */\nfunction isPColumnArray(source: unknown): source is PColumn<PColumnDataUniversal | undefined>[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as PColumn[]\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"data\" in first && !(\"dataStatus\" in first);\n}\n\n/** Checks if a value looks like a ColumnSnapshot array. */\nfunction isColumnSnapshotArray(source: unknown): source is ColumnSnapshot<PObjectId>[] {\n if (!Array.isArray(source)) return false;\n if (source.length === 0) return true; // empty array — treat as snapshots\n const first = source[0];\n return \"id\" in first && \"spec\" in first && \"dataStatus\" in first;\n}\n\n/**\n * Normalize any ColumnSource into a ColumnSnapshotProvider.\n * - ColumnSnapshotProvider → returned as-is\n * - ColumnSnapshot<PObjectId>[] → wrapped in SnapshotColumnProvider\n * - PColumn[] → wrapped in ArrayColumnProvider\n */\nexport function toColumnSnapshotProvider(source: ColumnSource): ColumnSnapshotProvider {\n if (isColumnSnapshotProvider(source)) return source;\n if (isColumnSnapshotArray(source)) return new SnapshotColumnProvider(source);\n if (isPColumnArray(source)) return new ArrayColumnProvider(source);\n // Should not reach here given the type union, but be safe\n throw new Error(\"Unknown ColumnSource type\");\n}\n"],"mappings":";;;;;;;AAmCA,IAAa,sBAAb,MAAmE;CACjE;CAEA,YAAY,SAAsD;AAChE,OAAK,UAAU,QAAQ,KAAK,SAAS;GACnC,IAAI,IAAI;GACR,MAAM,IAAI;GACV,MAAM,EAAE,WAAW,IAAI,MAAM;GAC7B,YAAY,KAAK,UAAU,IAAI,KAAK;GACrC,EAAE;;CAGL,gBAA6C;AAC3C,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;CAGT,UACE,GACkB;AAClB,MAAI,KAAK,KACP,QAAO;AAET,MAAI,OAAO,MAAM,WACf,QAAO,KAAK,UAAU,GAAG,CAAC;AAE5B,MAAI,aAAa,kBAAkB;AACjC,OAAI,EAAE,mBAAmB,CAAE,QAAO;AAClC,OAAI,EAAE,YAAY,CAAE,QAAO;AAC3B,UAAO;;AAET,MAAI,WAAW,EAAE,EAAE;GACjB,IAAI,QAAQ;GACZ,IAAI,QAAQ;AACZ,iBAAc,IAAI,MAAM;AACtB,cAAU,EAAE,mBAAmB;AAC/B,cAAU,EAAE,YAAY;KACxB;AACF,OAAI,MAAO,QAAO;AAClB,OAAI,MAAO,QAAO;AAClB,UAAO;;AAET,SAAO;;;;;;;AAQX,IAAa,yBAAb,MAAsE;CACpE,YAAY,WAAyD;AAAxC,OAAA,YAAA;;CAE7B,gBAA6C;AAC3C,SAAO,KAAK;;CAGd,uBAAgC;AAC9B,SAAO;;;;;;;AAaX,IAAa,uBAAb,MAAoE;CAClE,YACE,UACA,MACA;AAFiB,OAAA,WAAA;AACA,OAAA,OAAA;;CAGnB,gBAA6C;AAC3C,SAAO,KAAK,YAAY;;CAG1B,uBAAgC;AAC9B,SAAO,KAAK,SAAS,iBAAiB;;CAGxC,aAAkD;EAChD,MAAM,WAAW,KAAK,SAAS,aAAa;AAC5C,MAAI,aAAa,KAAA,EAAW,QAAO,EAAE;EAErC,MAAM,UAAU,KAAK,SAAS,YAAY;EAC1C,MAAM,eAAe,KAAK,MAAM,0BAA0B;AAE1D,SAAO,SAAS,KAAK,QAAQ;GAC3B,MAAM,eAAe,IAAI;GACzB,MAAM,UAAU,aAAa,mBAAmB;GAEhD,IAAI;AACJ,OAAI,QACF,cAAa;YACJ,gBAAgB,QACzB,cAAa;OAEb,cAAa;AAGf,UAAO;IACL,IAAI,IAAI;IACR,MAAM,IAAI;IACV;IACA,MAAM,EAAE,WAAY,UAAU,eAAe,KAAA,GAAY;IAC1D;IACD;;;;AAKN,SAAgB,yBAAyB,QAAmD;AAC1F,QACE,OAAO,WAAW,YAClB,WAAW,QACX,mBAAmB,UACnB,0BAA0B,UAC1B,OAAQ,OAAkC,kBAAkB,cAC5D,OAAQ,OAAkC,yBAAyB;;;AAKvE,SAAS,eAAe,QAAwE;AAC9F,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,UAAU,SAAS,EAAE,gBAAgB;;;AAIlF,SAAS,sBAAsB,QAAwD;AACrF,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO;AACnC,KAAI,OAAO,WAAW,EAAG,QAAO;CAChC,MAAM,QAAQ,OAAO;AACrB,QAAO,QAAQ,SAAS,UAAU,SAAS,gBAAgB;;;;;;;;AAS7D,SAAgB,yBAAyB,QAA8C;AACrF,KAAI,yBAAyB,OAAO,CAAE,QAAO;AAC7C,KAAI,sBAAsB,OAAO,CAAE,QAAO,IAAI,uBAAuB,OAAO;AAC5E,KAAI,eAAe,OAAO,CAAE,QAAO,IAAI,oBAAoB,OAAO;AAElE,OAAM,IAAI,MAAM,4BAA4B"}
|
|
@@ -47,10 +47,8 @@ function createPlDataTableV3(ctx, options) {
|
|
|
47
47
|
if (primarySnapshots.length === 0) return void 0;
|
|
48
48
|
const columnIsAvailable = createColumnValidationById([...annotated.direct.map((v) => v.column), ...annotated.linked.flatMap((lc) => [...lc.path.map((s) => s.linker), lc.column])]);
|
|
49
49
|
const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);
|
|
50
|
-
const filters = concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters);
|
|
51
|
-
|
|
52
|
-
const sorting = resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered));
|
|
53
|
-
validateSorting(sorting, columnIsAvailable);
|
|
50
|
+
const filters = filterFilters(concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters), columnIsAvailable);
|
|
51
|
+
const sorting = filterSorting(resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)), columnIsAvailable);
|
|
54
52
|
const primaryEntries = primarySnapshots.map((v) => ({ column: resolveSnapshot(v.column) }));
|
|
55
53
|
const fullDef = require_createPTableDefV3.createPTableDefV3({
|
|
56
54
|
primaryJoinType,
|
|
@@ -110,8 +108,8 @@ function annotateColumnGroups(params) {
|
|
|
110
108
|
const visibilityByColId = require_utils.evaluateRules(displayOptions?.visibility ?? [], allColumnsForRules, pframeSpec);
|
|
111
109
|
const orderByColId = require_utils.evaluateRules(displayOptions?.ordering ?? [], allColumnsForRules, pframeSpec);
|
|
112
110
|
return {
|
|
113
|
-
direct: liftToVariantColumns(direct, (0, es_toolkit.flow)((cols) => require_utils.withLabelAnnotations(derivedLabels, cols), (cols) => require_utils.withInfoAnnotations(derivedTooltips, cols), (cols) => require_utils.withTableVisualAnnotations(visibilityByColId, orderByColId, cols))),
|
|
114
|
-
linked: liftToVariantColumns(linked, (0, es_toolkit.flow)((cols) => require_utils.withHidenAxesAnnotations(cols), (cols) => require_utils.withLabelAnnotations(derivedLabels, cols), (cols) => require_utils.withInfoAnnotations(derivedTooltips, cols), (cols) => require_utils.withTableVisualAnnotations(visibilityByColId, orderByColId, cols))).map((lc) => ({
|
|
111
|
+
direct: liftToVariantColumns(direct, (0, es_toolkit.flow)((cols) => require_utils.withDataStatusAnnotations(cols), (cols) => require_utils.withLabelAnnotations(derivedLabels, cols), (cols) => require_utils.withInfoAnnotations(derivedTooltips, cols), (cols) => require_utils.withTableVisualAnnotations(visibilityByColId, orderByColId, cols))),
|
|
112
|
+
linked: liftToVariantColumns(linked, (0, es_toolkit.flow)((cols) => require_utils.withDataStatusAnnotations(cols), (cols) => require_utils.withHidenAxesAnnotations(cols), (cols) => require_utils.withLabelAnnotations(derivedLabels, cols), (cols) => require_utils.withInfoAnnotations(derivedTooltips, cols), (cols) => require_utils.withTableVisualAnnotations(visibilityByColId, orderByColId, cols))).map((lc) => ({
|
|
115
113
|
...lc,
|
|
116
114
|
path: annotateLinkerPath(derivedLabels, lc.path)
|
|
117
115
|
}))
|
|
@@ -148,11 +146,33 @@ function createColumnValidationById(fullColumns) {
|
|
|
148
146
|
return validIdSet.has(id);
|
|
149
147
|
};
|
|
150
148
|
}
|
|
151
|
-
/**
|
|
152
|
-
function
|
|
153
|
-
if (
|
|
154
|
-
const
|
|
155
|
-
|
|
149
|
+
/** Drop filter leaves whose column references are not available in the table. */
|
|
150
|
+
function filterFilters(filters, isValidColumnId) {
|
|
151
|
+
if ((0, _milaboratories_helpers.isNil)(filters)) return filters;
|
|
152
|
+
const isLeafValid = (leaf) => {
|
|
153
|
+
if (leaf.type === void 0) return true;
|
|
154
|
+
if ("column" in leaf && !isValidColumnId(leaf.column)) return false;
|
|
155
|
+
if ("rhs" in leaf && !isValidColumnId(leaf.rhs)) return false;
|
|
156
|
+
return true;
|
|
157
|
+
};
|
|
158
|
+
const prune = (node) => {
|
|
159
|
+
if (node.type === "and" || node.type === "or") {
|
|
160
|
+
const kept = node.filters.map((f) => prune(f)).filter((f) => !(0, _milaboratories_helpers.isNil)(f));
|
|
161
|
+
return {
|
|
162
|
+
type: node.type,
|
|
163
|
+
filters: kept
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (node.type === "not") {
|
|
167
|
+
const inner = prune(node.filter);
|
|
168
|
+
return (0, _milaboratories_helpers.isNil)(inner) ? void 0 : {
|
|
169
|
+
type: "not",
|
|
170
|
+
filter: inner
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return isLeafValid(node) ? node : void 0;
|
|
174
|
+
};
|
|
175
|
+
return prune(filters);
|
|
156
176
|
}
|
|
157
177
|
/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */
|
|
158
178
|
function concatFilters(a, b) {
|
|
@@ -167,10 +187,9 @@ function concatFilters(a, b) {
|
|
|
167
187
|
function resolveSorting(userSorting, defaultSorting) {
|
|
168
188
|
return ((0, es_toolkit_compat.isEmpty)(userSorting) ? defaultSorting : userSorting) ?? [];
|
|
169
189
|
}
|
|
170
|
-
/**
|
|
171
|
-
function
|
|
172
|
-
|
|
173
|
-
if (firstInvalid !== void 0) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`);
|
|
190
|
+
/** Drop sorting entries whose column is not available in the table. */
|
|
191
|
+
function filterSorting(sorting, isValidColumnId) {
|
|
192
|
+
return sorting.filter((s) => isValidColumnId((0, _milaboratories_pl_model_common.canonicalizeJson)(s.column)));
|
|
174
193
|
}
|
|
175
194
|
function buildSecondaryGroups(direct, linked) {
|
|
176
195
|
return [...direct.map((c) => ({
|
|
@@ -221,17 +240,18 @@ function resolveSnapshot(snap) {
|
|
|
221
240
|
}
|
|
222
241
|
/** Remap column references in sorting entries. */
|
|
223
242
|
function remapSortingColumnIds(sorting, columns) {
|
|
224
|
-
return sorting?.
|
|
225
|
-
if (s.column.type === "axis") return s;
|
|
243
|
+
return sorting?.flatMap((s) => {
|
|
244
|
+
if (s.column.type === "axis") return [s];
|
|
226
245
|
const id = s.column.id;
|
|
227
|
-
const column = columns.find((c) => (c.originalId ?? c.column.id) === id)
|
|
228
|
-
return
|
|
246
|
+
const column = columns.find((c) => (c.originalId ?? c.column.id) === id);
|
|
247
|
+
if (column === void 0) return [];
|
|
248
|
+
return [{
|
|
229
249
|
...s,
|
|
230
250
|
column: {
|
|
231
251
|
type: "column",
|
|
232
252
|
id: column.column.id
|
|
233
253
|
}
|
|
234
|
-
};
|
|
254
|
+
}];
|
|
235
255
|
});
|
|
236
256
|
}
|
|
237
257
|
/** Remap column references in a filter tree. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPlDataTableV3.cjs","names":["upgradePlDataTableStateV2","discoverTableColumnSnaphots","deriveAllLabels","deriveAllTooltips","createPTableDefV3","evaluateRules","withLabelAnnotations","withInfoAnnotations","withTableVisualAnnotations","withHidenAxesAnnotations","getAxisId","collectFilterSpecColumns","isColumnHidden","isColumnOptional","traverseFilterSpec"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n FilterSpecNode,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableSorting,\n PColumnSpec,\n MultiColumnSelector,\n PFrameSpecDriver,\n DiscoveredPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, getAxisId, parseJson, uniqueBy } from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSelector, ColumnSnapshot, ColumnVariant, MatchingMode } from \"../../../columns\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n deriveAllTooltips,\n evaluateRules,\n isColumnHidden,\n isColumnOptional,\n withHidenAxesAnnotations,\n withLabelAnnotations,\n withTableVisualAnnotations,\n withInfoAnnotations,\n} from \"./utils\";\nimport type { PrimaryEntry, SecondaryGroup } from \"./createPTableDefV3\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport { discoverTableColumnSnaphots, type DiscoverTableColumnOptions } from \"./discoverColumns\";\nimport { isNil, isPlainObject, throwError, type Nil } from \"@milaboratories/helpers\";\nimport { flow } from \"es-toolkit\";\n\nexport type createPlDataTableOptionsV3 = {\n tableState?: PlDataTableStateV2;\n\n columns: Nil | DiscoverTableColumnOptions | TableColumnVariant[];\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher | ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher | ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\n// Main Function\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const pframeSpec = ctx.getService(\"pframeSpec\");\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered = isPlainObject(options.columns)\n ? discoverTableColumnSnaphots(ctx, options.columns)\n : options.columns;\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const derivedTooltips = deriveAllTooltips({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n originalId: dc.originalId,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n });\n\n const annotated = annotateColumnGroups({\n pframeSpec,\n ...splited,\n derivedLabels,\n derivedTooltips,\n displayOptions: options.displayOptions,\n });\n\n const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);\n const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);\n\n if (primarySnapshots.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct.map((v) => v.column),\n ...annotated.linked.flatMap((lc) => [...lc.path.map((s) => s.linker), lc.column]),\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n );\n validateFilters(filters, columnIsAvailable);\n\n const sorting = resolveSorting(\n state.pTableParams.sorting,\n remapSortingColumnIds(options.sorting, discovered),\n );\n validateSorting(sorting, columnIsAvailable);\n\n const primaryEntries: PrimaryEntry<undefined | PColumnDataUniversal>[] = primarySnapshots.map(\n (v) => ({ column: resolveSnapshot(v.column) }),\n );\n const secondaryGroups: SecondaryGroup<undefined | PColumnDataUniversal>[] = buildSecondaryGroups(\n secondarySnapshots,\n annotated.linked,\n );\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: secondaryGroups,\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct.map((v) => resolveSnapshot(v.column)),\n ...annotated.linked.map((v) => resolveSnapshot(v.column)),\n ...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked].map((v) => v.column),\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds);\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(\n visible.direct.filter((c) => !c.isPrimary),\n visible.linked,\n ),\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\nexport type TableColumnVariant = ColumnVariant<DiscoveredPColumnId> & {\n readonly originalId: PObjectId;\n readonly isPrimary?: boolean;\n};\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(columns: TableColumnVariant[]): SplitDiscoveredColumns {\n const direct = columns.filter((dc) => dc.path.length === 0);\n const linked = columns.filter((dc) => dc.path.length > 0);\n return { direct, linked };\n}\n\n/** All linker snapshots across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: TableColumnVariant[]): ColumnSnapshot<PObjectId>[] {\n return uniqueBy(\n linked.flatMap((lc) => lc.path.map((s) => s.linker)),\n (c) => c.id,\n );\n}\n\n/**\n * Annotate all column groups with derived labels and display-rule annotations.\n * Evaluates `displayOptions` rules against all discovered columns (direct,\n * linked, labels, linkers) and writes the winning visibility/priority into\n * column annotations via `withTableVisualAnnotations`.\n */\nfunction annotateColumnGroups(params: {\n direct: TableColumnVariant[];\n linked: TableColumnVariant[];\n derivedLabels: Record<string, string>;\n derivedTooltips: Record<string, string>;\n displayOptions?: ColumnsDisplayOptions;\n pframeSpec: PFrameSpecDriver;\n}): AnnotatedColumnGroups {\n const { direct, linked, derivedLabels, derivedTooltips, displayOptions, pframeSpec } = params;\n\n const allColumnsForRules = [\n ...direct.map((v) => v.column),\n ...linked.map((v) => v.column),\n ...collectLinkerSnapshots(linked),\n ];\n const visibilityByColId = evaluateRules(\n displayOptions?.visibility ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n const orderByColId = evaluateRules(\n displayOptions?.ordering ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n\n const directAnnotated = liftToVariantColumns(\n direct,\n flow(\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n );\n\n const linkedAnnotated = liftToVariantColumns(\n linked,\n flow(\n (cols) => withHidenAxesAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n ).map((lc) => ({ ...lc, path: annotateLinkerPath(derivedLabels, lc.path) }));\n\n return {\n direct: directAnnotated,\n linked: linkedAnnotated,\n };\n}\n\n/** Lift a snapshot-array transform so it runs on the inner `column` of each variant. */\nfunction liftToVariantColumns<V extends { readonly column: ColumnSnapshot<DiscoveredPColumnId> }>(\n variants: V[],\n fn: (cols: ColumnSnapshot<DiscoveredPColumnId>[]) => ColumnSnapshot<DiscoveredPColumnId>[],\n): V[] {\n const cols = fn(variants.map((v) => v.column));\n if (cols.length !== variants.length)\n throw new Error(\n `liftToVariantColumns: fn must preserve array length (got ${cols.length}, expected ${variants.length})`,\n );\n return variants.map((v, i) => ({ ...v, column: cols[i] }));\n}\n\nfunction annotateLinkerPath(\n derivedLabels: Record<string, string>,\n path: TableColumnVariant[\"path\"],\n): TableColumnVariant[\"path\"] {\n if (path.length === 0) return path;\n const annotatedLinkers = withHidenAxesAnnotations(\n withLabelAnnotations(\n derivedLabels,\n path.map((s) => s.linker),\n ),\n );\n return path.map((s, i) => ({ ...s, linker: annotatedLinkers[i] }));\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(\n fullColumns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Validate that all column references in filters exist in the table. */\nfunction validateFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): void {\n if (filters == null) return;\n const filterColumns = collectFilterSpecColumns(filters);\n const firstInvalid = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid filter column ${firstInvalid}: column reference does not match the table columns`,\n );\n }\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Validate that all column references in sorting exist in the table. */\nfunction validateSorting(sorting: PTableSorting[], isValidColumnId: (id: string) => boolean): void {\n const firstInvalid = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`,\n );\n }\n}\n\nfunction buildSecondaryGroups(\n direct: TableColumnVariant[],\n linked: TableColumnVariant[],\n): SecondaryGroup<undefined | PColumnDataUniversal>[] {\n return [\n ...direct.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [{ column: resolveSnapshot(c.column), qualifications: c.qualifications.forHit }],\n primaryQualifications: c.qualifications.forQueries,\n }),\n ),\n ...linked.map(\n (lc): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [\n ...lc.path.map((s) => ({\n column: resolveSnapshot(s.linker),\n })),\n { column: resolveSnapshot(lc.column), qualifications: lc.qualifications.forHit },\n ],\n primaryQualifications: lc.qualifications.forQueries,\n }),\n ),\n ];\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.column.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.column.id));\n return { direct, linked };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnVariant[],\n): Nil | PTableSorting[] {\n return sorting?.map((s) => {\n if (s.column.type === \"axis\") return s; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column =\n columns.find((c) => (c.originalId ?? c.column.id) === id) ??\n throwError(`Column ID \"${id}\" in sorting does not match any discovered column`);\n\n return {\n ...s,\n column: {\n type: \"column\",\n id: column.column.id,\n },\n };\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnVariant[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (c.originalId ?? c.column.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createPlDataTableV3.cjs","names":["upgradePlDataTableStateV2","discoverTableColumnSnaphots","deriveAllLabels","deriveAllTooltips","createPTableDefV3","evaluateRules","withDataStatusAnnotations","withLabelAnnotations","withInfoAnnotations","withTableVisualAnnotations","withHidenAxesAnnotations","getAxisId","isColumnHidden","isColumnOptional","collectFilterSpecColumns","traverseFilterSpec"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n FilterSpecNode,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableSorting,\n PColumnSpec,\n MultiColumnSelector,\n PFrameSpecDriver,\n DiscoveredPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, getAxisId, parseJson, uniqueBy } from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSelector, ColumnSnapshot, ColumnVariant, MatchingMode } from \"../../../columns\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n deriveAllTooltips,\n evaluateRules,\n isColumnHidden,\n isColumnOptional,\n withHidenAxesAnnotations,\n withLabelAnnotations,\n withTableVisualAnnotations,\n withInfoAnnotations,\n withDataStatusAnnotations,\n} from \"./utils\";\nimport type { PrimaryEntry, SecondaryGroup } from \"./createPTableDefV3\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport { discoverTableColumnSnaphots, type DiscoverTableColumnOptions } from \"./discoverColumns\";\nimport { isNil, isPlainObject, throwError, type Nil } from \"@milaboratories/helpers\";\nimport { flow } from \"es-toolkit\";\n\nexport type createPlDataTableOptionsV3 = {\n tableState?: PlDataTableStateV2;\n\n columns: Nil | DiscoverTableColumnOptions | TableColumnVariant[];\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher | ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher | ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const pframeSpec = ctx.getService(\"pframeSpec\");\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered = isPlainObject(options.columns)\n ? discoverTableColumnSnaphots(ctx, options.columns)\n : options.columns;\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const derivedTooltips = deriveAllTooltips({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n originalId: dc.originalId,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n });\n\n const annotated = annotateColumnGroups({\n pframeSpec,\n ...splited,\n derivedLabels,\n derivedTooltips,\n displayOptions: options.displayOptions,\n });\n\n const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);\n const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);\n\n if (primarySnapshots.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct.map((v) => v.column),\n ...annotated.linked.flatMap((lc) => [...lc.path.map((s) => s.linker), lc.column]),\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = filterFilters(\n concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n ),\n columnIsAvailable,\n );\n\n const sorting = filterSorting(\n resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)),\n columnIsAvailable,\n );\n\n const primaryEntries: PrimaryEntry<undefined | PColumnDataUniversal>[] = primarySnapshots.map(\n (v) => ({ column: resolveSnapshot(v.column) }),\n );\n const secondaryGroups: SecondaryGroup<undefined | PColumnDataUniversal>[] = buildSecondaryGroups(\n secondarySnapshots,\n annotated.linked,\n );\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: secondaryGroups,\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct.map((v) => resolveSnapshot(v.column)),\n ...annotated.linked.map((v) => resolveSnapshot(v.column)),\n ...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked].map((v) => v.column),\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds);\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(\n visible.direct.filter((c) => !c.isPrimary),\n visible.linked,\n ),\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\nexport type TableColumnVariant = ColumnVariant<DiscoveredPColumnId> & {\n readonly originalId: PObjectId;\n readonly isPrimary?: boolean;\n};\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(columns: TableColumnVariant[]): SplitDiscoveredColumns {\n const direct = columns.filter((dc) => dc.path.length === 0);\n const linked = columns.filter((dc) => dc.path.length > 0);\n return { direct, linked };\n}\n\n/** All linker snapshots across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: TableColumnVariant[]): ColumnSnapshot<PObjectId>[] {\n return uniqueBy(\n linked.flatMap((lc) => lc.path.map((s) => s.linker)),\n (c) => c.id,\n );\n}\n\n/**\n * Annotate all column groups with derived labels and display-rule annotations.\n * Evaluates `displayOptions` rules against all discovered columns (direct,\n * linked, labels, linkers) and writes the winning visibility/priority into\n * column annotations via `withTableVisualAnnotations`.\n */\nfunction annotateColumnGroups(params: {\n direct: TableColumnVariant[];\n linked: TableColumnVariant[];\n derivedLabels: Record<string, string>;\n derivedTooltips: Record<string, string>;\n displayOptions?: ColumnsDisplayOptions;\n pframeSpec: PFrameSpecDriver;\n}): AnnotatedColumnGroups {\n const { direct, linked, derivedLabels, derivedTooltips, displayOptions, pframeSpec } = params;\n\n const allColumnsForRules = [\n ...direct.map((v) => v.column),\n ...linked.map((v) => v.column),\n ...collectLinkerSnapshots(linked),\n ];\n const visibilityByColId = evaluateRules(\n displayOptions?.visibility ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n const orderByColId = evaluateRules(\n displayOptions?.ordering ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n\n const directAnnotated = liftToVariantColumns(\n direct,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n );\n\n const linkedAnnotated = liftToVariantColumns(\n linked,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withHidenAxesAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n ).map((lc) => ({ ...lc, path: annotateLinkerPath(derivedLabels, lc.path) }));\n\n return {\n direct: directAnnotated,\n linked: linkedAnnotated,\n };\n}\n\n/** Lift a snapshot-array transform so it runs on the inner `column` of each variant. */\nfunction liftToVariantColumns<V extends { readonly column: ColumnSnapshot<DiscoveredPColumnId> }>(\n variants: V[],\n fn: (cols: ColumnSnapshot<DiscoveredPColumnId>[]) => ColumnSnapshot<DiscoveredPColumnId>[],\n): V[] {\n const cols = fn(variants.map((v) => v.column));\n if (cols.length !== variants.length)\n throw new Error(\n `liftToVariantColumns: fn must preserve array length (got ${cols.length}, expected ${variants.length})`,\n );\n return variants.map((v, i) => ({ ...v, column: cols[i] }));\n}\n\nfunction annotateLinkerPath(\n derivedLabels: Record<string, string>,\n path: TableColumnVariant[\"path\"],\n): TableColumnVariant[\"path\"] {\n if (path.length === 0) return path;\n const annotatedLinkers = withHidenAxesAnnotations(\n withLabelAnnotations(\n derivedLabels,\n path.map((s) => s.linker),\n ),\n );\n return path.map((s, i) => ({ ...s, linker: annotatedLinkers[i] }));\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(\n fullColumns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Drop filter leaves whose column references are not available in the table. */\nfunction filterFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const isLeafValid = (leaf: PlDataTableFilterSpecLeaf): boolean => {\n if (leaf.type === undefined) return true;\n if (\"column\" in leaf && !isValidColumnId(leaf.column)) return false;\n if (\"rhs\" in leaf && !isValidColumnId(leaf.rhs)) return false;\n return true;\n };\n\n const prune = (node: PlDataTableFilterNode): Nil | PlDataTableFilterNode => {\n if (node.type === \"and\" || node.type === \"or\") {\n const kept = node.filters\n .map((f) => prune(f))\n .filter((f): f is PlDataTableFilterNode => !isNil(f));\n return { type: node.type, filters: kept };\n }\n if (node.type === \"not\") {\n const inner = prune(node.filter);\n return isNil(inner) ? undefined : { type: \"not\", filter: inner };\n }\n return isLeafValid(node) ? node : undefined;\n };\n\n return prune(filters) as Nil | PlDataTableFilters;\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Drop sorting entries whose column is not available in the table. */\nfunction filterSorting(\n sorting: PTableSorting[],\n isValidColumnId: (id: string) => boolean,\n): PTableSorting[] {\n return sorting.filter((s) => isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)));\n}\n\nfunction buildSecondaryGroups(\n direct: TableColumnVariant[],\n linked: TableColumnVariant[],\n): SecondaryGroup<undefined | PColumnDataUniversal>[] {\n return [\n ...direct.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [{ column: resolveSnapshot(c.column), qualifications: c.qualifications.forHit }],\n primaryQualifications: c.qualifications.forQueries,\n }),\n ),\n ...linked.map(\n (lc): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [\n ...lc.path.map((s) => ({\n column: resolveSnapshot(s.linker),\n })),\n { column: resolveSnapshot(lc.column), qualifications: lc.qualifications.forHit },\n ],\n primaryQualifications: lc.qualifications.forQueries,\n }),\n ),\n ];\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.column.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.column.id));\n return { direct, linked };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnVariant[],\n): Nil | PTableSorting[] {\n return sorting?.flatMap((s) => {\n if (s.column.type === \"axis\") return [s]; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column = columns.find((c) => (c.originalId ?? c.column.id) === id);\n if (column === undefined) return [];\n\n return [\n {\n ...s,\n column: {\n type: \"column\" as const,\n id: column.column.id,\n },\n },\n ];\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnVariant[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (c.originalId ?? c.column.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":";;;;;;;;;;;AAkFA,SAAgB,oBACd,KACA,SAC8B;CAC9B,MAAM,aAAa,IAAI,WAAW,aAAa;CAC/C,MAAM,QAAQA,wBAAAA,0BAA0B,QAAQ,WAAW;CAC3D,MAAM,kBAAkB,QAAQ,mBAAmB;CAEnD,MAAM,cAAA,GAAA,wBAAA,eAA2B,QAAQ,QAAQ,GAC7CC,wBAAAA,4BAA4B,KAAK,QAAQ,QAAQ,GACjD,QAAQ;AACZ,MAAA,GAAA,wBAAA,OAAU,WAAW,IAAI,WAAW,WAAW,EAAG,QAAO,KAAA;CAEzD,MAAM,UAAU,uBAAuB,WAAW;CAElD,MAAM,gBAAgBC,cAAAA,gBAAgB;EACpC,SAAS,WAAW,KAAK,QAAQ;GAC/B,IAAI,GAAG,OAAO;GACd,MAAM,GAAG,OAAO;GAChB,YAAY,GAAG;GACf,gBAAgB,GAAG;GACpB,EAAE;EACH,qBAAqB;GACnB,oBAAoB;GACpB,GAAG,QAAQ;GACZ;EACF,CAAC;CAEF,MAAM,kBAAkBC,cAAAA,kBAAkB,EACxC,SAAS,WAAW,KAAK,QAAQ;EAC/B,IAAI,GAAG,OAAO;EACd,YAAY,GAAG;EACf,MAAM,GAAG,OAAO;EAChB,YAAY,GAAG;EACf,gBAAgB,GAAG;EACpB,EAAE,EACJ,CAAC;CAEF,MAAM,YAAY,qBAAqB;EACrC;EACA,GAAG;EACH;EACA;EACA,gBAAgB,QAAQ;EACzB,CAAC;CAEF,MAAM,mBAAmB,UAAU,OAAO,QAAQ,MAAM,EAAE,UAAU;CACpE,MAAM,qBAAqB,UAAU,OAAO,QAAQ,MAAM,CAAC,EAAE,UAAU;AAEvE,KAAI,iBAAiB,WAAW,EAAG,QAAO,KAAA;CAE1C,MAAM,oBAAoB,2BAA2B,CACnD,GAAG,UAAU,OAAO,KAAK,MAAM,EAAE,OAAO,EACxC,GAAG,UAAU,OAAO,SAAS,OAAO,CAAC,GAAG,GAAG,KAAK,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAClF,CAAC;CAEF,MAAM,wBAAwB,qBAAqB,QAAQ,SAAS,WAAW;CAC/E,MAAM,UAAU,cACd,cACE,MAAM,aAAa,SACnB,MAAM,aAAa,kBAAkB,sBACtC,EACD,kBACD;CAED,MAAM,UAAU,cACd,eAAe,MAAM,aAAa,SAAS,sBAAsB,QAAQ,SAAS,WAAW,CAAC,EAC9F,kBACD;CAED,MAAM,iBAAmE,iBAAiB,KACvF,OAAO,EAAE,QAAQ,gBAAgB,EAAE,OAAO,EAAE,EAC9C;CAKD,MAAM,UAAUC,0BAAAA,kBAAkB;EAChC;EACA,SAAS;EACT,WAP0E,qBAC1E,oBACA,UAAU,OACX;EAKC;EACA;EACD,CAAC;CAEF,MAAM,aAAa,IAAI,eAAe,QAAQ;CAG9C,MAAM,eAAe,IAAI,aAAa;EACpC,GAAG,UAAU,OAAO,KAAK,MAAM,gBAAgB,EAAE,OAAO,CAAC;EACzD,GAAG,UAAU,OAAO,KAAK,MAAM,gBAAgB,EAAE,OAAO,CAAC;EACzD,GAAG,uBAAuB,UAAU,OAAO,CAAC,IAAI,gBAAgB;EACjE,CAAC;CAEF,MAAM,cAAc,MAAM,aAAa;CAQvC,MAAM,UAAU,oBAAoB,WAPZ,qBACtB,CAAC,GAAG,UAAU,QAAQ,GAAG,UAAU,OAAO,CAAC,KAAK,MAAM,EAAE,OAAO,EAC/D,SACA,SACA,YACD,CAE8D;CAC/D,MAAM,aAAaA,0BAAAA,kBAAkB;EACnC;EACA,SAAS;EACT,WAAW,qBACT,QAAQ,OAAO,QAAQ,MAAM,CAAC,EAAE,UAAU,EAC1C,QAAQ,OACT;EACD;EACA;EACD,CAAC;CACF,MAAM,gBAAgB,IAAI,eAAe,WAAW;AAEpD,QAAO;EACL,UAAU,MAAM,aAAa;EAC7B,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;EACpB,gBAAgB;EACjB;;;AAwBH,SAAS,uBAAuB,SAAuD;AAGrF,QAAO;EAAE,QAFM,QAAQ,QAAQ,OAAO,GAAG,KAAK,WAAW,EAAE;EAE1C,QADF,QAAQ,QAAQ,OAAO,GAAG,KAAK,SAAS,EAAE;EAChC;;;AAI3B,SAAS,uBAAuB,QAA2D;AACzF,SAAA,GAAA,gCAAA,UACE,OAAO,SAAS,OAAO,GAAG,KAAK,KAAK,MAAM,EAAE,OAAO,CAAC,GACnD,MAAM,EAAE,GACV;;;;;;;;AASH,SAAS,qBAAqB,QAOJ;CACxB,MAAM,EAAE,QAAQ,QAAQ,eAAe,iBAAiB,gBAAgB,eAAe;CAEvF,MAAM,qBAAqB;EACzB,GAAG,OAAO,KAAK,MAAM,EAAE,OAAO;EAC9B,GAAG,OAAO,KAAK,MAAM,EAAE,OAAO;EAC9B,GAAG,uBAAuB,OAAO;EAClC;CACD,MAAM,oBAAoBC,cAAAA,cACxB,gBAAgB,cAAc,EAAE,EAChC,oBACA,WACD;CACD,MAAM,eAAeA,cAAAA,cACnB,gBAAgB,YAAY,EAAE,EAC9B,oBACA,WACD;AAuBD,QAAO;EACL,QAtBsB,qBACtB,SAAA,GAAA,WAAA,OAEG,SAASC,cAAAA,0BAA0B,KAAK,GACxC,SAASC,cAAAA,qBAAqB,eAAe,KAAK,GAClD,SAASC,cAAAA,oBAAoB,iBAAiB,KAAK,GACnD,SAASC,cAAAA,2BAA2B,mBAAmB,cAAc,KAAK,CAC5E,CACF;EAeC,QAbsB,qBACtB,SAAA,GAAA,WAAA,OAEG,SAASH,cAAAA,0BAA0B,KAAK,GACxC,SAASI,cAAAA,yBAAyB,KAAK,GACvC,SAASH,cAAAA,qBAAqB,eAAe,KAAK,GAClD,SAASC,cAAAA,oBAAoB,iBAAiB,KAAK,GACnD,SAASC,cAAAA,2BAA2B,mBAAmB,cAAc,KAAK,CAC5E,CACF,CAAC,KAAK,QAAQ;GAAE,GAAG;GAAI,MAAM,mBAAmB,eAAe,GAAG,KAAK;GAAE,EAAE;EAK3E;;;AAIH,SAAS,qBACP,UACA,IACK;CACL,MAAM,OAAO,GAAG,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC;AAC9C,KAAI,KAAK,WAAW,SAAS,OAC3B,OAAM,IAAI,MACR,4DAA4D,KAAK,OAAO,aAAa,SAAS,OAAO,GACtG;AACH,QAAO,SAAS,KAAK,GAAG,OAAO;EAAE,GAAG;EAAG,QAAQ,KAAK;EAAI,EAAE;;AAG5D,SAAS,mBACP,eACA,MAC4B;AAC5B,KAAI,KAAK,WAAW,EAAG,QAAO;CAC9B,MAAM,mBAAmBC,cAAAA,yBACvBH,cAAAA,qBACE,eACA,KAAK,KAAK,MAAM,EAAE,OAAO,CAC1B,CACF;AACD,QAAO,KAAK,KAAK,GAAG,OAAO;EAAE,GAAG;EAAG,QAAQ,iBAAiB;EAAI,EAAE;;;AAIpE,SAAS,2BACP,aACA;CAMA,MAAM,SAA2B,CAC/B,IAAA,GAAA,gCAAA,UALA,YAAY,SAAS,MAAM,EAAE,KAAK,SAAS,IAAII,gCAAAA,UAAU,CAAC,GACzD,OAAA,GAAA,gCAAA,kBAA+B,EAAE,CACnC,CAGY,KAAK,OAAO;EAAE,MAAM;EAAQ,IAAI;EAAG,EAA+B,EAC7E,GAAG,YAAY,KAAK,OAAO;EAAE,MAAM;EAAU,IAAI,EAAE;EAAI,EAAiC,CACzF;CAED,MAAM,aAAa,IAAI,IAAI,OAAO,KAAK,OAAA,GAAA,gCAAA,kBAAuC,EAAE,CAAC,CAAC;AAElF,SAAQ,OAAwB;AAC9B,SAAO,WAAW,IAAI,GAAwC;;;;AAKlE,SAAS,cACP,SACA,iBAC0B;AAC1B,MAAA,GAAA,wBAAA,OAAU,QAAQ,CAAE,QAAO;CAE3B,MAAM,eAAe,SAA6C;AAChE,MAAI,KAAK,SAAS,KAAA,EAAW,QAAO;AACpC,MAAI,YAAY,QAAQ,CAAC,gBAAgB,KAAK,OAAO,CAAE,QAAO;AAC9D,MAAI,SAAS,QAAQ,CAAC,gBAAgB,KAAK,IAAI,CAAE,QAAO;AACxD,SAAO;;CAGT,MAAM,SAAS,SAA6D;AAC1E,MAAI,KAAK,SAAS,SAAS,KAAK,SAAS,MAAM;GAC7C,MAAM,OAAO,KAAK,QACf,KAAK,MAAM,MAAM,EAAE,CAAC,CACpB,QAAQ,MAAkC,EAAA,GAAA,wBAAA,OAAO,EAAE,CAAC;AACvD,UAAO;IAAE,MAAM,KAAK;IAAM,SAAS;IAAM;;AAE3C,MAAI,KAAK,SAAS,OAAO;GACvB,MAAM,QAAQ,MAAM,KAAK,OAAO;AAChC,WAAA,GAAA,wBAAA,OAAa,MAAM,GAAG,KAAA,IAAY;IAAE,MAAM;IAAO,QAAQ;IAAO;;AAElE,SAAO,YAAY,KAAK,GAAG,OAAO,KAAA;;AAGpC,QAAO,MAAM,QAAQ;;;AAIvB,SAAS,cACP,GACA,GAC0B;AAC1B,MAAA,GAAA,wBAAA,OAAU,EAAE,CAAE,QAAO;AACrB,MAAA,GAAA,wBAAA,OAAU,EAAE,CAAE,QAAO;AACrB,QAAO;EAAE,GAAG;EAAG,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;EAAE;;;AAIxD,SAAS,eACP,aACA,gBACiB;AACjB,UAAA,GAAA,kBAAA,SAAgB,YAAY,GAAG,iBAAiB,gBAAgB,EAAE;;;AAIpE,SAAS,cACP,SACA,iBACiB;AACjB,QAAO,QAAQ,QAAQ,MAAM,iBAAA,GAAA,gCAAA,kBAAiD,EAAE,OAAO,CAAC,CAAC;;AAG3F,SAAS,qBACP,QACA,QACoD;AACpD,QAAO,CACL,GAAG,OAAO,KACP,OAAyD;EACxD,SAAS,CAAC;GAAE,QAAQ,gBAAgB,EAAE,OAAO;GAAE,gBAAgB,EAAE,eAAe;GAAQ,CAAC;EACzF,uBAAuB,EAAE,eAAe;EACzC,EACF,EACD,GAAG,OAAO,KACP,QAA0D;EACzD,SAAS,CACP,GAAG,GAAG,KAAK,KAAK,OAAO,EACrB,QAAQ,gBAAgB,EAAE,OAAO,EAClC,EAAE,EACH;GAAE,QAAQ,gBAAgB,GAAG,OAAO;GAAE,gBAAgB,GAAG,eAAe;GAAQ,CACjF;EACD,uBAAuB,GAAG,eAAe;EAC1C,EACF,CACF;;;AAIH,SAAS,qBACP,SACA,SACA,SACA,aACgB;CAChB,MAAM,eAAe,QAAQ,QAAQ,MAAMC,cAAAA,eAAe,EAAE,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG;CACnF,MAAM,iBAAiB,EAAA,GAAA,wBAAA,OAAO,YAAY,GACtC,YAAY,QAAQ,MAAiC,EAAE,SAAS,SAAS,CAAC,KAAK,MAAM,EAAE,GAAG,GAC1F,QAAQ,QAAQ,MAAMC,cAAAA,iBAAiB,EAAE,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG;CACpE,MAAM,UAAU,CAAC,GAAG,cAAc,GAAG,eAAe;CACpD,MAAM,YAAY,0BAA0B,SAAS,QAAQ;AAE7D,QAAO,IAAI,IAAI,QAAQ,QAAQ,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;;;AAI5D,SAAS,0BACP,SACA,SACgB;CAChB,MAAM,aAAa,WAAW,EAAE,EAC7B,KAAK,MAAM,EAAE,OAAO,CACpB,QAAQ,MAAiC,EAAE,SAAS,SAAS,CAC7D,KAAK,MAAM,EAAE,GAAG;CAEnB,MAAM,YAAY,EAAA,GAAA,wBAAA,OAAO,QAAQ,GAC7BC,iBAAAA,yBAAyB,QAAQ,CAAC,SAAS,MAAM;EAC/C,MAAM,OAAA,GAAA,gCAAA,WAAgB,EAAE;AACxB,SAAO,IAAI,SAAS,WAAW,CAAC,IAAI,GAAG,GAAG,EAAE;GAC5C,GACF,EAAE;AAEN,QAAO,IAAI,IAAe,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC;;;AAIzD,SAAS,oBACP,WACA,eACgB;AAGhB,QAAO;EAAE,QAFM,UAAU,OAAO,QAAQ,MAAM,CAAC,cAAc,IAAI,EAAE,OAAO,GAAG,CAAC;EAE7D,QADF,UAAU,OAAO,QAAQ,MAAM,CAAC,cAAc,IAAI,EAAE,OAAO,GAAG,CAAC;EACrD;;;AAI3B,SAAS,gBACP,MAC2C;AAC3C,QAAO;EAAE,IAAI,KAAK;EAAI,MAAM,KAAK;EAAM,MAAM,KAAK,MAAM,KAAK;EAAE;;;AAIjE,SAAS,sBACP,SACA,SACuB;AACvB,QAAO,SAAS,SAAS,MAAM;AAC7B,MAAI,EAAE,OAAO,SAAS,OAAQ,QAAO,CAAC,EAAE;EAExC,MAAM,KAAK,EAAE,OAAO;EACpB,MAAM,SAAS,QAAQ,MAAM,OAAO,EAAE,cAAc,EAAE,OAAO,QAAQ,GAAG;AACxE,MAAI,WAAW,KAAA,EAAW,QAAO,EAAE;AAEnC,SAAO,CACL;GACE,GAAG;GACH,QAAQ;IACN,MAAM;IACN,IAAI,OAAO,OAAO;IACnB;GACF,CACF;GACD;;;AAMJ,SAAS,qBACP,SACA,SAC0B;AAC1B,MAAA,GAAA,wBAAA,OAAU,QAAQ,CAAE,QAAO;CAE3B,MAAM,OACJ,kBACsC;EACtC,MAAM,UAAA,GAAA,gCAAA,WAAmC,cAAc;AACvD,MAAI,OAAO,SAAS,OAAQ,QAAO;EAEnC,MAAM,aAAa,OAAO;AAK1B,UAAA,GAAA,gCAAA,kBAAwC;GACtC,MAAM;GACN,KALA,QAAQ,MAAM,OAAO,EAAE,cAAc,EAAE,OAAO,QAAQ,WAAW,KAAA,GAAA,wBAAA,YACtD,cAAc,OAAO,GAAG,mDAAmD,EAI3E,OAAO;GACnB,CAAC;;AAGJ,QAAOC,iBAAAA,mBAAmB,SAAS;EACjC,OAAO,SAAgC;AACrC,OAAI,KAAK,SAAS,KAAA,EAAW,QAAO;GACpC,MAAM,SAAS,EAAE,GAAG,MAAM;AAC1B,OAAI,YAAY,OAAQ,QAAO,SAAS,IAAI,OAAO,OAAO;AAC1D,OAAI,SAAS,OAAQ,QAAO,MAAM,IAAI,OAAO,IAAI;AACjD,UAAO;;EAET,MAAM,aAAoC;GAAE,MAAM;GAAO,SAAS;GAAS;EAC3E,KAAK,aAAoC;GAAE,MAAM;GAAM,SAAS;GAAS;EACzE,MAAM,YAAmC;GAAE,MAAM;GAAO,QAAQ;GAAQ;EACzE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPlDataTableV3.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"createPlDataTableV3.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"mappings":";;;;;;;;;;;KA0CY,0BAAA;EACV,UAAA,GAAa,kBAAA;EAEb,OAAA,EAAS,GAAA,GAAM,0BAAA,GAA6B,kBAAA;EAC5C,OAAA,GAAU,kBAAA;EACV,OAAA,GAAU,aAAA;EACV,eAAA;EAEA,aAAA,GAAgB,mBAAA;EAChB,cAAA,GAAiB,qBAAA;AAAA;;KAIP,qBAAA;EACV,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,IAAA,GAAO,YAAA;EACP,OAAA;AAAA;AAAA,KAGU,qBAAA;EAX4B,uFAatC,QAAA,GAAW,eAAA,IArBE;EAuBb,UAAA,GAAa,oBAAA;AAAA;AAAA,KAGH,eAAA;EACV,KAAA,EAAO,aAAA,GAAgB,cAAA,EAxBvB;EA0BA,QAAA;AAAA;AAAA,KAGU,oBAAA;EACV,KAAA,EAAO,aAAA,GAAgB,cAAA;EACvB,UAAA;AAAA;AAAA,KAGU,aAAA,IAAiB,IAAA,EAAM,WAAA;AAAA,iBAEnB,mBAAA,MAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,GACtB,OAAA,EAAS,0BAAA,GACR,gBAAA;AAAA,KAyHS,kBAAA,GAAqB,aAAA,CAAc,mBAAA;EAAA,SACpC,UAAA,EAAY,SAAA;EAAA,SACZ,SAAA;AAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { collectFilterSpecColumns, traverseFilterSpec } from "../../../filters/traverse.js";
|
|
2
2
|
import { upgradePlDataTableStateV2 } from "../state-migration.js";
|
|
3
3
|
import { createPTableDefV3 } from "./createPTableDefV3.js";
|
|
4
|
-
import { deriveAllLabels, deriveAllTooltips, evaluateRules, isColumnHidden, isColumnOptional, withHidenAxesAnnotations, withInfoAnnotations, withLabelAnnotations, withTableVisualAnnotations } from "./utils.js";
|
|
4
|
+
import { deriveAllLabels, deriveAllTooltips, evaluateRules, isColumnHidden, isColumnOptional, withDataStatusAnnotations, withHidenAxesAnnotations, withInfoAnnotations, withLabelAnnotations, withTableVisualAnnotations } from "./utils.js";
|
|
5
5
|
import { discoverTableColumnSnaphots } from "./discoverColumns.js";
|
|
6
6
|
import { canonicalizeJson, getAxisId, parseJson, uniqueBy } from "@milaboratories/pl-model-common";
|
|
7
7
|
import { isNil, isPlainObject, throwError } from "@milaboratories/helpers";
|
|
@@ -46,10 +46,8 @@ function createPlDataTableV3(ctx, options) {
|
|
|
46
46
|
if (primarySnapshots.length === 0) return void 0;
|
|
47
47
|
const columnIsAvailable = createColumnValidationById([...annotated.direct.map((v) => v.column), ...annotated.linked.flatMap((lc) => [...lc.path.map((s) => s.linker), lc.column])]);
|
|
48
48
|
const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);
|
|
49
|
-
const filters = concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters);
|
|
50
|
-
|
|
51
|
-
const sorting = resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered));
|
|
52
|
-
validateSorting(sorting, columnIsAvailable);
|
|
49
|
+
const filters = filterFilters(concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters), columnIsAvailable);
|
|
50
|
+
const sorting = filterSorting(resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)), columnIsAvailable);
|
|
53
51
|
const primaryEntries = primarySnapshots.map((v) => ({ column: resolveSnapshot(v.column) }));
|
|
54
52
|
const fullDef = createPTableDefV3({
|
|
55
53
|
primaryJoinType,
|
|
@@ -109,8 +107,8 @@ function annotateColumnGroups(params) {
|
|
|
109
107
|
const visibilityByColId = evaluateRules(displayOptions?.visibility ?? [], allColumnsForRules, pframeSpec);
|
|
110
108
|
const orderByColId = evaluateRules(displayOptions?.ordering ?? [], allColumnsForRules, pframeSpec);
|
|
111
109
|
return {
|
|
112
|
-
direct: liftToVariantColumns(direct, flow((cols) => withLabelAnnotations(derivedLabels, cols), (cols) => withInfoAnnotations(derivedTooltips, cols), (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols))),
|
|
113
|
-
linked: liftToVariantColumns(linked, flow((cols) => withHidenAxesAnnotations(cols), (cols) => withLabelAnnotations(derivedLabels, cols), (cols) => withInfoAnnotations(derivedTooltips, cols), (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols))).map((lc) => ({
|
|
110
|
+
direct: liftToVariantColumns(direct, flow((cols) => withDataStatusAnnotations(cols), (cols) => withLabelAnnotations(derivedLabels, cols), (cols) => withInfoAnnotations(derivedTooltips, cols), (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols))),
|
|
111
|
+
linked: liftToVariantColumns(linked, flow((cols) => withDataStatusAnnotations(cols), (cols) => withHidenAxesAnnotations(cols), (cols) => withLabelAnnotations(derivedLabels, cols), (cols) => withInfoAnnotations(derivedTooltips, cols), (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols))).map((lc) => ({
|
|
114
112
|
...lc,
|
|
115
113
|
path: annotateLinkerPath(derivedLabels, lc.path)
|
|
116
114
|
}))
|
|
@@ -147,11 +145,33 @@ function createColumnValidationById(fullColumns) {
|
|
|
147
145
|
return validIdSet.has(id);
|
|
148
146
|
};
|
|
149
147
|
}
|
|
150
|
-
/**
|
|
151
|
-
function
|
|
152
|
-
if (filters
|
|
153
|
-
const
|
|
154
|
-
|
|
148
|
+
/** Drop filter leaves whose column references are not available in the table. */
|
|
149
|
+
function filterFilters(filters, isValidColumnId) {
|
|
150
|
+
if (isNil(filters)) return filters;
|
|
151
|
+
const isLeafValid = (leaf) => {
|
|
152
|
+
if (leaf.type === void 0) return true;
|
|
153
|
+
if ("column" in leaf && !isValidColumnId(leaf.column)) return false;
|
|
154
|
+
if ("rhs" in leaf && !isValidColumnId(leaf.rhs)) return false;
|
|
155
|
+
return true;
|
|
156
|
+
};
|
|
157
|
+
const prune = (node) => {
|
|
158
|
+
if (node.type === "and" || node.type === "or") {
|
|
159
|
+
const kept = node.filters.map((f) => prune(f)).filter((f) => !isNil(f));
|
|
160
|
+
return {
|
|
161
|
+
type: node.type,
|
|
162
|
+
filters: kept
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (node.type === "not") {
|
|
166
|
+
const inner = prune(node.filter);
|
|
167
|
+
return isNil(inner) ? void 0 : {
|
|
168
|
+
type: "not",
|
|
169
|
+
filter: inner
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return isLeafValid(node) ? node : void 0;
|
|
173
|
+
};
|
|
174
|
+
return prune(filters);
|
|
155
175
|
}
|
|
156
176
|
/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */
|
|
157
177
|
function concatFilters(a, b) {
|
|
@@ -166,10 +186,9 @@ function concatFilters(a, b) {
|
|
|
166
186
|
function resolveSorting(userSorting, defaultSorting) {
|
|
167
187
|
return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];
|
|
168
188
|
}
|
|
169
|
-
/**
|
|
170
|
-
function
|
|
171
|
-
|
|
172
|
-
if (firstInvalid !== void 0) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`);
|
|
189
|
+
/** Drop sorting entries whose column is not available in the table. */
|
|
190
|
+
function filterSorting(sorting, isValidColumnId) {
|
|
191
|
+
return sorting.filter((s) => isValidColumnId(canonicalizeJson(s.column)));
|
|
173
192
|
}
|
|
174
193
|
function buildSecondaryGroups(direct, linked) {
|
|
175
194
|
return [...direct.map((c) => ({
|
|
@@ -220,17 +239,18 @@ function resolveSnapshot(snap) {
|
|
|
220
239
|
}
|
|
221
240
|
/** Remap column references in sorting entries. */
|
|
222
241
|
function remapSortingColumnIds(sorting, columns) {
|
|
223
|
-
return sorting?.
|
|
224
|
-
if (s.column.type === "axis") return s;
|
|
242
|
+
return sorting?.flatMap((s) => {
|
|
243
|
+
if (s.column.type === "axis") return [s];
|
|
225
244
|
const id = s.column.id;
|
|
226
|
-
const column = columns.find((c) => (c.originalId ?? c.column.id) === id)
|
|
227
|
-
return
|
|
245
|
+
const column = columns.find((c) => (c.originalId ?? c.column.id) === id);
|
|
246
|
+
if (column === void 0) return [];
|
|
247
|
+
return [{
|
|
228
248
|
...s,
|
|
229
249
|
column: {
|
|
230
250
|
type: "column",
|
|
231
251
|
id: column.column.id
|
|
232
252
|
}
|
|
233
|
-
};
|
|
253
|
+
}];
|
|
234
254
|
});
|
|
235
255
|
}
|
|
236
256
|
/** Remap column references in a filter tree. */
|