@platforma-sdk/model 1.59.3 → 1.60.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/block_storage.cjs.map +1 -1
- package/dist/block_storage.d.ts +1 -11
- package/dist/block_storage.js.map +1 -1
- package/dist/block_storage_callbacks.cjs.map +1 -1
- package/dist/block_storage_callbacks.js.map +1 -1
- package/dist/columns/column_collection_builder.cjs +215 -0
- package/dist/columns/column_collection_builder.cjs.map +1 -0
- package/dist/columns/column_collection_builder.d.ts +112 -0
- package/dist/columns/column_collection_builder.js +214 -0
- package/dist/columns/column_collection_builder.js.map +1 -0
- package/dist/columns/column_selector.cjs +122 -0
- package/dist/columns/column_selector.cjs.map +1 -0
- package/dist/columns/column_selector.d.ts +41 -0
- package/dist/columns/column_selector.js +118 -0
- package/dist/columns/column_selector.js.map +1 -0
- package/dist/columns/column_snapshot.cjs +20 -0
- package/dist/columns/column_snapshot.cjs.map +1 -0
- package/dist/columns/column_snapshot.d.ts +39 -0
- package/dist/columns/column_snapshot.js +18 -0
- package/dist/columns/column_snapshot.js.map +1 -0
- package/dist/columns/column_snapshot_provider.cjs +112 -0
- package/dist/columns/column_snapshot_provider.cjs.map +1 -0
- package/dist/columns/column_snapshot_provider.d.ts +73 -0
- package/dist/columns/column_snapshot_provider.js +107 -0
- package/dist/columns/column_snapshot_provider.js.map +1 -0
- package/dist/columns/ctx_column_sources.cjs +84 -0
- package/dist/columns/ctx_column_sources.cjs.map +1 -0
- package/dist/columns/ctx_column_sources.d.ts +33 -0
- package/dist/columns/ctx_column_sources.js +82 -0
- package/dist/columns/ctx_column_sources.js.map +1 -0
- package/dist/columns/index.cjs +5 -0
- package/dist/columns/index.d.ts +5 -0
- package/dist/columns/index.js +5 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +111 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +25 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +110 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -0
- package/dist/components/PlDataTable/{table.cjs → createPlDataTable/createPlDataTableV3.cjs} +54 -54
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +39 -0
- package/dist/components/PlDataTable/{table.js → createPlDataTable/createPlDataTableV3.js} +53 -53
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/index.cjs +12 -0
- package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts +15 -0
- package/dist/components/PlDataTable/createPlDataTable/index.js +12 -0
- package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.cjs +18 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +11 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.js +17 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -0
- package/dist/components/PlDataTable/index.cjs +4 -1
- package/dist/components/PlDataTable/index.d.ts +5 -2
- package/dist/components/PlDataTable/index.js +4 -1
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts +2 -2
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/{v4.d.ts → typesV4.d.ts} +2 -2
- package/dist/components/PlDataTable/{v5.d.ts → typesV5.d.ts} +2 -2
- package/dist/components/index.cjs +4 -1
- package/dist/components/index.d.ts +5 -2
- package/dist/components/index.js +4 -1
- package/dist/index.cjs +44 -16
- package/dist/index.d.ts +17 -5
- package/dist/index.js +15 -3
- package/dist/labels/derive_distinct_labels.cjs +156 -0
- package/dist/labels/derive_distinct_labels.cjs.map +1 -0
- package/dist/labels/derive_distinct_labels.d.ts +29 -0
- package/dist/labels/derive_distinct_labels.js +155 -0
- package/dist/labels/derive_distinct_labels.js.map +1 -0
- package/dist/labels/index.cjs +2 -0
- package/dist/labels/index.d.ts +2 -0
- package/dist/labels/index.js +2 -0
- package/dist/labels/write_labels_to_specs.cjs +15 -0
- package/dist/labels/write_labels_to_specs.cjs.map +1 -0
- package/dist/labels/write_labels_to_specs.d.ts +9 -0
- package/dist/labels/write_labels_to_specs.js +14 -0
- package/dist/labels/write_labels_to_specs.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/render/api.cjs +11 -2
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +9 -5
- package/dist/render/api.js +12 -3
- package/dist/render/api.js.map +1 -1
- package/dist/render/index.d.ts +2 -1
- package/dist/render/index.js +1 -1
- package/dist/render/internal.cjs.map +1 -1
- package/dist/render/internal.d.ts +5 -2
- package/dist/render/internal.js.map +1 -1
- package/dist/render/util/column_collection.cjs +3 -3
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +3 -2
- package/dist/render/util/column_collection.js +4 -4
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/index.d.ts +2 -1
- package/dist/render/util/index.js +1 -1
- package/dist/render/util/label.cjs +7 -134
- package/dist/render/util/label.cjs.map +1 -1
- package/dist/render/util/label.d.ts +5 -50
- package/dist/render/util/label.js +8 -132
- package/dist/render/util/label.js.map +1 -1
- package/dist/render/util/split_selectors.d.ts +2 -2
- package/package.json +9 -7
- package/src/block_storage.ts +0 -11
- package/src/block_storage_callbacks.ts +1 -1
- package/src/columns/column_collection_builder.test.ts +427 -0
- package/src/columns/column_collection_builder.ts +455 -0
- package/src/columns/column_selector.test.ts +472 -0
- package/src/columns/column_selector.ts +212 -0
- package/src/columns/column_snapshot.ts +55 -0
- package/src/columns/column_snapshot_provider.ts +177 -0
- package/src/columns/ctx_column_sources.ts +107 -0
- package/src/columns/expand_by_partition.test.ts +289 -0
- package/src/columns/expand_by_partition.ts +187 -0
- package/src/columns/index.ts +5 -0
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +193 -0
- package/src/components/PlDataTable/{table.ts → createPlDataTable/createPlDataTableV3.ts} +134 -70
- package/src/components/PlDataTable/createPlDataTable/index.ts +27 -0
- package/src/components/PlDataTable/createPlDataTableSheet.ts +20 -0
- package/src/components/PlDataTable/index.ts +6 -4
- package/src/components/PlDataTable/state-migration.ts +2 -2
- package/src/index.ts +2 -1
- package/src/labels/derive_distinct_labels.test.ts +461 -0
- package/src/labels/derive_distinct_labels.ts +289 -0
- package/src/labels/index.ts +2 -0
- package/src/labels/write_labels_to_specs.ts +12 -0
- package/src/render/api.ts +25 -3
- package/src/render/internal.ts +20 -1
- package/src/render/util/column_collection.ts +9 -6
- package/src/render/util/label.test.ts +1 -1
- package/src/render/util/label.ts +19 -235
- package/src/render/util/split_selectors.ts +3 -3
- package/dist/components/PlDataTable/table.cjs.map +0 -1
- package/dist/components/PlDataTable/table.d.ts +0 -30
- package/dist/components/PlDataTable/table.js.map +0 -1
- /package/src/components/PlDataTable/{v4.ts → typesV4.ts} +0 -0
- /package/src/components/PlDataTable/{v5.ts → typesV5.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctx_column_sources.cjs","names":["ResourceTypeName","OutputColumnProvider"],"sources":["../../src/columns/ctx_column_sources.ts"],"sourcesContent":["import type { PColumnSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { RenderCtxBase, ResultPool } from \"../render\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport type { ColumnDataStatus } from \"./column_snapshot\";\nimport type { ColumnSnapshotProvider } from \"./column_snapshot_provider\";\nimport { OutputColumnProvider } from \"./column_snapshot_provider\";\nimport { ResourceTypeName } from \"@milaboratories/pl-model-common\";\nimport type { ValueOf } from \"@milaboratories/helpers\";\n\n/**\n * Collect ColumnSnapshotProviders from all render context sources:\n *\n * - **resultPool** — all upstream columns (always included)\n * - **outputs** — PFrame fields from block execution outputs\n * - **prerun** — PFrame fields from prerun/staging results\n *\n * Returns an array of providers suitable for `ColumnCollectionBuilder.addSource()`.\n */\nexport function collectCtxColumnSnapshotProviders<A, U>(\n ctx: RenderCtxBase<A, U>,\n): ColumnSnapshotProvider[] {\n const providers: ColumnSnapshotProvider[] = [];\n\n // ResultPool — all upstream columns\n providers.push(new ResultPoolColumnSnapshotProvider(ctx.resultPool));\n\n // Outputs — each PFrame-like output field becomes a provider\n const outputs = ctx.outputs;\n if (outputs) {\n providers.push(...collectPFrameProviders(outputs));\n }\n\n // Prerun — same treatment as outputs\n const prerun = ctx.prerun;\n if (prerun) {\n providers.push(...collectPFrameProviders(prerun));\n }\n\n return providers;\n}\n\n/**\n * Adapter wrapping ResultPool into the new ColumnSnapshotProvider interface.\n *\n * - `isColumnListComplete()` always returns true — the result pool\n * is a stable snapshot within a single render cycle.\n * - Data status is derived from the underlying TreeNodeAccessor:\n * ready (getIsReadyOrError), computing, or absent (no data resource).\n */\nexport class ResultPoolColumnSnapshotProvider implements ColumnSnapshotProvider {\n constructor(private readonly pool: ResultPool) {}\n\n getAllColumns(): ColumnSnapshot[] {\n const pColumns = this.pool.selectColumns(() => true);\n return pColumns.map((col) => toSnapshot(col.id, col.spec, col.data));\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\nfunction toSnapshot(\n id: PObjectId,\n spec: PColumnSpec,\n accessor: TreeNodeAccessor | undefined,\n): ColumnSnapshot {\n if (accessor === undefined) {\n return { id, spec, dataStatus: \"absent\" as ColumnDataStatus, data: undefined };\n }\n const isReady = accessor.getIsReadyOrError();\n return {\n id,\n spec,\n dataStatus: (isReady ? \"ready\" : \"computing\") as ColumnDataStatus,\n data: { get: () => (isReady ? accessor : undefined) },\n };\n}\n\n/**\n * Recursively walk the output tree starting from `accessor`.\n * - If a node's resourceType is PFrame → wrap it as OutputColumnProvider.\n * - If a node's resourceType is StdMap/std/map → recurse into its output fields.\n * - Otherwise → skip (leaf of unknown type).\n */\nfunction collectPFrameProviders(accessor: TreeNodeAccessor): ColumnSnapshotProvider[] {\n const out: ColumnSnapshotProvider[] = [];\n walkTree(accessor, out);\n return out;\n}\n\nfunction walkTree(node: TreeNodeAccessor, out: ColumnSnapshotProvider[]): void {\n const typeName = node.resourceType.name as ValueOf<typeof ResourceTypeName>;\n\n if (typeName === ResourceTypeName.PFrame) {\n out.push(new OutputColumnProvider(node));\n return;\n }\n\n if (typeName === ResourceTypeName.StdMap || typeName === ResourceTypeName.StdMapSlash) {\n for (const field of node.listInputFields()) {\n const child = node.resolve(field);\n if (child) walkTree(child, out);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,SAAgB,kCACd,KAC0B;CAC1B,MAAM,YAAsC,EAAE;AAG9C,WAAU,KAAK,IAAI,iCAAiC,IAAI,WAAW,CAAC;CAGpE,MAAM,UAAU,IAAI;AACpB,KAAI,QACF,WAAU,KAAK,GAAG,uBAAuB,QAAQ,CAAC;CAIpD,MAAM,SAAS,IAAI;AACnB,KAAI,OACF,WAAU,KAAK,GAAG,uBAAuB,OAAO,CAAC;AAGnD,QAAO;;;;;;;;;;AAWT,IAAa,mCAAb,MAAgF;CAC9E,YAAY,AAAiB,MAAkB;EAAlB;;CAE7B,gBAAkC;AAEhC,SADiB,KAAK,KAAK,oBAAoB,KAAK,CACpC,KAAK,QAAQ,WAAW,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;;CAGtE,uBAAgC;AAC9B,SAAO;;;AAIX,SAAS,WACP,IACA,MACA,UACgB;AAChB,KAAI,aAAa,OACf,QAAO;EAAE;EAAI;EAAM,YAAY;EAA8B,MAAM;EAAW;CAEhF,MAAM,UAAU,SAAS,mBAAmB;AAC5C,QAAO;EACL;EACA;EACA,YAAa,UAAU,UAAU;EACjC,MAAM,EAAE,WAAY,UAAU,WAAW,QAAY;EACtD;;;;;;;;AASH,SAAS,uBAAuB,UAAsD;CACpF,MAAM,MAAgC,EAAE;AACxC,UAAS,UAAU,IAAI;AACvB,QAAO;;AAGT,SAAS,SAAS,MAAwB,KAAqC;CAC7E,MAAM,WAAW,KAAK,aAAa;AAEnC,KAAI,aAAaA,iDAAiB,QAAQ;AACxC,MAAI,KAAK,IAAIC,sDAAqB,KAAK,CAAC;AACxC;;AAGF,KAAI,aAAaD,iDAAiB,UAAU,aAAaA,iDAAiB,YACxE,MAAK,MAAM,SAAS,KAAK,iBAAiB,EAAE;EAC1C,MAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,MAAI,MAAO,UAAS,OAAO,IAAI"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RenderCtxBase, ResultPool } from "../render/api.js";
|
|
2
|
+
import "../render/index.js";
|
|
3
|
+
import { ColumnSnapshot } from "./column_snapshot.js";
|
|
4
|
+
import { ColumnSnapshotProvider } from "./column_snapshot_provider.js";
|
|
5
|
+
|
|
6
|
+
//#region src/columns/ctx_column_sources.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* Collect ColumnSnapshotProviders from all render context sources:
|
|
9
|
+
*
|
|
10
|
+
* - **resultPool** — all upstream columns (always included)
|
|
11
|
+
* - **outputs** — PFrame fields from block execution outputs
|
|
12
|
+
* - **prerun** — PFrame fields from prerun/staging results
|
|
13
|
+
*
|
|
14
|
+
* Returns an array of providers suitable for `ColumnCollectionBuilder.addSource()`.
|
|
15
|
+
*/
|
|
16
|
+
declare function collectCtxColumnSnapshotProviders<A, U>(ctx: RenderCtxBase<A, U>): ColumnSnapshotProvider[];
|
|
17
|
+
/**
|
|
18
|
+
* Adapter wrapping ResultPool into the new ColumnSnapshotProvider interface.
|
|
19
|
+
*
|
|
20
|
+
* - `isColumnListComplete()` always returns true — the result pool
|
|
21
|
+
* is a stable snapshot within a single render cycle.
|
|
22
|
+
* - Data status is derived from the underlying TreeNodeAccessor:
|
|
23
|
+
* ready (getIsReadyOrError), computing, or absent (no data resource).
|
|
24
|
+
*/
|
|
25
|
+
declare class ResultPoolColumnSnapshotProvider implements ColumnSnapshotProvider {
|
|
26
|
+
private readonly pool;
|
|
27
|
+
constructor(pool: ResultPool);
|
|
28
|
+
getAllColumns(): ColumnSnapshot[];
|
|
29
|
+
isColumnListComplete(): boolean;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders };
|
|
33
|
+
//# sourceMappingURL=ctx_column_sources.d.ts.map
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { OutputColumnProvider } from "./column_snapshot_provider.js";
|
|
2
|
+
import { ResourceTypeName } from "@milaboratories/pl-model-common";
|
|
3
|
+
|
|
4
|
+
//#region src/columns/ctx_column_sources.ts
|
|
5
|
+
/**
|
|
6
|
+
* Collect ColumnSnapshotProviders from all render context sources:
|
|
7
|
+
*
|
|
8
|
+
* - **resultPool** — all upstream columns (always included)
|
|
9
|
+
* - **outputs** — PFrame fields from block execution outputs
|
|
10
|
+
* - **prerun** — PFrame fields from prerun/staging results
|
|
11
|
+
*
|
|
12
|
+
* Returns an array of providers suitable for `ColumnCollectionBuilder.addSource()`.
|
|
13
|
+
*/
|
|
14
|
+
function collectCtxColumnSnapshotProviders(ctx) {
|
|
15
|
+
const providers = [];
|
|
16
|
+
providers.push(new ResultPoolColumnSnapshotProvider(ctx.resultPool));
|
|
17
|
+
const outputs = ctx.outputs;
|
|
18
|
+
if (outputs) providers.push(...collectPFrameProviders(outputs));
|
|
19
|
+
const prerun = ctx.prerun;
|
|
20
|
+
if (prerun) providers.push(...collectPFrameProviders(prerun));
|
|
21
|
+
return providers;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Adapter wrapping ResultPool into the new ColumnSnapshotProvider interface.
|
|
25
|
+
*
|
|
26
|
+
* - `isColumnListComplete()` always returns true — the result pool
|
|
27
|
+
* is a stable snapshot within a single render cycle.
|
|
28
|
+
* - Data status is derived from the underlying TreeNodeAccessor:
|
|
29
|
+
* ready (getIsReadyOrError), computing, or absent (no data resource).
|
|
30
|
+
*/
|
|
31
|
+
var ResultPoolColumnSnapshotProvider = class {
|
|
32
|
+
constructor(pool) {
|
|
33
|
+
this.pool = pool;
|
|
34
|
+
}
|
|
35
|
+
getAllColumns() {
|
|
36
|
+
return this.pool.selectColumns(() => true).map((col) => toSnapshot(col.id, col.spec, col.data));
|
|
37
|
+
}
|
|
38
|
+
isColumnListComplete() {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
function toSnapshot(id, spec, accessor) {
|
|
43
|
+
if (accessor === void 0) return {
|
|
44
|
+
id,
|
|
45
|
+
spec,
|
|
46
|
+
dataStatus: "absent",
|
|
47
|
+
data: void 0
|
|
48
|
+
};
|
|
49
|
+
const isReady = accessor.getIsReadyOrError();
|
|
50
|
+
return {
|
|
51
|
+
id,
|
|
52
|
+
spec,
|
|
53
|
+
dataStatus: isReady ? "ready" : "computing",
|
|
54
|
+
data: { get: () => isReady ? accessor : void 0 }
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Recursively walk the output tree starting from `accessor`.
|
|
59
|
+
* - If a node's resourceType is PFrame → wrap it as OutputColumnProvider.
|
|
60
|
+
* - If a node's resourceType is StdMap/std/map → recurse into its output fields.
|
|
61
|
+
* - Otherwise → skip (leaf of unknown type).
|
|
62
|
+
*/
|
|
63
|
+
function collectPFrameProviders(accessor) {
|
|
64
|
+
const out = [];
|
|
65
|
+
walkTree(accessor, out);
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
function walkTree(node, out) {
|
|
69
|
+
const typeName = node.resourceType.name;
|
|
70
|
+
if (typeName === ResourceTypeName.PFrame) {
|
|
71
|
+
out.push(new OutputColumnProvider(node));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (typeName === ResourceTypeName.StdMap || typeName === ResourceTypeName.StdMapSlash) for (const field of node.listInputFields()) {
|
|
75
|
+
const child = node.resolve(field);
|
|
76
|
+
if (child) walkTree(child, out);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders };
|
|
82
|
+
//# sourceMappingURL=ctx_column_sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctx_column_sources.js","names":[],"sources":["../../src/columns/ctx_column_sources.ts"],"sourcesContent":["import type { PColumnSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { TreeNodeAccessor } from \"../render/accessor\";\nimport type { RenderCtxBase, ResultPool } from \"../render\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport type { ColumnDataStatus } from \"./column_snapshot\";\nimport type { ColumnSnapshotProvider } from \"./column_snapshot_provider\";\nimport { OutputColumnProvider } from \"./column_snapshot_provider\";\nimport { ResourceTypeName } from \"@milaboratories/pl-model-common\";\nimport type { ValueOf } from \"@milaboratories/helpers\";\n\n/**\n * Collect ColumnSnapshotProviders from all render context sources:\n *\n * - **resultPool** — all upstream columns (always included)\n * - **outputs** — PFrame fields from block execution outputs\n * - **prerun** — PFrame fields from prerun/staging results\n *\n * Returns an array of providers suitable for `ColumnCollectionBuilder.addSource()`.\n */\nexport function collectCtxColumnSnapshotProviders<A, U>(\n ctx: RenderCtxBase<A, U>,\n): ColumnSnapshotProvider[] {\n const providers: ColumnSnapshotProvider[] = [];\n\n // ResultPool — all upstream columns\n providers.push(new ResultPoolColumnSnapshotProvider(ctx.resultPool));\n\n // Outputs — each PFrame-like output field becomes a provider\n const outputs = ctx.outputs;\n if (outputs) {\n providers.push(...collectPFrameProviders(outputs));\n }\n\n // Prerun — same treatment as outputs\n const prerun = ctx.prerun;\n if (prerun) {\n providers.push(...collectPFrameProviders(prerun));\n }\n\n return providers;\n}\n\n/**\n * Adapter wrapping ResultPool into the new ColumnSnapshotProvider interface.\n *\n * - `isColumnListComplete()` always returns true — the result pool\n * is a stable snapshot within a single render cycle.\n * - Data status is derived from the underlying TreeNodeAccessor:\n * ready (getIsReadyOrError), computing, or absent (no data resource).\n */\nexport class ResultPoolColumnSnapshotProvider implements ColumnSnapshotProvider {\n constructor(private readonly pool: ResultPool) {}\n\n getAllColumns(): ColumnSnapshot[] {\n const pColumns = this.pool.selectColumns(() => true);\n return pColumns.map((col) => toSnapshot(col.id, col.spec, col.data));\n }\n\n isColumnListComplete(): boolean {\n return true;\n }\n}\n\nfunction toSnapshot(\n id: PObjectId,\n spec: PColumnSpec,\n accessor: TreeNodeAccessor | undefined,\n): ColumnSnapshot {\n if (accessor === undefined) {\n return { id, spec, dataStatus: \"absent\" as ColumnDataStatus, data: undefined };\n }\n const isReady = accessor.getIsReadyOrError();\n return {\n id,\n spec,\n dataStatus: (isReady ? \"ready\" : \"computing\") as ColumnDataStatus,\n data: { get: () => (isReady ? accessor : undefined) },\n };\n}\n\n/**\n * Recursively walk the output tree starting from `accessor`.\n * - If a node's resourceType is PFrame → wrap it as OutputColumnProvider.\n * - If a node's resourceType is StdMap/std/map → recurse into its output fields.\n * - Otherwise → skip (leaf of unknown type).\n */\nfunction collectPFrameProviders(accessor: TreeNodeAccessor): ColumnSnapshotProvider[] {\n const out: ColumnSnapshotProvider[] = [];\n walkTree(accessor, out);\n return out;\n}\n\nfunction walkTree(node: TreeNodeAccessor, out: ColumnSnapshotProvider[]): void {\n const typeName = node.resourceType.name as ValueOf<typeof ResourceTypeName>;\n\n if (typeName === ResourceTypeName.PFrame) {\n out.push(new OutputColumnProvider(node));\n return;\n }\n\n if (typeName === ResourceTypeName.StdMap || typeName === ResourceTypeName.StdMapSlash) {\n for (const field of node.listInputFields()) {\n const child = node.resolve(field);\n if (child) walkTree(child, out);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmBA,SAAgB,kCACd,KAC0B;CAC1B,MAAM,YAAsC,EAAE;AAG9C,WAAU,KAAK,IAAI,iCAAiC,IAAI,WAAW,CAAC;CAGpE,MAAM,UAAU,IAAI;AACpB,KAAI,QACF,WAAU,KAAK,GAAG,uBAAuB,QAAQ,CAAC;CAIpD,MAAM,SAAS,IAAI;AACnB,KAAI,OACF,WAAU,KAAK,GAAG,uBAAuB,OAAO,CAAC;AAGnD,QAAO;;;;;;;;;;AAWT,IAAa,mCAAb,MAAgF;CAC9E,YAAY,AAAiB,MAAkB;EAAlB;;CAE7B,gBAAkC;AAEhC,SADiB,KAAK,KAAK,oBAAoB,KAAK,CACpC,KAAK,QAAQ,WAAW,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;;CAGtE,uBAAgC;AAC9B,SAAO;;;AAIX,SAAS,WACP,IACA,MACA,UACgB;AAChB,KAAI,aAAa,OACf,QAAO;EAAE;EAAI;EAAM,YAAY;EAA8B,MAAM;EAAW;CAEhF,MAAM,UAAU,SAAS,mBAAmB;AAC5C,QAAO;EACL;EACA;EACA,YAAa,UAAU,UAAU;EACjC,MAAM,EAAE,WAAY,UAAU,WAAW,QAAY;EACtD;;;;;;;;AASH,SAAS,uBAAuB,UAAsD;CACpF,MAAM,MAAgC,EAAE;AACxC,UAAS,UAAU,IAAI;AACvB,QAAO;;AAGT,SAAS,SAAS,MAAwB,KAAqC;CAC7E,MAAM,WAAW,KAAK,aAAa;AAEnC,KAAI,aAAa,iBAAiB,QAAQ;AACxC,MAAI,KAAK,IAAI,qBAAqB,KAAK,CAAC;AACxC;;AAGF,KAAI,aAAa,iBAAiB,UAAU,aAAa,iBAAiB,YACxE,MAAK,MAAM,SAAS,KAAK,iBAAiB,EAAE;EAC1C,MAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,MAAI,MAAO,UAAS,OAAO,IAAI"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const require_column_snapshot = require('./column_snapshot.cjs');
|
|
2
|
+
const require_column_snapshot_provider = require('./column_snapshot_provider.cjs');
|
|
3
|
+
const require_column_selector = require('./column_selector.cjs');
|
|
4
|
+
const require_column_collection_builder = require('./column_collection_builder.cjs');
|
|
5
|
+
const require_ctx_column_sources = require('./ctx_column_sources.cjs');
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ColumnData, ColumnDataStatus, ColumnSnapshot, createColumnSnapshot, createReadyColumnData } from "./column_snapshot.js";
|
|
2
|
+
import { ArrayColumnProvider, ColumnSnapshotProvider, ColumnSource, OutputColumnProvider, OutputColumnProviderOpts, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./column_snapshot_provider.js";
|
|
3
|
+
import { ColumnSelectorInput, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, StringMatcher, columnSelectorsToPredicate, matchColumn, matchColumnSelectors, normalizeSelectors } from "./column_selector.js";
|
|
4
|
+
import { AnchoredBuildOptions, AnchoredColumnCollection, AnchoredFindColumnsOptions, BuildOptions, ColumnCollection, ColumnCollectionBuilder, ColumnMatch, FindColumnsOptions, MatchQualifications, MatchVariant, MatchingMode } from "./column_collection_builder.js";
|
|
5
|
+
import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./ctx_column_sources.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createColumnSnapshot, createReadyColumnData } from "./column_snapshot.js";
|
|
2
|
+
import { ArrayColumnProvider, OutputColumnProvider, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./column_snapshot_provider.js";
|
|
3
|
+
import { columnSelectorsToPredicate, matchColumn, matchColumnSelectors, normalizeSelectors } from "./column_selector.js";
|
|
4
|
+
import { ColumnCollectionBuilder } from "./column_collection_builder.js";
|
|
5
|
+
import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./ctx_column_sources.js";
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_label = require('../../../render/util/label.cjs');
|
|
3
|
+
const require_pcolumn_data = require('../../../render/util/pcolumn_data.cjs');
|
|
4
|
+
require('../../../render/index.cjs');
|
|
5
|
+
const require_traverse = require('../../../filters/traverse.cjs');
|
|
6
|
+
const require_state_migration = require('../state-migration.cjs');
|
|
7
|
+
const require_labels = require('../labels.cjs');
|
|
8
|
+
const require_createPlDataTableV3 = require('./createPlDataTableV3.cjs');
|
|
9
|
+
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
10
|
+
let es_toolkit_compat = require("es-toolkit/compat");
|
|
11
|
+
let es_toolkit = require("es-toolkit");
|
|
12
|
+
|
|
13
|
+
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts
|
|
14
|
+
/**
|
|
15
|
+
* Create p-table spec and handle given ui table state
|
|
16
|
+
*
|
|
17
|
+
* @param ctx context
|
|
18
|
+
* @param columns column list
|
|
19
|
+
* @param tableState table ui state
|
|
20
|
+
* @returns PlAgDataTableV2 table source
|
|
21
|
+
*/
|
|
22
|
+
function createPlDataTableV2(ctx, columns, tableState, options) {
|
|
23
|
+
if (columns.length === 0) return void 0;
|
|
24
|
+
const tableStateNormalized = require_state_migration.upgradePlDataTableStateV2(tableState);
|
|
25
|
+
const allLabelColumns = require_labels.getAllLabelColumns(ctx.resultPool);
|
|
26
|
+
if (!allLabelColumns) return void 0;
|
|
27
|
+
let fullLabelColumns = require_labels.getMatchingLabelColumns(columns.map(_milaboratories_pl_model_common.getColumnIdAndSpec), allLabelColumns);
|
|
28
|
+
fullLabelColumns = require_label.deriveLabels(fullLabelColumns, es_toolkit.identity, { includeNativeLabel: true }).map((v) => {
|
|
29
|
+
return {
|
|
30
|
+
...v.value,
|
|
31
|
+
spec: {
|
|
32
|
+
...v.value.spec,
|
|
33
|
+
annotations: {
|
|
34
|
+
...v.value.spec.annotations,
|
|
35
|
+
[_milaboratories_pl_model_common.Annotation.Label]: v.label
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
const fullColumns = [...columns, ...fullLabelColumns];
|
|
41
|
+
const fullColumnsIds = [...(0, _milaboratories_pl_model_common.uniqueBy)(fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => (0, _milaboratories_pl_model_common.getAxisId)(a))), (a) => (0, _milaboratories_pl_model_common.canonicalizeJson)(a)).map((a) => ({
|
|
42
|
+
type: "axis",
|
|
43
|
+
id: a
|
|
44
|
+
})), ...fullColumns.map((c) => ({
|
|
45
|
+
type: "column",
|
|
46
|
+
id: c.id
|
|
47
|
+
}))];
|
|
48
|
+
const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => (0, _milaboratories_pl_model_common.canonicalizeJson)(c)));
|
|
49
|
+
const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
|
|
50
|
+
const stateFilters = tableStateNormalized.pTableParams.filters;
|
|
51
|
+
const opsFilters = options?.filters ?? null;
|
|
52
|
+
const filters = stateFilters != null && opsFilters != null ? {
|
|
53
|
+
type: "and",
|
|
54
|
+
filters: [stateFilters, opsFilters]
|
|
55
|
+
} : stateFilters ?? opsFilters;
|
|
56
|
+
const firstInvalidFilterColumn = (filters ? require_traverse.collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
|
|
57
|
+
if (firstInvalidFilterColumn) throw new Error(`Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`);
|
|
58
|
+
const userSorting = tableStateNormalized.pTableParams.sorting;
|
|
59
|
+
const sorting = ((0, es_toolkit_compat.isEmpty)(userSorting) ? options?.sorting : userSorting) ?? [];
|
|
60
|
+
const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId((0, _milaboratories_pl_model_common.canonicalizeJson)(s.column)));
|
|
61
|
+
if (firstInvalidSortingColumn) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`);
|
|
62
|
+
const coreJoinType = options?.coreJoinType ?? "full";
|
|
63
|
+
const fullDef = require_createPlDataTableV3.createPTableDef({
|
|
64
|
+
columns,
|
|
65
|
+
labelColumns: fullLabelColumns,
|
|
66
|
+
coreJoinType,
|
|
67
|
+
filters,
|
|
68
|
+
sorting,
|
|
69
|
+
coreColumnPredicate: options?.coreColumnPredicate
|
|
70
|
+
});
|
|
71
|
+
const fullHandle = ctx.createPTableV2(fullDef);
|
|
72
|
+
const pframeHandle = ctx.createPFrame(fullColumns);
|
|
73
|
+
if (!fullHandle || !pframeHandle) return void 0;
|
|
74
|
+
const hiddenColumns = new Set((() => {
|
|
75
|
+
if (coreJoinType === "inner") return [];
|
|
76
|
+
const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;
|
|
77
|
+
if (hiddenColIds) return hiddenColIds;
|
|
78
|
+
return columns.filter((c) => require_createPlDataTableV3.isColumnOptional(c.spec)).map((c) => c.id);
|
|
79
|
+
})());
|
|
80
|
+
columns.filter((c) => (0, _milaboratories_pl_model_common.isLinkerColumn)(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
|
|
81
|
+
const coreColumnPredicate = options?.coreColumnPredicate;
|
|
82
|
+
if (coreColumnPredicate) columns.flatMap((c) => coreColumnPredicate((0, _milaboratories_pl_model_common.getColumnIdAndSpec)(c)) ? [c.id] : []).forEach((c) => hiddenColumns.delete(c));
|
|
83
|
+
sorting.map((s) => s.column).filter((c) => c.type === "column").forEach((c) => hiddenColumns.delete(c.id));
|
|
84
|
+
if (filters) require_traverse.collectFilterSpecColumns(filters).flatMap((c) => {
|
|
85
|
+
const obj = (0, _milaboratories_pl_model_common.parseJson)(c);
|
|
86
|
+
return obj.type === "column" ? [obj.id] : [];
|
|
87
|
+
}).forEach((c) => hiddenColumns.delete(c));
|
|
88
|
+
const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));
|
|
89
|
+
const visibleLabelColumns = require_labels.getMatchingLabelColumns(visibleColumns.map(_milaboratories_pl_model_common.getColumnIdAndSpec), allLabelColumns);
|
|
90
|
+
if (!require_pcolumn_data.allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return void 0;
|
|
91
|
+
const visibleDef = require_createPlDataTableV3.createPTableDef({
|
|
92
|
+
columns: visibleColumns,
|
|
93
|
+
labelColumns: visibleLabelColumns,
|
|
94
|
+
coreJoinType,
|
|
95
|
+
filters,
|
|
96
|
+
sorting,
|
|
97
|
+
coreColumnPredicate
|
|
98
|
+
});
|
|
99
|
+
const visibleHandle = ctx.createPTableV2(visibleDef);
|
|
100
|
+
if (!visibleHandle) return void 0;
|
|
101
|
+
return {
|
|
102
|
+
sourceId: tableStateNormalized.pTableParams.sourceId,
|
|
103
|
+
fullTableHandle: fullHandle,
|
|
104
|
+
fullPframeHandle: pframeHandle,
|
|
105
|
+
visibleTableHandle: visibleHandle
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//#endregion
|
|
110
|
+
exports.createPlDataTableV2 = createPlDataTableV2;
|
|
111
|
+
//# sourceMappingURL=createPlDataTableV2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPlDataTableV2.cjs","names":["upgradePlDataTableStateV2","getAllLabelColumns","getMatchingLabelColumns","getColumnIdAndSpec","deriveLabels","identity","Annotation","collectFilterSpecColumns","createPTableDef","isColumnOptional","allPColumnsReady"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts"],"sourcesContent":["import type {\n AxisId,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n CanonicalizedJson,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n uniqueBy,\n parseJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, RenderCtxBase } from \"../../../render\";\nimport { allPColumnsReady, deriveLabels } from \"../../../render\";\nimport { identity } from \"es-toolkit\";\nimport type { CreatePlDataTableOps, PlDataTableFilters, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { createPTableDef, isColumnOptional } from \"./createPlDataTableV3\";\n\nexport type createPlDataTableOptionsV2 = {\n columns: PColumn<PColumnDataUniversal>[];\n tableState?: PlDataTableStateV2;\n options?: CreatePlDataTableOps;\n};\n\n/**\n * Create p-table spec and handle given ui table state\n *\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns PlAgDataTableV2 table source\n */\nexport function createPlDataTableV2<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: createPlDataTableOptionsV2[\"columns\"],\n tableState?: createPlDataTableOptionsV2[\"tableState\"],\n options?: createPlDataTableOptionsV2[\"options\"],\n): PlDataTableModel | undefined {\n if (columns.length === 0) return undefined;\n\n const tableStateNormalized = upgradePlDataTableStateV2(tableState);\n\n const allLabelColumns = getAllLabelColumns(ctx.resultPool);\n if (!allLabelColumns) return undefined;\n\n let fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);\n fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map(\n (v) => {\n return {\n ...v.value,\n spec: {\n ...v.value.spec,\n annotations: {\n ...v.value.spec.annotations,\n [Annotation.Label]: v.label,\n },\n },\n };\n },\n );\n\n const fullColumns = [...columns, ...fullLabelColumns];\n\n const fullColumnsAxes = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))),\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: string): boolean =>\n fullColumnsIdsSet.has(id as CanonicalizedJson<PTableColumnId>);\n\n // -- Filtering validation --\n const stateFilters = tableStateNormalized.pTableParams.filters;\n const opsFilters = options?.filters ?? null;\n const filters: null | PlDataTableFilters =\n stateFilters != null && opsFilters != null\n ? { type: \"and\", filters: [stateFilters, opsFilters] }\n : (stateFilters ?? opsFilters);\n const filterColumns = filters ? collectFilterSpecColumns(filters) : [];\n const firstInvalidFilterColumn = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidFilterColumn)\n throw new Error(\n `Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`,\n );\n\n // -- Sorting validation --\n const userSorting = tableStateNormalized.pTableParams.sorting;\n const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];\n const firstInvalidSortingColumn = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalidSortingColumn)\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`,\n );\n\n const coreJoinType = options?.coreJoinType ?? \"full\";\n const fullDef = createPTableDef({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds) return hiddenColIds;\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(\n visibleColumns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n // if at least one column is not yet computed, we can't show the table\n if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDef({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { PColumnDataUniversal } from "../../../render/internal.js";
|
|
2
|
+
import { RenderCtxBase } from "../../../render/api.js";
|
|
3
|
+
import "../../../render/index.js";
|
|
4
|
+
import { CreatePlDataTableOps, PlDataTableModel } from "../typesV5.js";
|
|
5
|
+
import { PlDataTableStateV2 } from "../state-migration.js";
|
|
6
|
+
import { PColumn } from "@milaboratories/pl-model-common";
|
|
7
|
+
|
|
8
|
+
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts
|
|
9
|
+
type createPlDataTableOptionsV2 = {
|
|
10
|
+
columns: PColumn<PColumnDataUniversal>[];
|
|
11
|
+
tableState?: PlDataTableStateV2;
|
|
12
|
+
options?: CreatePlDataTableOps;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Create p-table spec and handle given ui table state
|
|
16
|
+
*
|
|
17
|
+
* @param ctx context
|
|
18
|
+
* @param columns column list
|
|
19
|
+
* @param tableState table ui state
|
|
20
|
+
* @returns PlAgDataTableV2 table source
|
|
21
|
+
*/
|
|
22
|
+
declare function createPlDataTableV2<A, U>(ctx: RenderCtxBase<A, U>, columns: createPlDataTableOptionsV2["columns"], tableState?: createPlDataTableOptionsV2["tableState"], options?: createPlDataTableOptionsV2["options"]): PlDataTableModel | undefined;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { createPlDataTableOptionsV2, createPlDataTableV2 };
|
|
25
|
+
//# sourceMappingURL=createPlDataTableV2.d.ts.map
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { deriveLabels } from "../../../render/util/label.js";
|
|
2
|
+
import { allPColumnsReady } from "../../../render/util/pcolumn_data.js";
|
|
3
|
+
import "../../../render/index.js";
|
|
4
|
+
import { collectFilterSpecColumns } from "../../../filters/traverse.js";
|
|
5
|
+
import { upgradePlDataTableStateV2 } from "../state-migration.js";
|
|
6
|
+
import { getAllLabelColumns, getMatchingLabelColumns } from "../labels.js";
|
|
7
|
+
import { createPTableDef, isColumnOptional } from "./createPlDataTableV3.js";
|
|
8
|
+
import { Annotation, canonicalizeJson, getAxisId, getColumnIdAndSpec, isLinkerColumn, parseJson, uniqueBy } from "@milaboratories/pl-model-common";
|
|
9
|
+
import { isEmpty } from "es-toolkit/compat";
|
|
10
|
+
import { identity } from "es-toolkit";
|
|
11
|
+
|
|
12
|
+
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts
|
|
13
|
+
/**
|
|
14
|
+
* Create p-table spec and handle given ui table state
|
|
15
|
+
*
|
|
16
|
+
* @param ctx context
|
|
17
|
+
* @param columns column list
|
|
18
|
+
* @param tableState table ui state
|
|
19
|
+
* @returns PlAgDataTableV2 table source
|
|
20
|
+
*/
|
|
21
|
+
function createPlDataTableV2(ctx, columns, tableState, options) {
|
|
22
|
+
if (columns.length === 0) return void 0;
|
|
23
|
+
const tableStateNormalized = upgradePlDataTableStateV2(tableState);
|
|
24
|
+
const allLabelColumns = getAllLabelColumns(ctx.resultPool);
|
|
25
|
+
if (!allLabelColumns) return void 0;
|
|
26
|
+
let fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);
|
|
27
|
+
fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map((v) => {
|
|
28
|
+
return {
|
|
29
|
+
...v.value,
|
|
30
|
+
spec: {
|
|
31
|
+
...v.value.spec,
|
|
32
|
+
annotations: {
|
|
33
|
+
...v.value.spec.annotations,
|
|
34
|
+
[Annotation.Label]: v.label
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
const fullColumns = [...columns, ...fullLabelColumns];
|
|
40
|
+
const fullColumnsIds = [...uniqueBy(fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))), (a) => canonicalizeJson(a)).map((a) => ({
|
|
41
|
+
type: "axis",
|
|
42
|
+
id: a
|
|
43
|
+
})), ...fullColumns.map((c) => ({
|
|
44
|
+
type: "column",
|
|
45
|
+
id: c.id
|
|
46
|
+
}))];
|
|
47
|
+
const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson(c)));
|
|
48
|
+
const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
|
|
49
|
+
const stateFilters = tableStateNormalized.pTableParams.filters;
|
|
50
|
+
const opsFilters = options?.filters ?? null;
|
|
51
|
+
const filters = stateFilters != null && opsFilters != null ? {
|
|
52
|
+
type: "and",
|
|
53
|
+
filters: [stateFilters, opsFilters]
|
|
54
|
+
} : stateFilters ?? opsFilters;
|
|
55
|
+
const firstInvalidFilterColumn = (filters ? collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
|
|
56
|
+
if (firstInvalidFilterColumn) throw new Error(`Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`);
|
|
57
|
+
const userSorting = tableStateNormalized.pTableParams.sorting;
|
|
58
|
+
const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];
|
|
59
|
+
const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId(canonicalizeJson(s.column)));
|
|
60
|
+
if (firstInvalidSortingColumn) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`);
|
|
61
|
+
const coreJoinType = options?.coreJoinType ?? "full";
|
|
62
|
+
const fullDef = createPTableDef({
|
|
63
|
+
columns,
|
|
64
|
+
labelColumns: fullLabelColumns,
|
|
65
|
+
coreJoinType,
|
|
66
|
+
filters,
|
|
67
|
+
sorting,
|
|
68
|
+
coreColumnPredicate: options?.coreColumnPredicate
|
|
69
|
+
});
|
|
70
|
+
const fullHandle = ctx.createPTableV2(fullDef);
|
|
71
|
+
const pframeHandle = ctx.createPFrame(fullColumns);
|
|
72
|
+
if (!fullHandle || !pframeHandle) return void 0;
|
|
73
|
+
const hiddenColumns = new Set((() => {
|
|
74
|
+
if (coreJoinType === "inner") return [];
|
|
75
|
+
const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;
|
|
76
|
+
if (hiddenColIds) return hiddenColIds;
|
|
77
|
+
return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);
|
|
78
|
+
})());
|
|
79
|
+
columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
|
|
80
|
+
const coreColumnPredicate = options?.coreColumnPredicate;
|
|
81
|
+
if (coreColumnPredicate) columns.flatMap((c) => coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : []).forEach((c) => hiddenColumns.delete(c));
|
|
82
|
+
sorting.map((s) => s.column).filter((c) => c.type === "column").forEach((c) => hiddenColumns.delete(c.id));
|
|
83
|
+
if (filters) collectFilterSpecColumns(filters).flatMap((c) => {
|
|
84
|
+
const obj = parseJson(c);
|
|
85
|
+
return obj.type === "column" ? [obj.id] : [];
|
|
86
|
+
}).forEach((c) => hiddenColumns.delete(c));
|
|
87
|
+
const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));
|
|
88
|
+
const visibleLabelColumns = getMatchingLabelColumns(visibleColumns.map(getColumnIdAndSpec), allLabelColumns);
|
|
89
|
+
if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return void 0;
|
|
90
|
+
const visibleDef = createPTableDef({
|
|
91
|
+
columns: visibleColumns,
|
|
92
|
+
labelColumns: visibleLabelColumns,
|
|
93
|
+
coreJoinType,
|
|
94
|
+
filters,
|
|
95
|
+
sorting,
|
|
96
|
+
coreColumnPredicate
|
|
97
|
+
});
|
|
98
|
+
const visibleHandle = ctx.createPTableV2(visibleDef);
|
|
99
|
+
if (!visibleHandle) return void 0;
|
|
100
|
+
return {
|
|
101
|
+
sourceId: tableStateNormalized.pTableParams.sourceId,
|
|
102
|
+
fullTableHandle: fullHandle,
|
|
103
|
+
fullPframeHandle: pframeHandle,
|
|
104
|
+
visibleTableHandle: visibleHandle
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
//#endregion
|
|
109
|
+
export { createPlDataTableV2 };
|
|
110
|
+
//# sourceMappingURL=createPlDataTableV2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPlDataTableV2.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts"],"sourcesContent":["import type {\n AxisId,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n CanonicalizedJson,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n uniqueBy,\n parseJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, RenderCtxBase } from \"../../../render\";\nimport { allPColumnsReady, deriveLabels } from \"../../../render\";\nimport { identity } from \"es-toolkit\";\nimport type { CreatePlDataTableOps, PlDataTableFilters, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { createPTableDef, isColumnOptional } from \"./createPlDataTableV3\";\n\nexport type createPlDataTableOptionsV2 = {\n columns: PColumn<PColumnDataUniversal>[];\n tableState?: PlDataTableStateV2;\n options?: CreatePlDataTableOps;\n};\n\n/**\n * Create p-table spec and handle given ui table state\n *\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns PlAgDataTableV2 table source\n */\nexport function createPlDataTableV2<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: createPlDataTableOptionsV2[\"columns\"],\n tableState?: createPlDataTableOptionsV2[\"tableState\"],\n options?: createPlDataTableOptionsV2[\"options\"],\n): PlDataTableModel | undefined {\n if (columns.length === 0) return undefined;\n\n const tableStateNormalized = upgradePlDataTableStateV2(tableState);\n\n const allLabelColumns = getAllLabelColumns(ctx.resultPool);\n if (!allLabelColumns) return undefined;\n\n let fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);\n fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map(\n (v) => {\n return {\n ...v.value,\n spec: {\n ...v.value.spec,\n annotations: {\n ...v.value.spec.annotations,\n [Annotation.Label]: v.label,\n },\n },\n };\n },\n );\n\n const fullColumns = [...columns, ...fullLabelColumns];\n\n const fullColumnsAxes = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))),\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: string): boolean =>\n fullColumnsIdsSet.has(id as CanonicalizedJson<PTableColumnId>);\n\n // -- Filtering validation --\n const stateFilters = tableStateNormalized.pTableParams.filters;\n const opsFilters = options?.filters ?? null;\n const filters: null | PlDataTableFilters =\n stateFilters != null && opsFilters != null\n ? { type: \"and\", filters: [stateFilters, opsFilters] }\n : (stateFilters ?? opsFilters);\n const filterColumns = filters ? collectFilterSpecColumns(filters) : [];\n const firstInvalidFilterColumn = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidFilterColumn)\n throw new Error(\n `Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`,\n );\n\n // -- Sorting validation --\n const userSorting = tableStateNormalized.pTableParams.sorting;\n const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];\n const firstInvalidSortingColumn = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalidSortingColumn)\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`,\n );\n\n const coreJoinType = options?.coreJoinType ?? \"full\";\n const fullDef = createPTableDef({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds) return hiddenColIds;\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(\n visibleColumns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n // if at least one column is not yet computed, we can't show the table\n if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDef({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n"],"mappings":"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"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
const require_runtime = require('
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
require('
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
require('
|
|
9
|
-
const
|
|
10
|
-
const
|
|
1
|
+
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_pcolumn_data = require('../../../render/util/pcolumn_data.cjs');
|
|
3
|
+
require('../../../render/index.cjs');
|
|
4
|
+
const require_traverse = require('../../../filters/traverse.cjs');
|
|
5
|
+
const require_filterToQuery = require('../../../filters/converters/filterToQuery.cjs');
|
|
6
|
+
const require_distill = require('../../../filters/distill.cjs');
|
|
7
|
+
require('../../../filters/index.cjs');
|
|
8
|
+
const require_state_migration = require('../state-migration.cjs');
|
|
9
|
+
const require_labels = require('../labels.cjs');
|
|
10
|
+
const require_column_snapshot_provider = require('../../../columns/column_snapshot_provider.cjs');
|
|
11
|
+
const require_column_collection_builder = require('../../../columns/column_collection_builder.cjs');
|
|
12
|
+
const require_ctx_column_sources = require('../../../columns/ctx_column_sources.cjs');
|
|
13
|
+
require('../../../columns/index.cjs');
|
|
11
14
|
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
12
15
|
let es_toolkit_compat = require("es-toolkit/compat");
|
|
13
16
|
let es_toolkit = require("es-toolkit");
|
|
14
17
|
|
|
15
|
-
//#region src/components/PlDataTable/
|
|
18
|
+
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts
|
|
16
19
|
/** Convert a PTableColumnId to a SpecQueryExpression reference. */
|
|
17
20
|
function columnIdToExpr(col) {
|
|
18
21
|
if (col.type === "axis") return {
|
|
@@ -85,32 +88,36 @@ function isColumnHidden(spec) {
|
|
|
85
88
|
function isColumnOptional(spec) {
|
|
86
89
|
return (0, _milaboratories_pl_model_common.readAnnotation)(spec, _milaboratories_pl_model_common.Annotation.Table.Visibility) === "optional";
|
|
87
90
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
91
|
+
function createPlDataTableV3(ctx, options) {
|
|
92
|
+
const providers = options.source ? normalizeSourceList(options.source).filter(require_column_snapshot_provider.isColumnSnapshotProvider) : require_ctx_column_sources.collectCtxColumnSnapshotProviders(ctx);
|
|
93
|
+
if (providers.length === 0) return void 0;
|
|
94
|
+
const builder = new require_column_collection_builder.ColumnCollectionBuilder(ctx).addSources(providers);
|
|
95
|
+
const anchors = options.columns.anchors;
|
|
96
|
+
const collection = (0, es_toolkit.isNil)(anchors) ? builder.build() : builder.build({ anchors });
|
|
97
|
+
if (!collection) return void 0;
|
|
98
|
+
const findOptions = options.columns ? {
|
|
99
|
+
include: options.columns.include,
|
|
100
|
+
exclude: options.columns.exclude,
|
|
101
|
+
mode: options.columns.mode,
|
|
102
|
+
maxHops: options.columns.maxHops
|
|
103
|
+
} : void 0;
|
|
104
|
+
const dataSnapshots = collection.findColumns(findOptions).map((v) => "column" in v ? v.column : v).filter((s) => !isColumnHidden(s.spec));
|
|
105
|
+
if (dataSnapshots.length === 0) return void 0;
|
|
106
|
+
const columns = [];
|
|
107
|
+
for (const snap of dataSnapshots) {
|
|
108
|
+
if (!snap.data) return void 0;
|
|
109
|
+
const data = snap.data.get();
|
|
110
|
+
if (data === void 0) return void 0;
|
|
111
|
+
columns.push({
|
|
112
|
+
id: snap.id,
|
|
113
|
+
spec: snap.spec,
|
|
114
|
+
data
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const tableStateNormalized = require_state_migration.upgradePlDataTableStateV2(options.state);
|
|
99
118
|
const allLabelColumns = require_labels.getAllLabelColumns(ctx.resultPool);
|
|
100
119
|
if (!allLabelColumns) return void 0;
|
|
101
|
-
|
|
102
|
-
fullLabelColumns = require_label.deriveLabels(fullLabelColumns, es_toolkit.identity, { includeNativeLabel: true }).map((v) => {
|
|
103
|
-
return {
|
|
104
|
-
...v.value,
|
|
105
|
-
spec: {
|
|
106
|
-
...v.value.spec,
|
|
107
|
-
annotations: {
|
|
108
|
-
...v.value.spec.annotations,
|
|
109
|
-
[_milaboratories_pl_model_common.Annotation.Label]: v.label
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
});
|
|
120
|
+
const fullLabelColumns = require_labels.getMatchingLabelColumns(columns.map(_milaboratories_pl_model_common.getColumnIdAndSpec), allLabelColumns);
|
|
114
121
|
const fullColumns = [...columns, ...fullLabelColumns];
|
|
115
122
|
const fullColumnsIds = [...(0, _milaboratories_pl_model_common.uniqueBy)(fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => (0, _milaboratories_pl_model_common.getAxisId)(a))), (a) => (0, _milaboratories_pl_model_common.canonicalizeJson)(a)).map((a) => ({
|
|
116
123
|
type: "axis",
|
|
@@ -122,7 +129,7 @@ function createPlDataTableV2(ctx, columns, tableState, ops) {
|
|
|
122
129
|
const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => (0, _milaboratories_pl_model_common.canonicalizeJson)(c)));
|
|
123
130
|
const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
|
|
124
131
|
const stateFilters = tableStateNormalized.pTableParams.filters;
|
|
125
|
-
const opsFilters =
|
|
132
|
+
const opsFilters = options?.filters ?? null;
|
|
126
133
|
const filters = stateFilters != null && opsFilters != null ? {
|
|
127
134
|
type: "and",
|
|
128
135
|
filters: [stateFilters, opsFilters]
|
|
@@ -130,17 +137,17 @@ function createPlDataTableV2(ctx, columns, tableState, ops) {
|
|
|
130
137
|
const firstInvalidFilterColumn = (filters ? require_traverse.collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
|
|
131
138
|
if (firstInvalidFilterColumn) throw new Error(`Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`);
|
|
132
139
|
const userSorting = tableStateNormalized.pTableParams.sorting;
|
|
133
|
-
const sorting = ((0, es_toolkit_compat.isEmpty)(userSorting) ?
|
|
140
|
+
const sorting = ((0, es_toolkit_compat.isEmpty)(userSorting) ? options?.sorting : userSorting) ?? [];
|
|
134
141
|
const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId((0, _milaboratories_pl_model_common.canonicalizeJson)(s.column)));
|
|
135
142
|
if (firstInvalidSortingColumn) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`);
|
|
136
|
-
const coreJoinType =
|
|
143
|
+
const coreJoinType = options?.coreJoinType ?? "full";
|
|
137
144
|
const fullDef = createPTableDef({
|
|
138
145
|
columns,
|
|
139
146
|
labelColumns: fullLabelColumns,
|
|
140
147
|
coreJoinType,
|
|
141
148
|
filters,
|
|
142
149
|
sorting,
|
|
143
|
-
coreColumnPredicate:
|
|
150
|
+
coreColumnPredicate: options?.coreColumnPredicate
|
|
144
151
|
});
|
|
145
152
|
const fullHandle = ctx.createPTableV2(fullDef);
|
|
146
153
|
const pframeHandle = ctx.createPFrame(fullColumns);
|
|
@@ -152,7 +159,7 @@ function createPlDataTableV2(ctx, columns, tableState, ops) {
|
|
|
152
159
|
return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);
|
|
153
160
|
})());
|
|
154
161
|
columns.filter((c) => (0, _milaboratories_pl_model_common.isLinkerColumn)(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
|
|
155
|
-
const coreColumnPredicate =
|
|
162
|
+
const coreColumnPredicate = options?.coreColumnPredicate;
|
|
156
163
|
if (coreColumnPredicate) columns.flatMap((c) => coreColumnPredicate((0, _milaboratories_pl_model_common.getColumnIdAndSpec)(c)) ? [c.id] : []).forEach((c) => hiddenColumns.delete(c));
|
|
157
164
|
sorting.map((s) => s.column).filter((c) => c.type === "column").forEach((c) => hiddenColumns.delete(c.id));
|
|
158
165
|
if (filters) require_traverse.collectFilterSpecColumns(filters).flatMap((c) => {
|
|
@@ -179,22 +186,15 @@ function createPlDataTableV2(ctx, columns, tableState, ops) {
|
|
|
179
186
|
visibleTableHandle: visibleHandle
|
|
180
187
|
};
|
|
181
188
|
}
|
|
182
|
-
/**
|
|
183
|
-
function
|
|
184
|
-
|
|
185
|
-
return
|
|
186
|
-
axis,
|
|
187
|
-
options: values.map((v) => ({
|
|
188
|
-
value: v,
|
|
189
|
-
label: labels?.[v] ?? v.toString()
|
|
190
|
-
})),
|
|
191
|
-
defaultValue: values[0]
|
|
192
|
-
};
|
|
189
|
+
/** Normalize raw ColumnSource | ColumnSource[] into a flat list of sources. */
|
|
190
|
+
function normalizeSourceList(source) {
|
|
191
|
+
if (Array.isArray(source) && source.length > 0 && (Array.isArray(source[0]) || require_column_snapshot_provider.isColumnSnapshotProvider(source[0]))) return source;
|
|
192
|
+
return [source];
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
//#endregion
|
|
196
|
-
exports.
|
|
197
|
-
exports.
|
|
196
|
+
exports.createPTableDef = createPTableDef;
|
|
197
|
+
exports.createPlDataTableV3 = createPlDataTableV3;
|
|
198
198
|
exports.isColumnHidden = isColumnHidden;
|
|
199
199
|
exports.isColumnOptional = isColumnOptional;
|
|
200
|
-
//# sourceMappingURL=
|
|
200
|
+
//# sourceMappingURL=createPlDataTableV3.cjs.map
|