@platforma-sdk/model 1.63.12 → 1.65.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_collection_builder.cjs +105 -92
- package/dist/columns/column_collection_builder.cjs.map +1 -1
- package/dist/columns/column_collection_builder.d.ts +13 -12
- package/dist/columns/column_collection_builder.d.ts.map +1 -1
- package/dist/columns/column_collection_builder.js +107 -94
- package/dist/columns/column_collection_builder.js.map +1 -1
- package/dist/columns/column_selector.cjs +8 -80
- package/dist/columns/column_selector.cjs.map +1 -1
- package/dist/columns/column_selector.d.ts +6 -14
- package/dist/columns/column_selector.d.ts.map +1 -1
- package/dist/columns/column_selector.js +6 -77
- package/dist/columns/column_selector.js.map +1 -1
- package/dist/columns/column_snapshot.cjs +3 -3
- package/dist/columns/column_snapshot.cjs.map +1 -1
- package/dist/columns/column_snapshot.d.ts +3 -3
- package/dist/columns/column_snapshot.d.ts.map +1 -1
- package/dist/columns/column_snapshot.js +3 -3
- package/dist/columns/column_snapshot.js.map +1 -1
- package/dist/columns/column_snapshot_provider.cjs +1 -1
- package/dist/columns/column_snapshot_provider.cjs.map +1 -1
- package/dist/columns/column_snapshot_provider.d.ts +8 -8
- package/dist/columns/column_snapshot_provider.d.ts.map +1 -1
- package/dist/columns/column_snapshot_provider.js +1 -1
- package/dist/columns/column_snapshot_provider.js.map +1 -1
- package/dist/columns/ctx_column_sources.cjs.map +1 -1
- package/dist/columns/ctx_column_sources.d.ts +2 -1
- package/dist/columns/ctx_column_sources.d.ts.map +1 -1
- package/dist/columns/ctx_column_sources.js.map +1 -1
- package/dist/columns/expand_by_partition.cjs +106 -0
- package/dist/columns/expand_by_partition.cjs.map +1 -0
- package/dist/columns/expand_by_partition.d.ts +33 -0
- package/dist/columns/expand_by_partition.d.ts.map +1 -0
- package/dist/columns/expand_by_partition.js +105 -0
- package/dist/columns/expand_by_partition.js.map +1 -0
- package/dist/columns/index.cjs +1 -0
- package/dist/columns/index.d.ts +4 -3
- package/dist/columns/index.js +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +26 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +25 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +68 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +67 -0
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +27 -17
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +4 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +28 -18
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +258 -175
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +37 -21
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +261 -175
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +64 -0
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -0
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +63 -0
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/index.cjs +2 -1
- package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -1
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.js +2 -1
- package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs +109 -0
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +19 -0
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/utils.js +102 -0
- package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -0
- package/dist/components/PlDataTable/index.cjs +3 -1
- package/dist/components/PlDataTable/index.d.ts +5 -3
- package/dist/components/PlDataTable/index.js +3 -1
- package/dist/components/PlDataTable/labels.cjs +25 -11
- package/dist/components/PlDataTable/labels.cjs.map +1 -1
- package/dist/components/PlDataTable/labels.js +25 -11
- package/dist/components/PlDataTable/labels.js.map +1 -1
- package/dist/components/PlDataTable/state-migration.cjs +8 -2
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
- package/dist/components/PlDataTable/state-migration.js +8 -2
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/typesV5.d.ts +23 -15
- package/dist/components/PlDataTable/typesV5.d.ts.map +1 -1
- package/dist/components/index.cjs +3 -1
- package/dist/components/index.d.ts +4 -2
- package/dist/components/index.js +3 -1
- package/dist/index.cjs +13 -9
- package/dist/index.d.ts +9 -7
- package/dist/index.js +6 -4
- package/dist/labels/derive_distinct_labels.cjs +39 -27
- package/dist/labels/derive_distinct_labels.cjs.map +1 -1
- package/dist/labels/derive_distinct_labels.d.ts +15 -15
- package/dist/labels/derive_distinct_labels.d.ts.map +1 -1
- package/dist/labels/derive_distinct_labels.js +39 -27
- package/dist/labels/derive_distinct_labels.js.map +1 -1
- package/dist/labels/index.cjs +0 -1
- package/dist/labels/index.d.ts +1 -2
- package/dist/labels/index.js +0 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/render/api.cjs +10 -3
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +2 -2
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +10 -3
- package/dist/render/api.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.map +1 -1
- package/dist/render/util/column_collection.js +3 -3
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/label.cjs +2 -2
- package/dist/render/util/label.cjs.map +1 -1
- package/dist/render/util/label.js +2 -2
- package/dist/render/util/label.js.map +1 -1
- package/dist/render/util/pcolumn_data.cjs.map +1 -1
- package/dist/render/util/pcolumn_data.d.ts +2 -2
- package/dist/render/util/pcolumn_data.d.ts.map +1 -1
- package/dist/render/util/pcolumn_data.js.map +1 -1
- package/package.json +7 -7
- package/src/columns/column_collection_builder.test.ts +40 -27
- package/src/columns/column_collection_builder.ts +176 -131
- package/src/columns/column_selector.test.ts +17 -399
- package/src/columns/column_selector.ts +14 -127
- package/src/columns/column_snapshot.ts +5 -5
- package/src/columns/column_snapshot_provider.ts +11 -10
- package/src/columns/ctx_column_sources.ts +2 -2
- package/src/columns/expand_by_partition.test.ts +4 -4
- package/src/columns/expand_by_partition.ts +4 -3
- package/src/columns/index.ts +1 -0
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +42 -0
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +89 -0
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +51 -19
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +500 -313
- package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +122 -0
- package/src/components/PlDataTable/createPlDataTable/index.ts +4 -2
- package/src/components/PlDataTable/createPlDataTable/utils.test.ts +257 -0
- package/src/components/PlDataTable/createPlDataTable/utils.ts +160 -0
- package/src/components/PlDataTable/index.ts +15 -2
- package/src/components/PlDataTable/labels.ts +29 -18
- package/src/components/PlDataTable/state-migration.ts +6 -1
- package/src/components/PlDataTable/typesV5.ts +25 -12
- package/src/labels/derive_distinct_labels.test.ts +143 -45
- package/src/labels/derive_distinct_labels.ts +102 -49
- package/src/labels/index.ts +0 -1
- package/src/render/api.ts +15 -5
- package/src/render/util/column_collection.ts +4 -3
- package/src/render/util/label.ts +2 -2
- package/src/render/util/pcolumn_data.ts +5 -3
- package/dist/labels/write_labels_to_specs.cjs +0 -14
- package/dist/labels/write_labels_to_specs.cjs.map +0 -1
- package/dist/labels/write_labels_to_specs.d.ts +0 -7
- package/dist/labels/write_labels_to_specs.d.ts.map +0 -1
- package/dist/labels/write_labels_to_specs.js +0 -13
- package/dist/labels/write_labels_to_specs.js.map +0 -1
- package/src/labels/write_labels_to_specs.ts +0 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand_by_partition.cjs","names":["convertOrParsePColumnData","getUniquePartitionKeys","filterDataInfoEntries","createReadyColumnData"],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n PartitionedDataInfoEntries,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeAxisId,\n entriesToDataInfo,\n getAxisId,\n isPartitionedDataInfoEntries,\n} from \"@milaboratories/pl-model-common\";\nimport type { TreeNodeAccessor } from \"../render/accessor\";\nimport { filterDataInfoEntries } from \"../render/util/axis_filtering\";\nimport { convertOrParsePColumnData, getUniquePartitionKeys } from \"../render/util/pcolumn_data\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport { createReadyColumnData } from \"./column_snapshot\";\n\n// --- Types ---\n\nexport interface SplitAxis {\n /** Index of the axis in the column's axesSpec to split by. */\n readonly idx: number;\n}\n\nexport interface ExpandByPartitionOpts {\n /** Resolve axis values to human-readable labels. */\n axisLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;\n}\n\nexport interface ExpandByPartitionResult {\n /** Expanded snapshots (one per key combination per original snapshot). */\n readonly items: ColumnSnapshot<PObjectId>[];\n /** False if any column's data was not ready for splitting. */\n readonly complete: boolean;\n}\n\n// --- Implementation ---\n\n/**\n * Expand snapshots by splitting along partition axes.\n *\n * For each snapshot, reads partition data, enumerates unique keys on the\n * split axes, and produces one output snapshot per key combination —\n * with the split axes removed from `axesSpec` and a `pl7.app/trace`\n * annotation recording the split origin.\n *\n * Returns `{ items: [], complete: false }` when any snapshot's data\n * is not ready (status !== 'ready' or partition data unavailable).\n */\nexport function expandByPartition(\n snapshots: ColumnSnapshot<PObjectId>[],\n splitAxes: SplitAxis[],\n opts?: ExpandByPartitionOpts,\n): ExpandByPartitionResult {\n if (splitAxes.length === 0) {\n return { items: snapshots, complete: true };\n }\n\n const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);\n const result: ColumnSnapshot<PObjectId>[] = [];\n\n for (const snapshot of snapshots) {\n if (snapshot.dataStatus !== \"ready\" || snapshot.data === undefined) {\n return { items: [], complete: false };\n }\n\n const rawData = snapshot.data.get();\n const dataEntries = convertOrParsePColumnData(rawData as TreeNodeAccessor | undefined);\n\n if (dataEntries === undefined) {\n return { items: [], complete: false };\n }\n\n if (!isPartitionedDataInfoEntries(dataEntries)) {\n throw new Error(\n `Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`,\n );\n }\n\n const uniqueKeys = getUniquePartitionKeys(dataEntries);\n\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n if (maxSplitIdx >= dataEntries.partitionKeyLength) {\n throw new Error(\n `Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`,\n );\n }\n\n // Resolve labels for each split axis\n const axesLabels: (undefined | Record<string | number, string>)[] = splitAxisIdxs.map((idx) =>\n opts?.axisLabels?.(getAxisId(snapshot.spec.axesSpec[idx])),\n );\n\n // Generate all key combinations across split axes\n const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);\n if (keyCombinations.length === 0) continue;\n\n // Build adjusted axesSpec (remove split axes in reverse order)\n const newAxesSpec = [...snapshot.spec.axesSpec];\n for (let i = splitAxisIdxs.length - 1; i >= 0; i--) {\n newAxesSpec.splice(splitAxisIdxs[i], 1);\n }\n\n for (const keyCombo of keyCombinations) {\n const axisFilters: AxisFilterByIdx[] = keyCombo.map(\n (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],\n );\n\n const traceEntries = keyCombo.map((value, sAxisIdx) => {\n const axisIdx = splitAxisIdxs[sAxisIdx];\n const axisId = getAxisId(snapshot.spec.axesSpec[axisIdx]);\n const labelMap = axesLabels[sAxisIdx];\n const label = labelMap?.[value] ?? String(value);\n return {\n type: `split:${canonicalizeAxisId(axisId)}`,\n label,\n importance: 1_000_000,\n };\n });\n\n const filteredData = filterDataInfoEntries(\n dataEntries as PartitionedDataInfoEntries<TreeNodeAccessor>,\n axisFilters,\n );\n\n const adjustedSpec = {\n ...snapshot.spec,\n axesSpec: newAxesSpec,\n annotations: {\n ...snapshot.spec.annotations,\n \"pl7.app/trace\": JSON.stringify(traceEntries),\n },\n };\n\n result.push({\n id: snapshot.id,\n spec: adjustedSpec,\n dataStatus: \"ready\",\n data: createReadyColumnData(() => entriesToDataInfo(filteredData)),\n });\n }\n }\n\n return { items: result, complete: true };\n}\n\nconst MAX_KEY_COMBINATIONS = 10_000;\n\nfunction generateKeyCombinations(\n uniqueKeys: (string | number)[][],\n splitAxisIdxs: number[],\n): (string | number)[][] {\n const combinations: (string | number)[][] = [];\n\n function generate(currentCombo: (string | number)[], sAxisIdx: number): void {\n if (sAxisIdx >= splitAxisIdxs.length) {\n combinations.push([...currentCombo]);\n if (combinations.length > MAX_KEY_COMBINATIONS) {\n throw new Error(\"Too many key combinations, aborting.\");\n }\n return;\n }\n\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length) {\n throw new Error(\n `Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`,\n );\n }\n\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n combinations.length = 0;\n return;\n }\n\n for (const val of axisValues) {\n currentCombo.push(val);\n generate(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n }\n\n generate([], 0);\n return combinations;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ColumnSnapshot } from "./column_snapshot.js";
|
|
2
|
+
import { AxisId, PObjectId } from "@milaboratories/pl-model-common";
|
|
3
|
+
|
|
4
|
+
//#region src/columns/expand_by_partition.d.ts
|
|
5
|
+
interface SplitAxis {
|
|
6
|
+
/** Index of the axis in the column's axesSpec to split by. */
|
|
7
|
+
readonly idx: number;
|
|
8
|
+
}
|
|
9
|
+
interface ExpandByPartitionOpts {
|
|
10
|
+
/** Resolve axis values to human-readable labels. */
|
|
11
|
+
axisLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;
|
|
12
|
+
}
|
|
13
|
+
interface ExpandByPartitionResult {
|
|
14
|
+
/** Expanded snapshots (one per key combination per original snapshot). */
|
|
15
|
+
readonly items: ColumnSnapshot<PObjectId>[];
|
|
16
|
+
/** False if any column's data was not ready for splitting. */
|
|
17
|
+
readonly complete: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Expand snapshots by splitting along partition axes.
|
|
21
|
+
*
|
|
22
|
+
* For each snapshot, reads partition data, enumerates unique keys on the
|
|
23
|
+
* split axes, and produces one output snapshot per key combination —
|
|
24
|
+
* with the split axes removed from `axesSpec` and a `pl7.app/trace`
|
|
25
|
+
* annotation recording the split origin.
|
|
26
|
+
*
|
|
27
|
+
* Returns `{ items: [], complete: false }` when any snapshot's data
|
|
28
|
+
* is not ready (status !== 'ready' or partition data unavailable).
|
|
29
|
+
*/
|
|
30
|
+
declare function expandByPartition(snapshots: ColumnSnapshot<PObjectId>[], splitAxes: SplitAxis[], opts?: ExpandByPartitionOpts): ExpandByPartitionResult;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { ExpandByPartitionOpts, ExpandByPartitionResult, SplitAxis, expandByPartition };
|
|
33
|
+
//# sourceMappingURL=expand_by_partition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand_by_partition.d.ts","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"mappings":";;;;UAqBiB,SAAA;;WAEN,GAAA;AAAA;AAAA,UAGM,qBAAA;EAHN;EAKT,UAAA,IAAc,MAAA,EAAQ,MAAA,iBAAuB,MAAA;AAAA;AAAA,UAG9B,uBAAA;;WAEN,KAAA,EAAO,cAAA,CAAe,SAAA;EAL/B;EAAA,SAOS,QAAA;AAAA;;;;AAJX;;;;;;;;iBAoBgB,iBAAA,CACd,SAAA,EAAW,cAAA,CAAe,SAAA,KAC1B,SAAA,EAAW,SAAA,IACX,IAAA,GAAO,qBAAA,GACN,uBAAA"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { filterDataInfoEntries } from "../render/util/axis_filtering.js";
|
|
2
|
+
import { convertOrParsePColumnData, getUniquePartitionKeys } from "../render/util/pcolumn_data.js";
|
|
3
|
+
import { createReadyColumnData } from "./column_snapshot.js";
|
|
4
|
+
import { canonicalizeAxisId, entriesToDataInfo, getAxisId, isPartitionedDataInfoEntries } from "@milaboratories/pl-model-common";
|
|
5
|
+
//#region src/columns/expand_by_partition.ts
|
|
6
|
+
/**
|
|
7
|
+
* Expand snapshots by splitting along partition axes.
|
|
8
|
+
*
|
|
9
|
+
* For each snapshot, reads partition data, enumerates unique keys on the
|
|
10
|
+
* split axes, and produces one output snapshot per key combination —
|
|
11
|
+
* with the split axes removed from `axesSpec` and a `pl7.app/trace`
|
|
12
|
+
* annotation recording the split origin.
|
|
13
|
+
*
|
|
14
|
+
* Returns `{ items: [], complete: false }` when any snapshot's data
|
|
15
|
+
* is not ready (status !== 'ready' or partition data unavailable).
|
|
16
|
+
*/
|
|
17
|
+
function expandByPartition(snapshots, splitAxes, opts) {
|
|
18
|
+
if (splitAxes.length === 0) return {
|
|
19
|
+
items: snapshots,
|
|
20
|
+
complete: true
|
|
21
|
+
};
|
|
22
|
+
const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);
|
|
23
|
+
const result = [];
|
|
24
|
+
for (const snapshot of snapshots) {
|
|
25
|
+
if (snapshot.dataStatus !== "ready" || snapshot.data === void 0) return {
|
|
26
|
+
items: [],
|
|
27
|
+
complete: false
|
|
28
|
+
};
|
|
29
|
+
const dataEntries = convertOrParsePColumnData(snapshot.data.get());
|
|
30
|
+
if (dataEntries === void 0) return {
|
|
31
|
+
items: [],
|
|
32
|
+
complete: false
|
|
33
|
+
};
|
|
34
|
+
if (!isPartitionedDataInfoEntries(dataEntries)) throw new Error(`Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`);
|
|
35
|
+
const uniqueKeys = getUniquePartitionKeys(dataEntries);
|
|
36
|
+
const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];
|
|
37
|
+
if (maxSplitIdx >= dataEntries.partitionKeyLength) throw new Error(`Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`);
|
|
38
|
+
const axesLabels = splitAxisIdxs.map((idx) => opts?.axisLabels?.(getAxisId(snapshot.spec.axesSpec[idx])));
|
|
39
|
+
const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);
|
|
40
|
+
if (keyCombinations.length === 0) continue;
|
|
41
|
+
const newAxesSpec = [...snapshot.spec.axesSpec];
|
|
42
|
+
for (let i = splitAxisIdxs.length - 1; i >= 0; i--) newAxesSpec.splice(splitAxisIdxs[i], 1);
|
|
43
|
+
for (const keyCombo of keyCombinations) {
|
|
44
|
+
const axisFilters = keyCombo.map((value, sAxisIdx) => [splitAxisIdxs[sAxisIdx], value]);
|
|
45
|
+
const traceEntries = keyCombo.map((value, sAxisIdx) => {
|
|
46
|
+
const axisIdx = splitAxisIdxs[sAxisIdx];
|
|
47
|
+
const axisId = getAxisId(snapshot.spec.axesSpec[axisIdx]);
|
|
48
|
+
const label = axesLabels[sAxisIdx]?.[value] ?? String(value);
|
|
49
|
+
return {
|
|
50
|
+
type: `split:${canonicalizeAxisId(axisId)}`,
|
|
51
|
+
label,
|
|
52
|
+
importance: 1e6
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
const filteredData = filterDataInfoEntries(dataEntries, axisFilters);
|
|
56
|
+
const adjustedSpec = {
|
|
57
|
+
...snapshot.spec,
|
|
58
|
+
axesSpec: newAxesSpec,
|
|
59
|
+
annotations: {
|
|
60
|
+
...snapshot.spec.annotations,
|
|
61
|
+
"pl7.app/trace": JSON.stringify(traceEntries)
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
result.push({
|
|
65
|
+
id: snapshot.id,
|
|
66
|
+
spec: adjustedSpec,
|
|
67
|
+
dataStatus: "ready",
|
|
68
|
+
data: createReadyColumnData(() => entriesToDataInfo(filteredData))
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
items: result,
|
|
74
|
+
complete: true
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const MAX_KEY_COMBINATIONS = 1e4;
|
|
78
|
+
function generateKeyCombinations(uniqueKeys, splitAxisIdxs) {
|
|
79
|
+
const combinations = [];
|
|
80
|
+
function generate(currentCombo, sAxisIdx) {
|
|
81
|
+
if (sAxisIdx >= splitAxisIdxs.length) {
|
|
82
|
+
combinations.push([...currentCombo]);
|
|
83
|
+
if (combinations.length > MAX_KEY_COMBINATIONS) throw new Error("Too many key combinations, aborting.");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const axisIdx = splitAxisIdxs[sAxisIdx];
|
|
87
|
+
if (axisIdx >= uniqueKeys.length) throw new Error(`Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`);
|
|
88
|
+
const axisValues = uniqueKeys[axisIdx];
|
|
89
|
+
if (!axisValues || axisValues.length === 0) {
|
|
90
|
+
combinations.length = 0;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
for (const val of axisValues) {
|
|
94
|
+
currentCombo.push(val);
|
|
95
|
+
generate(currentCombo, sAxisIdx + 1);
|
|
96
|
+
currentCombo.pop();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
generate([], 0);
|
|
100
|
+
return combinations;
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
103
|
+
export { expandByPartition };
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=expand_by_partition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand_by_partition.js","names":[],"sources":["../../src/columns/expand_by_partition.ts"],"sourcesContent":["import type {\n AxisFilterByIdx,\n AxisFilterValue,\n AxisId,\n PartitionedDataInfoEntries,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeAxisId,\n entriesToDataInfo,\n getAxisId,\n isPartitionedDataInfoEntries,\n} from \"@milaboratories/pl-model-common\";\nimport type { TreeNodeAccessor } from \"../render/accessor\";\nimport { filterDataInfoEntries } from \"../render/util/axis_filtering\";\nimport { convertOrParsePColumnData, getUniquePartitionKeys } from \"../render/util/pcolumn_data\";\nimport type { ColumnSnapshot } from \"./column_snapshot\";\nimport { createReadyColumnData } from \"./column_snapshot\";\n\n// --- Types ---\n\nexport interface SplitAxis {\n /** Index of the axis in the column's axesSpec to split by. */\n readonly idx: number;\n}\n\nexport interface ExpandByPartitionOpts {\n /** Resolve axis values to human-readable labels. */\n axisLabels?: (axisId: AxisId) => undefined | Record<string | number, string>;\n}\n\nexport interface ExpandByPartitionResult {\n /** Expanded snapshots (one per key combination per original snapshot). */\n readonly items: ColumnSnapshot<PObjectId>[];\n /** False if any column's data was not ready for splitting. */\n readonly complete: boolean;\n}\n\n// --- Implementation ---\n\n/**\n * Expand snapshots by splitting along partition axes.\n *\n * For each snapshot, reads partition data, enumerates unique keys on the\n * split axes, and produces one output snapshot per key combination —\n * with the split axes removed from `axesSpec` and a `pl7.app/trace`\n * annotation recording the split origin.\n *\n * Returns `{ items: [], complete: false }` when any snapshot's data\n * is not ready (status !== 'ready' or partition data unavailable).\n */\nexport function expandByPartition(\n snapshots: ColumnSnapshot<PObjectId>[],\n splitAxes: SplitAxis[],\n opts?: ExpandByPartitionOpts,\n): ExpandByPartitionResult {\n if (splitAxes.length === 0) {\n return { items: snapshots, complete: true };\n }\n\n const splitAxisIdxs = splitAxes.map((a) => a.idx).sort((a, b) => a - b);\n const result: ColumnSnapshot<PObjectId>[] = [];\n\n for (const snapshot of snapshots) {\n if (snapshot.dataStatus !== \"ready\" || snapshot.data === undefined) {\n return { items: [], complete: false };\n }\n\n const rawData = snapshot.data.get();\n const dataEntries = convertOrParsePColumnData(rawData as TreeNodeAccessor | undefined);\n\n if (dataEntries === undefined) {\n return { items: [], complete: false };\n }\n\n if (!isPartitionedDataInfoEntries(dataEntries)) {\n throw new Error(\n `Splitting requires Partitioned DataInfoEntries, but got ${dataEntries.type} for column ${String(snapshot.id)}`,\n );\n }\n\n const uniqueKeys = getUniquePartitionKeys(dataEntries);\n\n const maxSplitIdx = splitAxisIdxs[splitAxisIdxs.length - 1];\n if (maxSplitIdx >= dataEntries.partitionKeyLength) {\n throw new Error(\n `Not enough partition keys (${dataEntries.partitionKeyLength}) for requested split axes (max index ${maxSplitIdx}) in column ${snapshot.spec.name}`,\n );\n }\n\n // Resolve labels for each split axis\n const axesLabels: (undefined | Record<string | number, string>)[] = splitAxisIdxs.map((idx) =>\n opts?.axisLabels?.(getAxisId(snapshot.spec.axesSpec[idx])),\n );\n\n // Generate all key combinations across split axes\n const keyCombinations = generateKeyCombinations(uniqueKeys, splitAxisIdxs);\n if (keyCombinations.length === 0) continue;\n\n // Build adjusted axesSpec (remove split axes in reverse order)\n const newAxesSpec = [...snapshot.spec.axesSpec];\n for (let i = splitAxisIdxs.length - 1; i >= 0; i--) {\n newAxesSpec.splice(splitAxisIdxs[i], 1);\n }\n\n for (const keyCombo of keyCombinations) {\n const axisFilters: AxisFilterByIdx[] = keyCombo.map(\n (value, sAxisIdx): AxisFilterByIdx => [splitAxisIdxs[sAxisIdx], value as AxisFilterValue],\n );\n\n const traceEntries = keyCombo.map((value, sAxisIdx) => {\n const axisIdx = splitAxisIdxs[sAxisIdx];\n const axisId = getAxisId(snapshot.spec.axesSpec[axisIdx]);\n const labelMap = axesLabels[sAxisIdx];\n const label = labelMap?.[value] ?? String(value);\n return {\n type: `split:${canonicalizeAxisId(axisId)}`,\n label,\n importance: 1_000_000,\n };\n });\n\n const filteredData = filterDataInfoEntries(\n dataEntries as PartitionedDataInfoEntries<TreeNodeAccessor>,\n axisFilters,\n );\n\n const adjustedSpec = {\n ...snapshot.spec,\n axesSpec: newAxesSpec,\n annotations: {\n ...snapshot.spec.annotations,\n \"pl7.app/trace\": JSON.stringify(traceEntries),\n },\n };\n\n result.push({\n id: snapshot.id,\n spec: adjustedSpec,\n dataStatus: \"ready\",\n data: createReadyColumnData(() => entriesToDataInfo(filteredData)),\n });\n }\n }\n\n return { items: result, complete: true };\n}\n\nconst MAX_KEY_COMBINATIONS = 10_000;\n\nfunction generateKeyCombinations(\n uniqueKeys: (string | number)[][],\n splitAxisIdxs: number[],\n): (string | number)[][] {\n const combinations: (string | number)[][] = [];\n\n function generate(currentCombo: (string | number)[], sAxisIdx: number): void {\n if (sAxisIdx >= splitAxisIdxs.length) {\n combinations.push([...currentCombo]);\n if (combinations.length > MAX_KEY_COMBINATIONS) {\n throw new Error(\"Too many key combinations, aborting.\");\n }\n return;\n }\n\n const axisIdx = splitAxisIdxs[sAxisIdx];\n if (axisIdx >= uniqueKeys.length) {\n throw new Error(\n `Axis index ${axisIdx} out of bounds for unique keys array (length ${uniqueKeys.length})`,\n );\n }\n\n const axisValues = uniqueKeys[axisIdx];\n if (!axisValues || axisValues.length === 0) {\n combinations.length = 0;\n return;\n }\n\n for (const val of axisValues) {\n currentCombo.push(val);\n generate(currentCombo, sAxisIdx + 1);\n currentCombo.pop();\n }\n }\n\n generate([], 0);\n return combinations;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmDA,SAAgB,kBACd,WACA,WACA,MACyB;AACzB,KAAI,UAAU,WAAW,EACvB,QAAO;EAAE,OAAO;EAAW,UAAU;EAAM;CAG7C,MAAM,gBAAgB,UAAU,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE;CACvE,MAAM,SAAsC,EAAE;AAE9C,MAAK,MAAM,YAAY,WAAW;AAChC,MAAI,SAAS,eAAe,WAAW,SAAS,SAAS,KAAA,EACvD,QAAO;GAAE,OAAO,EAAE;GAAE,UAAU;GAAO;EAIvC,MAAM,cAAc,0BADJ,SAAS,KAAK,KAAK,CACmD;AAEtF,MAAI,gBAAgB,KAAA,EAClB,QAAO;GAAE,OAAO,EAAE;GAAE,UAAU;GAAO;AAGvC,MAAI,CAAC,6BAA6B,YAAY,CAC5C,OAAM,IAAI,MACR,2DAA2D,YAAY,KAAK,cAAc,OAAO,SAAS,GAAG,GAC9G;EAGH,MAAM,aAAa,uBAAuB,YAAY;EAEtD,MAAM,cAAc,cAAc,cAAc,SAAS;AACzD,MAAI,eAAe,YAAY,mBAC7B,OAAM,IAAI,MACR,8BAA8B,YAAY,mBAAmB,wCAAwC,YAAY,cAAc,SAAS,KAAK,OAC9I;EAIH,MAAM,aAA8D,cAAc,KAAK,QACrF,MAAM,aAAa,UAAU,SAAS,KAAK,SAAS,KAAK,CAAC,CAC3D;EAGD,MAAM,kBAAkB,wBAAwB,YAAY,cAAc;AAC1E,MAAI,gBAAgB,WAAW,EAAG;EAGlC,MAAM,cAAc,CAAC,GAAG,SAAS,KAAK,SAAS;AAC/C,OAAK,IAAI,IAAI,cAAc,SAAS,GAAG,KAAK,GAAG,IAC7C,aAAY,OAAO,cAAc,IAAI,EAAE;AAGzC,OAAK,MAAM,YAAY,iBAAiB;GACtC,MAAM,cAAiC,SAAS,KAC7C,OAAO,aAA8B,CAAC,cAAc,WAAW,MAAyB,CAC1F;GAED,MAAM,eAAe,SAAS,KAAK,OAAO,aAAa;IACrD,MAAM,UAAU,cAAc;IAC9B,MAAM,SAAS,UAAU,SAAS,KAAK,SAAS,SAAS;IAEzD,MAAM,QADW,WAAW,YACH,UAAU,OAAO,MAAM;AAChD,WAAO;KACL,MAAM,SAAS,mBAAmB,OAAO;KACzC;KACA,YAAY;KACb;KACD;GAEF,MAAM,eAAe,sBACnB,aACA,YACD;GAED,MAAM,eAAe;IACnB,GAAG,SAAS;IACZ,UAAU;IACV,aAAa;KACX,GAAG,SAAS,KAAK;KACjB,iBAAiB,KAAK,UAAU,aAAa;KAC9C;IACF;AAED,UAAO,KAAK;IACV,IAAI,SAAS;IACb,MAAM;IACN,YAAY;IACZ,MAAM,4BAA4B,kBAAkB,aAAa,CAAC;IACnE,CAAC;;;AAIN,QAAO;EAAE,OAAO;EAAQ,UAAU;EAAM;;AAG1C,MAAM,uBAAuB;AAE7B,SAAS,wBACP,YACA,eACuB;CACvB,MAAM,eAAsC,EAAE;CAE9C,SAAS,SAAS,cAAmC,UAAwB;AAC3E,MAAI,YAAY,cAAc,QAAQ;AACpC,gBAAa,KAAK,CAAC,GAAG,aAAa,CAAC;AACpC,OAAI,aAAa,SAAS,qBACxB,OAAM,IAAI,MAAM,uCAAuC;AAEzD;;EAGF,MAAM,UAAU,cAAc;AAC9B,MAAI,WAAW,WAAW,OACxB,OAAM,IAAI,MACR,cAAc,QAAQ,+CAA+C,WAAW,OAAO,GACxF;EAGH,MAAM,aAAa,WAAW;AAC9B,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,gBAAa,SAAS;AACtB;;AAGF,OAAK,MAAM,OAAO,YAAY;AAC5B,gBAAa,KAAK,IAAI;AACtB,YAAS,cAAc,WAAW,EAAE;AACpC,gBAAa,KAAK;;;AAItB,UAAS,EAAE,EAAE,EAAE;AACf,QAAO"}
|
package/dist/columns/index.cjs
CHANGED
package/dist/columns/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ColumnData, ColumnDataStatus, ColumnSnapshot, createColumnSnapshot, createReadyColumnData } from "./column_snapshot.js";
|
|
2
2
|
import { ArrayColumnProvider, ColumnSnapshotProvider, ColumnSource, OutputColumnProvider, OutputColumnProviderOpts, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./column_snapshot_provider.js";
|
|
3
|
-
import {
|
|
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";
|
|
3
|
+
import { ColumnSelector, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, StringMatcher, convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./column_selector.js";
|
|
4
|
+
import { AnchorEntry, 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";
|
|
6
|
+
import { ExpandByPartitionOpts, ExpandByPartitionResult, SplitAxis, expandByPartition } from "./expand_by_partition.js";
|
package/dist/columns/index.js
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require("../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_createPTableDefV3 = require("./createPTableDefV3.cjs");
|
|
3
|
+
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
4
|
+
let es_toolkit = require("es-toolkit");
|
|
5
|
+
//#region src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts
|
|
6
|
+
function createPTableDefV2(params) {
|
|
7
|
+
let coreColumns = params.columns;
|
|
8
|
+
const secondaryColumns = [];
|
|
9
|
+
if ((0, es_toolkit.isFunction)(params.coreColumnPredicate)) {
|
|
10
|
+
coreColumns = [];
|
|
11
|
+
for (const c of params.columns) if (params.coreColumnPredicate((0, _milaboratories_pl_model_common.getColumnIdAndSpec)(c))) coreColumns.push(c);
|
|
12
|
+
else secondaryColumns.push(c);
|
|
13
|
+
}
|
|
14
|
+
secondaryColumns.push(...params.labelColumns);
|
|
15
|
+
return require_createPTableDefV3.createPTableDefV3({
|
|
16
|
+
primaryColumns: coreColumns,
|
|
17
|
+
secondaryGroups: secondaryColumns.map((c) => [c]),
|
|
18
|
+
primaryJoinType: params.coreJoinType,
|
|
19
|
+
filters: params.filters,
|
|
20
|
+
sorting: params.sorting
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
exports.createPTableDefV2 = createPTableDefV2;
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=createPTableDefV2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPTableDefV2.cjs","names":["createPTableDefV3"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnIdAndSpec,\n PTableSorting,\n PTableDefV2,\n DataInfo,\n PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { getColumnIdAndSpec } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, TreeNodeAccessor } from \"../../../render\";\nimport { isFunction } from \"es-toolkit\";\nimport type { PlDataTableFilters } from \"../typesV5\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\n\nexport function createPTableDefV2(params: {\n columns: PColumn<PColumnDataUniversal>[];\n labelColumns: PColumn<PColumnDataUniversal>[];\n coreJoinType: \"inner\" | \"full\";\n filters: null | PlDataTableFilters;\n sorting: PTableSorting[];\n coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;\n}): PTableDefV2<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> {\n let coreColumns = params.columns;\n const secondaryColumns: typeof params.columns = [];\n\n if (isFunction(params.coreColumnPredicate)) {\n coreColumns = [];\n for (const c of params.columns)\n if (params.coreColumnPredicate(getColumnIdAndSpec(c))) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...params.labelColumns);\n\n return createPTableDefV3({\n primaryColumns: coreColumns,\n secondaryGroups: secondaryColumns.map((c) => [c]),\n primaryJoinType: params.coreJoinType,\n filters: params.filters,\n sorting: params.sorting,\n });\n}\n"],"mappings":";;;;;AAcA,SAAgB,kBAAkB,QAOsD;CACtF,IAAI,cAAc,OAAO;CACzB,MAAM,mBAA0C,EAAE;AAElD,MAAA,GAAA,WAAA,YAAe,OAAO,oBAAoB,EAAE;AAC1C,gBAAc,EAAE;AAChB,OAAK,MAAM,KAAK,OAAO,QACrB,KAAI,OAAO,qBAAA,GAAA,gCAAA,oBAAuC,EAAE,CAAC,CAAE,aAAY,KAAK,EAAE;MACrE,kBAAiB,KAAK,EAAE;;AAGjC,kBAAiB,KAAK,GAAG,OAAO,aAAa;AAE7C,QAAOA,0BAAAA,kBAAkB;EACvB,gBAAgB;EAChB,iBAAiB,iBAAiB,KAAK,MAAM,CAAC,EAAE,CAAC;EACjD,iBAAiB,OAAO;EACxB,SAAS,OAAO;EAChB,SAAS,OAAO;EACjB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createPTableDefV3 } from "./createPTableDefV3.js";
|
|
2
|
+
import { getColumnIdAndSpec } from "@milaboratories/pl-model-common";
|
|
3
|
+
import { isFunction } from "es-toolkit";
|
|
4
|
+
//#region src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts
|
|
5
|
+
function createPTableDefV2(params) {
|
|
6
|
+
let coreColumns = params.columns;
|
|
7
|
+
const secondaryColumns = [];
|
|
8
|
+
if (isFunction(params.coreColumnPredicate)) {
|
|
9
|
+
coreColumns = [];
|
|
10
|
+
for (const c of params.columns) if (params.coreColumnPredicate(getColumnIdAndSpec(c))) coreColumns.push(c);
|
|
11
|
+
else secondaryColumns.push(c);
|
|
12
|
+
}
|
|
13
|
+
secondaryColumns.push(...params.labelColumns);
|
|
14
|
+
return createPTableDefV3({
|
|
15
|
+
primaryColumns: coreColumns,
|
|
16
|
+
secondaryGroups: secondaryColumns.map((c) => [c]),
|
|
17
|
+
primaryJoinType: params.coreJoinType,
|
|
18
|
+
filters: params.filters,
|
|
19
|
+
sorting: params.sorting
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { createPTableDefV2 };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=createPTableDefV2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPTableDefV2.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnIdAndSpec,\n PTableSorting,\n PTableDefV2,\n DataInfo,\n PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { getColumnIdAndSpec } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, TreeNodeAccessor } from \"../../../render\";\nimport { isFunction } from \"es-toolkit\";\nimport type { PlDataTableFilters } from \"../typesV5\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\n\nexport function createPTableDefV2(params: {\n columns: PColumn<PColumnDataUniversal>[];\n labelColumns: PColumn<PColumnDataUniversal>[];\n coreJoinType: \"inner\" | \"full\";\n filters: null | PlDataTableFilters;\n sorting: PTableSorting[];\n coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;\n}): PTableDefV2<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> {\n let coreColumns = params.columns;\n const secondaryColumns: typeof params.columns = [];\n\n if (isFunction(params.coreColumnPredicate)) {\n coreColumns = [];\n for (const c of params.columns)\n if (params.coreColumnPredicate(getColumnIdAndSpec(c))) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...params.labelColumns);\n\n return createPTableDefV3({\n primaryColumns: coreColumns,\n secondaryGroups: secondaryColumns.map((c) => [c]),\n primaryJoinType: params.coreJoinType,\n filters: params.filters,\n sorting: params.sorting,\n });\n}\n"],"mappings":";;;;AAcA,SAAgB,kBAAkB,QAOsD;CACtF,IAAI,cAAc,OAAO;CACzB,MAAM,mBAA0C,EAAE;AAElD,KAAI,WAAW,OAAO,oBAAoB,EAAE;AAC1C,gBAAc,EAAE;AAChB,OAAK,MAAM,KAAK,OAAO,QACrB,KAAI,OAAO,oBAAoB,mBAAmB,EAAE,CAAC,CAAE,aAAY,KAAK,EAAE;MACrE,kBAAiB,KAAK,EAAE;;AAGjC,kBAAiB,KAAK,GAAG,OAAO,aAAa;AAE7C,QAAO,kBAAkB;EACvB,gBAAgB;EAChB,iBAAiB,iBAAiB,KAAK,MAAM,CAAC,EAAE,CAAC;EACjD,iBAAiB,OAAO;EACxB,SAAS,OAAO;EAChB,SAAS,OAAO;EACjB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require("../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_filterToQuery = require("../../../filters/converters/filterToQuery.cjs");
|
|
3
|
+
const require_distill = require("../../../filters/distill.cjs");
|
|
4
|
+
require("../../../filters/index.cjs");
|
|
5
|
+
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
6
|
+
let es_toolkit = require("es-toolkit");
|
|
7
|
+
//#region src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts
|
|
8
|
+
function createPTableDefV3(params) {
|
|
9
|
+
let query = {
|
|
10
|
+
type: "outerJoin",
|
|
11
|
+
primary: toJoinEntry({
|
|
12
|
+
type: params.primaryJoinType === "inner" ? "innerJoin" : "fullJoin",
|
|
13
|
+
entries: params.primaryColumns.map((c) => toJoinEntry({
|
|
14
|
+
type: "column",
|
|
15
|
+
column: c
|
|
16
|
+
}))
|
|
17
|
+
}),
|
|
18
|
+
secondary: params.secondaryGroups.map((group) => toJoinEntry({
|
|
19
|
+
type: "innerJoin",
|
|
20
|
+
entries: group.map((c) => toJoinEntry({
|
|
21
|
+
type: "column",
|
|
22
|
+
column: c
|
|
23
|
+
}))
|
|
24
|
+
}))
|
|
25
|
+
};
|
|
26
|
+
if (!(0, es_toolkit.isNil)(params.filters)) {
|
|
27
|
+
const nonEmpty = require_distill.distillFilterSpec(params.filters);
|
|
28
|
+
if (!(0, es_toolkit.isNil)(nonEmpty)) {
|
|
29
|
+
const pridicate = require_filterToQuery.filterSpecToSpecQueryExpr(nonEmpty);
|
|
30
|
+
if (!(0, _milaboratories_pl_model_common.isBooleanExpression)(pridicate)) throw new Error(`Filter conversion produced a non-boolean expression (got type "${pridicate.type}"), expected a boolean predicate for query filtering`);
|
|
31
|
+
query = {
|
|
32
|
+
type: "filter",
|
|
33
|
+
input: query,
|
|
34
|
+
predicate: pridicate
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!(0, es_toolkit.isNil)(params.sorting) && params.sorting.length > 0) query = {
|
|
39
|
+
type: "sort",
|
|
40
|
+
input: query,
|
|
41
|
+
sortBy: params.sorting.map((s) => ({
|
|
42
|
+
expression: columnIdToExpr(s.column),
|
|
43
|
+
ascending: s.ascending,
|
|
44
|
+
nullsFirst: !s.naAndAbsentAreLeastValues
|
|
45
|
+
}))
|
|
46
|
+
};
|
|
47
|
+
return { query };
|
|
48
|
+
}
|
|
49
|
+
/** Convert a PTableColumnId to a SpecQueryExpression reference. */
|
|
50
|
+
function columnIdToExpr(col) {
|
|
51
|
+
return col.type === "axis" ? {
|
|
52
|
+
type: "axisRef",
|
|
53
|
+
value: col.id
|
|
54
|
+
} : {
|
|
55
|
+
type: "columnRef",
|
|
56
|
+
value: col.id
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function toJoinEntry(input) {
|
|
60
|
+
return {
|
|
61
|
+
entry: input,
|
|
62
|
+
qualifications: []
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
exports.createPTableDefV3 = createPTableDefV3;
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=createPTableDefV3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPTableDefV3.cjs","names":["distillFilterSpec","filterSpecToSpecQueryExpr"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts"],"sourcesContent":["import type {\n PColumn,\n PTableColumnId,\n PTableSorting,\n PTableDefV2,\n SingleAxisSelector,\n SpecQuery,\n SpecQueryExpression,\n SpecQueryJoinEntry,\n} from \"@milaboratories/pl-model-common\";\nimport { isBooleanExpression } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../../../render\";\nimport { isNil } from \"es-toolkit\";\nimport type { PlDataTableFilters } from \"../typesV5\";\nimport { distillFilterSpec, filterSpecToSpecQueryExpr } from \"../../../filters\";\nimport type { Nil } from \"@milaboratories/helpers\";\n\nexport function createPTableDefV3<Data = PColumnDataUniversal>(params: {\n primaryJoinType: \"inner\" | \"full\";\n primaryColumns: PColumn<Data>[];\n secondaryGroups: PColumn<Data>[][];\n filters?: Nil | PlDataTableFilters;\n sorting?: Nil | PTableSorting[];\n}): PTableDefV2<PColumn<Data>> {\n // Build SpecQuery directly from columns\n const coreJoinQuery: SpecQuery<PColumn<Data>> = {\n type: params.primaryJoinType === \"inner\" ? \"innerJoin\" : \"fullJoin\",\n entries: params.primaryColumns.map((c) => toJoinEntry({ type: \"column\", column: c })),\n };\n\n let query: SpecQuery<PColumn<Data>> = {\n type: \"outerJoin\",\n primary: toJoinEntry(coreJoinQuery),\n secondary: params.secondaryGroups.map((group) =>\n toJoinEntry({\n type: \"innerJoin\" as const,\n entries: group.map((c) => toJoinEntry({ type: \"column\" as const, column: c })),\n }),\n ),\n };\n\n // Apply filters\n if (!isNil(params.filters)) {\n const nonEmpty = distillFilterSpec(params.filters);\n\n if (!isNil(nonEmpty)) {\n const pridicate = filterSpecToSpecQueryExpr(nonEmpty);\n if (!isBooleanExpression(pridicate)) {\n throw new Error(\n `Filter conversion produced a non-boolean expression (got type \"${pridicate.type}\"), expected a boolean predicate for query filtering`,\n );\n }\n query = {\n type: \"filter\",\n input: query,\n predicate: pridicate,\n };\n }\n }\n\n // Apply sorting\n if (!isNil(params.sorting) && params.sorting.length > 0) {\n query = {\n type: \"sort\",\n input: query,\n sortBy: params.sorting.map((s) => ({\n expression: columnIdToExpr(s.column),\n ascending: s.ascending,\n nullsFirst: !s.naAndAbsentAreLeastValues,\n })),\n };\n }\n\n return { query };\n}\n\n/** Convert a PTableColumnId to a SpecQueryExpression reference. */\nfunction columnIdToExpr(col: PTableColumnId): SpecQueryExpression {\n return col.type === \"axis\"\n ? { type: \"axisRef\", value: col.id as SingleAxisSelector }\n : { type: \"columnRef\", value: col.id };\n}\n\nfunction toJoinEntry<C>(input: SpecQuery<C>): SpecQueryJoinEntry<C> {\n return {\n entry: input,\n qualifications: [],\n };\n}\n"],"mappings":";;;;;;;AAiBA,SAAgB,kBAA+C,QAMhC;CAO7B,IAAI,QAAkC;EACpC,MAAM;EACN,SAAS,YAPqC;GAC9C,MAAM,OAAO,oBAAoB,UAAU,cAAc;GACzD,SAAS,OAAO,eAAe,KAAK,MAAM,YAAY;IAAE,MAAM;IAAU,QAAQ;IAAG,CAAC,CAAC;GACtF,CAIoC;EACnC,WAAW,OAAO,gBAAgB,KAAK,UACrC,YAAY;GACV,MAAM;GACN,SAAS,MAAM,KAAK,MAAM,YAAY;IAAE,MAAM;IAAmB,QAAQ;IAAG,CAAC,CAAC;GAC/E,CAAC,CACH;EACF;AAGD,KAAI,EAAA,GAAA,WAAA,OAAO,OAAO,QAAQ,EAAE;EAC1B,MAAM,WAAWA,gBAAAA,kBAAkB,OAAO,QAAQ;AAElD,MAAI,EAAA,GAAA,WAAA,OAAO,SAAS,EAAE;GACpB,MAAM,YAAYC,sBAAAA,0BAA0B,SAAS;AACrD,OAAI,EAAA,GAAA,gCAAA,qBAAqB,UAAU,CACjC,OAAM,IAAI,MACR,kEAAkE,UAAU,KAAK,sDAClF;AAEH,WAAQ;IACN,MAAM;IACN,OAAO;IACP,WAAW;IACZ;;;AAKL,KAAI,EAAA,GAAA,WAAA,OAAO,OAAO,QAAQ,IAAI,OAAO,QAAQ,SAAS,EACpD,SAAQ;EACN,MAAM;EACN,OAAO;EACP,QAAQ,OAAO,QAAQ,KAAK,OAAO;GACjC,YAAY,eAAe,EAAE,OAAO;GACpC,WAAW,EAAE;GACb,YAAY,CAAC,EAAE;GAChB,EAAE;EACJ;AAGH,QAAO,EAAE,OAAO;;;AAIlB,SAAS,eAAe,KAA0C;AAChE,QAAO,IAAI,SAAS,SAChB;EAAE,MAAM;EAAW,OAAO,IAAI;EAA0B,GACxD;EAAE,MAAM;EAAa,OAAO,IAAI;EAAI;;AAG1C,SAAS,YAAe,OAA4C;AAClE,QAAO;EACL,OAAO;EACP,gBAAgB,EAAE;EACnB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { filterSpecToSpecQueryExpr } from "../../../filters/converters/filterToQuery.js";
|
|
2
|
+
import { distillFilterSpec } from "../../../filters/distill.js";
|
|
3
|
+
import "../../../filters/index.js";
|
|
4
|
+
import { isBooleanExpression } from "@milaboratories/pl-model-common";
|
|
5
|
+
import { isNil } from "es-toolkit";
|
|
6
|
+
//#region src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts
|
|
7
|
+
function createPTableDefV3(params) {
|
|
8
|
+
let query = {
|
|
9
|
+
type: "outerJoin",
|
|
10
|
+
primary: toJoinEntry({
|
|
11
|
+
type: params.primaryJoinType === "inner" ? "innerJoin" : "fullJoin",
|
|
12
|
+
entries: params.primaryColumns.map((c) => toJoinEntry({
|
|
13
|
+
type: "column",
|
|
14
|
+
column: c
|
|
15
|
+
}))
|
|
16
|
+
}),
|
|
17
|
+
secondary: params.secondaryGroups.map((group) => toJoinEntry({
|
|
18
|
+
type: "innerJoin",
|
|
19
|
+
entries: group.map((c) => toJoinEntry({
|
|
20
|
+
type: "column",
|
|
21
|
+
column: c
|
|
22
|
+
}))
|
|
23
|
+
}))
|
|
24
|
+
};
|
|
25
|
+
if (!isNil(params.filters)) {
|
|
26
|
+
const nonEmpty = distillFilterSpec(params.filters);
|
|
27
|
+
if (!isNil(nonEmpty)) {
|
|
28
|
+
const pridicate = filterSpecToSpecQueryExpr(nonEmpty);
|
|
29
|
+
if (!isBooleanExpression(pridicate)) throw new Error(`Filter conversion produced a non-boolean expression (got type "${pridicate.type}"), expected a boolean predicate for query filtering`);
|
|
30
|
+
query = {
|
|
31
|
+
type: "filter",
|
|
32
|
+
input: query,
|
|
33
|
+
predicate: pridicate
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (!isNil(params.sorting) && params.sorting.length > 0) query = {
|
|
38
|
+
type: "sort",
|
|
39
|
+
input: query,
|
|
40
|
+
sortBy: params.sorting.map((s) => ({
|
|
41
|
+
expression: columnIdToExpr(s.column),
|
|
42
|
+
ascending: s.ascending,
|
|
43
|
+
nullsFirst: !s.naAndAbsentAreLeastValues
|
|
44
|
+
}))
|
|
45
|
+
};
|
|
46
|
+
return { query };
|
|
47
|
+
}
|
|
48
|
+
/** Convert a PTableColumnId to a SpecQueryExpression reference. */
|
|
49
|
+
function columnIdToExpr(col) {
|
|
50
|
+
return col.type === "axis" ? {
|
|
51
|
+
type: "axisRef",
|
|
52
|
+
value: col.id
|
|
53
|
+
} : {
|
|
54
|
+
type: "columnRef",
|
|
55
|
+
value: col.id
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function toJoinEntry(input) {
|
|
59
|
+
return {
|
|
60
|
+
entry: input,
|
|
61
|
+
qualifications: []
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
export { createPTableDefV3 };
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=createPTableDefV3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPTableDefV3.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts"],"sourcesContent":["import type {\n PColumn,\n PTableColumnId,\n PTableSorting,\n PTableDefV2,\n SingleAxisSelector,\n SpecQuery,\n SpecQueryExpression,\n SpecQueryJoinEntry,\n} from \"@milaboratories/pl-model-common\";\nimport { isBooleanExpression } from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../../../render\";\nimport { isNil } from \"es-toolkit\";\nimport type { PlDataTableFilters } from \"../typesV5\";\nimport { distillFilterSpec, filterSpecToSpecQueryExpr } from \"../../../filters\";\nimport type { Nil } from \"@milaboratories/helpers\";\n\nexport function createPTableDefV3<Data = PColumnDataUniversal>(params: {\n primaryJoinType: \"inner\" | \"full\";\n primaryColumns: PColumn<Data>[];\n secondaryGroups: PColumn<Data>[][];\n filters?: Nil | PlDataTableFilters;\n sorting?: Nil | PTableSorting[];\n}): PTableDefV2<PColumn<Data>> {\n // Build SpecQuery directly from columns\n const coreJoinQuery: SpecQuery<PColumn<Data>> = {\n type: params.primaryJoinType === \"inner\" ? \"innerJoin\" : \"fullJoin\",\n entries: params.primaryColumns.map((c) => toJoinEntry({ type: \"column\", column: c })),\n };\n\n let query: SpecQuery<PColumn<Data>> = {\n type: \"outerJoin\",\n primary: toJoinEntry(coreJoinQuery),\n secondary: params.secondaryGroups.map((group) =>\n toJoinEntry({\n type: \"innerJoin\" as const,\n entries: group.map((c) => toJoinEntry({ type: \"column\" as const, column: c })),\n }),\n ),\n };\n\n // Apply filters\n if (!isNil(params.filters)) {\n const nonEmpty = distillFilterSpec(params.filters);\n\n if (!isNil(nonEmpty)) {\n const pridicate = filterSpecToSpecQueryExpr(nonEmpty);\n if (!isBooleanExpression(pridicate)) {\n throw new Error(\n `Filter conversion produced a non-boolean expression (got type \"${pridicate.type}\"), expected a boolean predicate for query filtering`,\n );\n }\n query = {\n type: \"filter\",\n input: query,\n predicate: pridicate,\n };\n }\n }\n\n // Apply sorting\n if (!isNil(params.sorting) && params.sorting.length > 0) {\n query = {\n type: \"sort\",\n input: query,\n sortBy: params.sorting.map((s) => ({\n expression: columnIdToExpr(s.column),\n ascending: s.ascending,\n nullsFirst: !s.naAndAbsentAreLeastValues,\n })),\n };\n }\n\n return { query };\n}\n\n/** Convert a PTableColumnId to a SpecQueryExpression reference. */\nfunction columnIdToExpr(col: PTableColumnId): SpecQueryExpression {\n return col.type === \"axis\"\n ? { type: \"axisRef\", value: col.id as SingleAxisSelector }\n : { type: \"columnRef\", value: col.id };\n}\n\nfunction toJoinEntry<C>(input: SpecQuery<C>): SpecQueryJoinEntry<C> {\n return {\n entry: input,\n qualifications: [],\n };\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,kBAA+C,QAMhC;CAO7B,IAAI,QAAkC;EACpC,MAAM;EACN,SAAS,YAPqC;GAC9C,MAAM,OAAO,oBAAoB,UAAU,cAAc;GACzD,SAAS,OAAO,eAAe,KAAK,MAAM,YAAY;IAAE,MAAM;IAAU,QAAQ;IAAG,CAAC,CAAC;GACtF,CAIoC;EACnC,WAAW,OAAO,gBAAgB,KAAK,UACrC,YAAY;GACV,MAAM;GACN,SAAS,MAAM,KAAK,MAAM,YAAY;IAAE,MAAM;IAAmB,QAAQ;IAAG,CAAC,CAAC;GAC/E,CAAC,CACH;EACF;AAGD,KAAI,CAAC,MAAM,OAAO,QAAQ,EAAE;EAC1B,MAAM,WAAW,kBAAkB,OAAO,QAAQ;AAElD,MAAI,CAAC,MAAM,SAAS,EAAE;GACpB,MAAM,YAAY,0BAA0B,SAAS;AACrD,OAAI,CAAC,oBAAoB,UAAU,CACjC,OAAM,IAAI,MACR,kEAAkE,UAAU,KAAK,sDAClF;AAEH,WAAQ;IACN,MAAM;IACN,OAAO;IACP,WAAW;IACZ;;;AAKL,KAAI,CAAC,MAAM,OAAO,QAAQ,IAAI,OAAO,QAAQ,SAAS,EACpD,SAAQ;EACN,MAAM;EACN,OAAO;EACP,QAAQ,OAAO,QAAQ,KAAK,OAAO;GACjC,YAAY,eAAe,EAAE,OAAO;GACpC,WAAW,EAAE;GACb,YAAY,CAAC,EAAE;GAChB,EAAE;EACJ;AAGH,QAAO,EAAE,OAAO;;;AAIlB,SAAS,eAAe,KAA0C;AAChE,QAAO,IAAI,SAAS,SAChB;EAAE,MAAM;EAAW,OAAO,IAAI;EAA0B,GACxD;EAAE,MAAM;EAAa,OAAO,IAAI;EAAI;;AAG1C,SAAS,YAAe,OAA4C;AAClE,QAAO;EACL,OAAO;EACP,gBAAgB,EAAE;EACnB"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
require("../../../_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
const require_label = require("../../../render/util/label.cjs");
|
|
3
3
|
const require_pcolumn_data = require("../../../render/util/pcolumn_data.cjs");
|
|
4
|
+
const require_column_collection = require("../../../render/util/column_collection.cjs");
|
|
4
5
|
require("../../../render/index.cjs");
|
|
5
6
|
const require_traverse = require("../../../filters/traverse.cjs");
|
|
6
7
|
const require_state_migration = require("../state-migration.cjs");
|
|
7
8
|
const require_labels = require("../labels.cjs");
|
|
8
|
-
const
|
|
9
|
+
const require_createPTableDefV2 = require("./createPTableDefV2.cjs");
|
|
10
|
+
const require_utils = require("./utils.cjs");
|
|
9
11
|
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
10
|
-
let es_toolkit_compat = require("es-toolkit/compat");
|
|
11
12
|
let es_toolkit = require("es-toolkit");
|
|
13
|
+
let es_toolkit_compat = require("es-toolkit/compat");
|
|
12
14
|
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts
|
|
13
15
|
/**
|
|
14
16
|
* Create p-table spec and handle given ui table state
|
|
15
17
|
*
|
|
18
|
+
* @deprecated This version of createPlDataTable is deprecated and will be removed in future. Please migrate to v3 by switching to the new options format and providing necessary information for column discovery and display configuration. See createPlDataTableOptionsV3 for details.
|
|
16
19
|
* @param ctx context
|
|
17
20
|
* @param columns column list
|
|
18
21
|
* @param tableState table ui state
|
|
@@ -21,9 +24,8 @@ let es_toolkit = require("es-toolkit");
|
|
|
21
24
|
function createPlDataTableV2(ctx, columns, tableState, options) {
|
|
22
25
|
if (columns.length === 0) return void 0;
|
|
23
26
|
const tableStateNormalized = require_state_migration.upgradePlDataTableStateV2(tableState);
|
|
24
|
-
const allLabelColumns =
|
|
25
|
-
|
|
26
|
-
let fullLabelColumns = require_labels.getMatchingLabelColumns(columns.map(_milaboratories_pl_model_common.getColumnIdAndSpec), allLabelColumns);
|
|
27
|
+
const allLabelColumns = getAllLabelColumns(ctx.resultPool) ?? [];
|
|
28
|
+
let fullLabelColumns = require_labels.getMatchingLabelColumns(columns, allLabelColumns);
|
|
27
29
|
fullLabelColumns = require_label.deriveLabels(fullLabelColumns, es_toolkit.identity, { includeNativeLabel: true }).map((v) => {
|
|
28
30
|
return {
|
|
29
31
|
...v.value,
|
|
@@ -46,20 +48,18 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
|
|
|
46
48
|
}))];
|
|
47
49
|
const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => (0, _milaboratories_pl_model_common.canonicalizeJson)(c)));
|
|
48
50
|
const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
|
|
49
|
-
const
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
type: "and",
|
|
53
|
-
filters: [stateFilters, opsFilters]
|
|
54
|
-
} : stateFilters ?? opsFilters;
|
|
55
|
-
const firstInvalidFilterColumn = (filters ? require_traverse.collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
|
|
51
|
+
const filters = tableStateNormalized.pTableParams.filters;
|
|
52
|
+
const defaultFilters = options?.filters ?? void 0;
|
|
53
|
+
const firstInvalidFilterColumn = (filters !== null ? require_traverse.collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
|
|
56
54
|
if (firstInvalidFilterColumn) throw new Error(`Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`);
|
|
55
|
+
const firstInvalidDefaultFilterColumn = (defaultFilters !== void 0 ? require_traverse.collectFilterSpecColumns(defaultFilters) : []).find((col) => !isValidColumnId(col));
|
|
56
|
+
if (firstInvalidDefaultFilterColumn) throw new Error(`Invalid default filter column ${firstInvalidDefaultFilterColumn}: column reference does not match the table columns`);
|
|
57
57
|
const userSorting = tableStateNormalized.pTableParams.sorting;
|
|
58
58
|
const sorting = ((0, es_toolkit_compat.isEmpty)(userSorting) ? options?.sorting : userSorting) ?? [];
|
|
59
59
|
const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId((0, _milaboratories_pl_model_common.canonicalizeJson)(s.column)));
|
|
60
60
|
if (firstInvalidSortingColumn) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`);
|
|
61
61
|
const coreJoinType = options?.coreJoinType ?? "full";
|
|
62
|
-
const fullDef =
|
|
62
|
+
const fullDef = require_createPTableDefV2.createPTableDefV2({
|
|
63
63
|
columns,
|
|
64
64
|
labelColumns: fullLabelColumns,
|
|
65
65
|
coreJoinType,
|
|
@@ -73,8 +73,8 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
|
|
|
73
73
|
const hiddenColumns = new Set((() => {
|
|
74
74
|
if (coreJoinType === "inner") return [];
|
|
75
75
|
const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;
|
|
76
|
-
if (hiddenColIds) return hiddenColIds;
|
|
77
|
-
return columns.filter((c) =>
|
|
76
|
+
if (hiddenColIds !== null) return hiddenColIds.filter((s) => s.type === "column").map((s) => s.id);
|
|
77
|
+
return columns.filter((c) => require_utils.isColumnOptional(c.spec)).map((c) => c.id);
|
|
78
78
|
})());
|
|
79
79
|
columns.filter((c) => (0, _milaboratories_pl_model_common.isLinkerColumn)(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
|
|
80
80
|
const coreColumnPredicate = options?.coreColumnPredicate;
|
|
@@ -87,7 +87,7 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
|
|
|
87
87
|
const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));
|
|
88
88
|
const visibleLabelColumns = require_labels.getMatchingLabelColumns(visibleColumns.map(_milaboratories_pl_model_common.getColumnIdAndSpec), allLabelColumns);
|
|
89
89
|
if (!require_pcolumn_data.allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return void 0;
|
|
90
|
-
const visibleDef =
|
|
90
|
+
const visibleDef = require_createPTableDefV2.createPTableDefV2({
|
|
91
91
|
columns: visibleColumns,
|
|
92
92
|
labelColumns: visibleLabelColumns,
|
|
93
93
|
coreJoinType,
|
|
@@ -101,9 +101,19 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
|
|
|
101
101
|
sourceId: tableStateNormalized.pTableParams.sourceId,
|
|
102
102
|
fullTableHandle: fullHandle,
|
|
103
103
|
fullPframeHandle: pframeHandle,
|
|
104
|
-
visibleTableHandle: visibleHandle
|
|
104
|
+
visibleTableHandle: visibleHandle,
|
|
105
|
+
defaultFilters
|
|
105
106
|
};
|
|
106
107
|
}
|
|
108
|
+
function getAllLabelColumns(resultPool) {
|
|
109
|
+
return new require_column_collection.PColumnCollection().addAxisLabelProvider(resultPool).addColumnProvider(resultPool).getColumns({
|
|
110
|
+
name: _milaboratories_pl_model_common.PColumnName.Label,
|
|
111
|
+
axes: [{}]
|
|
112
|
+
}, {
|
|
113
|
+
dontWaitAllData: true,
|
|
114
|
+
overrideLabelAnnotation: false
|
|
115
|
+
});
|
|
116
|
+
}
|
|
107
117
|
//#endregion
|
|
108
118
|
exports.createPlDataTableV2 = createPlDataTableV2;
|
|
109
119
|
|
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"createPlDataTableV2.cjs","names":["upgradePlDataTableStateV2","getMatchingLabelColumns","deriveLabels","identity","Annotation","collectFilterSpecColumns","createPTableDefV2","isColumnOptional","getColumnIdAndSpec","allPColumnsReady","PColumnCollection","PColumnName"],"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 PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n AxisLabelProvider,\n ColumnProvider,\n PColumnDataUniversal,\n RenderCtxBase,\n} from \"../../../render\";\nimport { allPColumnsReady, deriveLabels, PColumnCollection } from \"../../../render\";\nimport { identity } from \"es-toolkit\";\nimport type { CreatePlDataTableOps, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport { getMatchingLabelColumns } from \"../labels\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { createPTableDefV2 } from \"./createPTableDefV2\";\nimport { isColumnOptional } from \"./utils\";\n\n/**\n * @deprecated This function is deprecated and will be removed in future. Please migrate to createPlDataTable with v3 options for improved column discovery and display configuration. See createPlDataTableOptionsV3 for details on the new options format and migration guidance.\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 * @deprecated This version of createPlDataTable is deprecated and will be removed in future. Please migrate to v3 by switching to the new options format and providing necessary information for column discovery and display configuration. See createPlDataTableOptionsV3 for details.\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 const allLabelColumns = getAllLabelColumns(ctx.resultPool) ?? [];\n\n let fullLabelColumns = getMatchingLabelColumns(columns, 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 filters = tableStateNormalized.pTableParams.filters;\n const defaultFilters = options?.filters ?? undefined;\n const filterColumns = filters !== null ? 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 const defaultFilterColumns =\n defaultFilters !== undefined ? collectFilterSpecColumns(defaultFilters) : [];\n const firstInvalidDefaultFilterColumn = defaultFilterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidDefaultFilterColumn)\n throw new Error(\n `Invalid default filter column ${firstInvalidDefaultFilterColumn}: 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 = createPTableDefV2({\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 !== null) {\n return hiddenColIds\n .filter((s): s is PTableColumnIdColumn => s.type === \"column\")\n .map((s) => s.id);\n }\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 = createPTableDefV2({\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 defaultFilters,\n } satisfies PlDataTableModel;\n}\n\nfunction getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n"],"mappings":"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"}
|
|
@@ -5,6 +5,9 @@ import { PlDataTableStateV2 } from "../state-migration.js";
|
|
|
5
5
|
import { PColumn } from "@milaboratories/pl-model-common";
|
|
6
6
|
|
|
7
7
|
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated This function is deprecated and will be removed in future. Please migrate to createPlDataTable with v3 options for improved column discovery and display configuration. See createPlDataTableOptionsV3 for details on the new options format and migration guidance.
|
|
10
|
+
*/
|
|
8
11
|
type createPlDataTableOptionsV2 = {
|
|
9
12
|
columns: PColumn<PColumnDataUniversal>[];
|
|
10
13
|
tableState?: PlDataTableStateV2;
|
|
@@ -13,6 +16,7 @@ type createPlDataTableOptionsV2 = {
|
|
|
13
16
|
/**
|
|
14
17
|
* Create p-table spec and handle given ui table state
|
|
15
18
|
*
|
|
19
|
+
* @deprecated This version of createPlDataTable is deprecated and will be removed in future. Please migrate to v3 by switching to the new options format and providing necessary information for column discovery and display configuration. See createPlDataTableOptionsV3 for details.
|
|
16
20
|
* @param ctx context
|
|
17
21
|
* @param columns column list
|
|
18
22
|
* @param tableState table ui state
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPlDataTableV2.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"createPlDataTableV2.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts"],"mappings":";;;;;;;;;;KAuCY,0BAAA;EACV,OAAA,EAAS,OAAA,CAAQ,oBAAA;EACjB,UAAA,GAAa,kBAAA;EACb,OAAA,GAAU,oBAAA;AAAA;;;;;;;;;;iBAYI,mBAAA,MAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,GACtB,OAAA,EAAS,0BAAA,aACT,UAAA,GAAa,0BAAA,gBACb,OAAA,GAAU,0BAAA,cACT,gBAAA"}
|