@platforma-sdk/model 1.65.10 → 1.66.2
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_model.cjs +8 -11
- package/dist/block_model.cjs.map +1 -1
- package/dist/block_model.d.ts.map +1 -1
- package/dist/block_model.js +8 -10
- package/dist/block_model.js.map +1 -1
- package/dist/columns/column_collection_builder.cjs +61 -74
- package/dist/columns/column_collection_builder.cjs.map +1 -1
- package/dist/columns/column_collection_builder.d.ts +16 -22
- package/dist/columns/column_collection_builder.d.ts.map +1 -1
- package/dist/columns/column_collection_builder.js +62 -75
- package/dist/columns/column_collection_builder.js.map +1 -1
- package/dist/columns/column_selector.cjs.map +1 -1
- package/dist/columns/column_selector.d.ts +1 -1
- package/dist/columns/column_selector.js.map +1 -1
- package/dist/columns/column_snapshot.cjs.map +1 -1
- package/dist/columns/column_snapshot.d.ts +4 -4
- package/dist/columns/column_snapshot.d.ts.map +1 -1
- package/dist/columns/column_snapshot.js.map +1 -1
- package/dist/columns/ctx_column_sources.cjs.map +1 -1
- package/dist/columns/ctx_column_sources.d.ts +1 -1
- package/dist/columns/ctx_column_sources.d.ts.map +1 -1
- package/dist/columns/ctx_column_sources.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +2 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +2 -2
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +17 -18
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +17 -18
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +99 -91
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +16 -16
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +102 -94
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +32 -23
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +5 -5
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +33 -24
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -3
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs +133 -16
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +8 -6
- package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.js +130 -17
- package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
- package/dist/components/PlDataTable/labels.cjs +1 -2
- package/dist/components/PlDataTable/labels.cjs.map +1 -1
- package/dist/components/PlDataTable/labels.js +1 -2
- package/dist/components/PlDataTable/labels.js.map +1 -1
- package/dist/filters/distill.cjs +73 -30
- package/dist/filters/distill.cjs.map +1 -1
- package/dist/filters/distill.d.ts.map +1 -1
- package/dist/filters/distill.js +73 -30
- package/dist/filters/distill.js.map +1 -1
- package/dist/index.cjs +19 -15
- package/dist/index.d.ts +4 -2
- package/dist/index.js +6 -4
- package/dist/labels/derive_distinct_tooltips.cjs +85 -0
- package/dist/labels/derive_distinct_tooltips.cjs.map +1 -0
- package/dist/labels/derive_distinct_tooltips.d.ts +17 -0
- package/dist/labels/derive_distinct_tooltips.d.ts.map +1 -0
- package/dist/labels/derive_distinct_tooltips.js +84 -0
- package/dist/labels/derive_distinct_tooltips.js.map +1 -0
- package/dist/labels/index.cjs +1 -0
- package/dist/labels/index.d.ts +2 -1
- package/dist/labels/index.js +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/render/api.cjs +8 -13
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +8 -11
- package/dist/render/api.d.ts.map +1 -1
- package/dist/render/api.js +8 -13
- package/dist/render/api.js.map +1 -1
- package/dist/services/get_services.cjs +19 -0
- package/dist/services/get_services.cjs.map +1 -0
- package/dist/services/get_services.d.ts +7 -0
- package/dist/services/get_services.d.ts.map +1 -0
- package/dist/services/get_services.js +19 -0
- package/dist/services/get_services.js.map +1 -0
- package/dist/services/index.cjs +1 -0
- package/dist/services/index.d.ts +2 -1
- package/dist/services/index.js +1 -0
- package/dist/services/service_bridge.cjs +4 -4
- package/dist/services/service_bridge.cjs.map +1 -1
- package/dist/services/service_bridge.d.ts +4 -4
- package/dist/services/service_bridge.d.ts.map +1 -1
- package/dist/services/service_bridge.js +4 -4
- package/dist/services/service_bridge.js.map +1 -1
- package/package.json +7 -7
- package/src/block_model.ts +8 -11
- package/src/columns/column_collection_builder.test.ts +75 -30
- package/src/columns/column_collection_builder.ts +96 -133
- package/src/columns/column_selector.ts +1 -1
- package/src/columns/column_snapshot.ts +7 -4
- package/src/columns/ctx_column_sources.ts +1 -3
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +2 -2
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +44 -21
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +202 -218
- package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +69 -56
- package/src/components/PlDataTable/createPlDataTable/index.ts +6 -7
- package/src/components/PlDataTable/createPlDataTable/utils.test.ts +97 -1
- package/src/components/PlDataTable/createPlDataTable/utils.ts +190 -35
- package/src/components/PlDataTable/labels.ts +3 -7
- package/src/filters/distill.test.ts +91 -0
- package/src/filters/distill.ts +102 -46
- package/src/labels/derive_distinct_tooltips.test.ts +233 -0
- package/src/labels/derive_distinct_tooltips.ts +130 -0
- package/src/labels/index.ts +1 -0
- package/src/render/api.ts +15 -50
- package/src/services/get_services.ts +28 -0
- package/src/services/index.ts +1 -0
- package/src/services/service_bridge.ts +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPlDataTableV3.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"createPlDataTableV3.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"mappings":";;;;;;;;;;;;KA+CY,0BAAA;EACV,UAAA,GAAa,kBAAA;EAEb,OAAA,EAAS,GAAA,GAAM,0BAAA,GAA6B,mBAAA;EAC5C,OAAA,GAAU,kBAAA;EACV,OAAA,GAAU,aAAA;EACV,eAAA;EAEA,aAAA,GAAgB,mBAAA;EAChB,cAAA,GAAiB,qBAAA;AAAA;;KAIP,qBAAA;EACV,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,IAAA,GAAO,YAAA;EACP,OAAA;AAAA;AAAA,KAGU,qBAAA;EAX4B,uFAatC,QAAA,GAAW,eAAA,IArBX;EAuBA,UAAA,GAAa,oBAAA;AAAA;AAAA,KAGH,eAAA;EACV,KAAA,EAAO,aAAA,GAAgB,cAAA,EAzBqB;EA2B5C,QAAA;AAAA;AAAA,KAGU,oBAAA;EACV,KAAA,EAAO,aAAA,GAAgB,cAAA;EACvB,UAAA;AAAA;AAAA,KAGU,aAAA,IAAiB,IAAA,EAAM,WAAA;AAAA,iBAInB,mBAAA,MAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,GACtB,OAAA,EAAS,0BAAA,GACR,gBAAA;;KA+HS,mBAAA,GAAsB,cAAA,CAAe,mBAAA;EAAA,SACtC,UAAA,EAAY,SAAA;EAAA,SACZ,SAAA;EAAA,SACA,UAAA,GAAa,YAAA;EAAA,SACb,cAAA,GAAiB,mBAAA;EAAA,SACjB,yBAAA,GAA4B,mBAAA;AAAA"}
|
|
@@ -2,20 +2,21 @@ import { collectFilterSpecColumns, traverseFilterSpec } from "../../../filters/t
|
|
|
2
2
|
import { upgradePlDataTableStateV2 } from "../state-migration.js";
|
|
3
3
|
import { getAllLabelColumns, getMatchingLabelColumns } from "../labels.js";
|
|
4
4
|
import { createPTableDefV3 } from "./createPTableDefV3.js";
|
|
5
|
-
import { deriveAllLabels, isColumnHidden, isColumnOptional, withLabelAnnotations, withTableVisualAnnotations } from "./utils.js";
|
|
5
|
+
import { deriveAllLabels, deriveAllTooltips, evaluateRules, isColumnHidden, isColumnOptional, withHidenAxesAnnotations, withInfoAnnotations, withLabelAnnotations, withTableVisualAnnotations } from "./utils.js";
|
|
6
6
|
import { discoverTableColumnSnaphots } from "./discoverColumns.js";
|
|
7
|
-
import { canonicalizeJson, getAxisId,
|
|
8
|
-
import { isNil, throwError } from "@milaboratories/helpers";
|
|
7
|
+
import { canonicalizeJson, getAxisId, parseJson, uniqueBy } from "@milaboratories/pl-model-common";
|
|
8
|
+
import { isNil, isPlainObject, throwError } from "@milaboratories/helpers";
|
|
9
9
|
import { isEmpty } from "es-toolkit/compat";
|
|
10
10
|
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts
|
|
11
11
|
function createPlDataTableV3(ctx, options) {
|
|
12
|
+
const pframeSpec = ctx.getService("pframeSpec");
|
|
12
13
|
const state = upgradePlDataTableStateV2(options.tableState);
|
|
13
14
|
const primaryJoinType = options.primaryJoinType ?? "full";
|
|
14
|
-
const discovered =
|
|
15
|
+
const discovered = isPlainObject(options.columns) ? discoverTableColumnSnaphots(ctx, options.columns) : options.columns;
|
|
15
16
|
if (isNil(discovered) || discovered.length === 0) return void 0;
|
|
16
|
-
const
|
|
17
|
-
const labelColumns = getMatchingLabelColumns(
|
|
18
|
-
const
|
|
17
|
+
const splited = splitDiscoveredColumns(discovered);
|
|
18
|
+
const labelColumns = getMatchingLabelColumns([...splited.direct, ...splited.linked], getAllLabelColumns(ctx));
|
|
19
|
+
const derivedLabels = deriveAllLabels({
|
|
19
20
|
columns: discovered.map((dc) => ({
|
|
20
21
|
id: dc.id,
|
|
21
22
|
spec: dc.spec,
|
|
@@ -26,14 +27,29 @@ function createPlDataTableV3(ctx, options) {
|
|
|
26
27
|
includeNativeLabel: true,
|
|
27
28
|
...options.labelsOptions
|
|
28
29
|
}
|
|
29
|
-
})
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
});
|
|
31
|
+
const derivedTooltips = deriveAllTooltips({ columns: discovered.map((dc) => ({
|
|
32
|
+
id: dc.id,
|
|
33
|
+
originalId: dc.originalId,
|
|
34
|
+
spec: dc.spec,
|
|
35
|
+
linkerPath: dc.linkerPath,
|
|
36
|
+
qualifications: dc.qualifications,
|
|
37
|
+
distinctiveQualifications: dc.distinctiveQualifications
|
|
38
|
+
})) });
|
|
39
|
+
const annotated = annotateColumnGroups({
|
|
40
|
+
pframeSpec,
|
|
41
|
+
...splited,
|
|
42
|
+
labelColumns,
|
|
43
|
+
derivedLabels,
|
|
44
|
+
derivedTooltips,
|
|
45
|
+
displayOptions: options.displayOptions
|
|
46
|
+
});
|
|
47
|
+
const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);
|
|
48
|
+
const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);
|
|
49
|
+
if (primarySnapshots.length === 0) return void 0;
|
|
34
50
|
const columnIsAvailable = createColumnValidationById([
|
|
35
51
|
...annotated.direct,
|
|
36
|
-
...annotated.linked.flatMap((lc) => [...
|
|
52
|
+
...annotated.linked.flatMap((lc) => [...(lc.linkerPath ?? []).map((s) => s.linker), lc]),
|
|
37
53
|
...annotated.labels
|
|
38
54
|
]);
|
|
39
55
|
const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);
|
|
@@ -41,37 +57,27 @@ function createPlDataTableV3(ctx, options) {
|
|
|
41
57
|
validateFilters(filters, columnIsAvailable);
|
|
42
58
|
const sorting = resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered));
|
|
43
59
|
validateSorting(sorting, columnIsAvailable);
|
|
60
|
+
const primaryEntries = primarySnapshots.map((snap) => ({ column: resolveSnapshot(snap) }));
|
|
44
61
|
const fullDef = createPTableDefV3({
|
|
45
62
|
primaryJoinType,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
...secondaryColumns.map((c) => [c]),
|
|
49
|
-
...annotated.linked.map((lc) => [...annotated.linkers.get(lc.id) ?? [], lc]),
|
|
50
|
-
...annotated.labels.map((c) => [c])
|
|
51
|
-
],
|
|
63
|
+
primary: primaryEntries,
|
|
64
|
+
secondary: buildSecondaryGroups(secondarySnapshots, annotated.linked, annotated.labels),
|
|
52
65
|
filters,
|
|
53
66
|
sorting
|
|
54
67
|
});
|
|
55
68
|
const fullHandle = ctx.createPTableV2(fullDef);
|
|
56
69
|
const pframeHandle = ctx.createPFrame([
|
|
57
|
-
...annotated.direct,
|
|
58
|
-
...annotated.linked,
|
|
70
|
+
...annotated.direct.map(resolveSnapshot),
|
|
71
|
+
...annotated.linked.map(resolveSnapshot),
|
|
59
72
|
...annotated.labels,
|
|
60
|
-
...
|
|
73
|
+
...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot)
|
|
61
74
|
]);
|
|
62
75
|
const hiddenSpecs = state.pTableParams.hiddenColIds;
|
|
63
|
-
const
|
|
64
|
-
const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);
|
|
65
|
-
const visibleNonCoreDirect = secondaryColumns.filter((c) => !hiddenColumnIds.has(c.id));
|
|
66
|
-
const visibleLinkedGroups = buildVisibleLinkedGroups(visible.direct, visible.linked, annotated.linkers, hiddenSpecs);
|
|
76
|
+
const visible = buildVisibleColumns(annotated, computeHiddenColumns([...annotated.direct, ...annotated.linked], sorting, filters, hiddenSpecs), labelColumns);
|
|
67
77
|
const visibleDef = createPTableDefV3({
|
|
68
78
|
primaryJoinType,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
...visibleNonCoreDirect.map((c) => [c]),
|
|
72
|
-
...visibleLinkedGroups,
|
|
73
|
-
...visible.labels.map((c) => [c])
|
|
74
|
-
],
|
|
79
|
+
primary: primaryEntries,
|
|
80
|
+
secondary: buildSecondaryGroups(visible.direct.filter((c) => !c.isPrimary), visible.linked, visible.labels),
|
|
75
81
|
filters,
|
|
76
82
|
sorting
|
|
77
83
|
});
|
|
@@ -91,26 +97,52 @@ function splitDiscoveredColumns(columns) {
|
|
|
91
97
|
linked: columns.filter((dc) => !isNil(dc.linkerPath) && dc.linkerPath.length > 0)
|
|
92
98
|
};
|
|
93
99
|
}
|
|
94
|
-
/**
|
|
95
|
-
function
|
|
96
|
-
|
|
97
|
-
const linkers = new Map(split.linked.filter((dc) => !isNil(dc.linkerPath)).map((dc, i) => [linked[i].id, dc.linkerPath.map((s) => resolveSnapshot(s.linker))]));
|
|
98
|
-
return {
|
|
99
|
-
all: allDiscovered.map(resolveSnapshot),
|
|
100
|
-
direct: split.direct.map(resolveSnapshot),
|
|
101
|
-
linked,
|
|
102
|
-
linkers
|
|
103
|
-
};
|
|
100
|
+
/** All linker snapshots across the given linked columns, deduped by id. */
|
|
101
|
+
function collectLinkerSnapshots(linked) {
|
|
102
|
+
return uniqueBy(linked.flatMap((lc) => (lc.linkerPath ?? []).map((s) => s.linker)), (c) => c.id);
|
|
104
103
|
}
|
|
105
|
-
/**
|
|
106
|
-
|
|
104
|
+
/**
|
|
105
|
+
* Annotate all column groups with derived labels and display-rule annotations.
|
|
106
|
+
* Evaluates `displayOptions` rules against all discovered columns (direct,
|
|
107
|
+
* linked, labels, linkers) and writes the winning visibility/priority into
|
|
108
|
+
* column annotations via `withTableVisualAnnotations`.
|
|
109
|
+
*/
|
|
110
|
+
function annotateColumnGroups(params) {
|
|
111
|
+
const { direct, linked, labelColumns, derivedLabels, derivedTooltips, displayOptions, pframeSpec } = params;
|
|
112
|
+
const allColumnsForRules = [
|
|
113
|
+
...direct,
|
|
114
|
+
...linked,
|
|
115
|
+
...labelColumns,
|
|
116
|
+
...collectLinkerSnapshots(linked)
|
|
117
|
+
];
|
|
118
|
+
const visibilityByColId = evaluateRules(displayOptions?.visibility ?? [], allColumnsForRules, pframeSpec);
|
|
119
|
+
const orderByColId = evaluateRules(displayOptions?.ordering ?? [], allColumnsForRules, pframeSpec);
|
|
107
120
|
return {
|
|
108
|
-
direct:
|
|
109
|
-
|
|
110
|
-
|
|
121
|
+
direct: [
|
|
122
|
+
withLabelAnnotations.bind(null, derivedLabels),
|
|
123
|
+
withInfoAnnotations.bind(null, derivedTooltips),
|
|
124
|
+
withTableVisualAnnotations.bind(null, visibilityByColId, orderByColId)
|
|
125
|
+
].reduce((cols, fn) => fn(cols), direct),
|
|
126
|
+
linked: [
|
|
127
|
+
withLabelAnnotations.bind(null, derivedLabels),
|
|
128
|
+
withInfoAnnotations.bind(null, derivedTooltips),
|
|
129
|
+
withTableVisualAnnotations.bind(null, visibilityByColId, orderByColId),
|
|
130
|
+
(cols) => cols.map((lc) => ({
|
|
131
|
+
...lc,
|
|
132
|
+
linkerPath: annotateLinkerPath(derivedLabels, lc.linkerPath)
|
|
133
|
+
}))
|
|
134
|
+
].reduce((cols, fn) => fn(cols), linked),
|
|
111
135
|
labels: withLabelAnnotations(derivedLabels, labelColumns)
|
|
112
136
|
};
|
|
113
137
|
}
|
|
138
|
+
function annotateLinkerPath(derivedLabels, path) {
|
|
139
|
+
if (isNil(path) || path.length === 0) return path;
|
|
140
|
+
const annotatedLinkers = withHidenAxesAnnotations(withLabelAnnotations(derivedLabels, path.map((s) => s.linker)));
|
|
141
|
+
return path.map((s, i) => ({
|
|
142
|
+
...s,
|
|
143
|
+
linker: annotatedLinkers[i]
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
114
146
|
/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */
|
|
115
147
|
function createColumnValidationById(fullColumns) {
|
|
116
148
|
const allIds = [...uniqueBy(fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)), (a) => canonicalizeJson(a)).map((a) => ({
|
|
@@ -149,6 +181,28 @@ function validateSorting(sorting, isValidColumnId) {
|
|
|
149
181
|
const firstInvalid = sorting.find((s) => !isValidColumnId(canonicalizeJson(s.column)));
|
|
150
182
|
if (firstInvalid !== void 0) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`);
|
|
151
183
|
}
|
|
184
|
+
function buildSecondaryGroups(direct, linked, labels) {
|
|
185
|
+
return [
|
|
186
|
+
...direct.map((c) => ({
|
|
187
|
+
entries: [{
|
|
188
|
+
column: resolveSnapshot(c),
|
|
189
|
+
qualifications: c.qualifications?.forHit
|
|
190
|
+
}],
|
|
191
|
+
primaryQualifications: c.qualifications?.forQueries
|
|
192
|
+
})),
|
|
193
|
+
...linked.map((lc) => ({
|
|
194
|
+
entries: [...(lc.linkerPath ?? []).map((s) => ({
|
|
195
|
+
column: resolveSnapshot(s.linker),
|
|
196
|
+
qualifications: s.qualifications
|
|
197
|
+
})), {
|
|
198
|
+
column: resolveSnapshot(lc),
|
|
199
|
+
qualifications: lc.qualifications?.forHit
|
|
200
|
+
}],
|
|
201
|
+
primaryQualifications: lc.qualifications?.forQueries
|
|
202
|
+
})),
|
|
203
|
+
...labels.map((c) => ({ entries: [{ column: c }] }))
|
|
204
|
+
];
|
|
205
|
+
}
|
|
152
206
|
/** Determine which columns should be hidden based on state or optional-column defaults. */
|
|
153
207
|
function computeHiddenColumns(columns, sorting, filters, hiddenSpecs) {
|
|
154
208
|
const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);
|
|
@@ -157,52 +211,6 @@ function computeHiddenColumns(columns, sorting, filters, hiddenSpecs) {
|
|
|
157
211
|
const preserved = collectPreservedColumnIds(sorting, filters);
|
|
158
212
|
return new Set(initial.filter((id) => !preserved.has(id)));
|
|
159
213
|
}
|
|
160
|
-
/**
|
|
161
|
-
* Build visible linked column groups. Non-hidden groups are included fully;
|
|
162
|
-
* hidden groups are trimmed to only the prefix that brings axes not yet
|
|
163
|
-
* covered by earlier groups (visible or previously trimmed).
|
|
164
|
-
*/
|
|
165
|
-
function buildVisibleLinkedGroups(direct, linked, linkers, hiddenSpecs) {
|
|
166
|
-
const result = [];
|
|
167
|
-
const coveredAxisIds = /* @__PURE__ */ new Set();
|
|
168
|
-
const collectAxes = (group) => {
|
|
169
|
-
for (const col of group) for (const as of col.spec.axesSpec) coveredAxisIds.add(canonicalizeJson(getAxisId(as)));
|
|
170
|
-
};
|
|
171
|
-
collectAxes(direct);
|
|
172
|
-
for (const lc of linked) {
|
|
173
|
-
const group = [...linkers.get(lc.id) ?? [], lc];
|
|
174
|
-
result.push(group);
|
|
175
|
-
collectAxes(group);
|
|
176
|
-
}
|
|
177
|
-
for (const group of linkers.values()) {
|
|
178
|
-
const trimmed = trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds);
|
|
179
|
-
if (trimmed.length > 0) {
|
|
180
|
-
result.push(trimmed);
|
|
181
|
-
collectAxes(trimmed);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
return result;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* For a linked column group [linker1, ..., linkerN, column], find the rightmost
|
|
188
|
-
* element that has at least one non-hidden and not-yet-covered axis.
|
|
189
|
-
* Return the prefix up to and including that element.
|
|
190
|
-
* If no element has such an axis, return empty array.
|
|
191
|
-
*/
|
|
192
|
-
function trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds) {
|
|
193
|
-
if (hiddenSpecs === null) return group;
|
|
194
|
-
const hiddenAxisIds = new Set(hiddenSpecs.filter((s) => s.type === "axis").map((s) => canonicalizeJson(s.id)));
|
|
195
|
-
const uncoveredAxisIds = new Set(group.flatMap((c) => c.spec.axesSpec.map((as) => canonicalizeJson(getAxisId(as)))).filter((id) => !hiddenAxisIds.has(id) && !coveredAxisIds.has(id)));
|
|
196
|
-
let lastNeeded = -1;
|
|
197
|
-
for (let i = 0; i < group.length; i++) {
|
|
198
|
-
const newAxes = group[i].spec.axesSpec.map((as) => canonicalizeJson(getAxisId(as))).filter((id) => uncoveredAxisIds.has(id));
|
|
199
|
-
if (newAxes.length > 0) {
|
|
200
|
-
for (const id of newAxes) uncoveredAxisIds.delete(id);
|
|
201
|
-
lastNeeded = i;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return lastNeeded === -1 ? [] : group.slice(0, lastNeeded + 1);
|
|
205
|
-
}
|
|
206
214
|
/** Collect IDs of columns that must remain visible (sorted, filtered). */
|
|
207
215
|
function collectPreservedColumnIds(sorting, filters) {
|
|
208
216
|
const sortedIds = (sorting ?? []).map((s) => s.column).filter((c) => c.type === "column").map((c) => c.id);
|
|
@@ -219,7 +227,7 @@ function buildVisibleColumns(annotated, hiddenColumns, originalLabelColumns) {
|
|
|
219
227
|
return {
|
|
220
228
|
direct,
|
|
221
229
|
linked,
|
|
222
|
-
labels: getMatchingLabelColumns([...direct, ...linked]
|
|
230
|
+
labels: getMatchingLabelColumns([...direct, ...linked], originalLabelColumns)
|
|
223
231
|
};
|
|
224
232
|
}
|
|
225
233
|
/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPlDataTableV3.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n FilterSpecNode,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableSorting,\n PColumnSpec,\n MultiColumnSelector,\n SUniversalPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n parseJson,\n uniqueBy,\n} from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnMatch, ColumnSnapshot, MatchingMode } from \"../../../columns\";\nimport { Services, type RequireServices } from \"@milaboratories/pl-model-common\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n isColumnHidden,\n isColumnOptional,\n withLabelAnnotations,\n withTableVisualAnnotations,\n} from \"./utils\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport { discoverTableColumnSnaphots, type DiscoveredTableColumnOptions } from \"./discoverColumns\";\nimport { isNil, RequiredBy, throwError, type Nil } from \"@milaboratories/helpers\";\n\nexport type createPlDataTableOptionsV3 = (\n | {\n discoverColumnOptions: DiscoveredTableColumnOptions;\n }\n | {\n columns: Nil | TableColumnSnapshot<SUniversalPColumnId>[];\n }\n) & {\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n tableState?: PlDataTableStateV2;\n labelsOptions?: DeriveLabelsOptions;\n columnsDisplayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\n// Main Function\n\nexport function createPlDataTableV3<A, U, S extends RequireServices<typeof Services.PFrameSpec>>(\n ctx: RenderCtxBase<A, U, S>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered =\n \"discoverColumnOptions\" in options\n ? discoverTableColumnSnaphots(ctx, options.discoverColumnOptions)\n : options.columns;\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n const resolved = resolveDiscoveredColumns(splited, discovered);\n\n const labelColumns = getMatchingLabelColumns(resolved.all, getAllLabelColumns(ctx));\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.id,\n spec: dc.spec,\n linkerPath: dc.linkerPath?.map((lp) => ({ spec: lp.linker.spec })),\n })),\n labelColumns,\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const annotated = annotateColumnGroups(\n resolved,\n labelColumns,\n derivedLabels,\n options.columnsDisplayOptions,\n );\n\n const primaryColumnIds = new Set<PObjectId>(\n discovered.filter((dc) => dc.isPrimary).map((dc) => dc.id),\n );\n const primaryColumns = annotated.direct.filter((c) => primaryColumnIds.has(c.id));\n const secondaryColumns = annotated.direct.filter((c) => !primaryColumnIds.has(c.id));\n\n if (primaryColumns.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct,\n ...annotated.linked.flatMap((lc) => [...(annotated.linkers.get(lc.id) ?? []), lc]),\n ...annotated.labels,\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n );\n validateFilters(filters, columnIsAvailable);\n\n const sorting = resolveSorting(\n state.pTableParams.sorting,\n remapSortingColumnIds(options.sorting, discovered),\n );\n validateSorting(sorting, columnIsAvailable);\n\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primaryColumns,\n secondaryGroups: [\n ...secondaryColumns.map((c) => [c]),\n ...annotated.linked.map((lc) => [...(annotated.linkers.get(lc.id) ?? []), lc]),\n ...annotated.labels.map((c) => [c]),\n ],\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct,\n ...annotated.linked,\n ...annotated.labels,\n ...uniqueBy([...annotated.linkers.values()].flat(), (c) => c.id),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked],\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);\n const visibleNonCoreDirect = secondaryColumns.filter((c) => !hiddenColumnIds.has(c.id));\n const visibleLinkedGroups = buildVisibleLinkedGroups(\n visible.direct,\n visible.linked,\n annotated.linkers,\n hiddenSpecs,\n );\n\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primaryColumns,\n secondaryGroups: [\n ...visibleNonCoreDirect.map((c) => [c]),\n ...visibleLinkedGroups,\n ...visible.labels.map((c) => [c]),\n ],\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\n/** A single column discovered from sources — normalized from raw ColumnSnapshot/ColumnMatch. */\nexport type TableColumnSnapshot<Id extends PObjectId | SUniversalPColumnId> = ColumnSnapshot<Id> & {\n readonly isPrimary?: boolean;\n readonly originalId?: PObjectId;\n readonly linkerPath?: ColumnMatch[\"path\"];\n};\n\ntype TableColumn = PColumn<undefined | PColumnDataUniversal>;\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnSnapshot<SUniversalPColumnId>[];\n readonly linked: TableColumnSnapshot<SUniversalPColumnId>[];\n};\n\ntype ResolvedColumns = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly linkers: Map<PObjectId, TableColumn[]>;\n readonly all: TableColumn[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly linkers: Map<PObjectId, TableColumn[]>;\n readonly labels: TableColumn[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly labels: PColumn<PColumnDataUniversal>[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(\n columns: TableColumnSnapshot<SUniversalPColumnId>[],\n): SplitDiscoveredColumns {\n return {\n direct: columns.filter((dc) => isNil(dc.linkerPath) || dc.linkerPath.length === 0),\n linked: columns.filter((dc) => !isNil(dc.linkerPath) && dc.linkerPath.length > 0),\n };\n}\n\n/** Resolve DiscoveredColumn snapshots into PColumn objects with lazily-evaluated data. */\nfunction resolveDiscoveredColumns(\n split: SplitDiscoveredColumns,\n allDiscovered: TableColumnSnapshot<SUniversalPColumnId>[],\n): ResolvedColumns {\n const linked = split.linked.map(resolveSnapshot);\n const linkers = new Map<PObjectId, TableColumn[]>(\n split.linked\n .filter(\n (dc): dc is RequiredBy<TableColumnSnapshot<SUniversalPColumnId>, \"linkerPath\"> =>\n !isNil(dc.linkerPath),\n )\n .map((dc, i) => [linked[i].id, dc.linkerPath.map((s) => resolveSnapshot(s.linker))]),\n );\n\n return {\n all: allDiscovered.map(resolveSnapshot),\n direct: split.direct.map(resolveSnapshot),\n linked,\n linkers,\n };\n}\n\n/** Annotate all column groups with derived labels and display options. */\nfunction annotateColumnGroups(\n resolved: ResolvedColumns,\n labelColumns: PColumn<PColumnDataUniversal>[],\n derivedLabels: Record<string, string>,\n displayOptions: ColumnsDisplayOptions | undefined,\n): AnnotatedColumnGroups {\n const direct = withTableVisualAnnotations(\n displayOptions,\n withLabelAnnotations(derivedLabels, resolved.direct),\n );\n const linked = withTableVisualAnnotations(\n displayOptions,\n withLabelAnnotations(derivedLabels, resolved.linked),\n );\n const linkers = new Map<PObjectId, TableColumn[]>(\n [...resolved.linkers].map(([id, cols]) => [id, withLabelAnnotations(derivedLabels, cols)]),\n );\n const labels = withLabelAnnotations(derivedLabels, labelColumns);\n\n return { direct, linked, linkers, labels };\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(fullColumns: TableColumn[]) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Validate that all column references in filters exist in the table. */\nfunction validateFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): void {\n if (filters == null) return;\n const filterColumns = collectFilterSpecColumns(filters);\n const firstInvalid = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid filter column ${firstInvalid}: column reference does not match the table columns`,\n );\n }\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Validate that all column references in sorting exist in the table. */\nfunction validateSorting(sorting: PTableSorting[], isValidColumnId: (id: string) => boolean): void {\n const firstInvalid = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`,\n );\n }\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: TableColumn[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/**\n * Build visible linked column groups. Non-hidden groups are included fully;\n * hidden groups are trimmed to only the prefix that brings axes not yet\n * covered by earlier groups (visible or previously trimmed).\n */\nfunction buildVisibleLinkedGroups(\n direct: TableColumn[],\n linked: TableColumn[],\n linkers: Map<PObjectId, TableColumn[]>,\n hiddenSpecs: PTableColumnId[] | null,\n): TableColumn[][] {\n const result: TableColumn[][] = [];\n const coveredAxisIds = new Set<CanonicalizedJson<AxisId>>();\n\n const collectAxes = (group: TableColumn[]) => {\n for (const col of group) {\n for (const as of col.spec.axesSpec) {\n coveredAxisIds.add(canonicalizeJson(getAxisId(as)));\n }\n }\n };\n\n collectAxes(direct);\n\n for (const lc of linked) {\n const group = [...(linkers.get(lc.id) ?? []), lc];\n result.push(group);\n collectAxes(group);\n }\n\n for (const group of linkers.values()) {\n const trimmed = trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds);\n if (trimmed.length > 0) {\n result.push(trimmed);\n collectAxes(trimmed);\n }\n }\n\n return result;\n}\n\n/**\n * For a linked column group [linker1, ..., linkerN, column], find the rightmost\n * element that has at least one non-hidden and not-yet-covered axis.\n * Return the prefix up to and including that element.\n * If no element has such an axis, return empty array.\n */\nfunction trimGroupByVisibleAxes(\n group: TableColumn[],\n hiddenSpecs: PTableColumnId[] | null,\n coveredAxisIds: Set<CanonicalizedJson<AxisId>>,\n): TableColumn[] {\n if (hiddenSpecs === null) return group;\n\n const hiddenAxisIds = new Set(\n hiddenSpecs\n .filter((s): s is PTableColumnIdAxis => s.type === \"axis\")\n .map((s) => canonicalizeJson(s.id)),\n );\n\n const uncoveredAxisIds = new Set(\n group\n .flatMap((c) => c.spec.axesSpec.map((as) => canonicalizeJson(getAxisId(as))))\n .filter((id) => !hiddenAxisIds.has(id) && !coveredAxisIds.has(id)),\n );\n\n let lastNeeded = -1;\n for (let i = 0; i < group.length; i++) {\n const newAxes = group[i].spec.axesSpec\n .map((as) => canonicalizeJson(getAxisId(as)))\n .filter((id) => uncoveredAxisIds.has(id));\n if (newAxes.length > 0) {\n for (const id of newAxes) uncoveredAxisIds.delete(id);\n lastNeeded = i;\n }\n }\n return lastNeeded === -1 ? [] : group.slice(0, lastNeeded + 1);\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n originalLabelColumns: PColumn<PColumnDataUniversal>[],\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.id));\n const labels = getMatchingLabelColumns(\n [...direct, ...linked].map(getColumnIdAndSpec),\n originalLabelColumns,\n );\n return { direct, linked, labels };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnSnapshot<PObjectId | SUniversalPColumnId>[],\n): Nil | PTableSorting[] {\n return sorting?.map((s) => {\n if (s.column.type === \"axis\") return s; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column =\n columns.find((c) => (c.originalId ?? c.id) === id) ??\n throwError(`Column ID \"${id}\" in sorting does not match any discovered column`);\n\n return {\n ...s,\n column: {\n type: \"column\",\n id: column.id,\n },\n };\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnSnapshot<PObjectId | SUniversalPColumnId>[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (c.originalId ?? c.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createPlDataTableV3.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n FilterSpecNode,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableSorting,\n PColumnSpec,\n MultiColumnSelector,\n PFrameSpecDriver,\n DiscoveredPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, getAxisId, parseJson, uniqueBy } from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type {\n ColumnSelector,\n ColumnSnapshot,\n MatchingMode,\n MatchQualifications,\n MatchVariant,\n} from \"../../../columns\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n deriveAllTooltips,\n evaluateRules,\n isColumnHidden,\n isColumnOptional,\n withHidenAxesAnnotations,\n withLabelAnnotations,\n withTableVisualAnnotations,\n withInfoAnnotations,\n} from \"./utils\";\nimport type { PrimaryEntry, SecondaryGroup } from \"./createPTableDefV3\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport { discoverTableColumnSnaphots, type DiscoverTableColumnOptions } from \"./discoverColumns\";\nimport { isNil, isPlainObject, throwError, type Nil } from \"@milaboratories/helpers\";\n\nexport type createPlDataTableOptionsV3 = {\n tableState?: PlDataTableStateV2;\n\n columns: Nil | DiscoverTableColumnOptions | TableColumnSnapshot[];\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher | ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher | ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\n// Main Function\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const pframeSpec = ctx.getService(\"pframeSpec\");\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered = isPlainObject(options.columns)\n ? discoverTableColumnSnaphots(ctx, options.columns)\n : options.columns;\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n\n const labelColumns = getMatchingLabelColumns(\n [...splited.direct, ...splited.linked],\n getAllLabelColumns(ctx),\n );\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.id,\n spec: dc.spec,\n linkerPath: dc.linkerPath?.map((lp) => ({ spec: lp.linker.spec })),\n })),\n labelColumns,\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const derivedTooltips = deriveAllTooltips({\n columns: discovered.map((dc) => ({\n id: dc.id,\n originalId: dc.originalId,\n spec: dc.spec,\n linkerPath: dc.linkerPath,\n qualifications: dc.qualifications,\n distinctiveQualifications: dc.distinctiveQualifications,\n })),\n });\n\n const annotated = annotateColumnGroups({\n pframeSpec,\n ...splited,\n labelColumns,\n derivedLabels,\n derivedTooltips,\n displayOptions: options.displayOptions,\n });\n\n const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);\n const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);\n\n if (primarySnapshots.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct,\n ...annotated.linked.flatMap((lc) => [...(lc.linkerPath ?? []).map((s) => s.linker), lc]),\n ...annotated.labels,\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n );\n validateFilters(filters, columnIsAvailable);\n\n const sorting = resolveSorting(\n state.pTableParams.sorting,\n remapSortingColumnIds(options.sorting, discovered),\n );\n validateSorting(sorting, columnIsAvailable);\n\n const primaryEntries: PrimaryEntry<undefined | PColumnDataUniversal>[] = primarySnapshots.map(\n (snap) => ({ column: resolveSnapshot(snap) }),\n );\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(secondarySnapshots, annotated.linked, annotated.labels),\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct.map(resolveSnapshot),\n ...annotated.linked.map(resolveSnapshot),\n ...annotated.labels,\n ...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked],\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(\n visible.direct.filter((c) => !c.isPrimary),\n visible.linked,\n visible.labels,\n ),\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\n/** A single column discovered from sources — normalized from raw ColumnSnapshot/ColumnMatch. */\nexport type TableColumnSnapshot = ColumnSnapshot<DiscoveredPColumnId> & {\n readonly originalId: PObjectId;\n readonly isPrimary?: boolean;\n readonly linkerPath?: MatchVariant[\"path\"];\n readonly qualifications?: MatchQualifications;\n readonly distinctiveQualifications?: MatchQualifications;\n};\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnSnapshot[];\n readonly linked: TableColumnSnapshot[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumnSnapshot[];\n readonly linked: TableColumnSnapshot[];\n readonly labels: PColumn<PColumnDataUniversal>[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumnSnapshot[];\n readonly linked: TableColumnSnapshot[];\n readonly labels: PColumn<PColumnDataUniversal>[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(columns: TableColumnSnapshot[]): SplitDiscoveredColumns {\n const direct = columns.filter((dc) => isNil(dc.linkerPath) || dc.linkerPath.length === 0);\n const linked = columns.filter((dc) => !isNil(dc.linkerPath) && dc.linkerPath.length > 0);\n return { direct, linked };\n}\n\n/** All linker snapshots across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: TableColumnSnapshot[]): ColumnSnapshot<PObjectId>[] {\n return uniqueBy(\n linked.flatMap((lc) => (lc.linkerPath ?? []).map((s) => s.linker)),\n (c) => c.id,\n );\n}\n\n/**\n * Annotate all column groups with derived labels and display-rule annotations.\n * Evaluates `displayOptions` rules against all discovered columns (direct,\n * linked, labels, linkers) and writes the winning visibility/priority into\n * column annotations via `withTableVisualAnnotations`.\n */\nfunction annotateColumnGroups(params: {\n direct: TableColumnSnapshot[];\n linked: TableColumnSnapshot[];\n labelColumns: PColumn<PColumnDataUniversal>[];\n derivedLabels: Record<string, string>;\n derivedTooltips: Record<string, string>;\n displayOptions?: ColumnsDisplayOptions;\n pframeSpec: PFrameSpecDriver;\n}): AnnotatedColumnGroups {\n const {\n direct,\n linked,\n labelColumns,\n derivedLabels,\n derivedTooltips,\n displayOptions,\n pframeSpec,\n } = params;\n\n const allColumnsForRules = [\n ...direct,\n ...linked,\n ...labelColumns,\n ...collectLinkerSnapshots(linked),\n ];\n const visibilityByColId = evaluateRules(\n displayOptions?.visibility ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n const orderByColId = evaluateRules(\n displayOptions?.ordering ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n\n const directAnnotated = [\n withLabelAnnotations.bind(null, derivedLabels),\n withInfoAnnotations.bind(null, derivedTooltips),\n withTableVisualAnnotations.bind(null, visibilityByColId, orderByColId),\n ].reduce((cols, fn) => fn(cols) as TableColumnSnapshot[], direct);\n\n const linkedAnnotated = [\n withLabelAnnotations.bind(null, derivedLabels),\n withInfoAnnotations.bind(null, derivedTooltips),\n withTableVisualAnnotations.bind(null, visibilityByColId, orderByColId),\n (cols: TableColumnSnapshot[]) =>\n cols.map((lc) => ({ ...lc, linkerPath: annotateLinkerPath(derivedLabels, lc.linkerPath) })),\n ].reduce((cols, fn) => fn(cols) as TableColumnSnapshot[], linked);\n\n const labelColumnsAnnotated = withLabelAnnotations(derivedLabels, labelColumns);\n\n return {\n direct: directAnnotated,\n linked: linkedAnnotated,\n labels: labelColumnsAnnotated,\n };\n}\nfunction annotateLinkerPath(\n derivedLabels: Record<string, string>,\n path: TableColumnSnapshot[\"linkerPath\"],\n): TableColumnSnapshot[\"linkerPath\"] {\n if (isNil(path) || path.length === 0) return path;\n const annotatedLinkers = withHidenAxesAnnotations(\n withLabelAnnotations(\n derivedLabels,\n path.map((s) => s.linker),\n ),\n );\n return path.map((s, i) => ({ ...s, linker: annotatedLinkers[i] }));\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(\n fullColumns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Validate that all column references in filters exist in the table. */\nfunction validateFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): void {\n if (filters == null) return;\n const filterColumns = collectFilterSpecColumns(filters);\n const firstInvalid = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid filter column ${firstInvalid}: column reference does not match the table columns`,\n );\n }\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Validate that all column references in sorting exist in the table. */\nfunction validateSorting(sorting: PTableSorting[], isValidColumnId: (id: string) => boolean): void {\n const firstInvalid = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`,\n );\n }\n}\n\nfunction buildSecondaryGroups(\n direct: TableColumnSnapshot[],\n linked: TableColumnSnapshot[],\n labels: PColumn<PColumnDataUniversal>[],\n): SecondaryGroup<undefined | PColumnDataUniversal>[] {\n return [\n ...direct.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [{ column: resolveSnapshot(c), qualifications: c.qualifications?.forHit }],\n primaryQualifications: c.qualifications?.forQueries,\n }),\n ),\n ...linked.map(\n (lc): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [\n ...(lc.linkerPath ?? []).map((s) => ({\n column: resolveSnapshot(s.linker),\n qualifications: s.qualifications,\n })),\n { column: resolveSnapshot(lc), qualifications: lc.qualifications?.forHit },\n ],\n primaryQualifications: lc.qualifications?.forQueries,\n }),\n ),\n ...labels.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({ entries: [{ column: c }] }),\n ),\n ];\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n originalLabelColumns: PColumn<PColumnDataUniversal>[],\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.id));\n const labels = getMatchingLabelColumns([...direct, ...linked], originalLabelColumns);\n return { direct, linked, labels };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnSnapshot[],\n): Nil | PTableSorting[] {\n return sorting?.map((s) => {\n if (s.column.type === \"axis\") return s; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column =\n columns.find((c) => (c.originalId ?? c.id) === id) ??\n throwError(`Column ID \"${id}\" in sorting does not match any discovered column`);\n\n return {\n ...s,\n column: {\n type: \"column\",\n id: column.id,\n },\n };\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnSnapshot[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (c.originalId ?? c.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ const require_ctx_column_sources = require("../../../columns/ctx_column_sources.
|
|
|
5
5
|
require("../../../columns/index.cjs");
|
|
6
6
|
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
7
7
|
let _milaboratories_helpers = require("@milaboratories/helpers");
|
|
8
|
+
let es_toolkit = require("es-toolkit");
|
|
8
9
|
//#region src/components/PlDataTable/createPlDataTable/discoverColumns.ts
|
|
9
10
|
/** Discover columns from sources/anchors and normalize into a flat DiscoveredColumn list. */
|
|
10
11
|
function discoverTableColumnSnaphots(ctx, options) {
|
|
@@ -14,12 +15,13 @@ function discoverTableColumnSnaphots(ctx, options) {
|
|
|
14
15
|
};
|
|
15
16
|
const providers = resolveProviders(ctx, resolvedOptions.sources);
|
|
16
17
|
if (providers.length === 0) return void 0;
|
|
17
|
-
const collection = new require_column_collection_builder.ColumnCollectionBuilder(ctx.
|
|
18
|
+
const collection = new require_column_collection_builder.ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSources(providers).build(resolvedOptions);
|
|
18
19
|
if (collection === void 0) return void 0;
|
|
19
20
|
try {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
return mapToDiscoveredColumns(collection.findColumns({
|
|
22
|
+
...resolvedOptions.selector ?? {},
|
|
23
|
+
exclude: [...Array.isArray(resolvedOptions.selector?.exclude) ? resolvedOptions.selector.exclude : !(0, es_toolkit.isNil)(resolvedOptions.selector.exclude) ? [resolvedOptions.selector.exclude] : [], { name: "pl7.app/label" }]
|
|
24
|
+
}), collection.getAnchors());
|
|
23
25
|
} finally {
|
|
24
26
|
collection.dispose();
|
|
25
27
|
}
|
|
@@ -36,26 +38,33 @@ function resolveProviders(ctx, sources) {
|
|
|
36
38
|
return sources !== void 0 ? sources.map(require_column_snapshot_provider.toColumnSnapshotProvider) : require_ctx_column_sources.collectCtxColumnSnapshotProviders(ctx);
|
|
37
39
|
}
|
|
38
40
|
/** Map matched columns into a flat DiscoveredColumn list with deduped IDs. */
|
|
39
|
-
function mapToDiscoveredColumns(matched,
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
return matched.map((match) => {
|
|
41
|
+
function mapToDiscoveredColumns(matched, anchors) {
|
|
42
|
+
const columnIdToAnchorName = new Map(Array.from(anchors.entries(), ([key, { id }]) => [id, key]));
|
|
43
|
+
return matched.flatMap((match) => {
|
|
43
44
|
const snap = match.column;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
45
|
+
const isPrimary = columnIdToAnchorName.get(match.column.id) !== void 0;
|
|
46
|
+
return match.variants.map((variant) => {
|
|
47
|
+
return {
|
|
48
|
+
id: (0, _milaboratories_pl_model_common.createDiscoveredPColumnId)({
|
|
49
|
+
column: snap.id,
|
|
50
|
+
path: variant.path.map((p) => ({
|
|
51
|
+
type: "linker",
|
|
52
|
+
column: p.linker.id,
|
|
53
|
+
qualifications: p.qualifications
|
|
54
|
+
})),
|
|
55
|
+
columnQualifications: variant.qualifications.forHit,
|
|
56
|
+
queriesQualifications: variant.qualifications.forQueries
|
|
57
|
+
}),
|
|
58
|
+
isPrimary,
|
|
59
|
+
originalId: snap.id,
|
|
60
|
+
spec: snap.spec,
|
|
61
|
+
data: snap.data,
|
|
62
|
+
dataStatus: snap.dataStatus,
|
|
63
|
+
linkerPath: variant.path,
|
|
64
|
+
qualifications: variant.qualifications,
|
|
65
|
+
distinctiveQualifications: variant.distinctiveQualifications
|
|
66
|
+
};
|
|
67
|
+
});
|
|
59
68
|
});
|
|
60
69
|
}
|
|
61
70
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discoverColumns.cjs","names":["ColumnCollectionBuilder","toColumnSnapshotProvider","collectCtxColumnSnapshotProviders"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"discoverColumns.cjs","names":["ColumnCollectionBuilder","toColumnSnapshotProvider","collectCtxColumnSnapshotProviders"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"sourcesContent":["import type { PColumnSpec, PlRef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { createDiscoveredPColumnId, isPlRef } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../../render\";\nimport type {\n ColumnSource,\n ColumnMatch,\n RelaxedColumnSelector,\n ColumnSnapshotProvider,\n ColumnSnapshot,\n} from \"../../../columns\";\nimport { ColumnCollectionBuilder } from \"../../../columns\";\nimport { toColumnSnapshotProvider } from \"../../../columns/column_snapshot_provider\";\nimport { collectCtxColumnSnapshotProviders } from \"../../../columns/ctx_column_sources\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport type { ColumnsSelectorConfig, TableColumnSnapshot } from \"./createPlDataTableV3\";\nimport { isNil } from \"es-toolkit\";\n\nexport type DiscoverTableColumnOptions = {\n sources?: ColumnSource[];\n anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>;\n selector: ColumnsSelectorConfig;\n};\n\n/** Discover columns from sources/anchors and normalize into a flat DiscoveredColumn list. */\nexport function discoverTableColumnSnaphots(\n ctx: RenderCtxBase,\n options: DiscoverTableColumnOptions,\n): TableColumnSnapshot[] | undefined {\n // Resolve PlRef anchors to PColumnSpec\n const resolvedOptions = {\n ...options,\n anchors: resolveAnchors(ctx, options.anchors),\n };\n\n // Resolve providers\n const providers = resolveProviders(ctx, resolvedOptions.sources);\n if (providers.length === 0) return undefined;\n\n // Build collection (anchored or plain)\n const collection = new ColumnCollectionBuilder(ctx.getService(\"pframeSpec\"))\n .addSources(providers)\n .build(resolvedOptions);\n if (collection === undefined) return undefined;\n\n try {\n const columns = collection.findColumns({\n ...(resolvedOptions.selector ?? {}),\n exclude: [\n ...(Array.isArray(resolvedOptions.selector?.exclude)\n ? resolvedOptions.selector.exclude\n : !isNil(resolvedOptions.selector.exclude)\n ? [resolvedOptions.selector.exclude]\n : []),\n { name: \"pl7.app/label\" },\n ],\n });\n const anchors = collection.getAnchors();\n return mapToDiscoveredColumns(columns, anchors);\n } finally {\n collection.dispose();\n }\n}\n\n// --- Pure helper functions ---\n\n/** Resolve PlRef values in anchors to PColumnSpec via the result pool. */\nfunction resolveAnchors(\n ctx: RenderCtxBase,\n anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>,\n): Record<string, PObjectId | PColumnSpec | RelaxedColumnSelector> {\n const result: Record<string, PObjectId | PColumnSpec | RelaxedColumnSelector> = {};\n for (const [key, value] of Object.entries(anchors)) {\n if (isPlRef(value)) {\n result[key] =\n ctx.resultPool.getPColumnSpecByRef(value) ??\n throwError(\n `Anchor ${key} with ref ${JSON.stringify(value)} could not be resolved to a PColumnSpec`,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/** Resolve column snapshot providers from explicit sources or context. */\nfunction resolveProviders(\n ctx: RenderCtxBase,\n sources: undefined | ColumnSource[],\n): ColumnSnapshotProvider[] {\n return sources !== undefined\n ? sources.map(toColumnSnapshotProvider)\n : collectCtxColumnSnapshotProviders(ctx);\n}\n\n/** Map matched columns into a flat DiscoveredColumn list with deduped IDs. */\nfunction mapToDiscoveredColumns(\n matched: readonly ColumnMatch[],\n anchors: Map<string, ColumnSnapshot<PObjectId>>,\n): TableColumnSnapshot[] {\n const columnIdToAnchorName = new Map<PObjectId, string>(\n Array.from(anchors.entries(), ([key, { id }]) => [id, key] as const),\n );\n\n return matched.flatMap((match) => {\n const snap = match.column;\n const isPrimary = columnIdToAnchorName.get(match.column.id) !== undefined;\n\n return match.variants.map((variant): TableColumnSnapshot => {\n const discoveredId = createDiscoveredPColumnId({\n column: snap.id,\n path: variant.path.map((p) => ({\n type: \"linker\",\n column: p.linker.id,\n qualifications: p.qualifications,\n })),\n columnQualifications: variant.qualifications.forHit,\n queriesQualifications: variant.qualifications.forQueries,\n });\n return {\n id: discoveredId,\n isPrimary,\n\n originalId: snap.id,\n spec: snap.spec,\n data: snap.data,\n dataStatus: snap.dataStatus,\n\n linkerPath: variant.path,\n qualifications: variant.qualifications,\n distinctiveQualifications: variant.distinctiveQualifications,\n };\n });\n });\n}\n"],"mappings":";;;;;;;;;;AAwBA,SAAgB,4BACd,KACA,SACmC;CAEnC,MAAM,kBAAkB;EACtB,GAAG;EACH,SAAS,eAAe,KAAK,QAAQ,QAAQ;EAC9C;CAGD,MAAM,YAAY,iBAAiB,KAAK,gBAAgB,QAAQ;AAChE,KAAI,UAAU,WAAW,EAAG,QAAO,KAAA;CAGnC,MAAM,aAAa,IAAIA,kCAAAA,wBAAwB,IAAI,WAAW,aAAa,CAAC,CACzE,WAAW,UAAU,CACrB,MAAM,gBAAgB;AACzB,KAAI,eAAe,KAAA,EAAW,QAAO,KAAA;AAErC,KAAI;AAaF,SAAO,uBAZS,WAAW,YAAY;GACrC,GAAI,gBAAgB,YAAY,EAAE;GAClC,SAAS,CACP,GAAI,MAAM,QAAQ,gBAAgB,UAAU,QAAQ,GAChD,gBAAgB,SAAS,UACzB,EAAA,GAAA,WAAA,OAAO,gBAAgB,SAAS,QAAQ,GACtC,CAAC,gBAAgB,SAAS,QAAQ,GAClC,EAAE,EACR,EAAE,MAAM,iBAAiB,CAC1B;GACF,CAAC,EACc,WAAW,YAAY,CACQ;WACvC;AACR,aAAW,SAAS;;;;AAOxB,SAAS,eACP,KACA,SACiE;CACjE,MAAM,SAA0E,EAAE;AAClF,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAChD,MAAA,GAAA,gCAAA,SAAY,MAAM,CAChB,QAAO,OACL,IAAI,WAAW,oBAAoB,MAAM,KAAA,GAAA,wBAAA,YAEvC,UAAU,IAAI,YAAY,KAAK,UAAU,MAAM,CAAC,yCACjD;KAEH,QAAO,OAAO;AAGlB,QAAO;;;AAIT,SAAS,iBACP,KACA,SAC0B;AAC1B,QAAO,YAAY,KAAA,IACf,QAAQ,IAAIC,iCAAAA,yBAAyB,GACrCC,2BAAAA,kCAAkC,IAAI;;;AAI5C,SAAS,uBACP,SACA,SACuB;CACvB,MAAM,uBAAuB,IAAI,IAC/B,MAAM,KAAK,QAAQ,SAAS,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,IAAI,CAAU,CACrE;AAED,QAAO,QAAQ,SAAS,UAAU;EAChC,MAAM,OAAO,MAAM;EACnB,MAAM,YAAY,qBAAqB,IAAI,MAAM,OAAO,GAAG,KAAK,KAAA;AAEhE,SAAO,MAAM,SAAS,KAAK,YAAiC;AAW1D,UAAO;IACL,KAAA,GAAA,gCAAA,2BAX6C;KAC7C,QAAQ,KAAK;KACb,MAAM,QAAQ,KAAK,KAAK,OAAO;MAC7B,MAAM;MACN,QAAQ,EAAE,OAAO;MACjB,gBAAgB,EAAE;MACnB,EAAE;KACH,sBAAsB,QAAQ,eAAe;KAC7C,uBAAuB,QAAQ,eAAe;KAC/C,CAAC;IAGA;IAEA,YAAY,KAAK;IACjB,MAAM,KAAK;IACX,MAAM,KAAK;IACX,YAAY,KAAK;IAEjB,YAAY,QAAQ;IACpB,gBAAgB,QAAQ;IACxB,2BAA2B,QAAQ;IACpC;IACD;GACF"}
|
|
@@ -2,16 +2,16 @@ import { RenderCtxBase } from "../../../render/api.js";
|
|
|
2
2
|
import { ColumnSource } from "../../../columns/column_snapshot_provider.js";
|
|
3
3
|
import { RelaxedColumnSelector } from "../../../columns/column_selector.js";
|
|
4
4
|
import { ColumnsSelectorConfig, TableColumnSnapshot } from "./createPlDataTableV3.js";
|
|
5
|
-
import { PColumnSpec, PObjectId, PlRef
|
|
5
|
+
import { PColumnSpec, PObjectId, PlRef } from "@milaboratories/pl-model-common";
|
|
6
6
|
|
|
7
7
|
//#region src/components/PlDataTable/createPlDataTable/discoverColumns.d.ts
|
|
8
|
-
type
|
|
8
|
+
type DiscoverTableColumnOptions = {
|
|
9
9
|
sources?: ColumnSource[];
|
|
10
10
|
anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>;
|
|
11
|
-
|
|
11
|
+
selector: ColumnsSelectorConfig;
|
|
12
12
|
};
|
|
13
13
|
/** Discover columns from sources/anchors and normalize into a flat DiscoveredColumn list. */
|
|
14
|
-
declare function discoverTableColumnSnaphots
|
|
14
|
+
declare function discoverTableColumnSnaphots(ctx: RenderCtxBase, options: DiscoverTableColumnOptions): TableColumnSnapshot[] | undefined;
|
|
15
15
|
//#endregion
|
|
16
|
-
export {
|
|
16
|
+
export { DiscoverTableColumnOptions, discoverTableColumnSnaphots };
|
|
17
17
|
//# sourceMappingURL=discoverColumns.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discoverColumns.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"mappings":";;;;;;;KAiBY,
|
|
1
|
+
{"version":3,"file":"discoverColumns.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"mappings":";;;;;;;KAiBY,0BAAA;EACV,OAAA,GAAU,YAAA;EACV,OAAA,EAAS,MAAA,SAAe,KAAA,GAAQ,SAAA,GAAY,WAAA,GAAc,qBAAA;EAC1D,QAAA,EAAU,qBAAA;AAAA;AAHZ;AAAA,iBAOgB,2BAAA,CACd,GAAA,EAAK,aAAA,EACL,OAAA,EAAS,0BAAA,GACR,mBAAA"}
|