@platforma-sdk/model 1.74.0 → 1.75.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 +4 -3
- package/dist/columns/column_collection_builder.cjs.map +1 -1
- package/dist/columns/column_collection_builder.d.ts +5 -5
- package/dist/columns/column_collection_builder.d.ts.map +1 -1
- package/dist/columns/column_collection_builder.js +4 -3
- package/dist/columns/column_collection_builder.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +14 -14
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +3 -2
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +16 -16
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +50 -4
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +51 -6
- 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.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs +7 -4
- package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/utils.js +16 -13
- package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -1
- package/dist/components/PlDataTable/index.d.ts +1 -1
- package/dist/components/PlDataTable/state-migration.cjs +31 -5
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts +13 -1
- package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
- package/dist/components/PlDataTable/state-migration.js +32 -6
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/typesV5.d.ts +19 -90
- package/dist/components/PlDataTable/typesV5.d.ts.map +1 -1
- package/dist/components/PlDataTable/typesV6.d.ts +98 -0
- package/dist/components/PlDataTable/typesV6.d.ts.map +1 -0
- package/dist/components/PlDatasetSelector/enrichment_discovery.cjs +5 -5
- package/dist/components/PlDatasetSelector/enrichment_discovery.cjs.map +1 -1
- package/dist/components/PlDatasetSelector/enrichment_discovery.js +5 -5
- package/dist/components/PlDatasetSelector/enrichment_discovery.js.map +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/labels/derive_distinct_labels.cjs +2 -2
- package/dist/labels/derive_distinct_labels.cjs.map +1 -1
- package/dist/labels/derive_distinct_labels.js +2 -2
- package/dist/labels/derive_distinct_labels.js.map +1 -1
- package/dist/labels/derive_distinct_tooltips.cjs +2 -1
- package/dist/labels/derive_distinct_tooltips.cjs.map +1 -1
- package/dist/labels/derive_distinct_tooltips.js +2 -1
- package/dist/labels/derive_distinct_tooltips.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/package.json +8 -8
- package/src/columns/column_collection_builder.test.ts +3 -7
- package/src/columns/column_collection_builder.ts +14 -35
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +36 -21
- package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +57 -8
- package/src/components/PlDataTable/createPlDataTable/index.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/utils.test.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/utils.ts +9 -8
- package/src/components/PlDataTable/createPlDataTableSheet.ts +1 -1
- package/src/components/PlDataTable/index.ts +1 -2
- package/src/components/PlDataTable/state-migration.ts +71 -8
- package/src/components/PlDataTable/typesV5.ts +14 -153
- package/src/components/PlDataTable/typesV6.ts +152 -0
- package/src/components/PlDatasetSelector/enrichment_discovery.ts +5 -5
- package/src/labels/derive_distinct_labels.ts +2 -2
- package/src/labels/derive_distinct_tooltips.ts +2 -1
|
@@ -13,7 +13,7 @@ function createPlDataTableV3(ctx, options) {
|
|
|
13
13
|
const pframeSpec = ctx.getService("pframeSpec");
|
|
14
14
|
const state = require_state_migration.upgradePlDataTableStateV2(options.tableState);
|
|
15
15
|
const primaryJoinType = options.primaryJoinType ?? "full";
|
|
16
|
-
const discovered = (0, _milaboratories_helpers.isPlainObject)(options.columns) ? require_discoverColumns.discoverTableColumnSnaphots(ctx, options.columns) : options.columns;
|
|
16
|
+
const discovered = (0, _milaboratories_helpers.isPlainObject)(options.columns) ? require_discoverColumns.discoverTableColumnSnaphots(ctx, options.columns) : (0, _milaboratories_helpers.isNil)(options.columns) ? options.columns : (0, _milaboratories_pl_model_common.uniqueBy)([...options.columns, ...require_discoverColumns.discoverLabelColumnVariants(ctx, options.columns)], (c) => c.column.id);
|
|
17
17
|
if ((0, _milaboratories_helpers.isNil)(discovered) || discovered.length === 0) return void 0;
|
|
18
18
|
const splited = splitDiscoveredColumns(discovered);
|
|
19
19
|
const derivedLabels = require_utils.deriveAllLabels({
|
|
@@ -30,7 +30,7 @@ function createPlDataTableV3(ctx, options) {
|
|
|
30
30
|
});
|
|
31
31
|
const derivedTooltips = require_utils.deriveAllTooltips({ columns: discovered.map((dc) => ({
|
|
32
32
|
id: dc.column.id,
|
|
33
|
-
originalId: dc
|
|
33
|
+
originalId: (0, _milaboratories_helpers.getField)(dc, "originalId"),
|
|
34
34
|
spec: dc.column.spec,
|
|
35
35
|
linkerPath: dc.path,
|
|
36
36
|
qualifications: dc.qualifications
|
|
@@ -45,7 +45,7 @@ function createPlDataTableV3(ctx, options) {
|
|
|
45
45
|
const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);
|
|
46
46
|
const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);
|
|
47
47
|
if (primarySnapshots.length === 0) return void 0;
|
|
48
|
-
const columnIsAvailable = createColumnValidationById([...annotated.direct.map((v) => v.column), ...annotated.linked.flatMap((lc) => [...lc.path.map((s) => s.linker), lc.column])]);
|
|
48
|
+
const columnIsAvailable = createColumnValidationById([...annotated.direct.map((v) => v.column), ...annotated.linked.flatMap((lc) => [...(lc.path ?? []).map((s) => s.linker), lc.column])]);
|
|
49
49
|
const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);
|
|
50
50
|
const filters = filterFilters(concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters), columnIsAvailable);
|
|
51
51
|
const sorting = filterSorting(resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)), columnIsAvailable);
|
|
@@ -84,13 +84,13 @@ function createPlDataTableV3(ctx, options) {
|
|
|
84
84
|
/** Split discovered columns into direct (no linker path) and linked (with linker path). */
|
|
85
85
|
function splitDiscoveredColumns(columns) {
|
|
86
86
|
return {
|
|
87
|
-
direct: columns.filter((dc) => dc.path
|
|
88
|
-
linked: columns.filter((dc) => dc.path
|
|
87
|
+
direct: columns.filter((dc) => (dc.path?.length ?? 0) === 0),
|
|
88
|
+
linked: columns.filter((dc) => (dc.path?.length ?? 0) > 0)
|
|
89
89
|
};
|
|
90
90
|
}
|
|
91
91
|
/** All linker snapshots across the given linked columns, deduped by id. */
|
|
92
92
|
function collectLinkerSnapshots(linked) {
|
|
93
|
-
return (0, _milaboratories_pl_model_common.uniqueBy)(linked.flatMap((lc) => lc.path.map((s) => s.linker)), (c) => c.id);
|
|
93
|
+
return (0, _milaboratories_pl_model_common.uniqueBy)(linked.flatMap((lc) => (lc.path ?? []).map((s) => s.linker)), (c) => c.id);
|
|
94
94
|
}
|
|
95
95
|
/**
|
|
96
96
|
* Annotate all column groups with derived labels and display-rule annotations.
|
|
@@ -125,7 +125,7 @@ function liftToVariantColumns(variants, fn) {
|
|
|
125
125
|
}));
|
|
126
126
|
}
|
|
127
127
|
function annotateLinkerPath(derivedLabels, path) {
|
|
128
|
-
if (path.length === 0) return path;
|
|
128
|
+
if ((0, _milaboratories_helpers.isNil)(path) || path.length === 0) return path;
|
|
129
129
|
const annotatedLinkers = require_utils.withHidenAxesAnnotations(require_utils.withLabelAnnotations(derivedLabels, path.map((s) => s.linker)));
|
|
130
130
|
return path.map((s, i) => ({
|
|
131
131
|
...s,
|
|
@@ -195,16 +195,16 @@ function buildSecondaryGroups(direct, linked) {
|
|
|
195
195
|
return [...direct.map((c) => ({
|
|
196
196
|
entries: [{
|
|
197
197
|
column: resolveSnapshot(c.column),
|
|
198
|
-
qualifications: c.qualifications
|
|
198
|
+
qualifications: c.qualifications?.forHit
|
|
199
199
|
}],
|
|
200
|
-
primaryQualifications: c.qualifications
|
|
200
|
+
primaryQualifications: c.qualifications?.forQueries
|
|
201
201
|
})), ...linked.map((lc) => ({
|
|
202
202
|
entries: [{
|
|
203
203
|
column: resolveSnapshot(lc.column),
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
linkers: lc.path?.map((s) => resolveSnapshot(s.linker)),
|
|
205
|
+
qualifications: lc.qualifications?.forHit
|
|
206
206
|
}],
|
|
207
|
-
primaryQualifications: lc.qualifications
|
|
207
|
+
primaryQualifications: lc.qualifications?.forQueries
|
|
208
208
|
}))];
|
|
209
209
|
}
|
|
210
210
|
/** Determine which columns should be hidden based on state or optional-column defaults. */
|
|
@@ -244,7 +244,7 @@ function remapSortingColumnIds(sorting, columns) {
|
|
|
244
244
|
return sorting?.flatMap((s) => {
|
|
245
245
|
if (s.column.type === "axis") return [s];
|
|
246
246
|
const id = s.column.id;
|
|
247
|
-
const column = columns.find((c) => (c
|
|
247
|
+
const column = columns.find((c) => ((0, _milaboratories_helpers.getField)(c, "originalId") ?? c.column.id) === id);
|
|
248
248
|
if (column === void 0) return [];
|
|
249
249
|
return [{
|
|
250
250
|
...s,
|
|
@@ -264,7 +264,7 @@ function remapFilterColumnIds(filters, columns) {
|
|
|
264
264
|
const originalId = parsed.id;
|
|
265
265
|
return (0, _milaboratories_pl_model_common.canonicalizeJson)({
|
|
266
266
|
type: "column",
|
|
267
|
-
id: (columns.find((c) => (c
|
|
267
|
+
id: (columns.find((c) => ((0, _milaboratories_helpers.getField)(c, "originalId") ?? c.column.id) === originalId) ?? (0, _milaboratories_helpers.throwError)(`Column ID "${parsed.id}" in filters does not match any discovered column`)).column.id
|
|
268
268
|
});
|
|
269
269
|
};
|
|
270
270
|
return require_traverse.traverseFilterSpec(filters, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPlDataTableV3.cjs","names":["upgradePlDataTableStateV2","discoverTableColumnSnaphots","deriveAllLabels","deriveAllTooltips","createPTableDefV3","evaluateRules","withDataStatusAnnotations","withLabelAnnotations","withInfoAnnotations","withTableVisualAnnotations","withHidenAxesAnnotations","getAxisId","isColumnHidden","isColumnOptional","collectFilterSpecColumns","traverseFilterSpec"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n FilterSpecNode,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableSorting,\n PColumnSpec,\n MultiColumnSelector,\n PFrameSpecDriver,\n DiscoveredPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, getAxisId, parseJson, uniqueBy } from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSelector, ColumnSnapshot, ColumnVariant, MatchingMode } from \"../../../columns\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n deriveAllTooltips,\n evaluateRules,\n isColumnHidden,\n isColumnOptional,\n withHidenAxesAnnotations,\n withLabelAnnotations,\n withTableVisualAnnotations,\n withInfoAnnotations,\n withDataStatusAnnotations,\n} from \"./utils\";\nimport type { PrimaryEntry, SecondaryGroup } from \"./createPTableDefV3\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport { discoverTableColumnSnaphots, type DiscoverTableColumnOptions } from \"./discoverColumns\";\nimport { isNil, isPlainObject, throwError, type Nil } from \"@milaboratories/helpers\";\nimport { flow } from \"es-toolkit\";\n\nexport type createPlDataTableOptionsV3 = {\n tableState?: PlDataTableStateV2;\n\n columns: Nil | DiscoverTableColumnOptions | TableColumnVariant[];\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher | ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher | ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const pframeSpec = ctx.getService(\"pframeSpec\");\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered = isPlainObject(options.columns)\n ? discoverTableColumnSnaphots(ctx, options.columns)\n : options.columns;\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const derivedTooltips = deriveAllTooltips({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n originalId: dc.originalId,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n });\n\n const annotated = annotateColumnGroups({\n pframeSpec,\n ...splited,\n derivedLabels,\n derivedTooltips,\n displayOptions: options.displayOptions,\n });\n\n const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);\n const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);\n\n if (primarySnapshots.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct.map((v) => v.column),\n ...annotated.linked.flatMap((lc) => [...lc.path.map((s) => s.linker), lc.column]),\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = filterFilters(\n concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n ),\n columnIsAvailable,\n );\n\n const sorting = filterSorting(\n resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)),\n columnIsAvailable,\n );\n\n const primaryEntries: PrimaryEntry<undefined | PColumnDataUniversal>[] = primarySnapshots.map(\n (v) => ({ column: resolveSnapshot(v.column) }),\n );\n const secondaryGroups: SecondaryGroup<undefined | PColumnDataUniversal>[] = buildSecondaryGroups(\n secondarySnapshots,\n annotated.linked,\n );\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: secondaryGroups,\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct.map((v) => resolveSnapshot(v.column)),\n ...annotated.linked.map((v) => resolveSnapshot(v.column)),\n ...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked].map((v) => v.column),\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds);\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(\n visible.direct.filter((c) => !c.isPrimary),\n visible.linked,\n ),\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\nexport type TableColumnVariant = ColumnVariant<DiscoveredPColumnId> & {\n readonly originalId: PObjectId;\n readonly isPrimary?: boolean;\n};\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(columns: TableColumnVariant[]): SplitDiscoveredColumns {\n const direct = columns.filter((dc) => dc.path.length === 0);\n const linked = columns.filter((dc) => dc.path.length > 0);\n return { direct, linked };\n}\n\n/** All linker snapshots across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: TableColumnVariant[]): ColumnSnapshot<PObjectId>[] {\n return uniqueBy(\n linked.flatMap((lc) => lc.path.map((s) => s.linker)),\n (c) => c.id,\n );\n}\n\n/**\n * Annotate all column groups with derived labels and display-rule annotations.\n * Evaluates `displayOptions` rules against all discovered columns (direct,\n * linked, labels, linkers) and writes the winning visibility/priority into\n * column annotations via `withTableVisualAnnotations`.\n */\nfunction annotateColumnGroups(params: {\n direct: TableColumnVariant[];\n linked: TableColumnVariant[];\n derivedLabels: Record<string, string>;\n derivedTooltips: Record<string, string>;\n displayOptions?: ColumnsDisplayOptions;\n pframeSpec: PFrameSpecDriver;\n}): AnnotatedColumnGroups {\n const { direct, linked, derivedLabels, derivedTooltips, displayOptions, pframeSpec } = params;\n\n const allColumnsForRules = [\n ...direct.map((v) => v.column),\n ...linked.map((v) => v.column),\n ...collectLinkerSnapshots(linked),\n ];\n const visibilityByColId = evaluateRules(\n displayOptions?.visibility ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n const orderByColId = evaluateRules(\n displayOptions?.ordering ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n\n const directAnnotated = liftToVariantColumns(\n direct,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n );\n\n const linkedAnnotated = liftToVariantColumns(\n linked,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withHidenAxesAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n ).map((lc) => ({ ...lc, path: annotateLinkerPath(derivedLabels, lc.path) }));\n\n return {\n direct: directAnnotated,\n linked: linkedAnnotated,\n };\n}\n\n/** Lift a snapshot-array transform so it runs on the inner `column` of each variant. */\nfunction liftToVariantColumns<V extends { readonly column: ColumnSnapshot<DiscoveredPColumnId> }>(\n variants: V[],\n fn: (cols: ColumnSnapshot<DiscoveredPColumnId>[]) => ColumnSnapshot<DiscoveredPColumnId>[],\n): V[] {\n const cols = fn(variants.map((v) => v.column));\n if (cols.length !== variants.length)\n throw new Error(\n `liftToVariantColumns: fn must preserve array length (got ${cols.length}, expected ${variants.length})`,\n );\n return variants.map((v, i) => ({ ...v, column: cols[i] }));\n}\n\nfunction annotateLinkerPath(\n derivedLabels: Record<string, string>,\n path: TableColumnVariant[\"path\"],\n): TableColumnVariant[\"path\"] {\n if (path.length === 0) return path;\n const annotatedLinkers = withHidenAxesAnnotations(\n withLabelAnnotations(\n derivedLabels,\n path.map((s) => s.linker),\n ),\n );\n return path.map((s, i) => ({ ...s, linker: annotatedLinkers[i] }));\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(\n fullColumns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Drop filter leaves whose column references are not available in the table. */\nfunction filterFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const isLeafValid = (leaf: PlDataTableFilterSpecLeaf): boolean => {\n if (leaf.type === undefined) return true;\n if (\"column\" in leaf && !isValidColumnId(leaf.column)) return false;\n if (\"rhs\" in leaf && !isValidColumnId(leaf.rhs)) return false;\n return true;\n };\n\n const prune = (node: PlDataTableFilterNode): Nil | PlDataTableFilterNode => {\n if (node.type === \"and\" || node.type === \"or\") {\n const kept = node.filters\n .map((f) => prune(f))\n .filter((f): f is PlDataTableFilterNode => !isNil(f));\n return { type: node.type, filters: kept };\n }\n if (node.type === \"not\") {\n const inner = prune(node.filter);\n return isNil(inner) ? undefined : { type: \"not\", filter: inner };\n }\n return isLeafValid(node) ? node : undefined;\n };\n\n return prune(filters) as Nil | PlDataTableFilters;\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Drop sorting entries whose column is not available in the table. */\nfunction filterSorting(\n sorting: PTableSorting[],\n isValidColumnId: (id: string) => boolean,\n): PTableSorting[] {\n return sorting.filter((s) => isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)));\n}\n\nfunction buildSecondaryGroups(\n direct: TableColumnVariant[],\n linked: TableColumnVariant[],\n): SecondaryGroup<undefined | PColumnDataUniversal>[] {\n return [\n ...direct.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [{ column: resolveSnapshot(c.column), qualifications: c.qualifications.forHit }],\n primaryQualifications: c.qualifications.forQueries,\n }),\n ),\n ...linked.map(\n (lc): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [\n {\n column: resolveSnapshot(lc.column),\n qualifications: lc.qualifications.forHit,\n linkers: lc.path.map((s) => resolveSnapshot(s.linker)),\n },\n ],\n primaryQualifications: lc.qualifications.forQueries,\n }),\n ),\n ];\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.column.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.column.id));\n return { direct, linked };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnVariant[],\n): Nil | PTableSorting[] {\n return sorting?.flatMap((s) => {\n if (s.column.type === \"axis\") return [s]; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column = columns.find((c) => (c.originalId ?? c.column.id) === id);\n if (column === undefined) return [];\n\n return [\n {\n ...s,\n column: {\n type: \"column\" as const,\n id: column.column.id,\n },\n },\n ];\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnVariant[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (c.originalId ?? c.column.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createPlDataTableV3.cjs","names":["upgradePlDataTableStateV2","discoverTableColumnSnaphots","discoverLabelColumnVariants","deriveAllLabels","deriveAllTooltips","createPTableDefV3","evaluateRules","withDataStatusAnnotations","withLabelAnnotations","withInfoAnnotations","withTableVisualAnnotations","withHidenAxesAnnotations","getAxisId","isColumnHidden","isColumnOptional","collectFilterSpecColumns","traverseFilterSpec"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n FilterSpecNode,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableSorting,\n PColumnSpec,\n MultiColumnSelector,\n PFrameSpecDriver,\n DiscoveredPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, getAxisId, parseJson, uniqueBy } from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV6\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSelector, ColumnSnapshot, ColumnVariant, MatchingMode } from \"../../../columns\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n deriveAllTooltips,\n evaluateRules,\n isColumnHidden,\n isColumnOptional,\n withHidenAxesAnnotations,\n withLabelAnnotations,\n withTableVisualAnnotations,\n withInfoAnnotations,\n withDataStatusAnnotations,\n} from \"./utils\";\nimport type { PrimaryEntry, SecondaryGroup } from \"./createPTableDefV3\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport {\n discoverLabelColumnVariants,\n discoverTableColumnSnaphots,\n type DiscoverTableColumnOptions,\n} from \"./discoverColumns\";\nimport { getField, isNil, isPlainObject, throwError, type Nil } from \"@milaboratories/helpers\";\nimport { flow } from \"es-toolkit\";\n\nexport type createPlDataTableOptionsV3 = {\n tableState?: PlDataTableStateV2;\n\n columns: Nil | DiscoverTableColumnOptions | TableColumnVariant[];\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher | ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher | ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const pframeSpec = ctx.getService(\"pframeSpec\");\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered = isPlainObject(options.columns)\n ? discoverTableColumnSnaphots(ctx, options.columns)\n : isNil(options.columns)\n ? options.columns\n : uniqueBy(\n [...options.columns, ...discoverLabelColumnVariants(ctx, options.columns)],\n (c) => c.column.id,\n );\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const derivedTooltips = deriveAllTooltips({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n originalId: getField(dc, \"originalId\"),\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n });\n\n const annotated = annotateColumnGroups({\n pframeSpec,\n ...splited,\n derivedLabels,\n derivedTooltips,\n displayOptions: options.displayOptions,\n });\n\n const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);\n const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);\n\n if (primarySnapshots.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct.map((v) => v.column),\n ...annotated.linked.flatMap((lc) => [...(lc.path ?? []).map((s) => s.linker), lc.column]),\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = filterFilters(\n concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n ),\n columnIsAvailable,\n );\n\n const sorting = filterSorting(\n resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)),\n columnIsAvailable,\n );\n\n const primaryEntries: PrimaryEntry<undefined | PColumnDataUniversal>[] = primarySnapshots.map(\n (v) => ({ column: resolveSnapshot(v.column) }),\n );\n const secondaryGroups: SecondaryGroup<undefined | PColumnDataUniversal>[] = buildSecondaryGroups(\n secondarySnapshots,\n annotated.linked,\n );\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: secondaryGroups,\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct.map((v) => resolveSnapshot(v.column)),\n ...annotated.linked.map((v) => resolveSnapshot(v.column)),\n ...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked].map((v) => v.column),\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds);\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(\n visible.direct.filter((c) => !c.isPrimary),\n visible.linked,\n ),\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\nexport type TableColumnVariant = (\n | ColumnVariant<PObjectId>\n | (ColumnVariant<DiscoveredPColumnId> & { readonly originalId: PObjectId })\n) & {\n readonly isPrimary?: boolean;\n};\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(columns: TableColumnVariant[]): SplitDiscoveredColumns {\n const direct = columns.filter((dc) => (dc.path?.length ?? 0) === 0);\n const linked = columns.filter((dc) => (dc.path?.length ?? 0) > 0);\n return { direct, linked };\n}\n\n/** All linker snapshots across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: TableColumnVariant[]): ColumnSnapshot<PObjectId>[] {\n return uniqueBy(\n linked.flatMap((lc) => (lc.path ?? []).map((s) => s.linker)),\n (c) => c.id,\n );\n}\n\n/**\n * Annotate all column groups with derived labels and display-rule annotations.\n * Evaluates `displayOptions` rules against all discovered columns (direct,\n * linked, labels, linkers) and writes the winning visibility/priority into\n * column annotations via `withTableVisualAnnotations`.\n */\nfunction annotateColumnGroups(params: {\n direct: TableColumnVariant[];\n linked: TableColumnVariant[];\n derivedLabels: Record<string, string>;\n derivedTooltips: Record<string, string>;\n displayOptions?: ColumnsDisplayOptions;\n pframeSpec: PFrameSpecDriver;\n}): AnnotatedColumnGroups {\n const { direct, linked, derivedLabels, derivedTooltips, displayOptions, pframeSpec } = params;\n\n const allColumnsForRules = [\n ...direct.map((v) => v.column),\n ...linked.map((v) => v.column),\n ...collectLinkerSnapshots(linked),\n ];\n const visibilityByColId = evaluateRules(\n displayOptions?.visibility ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n const orderByColId = evaluateRules(\n displayOptions?.ordering ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n\n const directAnnotated = liftToVariantColumns(\n direct,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n );\n\n const linkedAnnotated = liftToVariantColumns(\n linked,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withHidenAxesAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n ).map((lc) => ({ ...lc, path: annotateLinkerPath(derivedLabels, lc.path) }));\n\n return {\n direct: directAnnotated,\n linked: linkedAnnotated,\n };\n}\n\n/** Lift a snapshot-array transform so it runs on the inner `column` of each variant. */\nfunction liftToVariantColumns<\n V extends { readonly column: ColumnSnapshot<PObjectId | DiscoveredPColumnId> },\n>(\n variants: V[],\n fn: (\n cols: ColumnSnapshot<PObjectId | DiscoveredPColumnId>[],\n ) => ColumnSnapshot<PObjectId | DiscoveredPColumnId>[],\n): V[] {\n const cols = fn(variants.map((v) => v.column));\n if (cols.length !== variants.length)\n throw new Error(\n `liftToVariantColumns: fn must preserve array length (got ${cols.length}, expected ${variants.length})`,\n );\n return variants.map((v, i) => ({ ...v, column: cols[i] }));\n}\n\nfunction annotateLinkerPath(\n derivedLabels: Record<string, string>,\n path: TableColumnVariant[\"path\"],\n): TableColumnVariant[\"path\"] {\n if (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/** Drop filter leaves whose column references are not available in the table. */\nfunction filterFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const isLeafValid = (leaf: PlDataTableFilterSpecLeaf): boolean => {\n if (leaf.type === undefined) return true;\n if (\"column\" in leaf && !isValidColumnId(leaf.column)) return false;\n if (\"rhs\" in leaf && !isValidColumnId(leaf.rhs)) return false;\n return true;\n };\n\n const prune = (node: PlDataTableFilterNode): Nil | PlDataTableFilterNode => {\n if (node.type === \"and\" || node.type === \"or\") {\n const kept = node.filters\n .map((f) => prune(f))\n .filter((f): f is PlDataTableFilterNode => !isNil(f));\n return { type: node.type, filters: kept };\n }\n if (node.type === \"not\") {\n const inner = prune(node.filter);\n return isNil(inner) ? undefined : { type: \"not\", filter: inner };\n }\n return isLeafValid(node) ? node : undefined;\n };\n\n return prune(filters) as Nil | PlDataTableFilters;\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Drop sorting entries whose column is not available in the table. */\nfunction filterSorting(\n sorting: PTableSorting[],\n isValidColumnId: (id: string) => boolean,\n): PTableSorting[] {\n return sorting.filter((s) => isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)));\n}\n\nfunction buildSecondaryGroups(\n direct: TableColumnVariant[],\n linked: TableColumnVariant[],\n): SecondaryGroup<undefined | PColumnDataUniversal>[] {\n return [\n ...direct.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [{ column: resolveSnapshot(c.column), qualifications: c.qualifications?.forHit }],\n primaryQualifications: c.qualifications?.forQueries,\n }),\n ),\n ...linked.map(\n (lc): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [\n {\n column: resolveSnapshot(lc.column),\n linkers: lc.path?.map((s) => resolveSnapshot(s.linker)),\n qualifications: lc.qualifications?.forHit,\n },\n ],\n primaryQualifications: lc.qualifications?.forQueries,\n }),\n ),\n ];\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.column.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.column.id));\n return { direct, linked };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnVariant[],\n): Nil | PTableSorting[] {\n return sorting?.flatMap((s) => {\n if (s.column.type === \"axis\") return [s]; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column = columns.find((c) => (getField(c, \"originalId\") ?? c.column.id) === id);\n if (column === undefined) return [];\n\n return [\n {\n ...s,\n column: {\n type: \"column\" as const,\n id: column.column.id,\n },\n },\n ];\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnVariant[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (getField(c, \"originalId\") ?? c.column.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { ColumnSelector } from "../../../columns/column_selector.js";
|
|
|
2
2
|
import { ColumnVariant, MatchingMode } from "../../../columns/column_collection_builder.js";
|
|
3
3
|
import { DeriveLabelsOptions } from "../../../labels/derive_distinct_labels.js";
|
|
4
4
|
import { RenderCtxBase } from "../../../render/api.js";
|
|
5
|
-
import { PlDataTableFilters, PlDataTableModel } from "../
|
|
5
|
+
import { PlDataTableFilters, PlDataTableModel } from "../typesV6.js";
|
|
6
6
|
import { PlDataTableStateV2 } from "../state-migration.js";
|
|
7
7
|
import { DiscoverTableColumnOptions } from "./discoverColumns.js";
|
|
8
8
|
import { DiscoveredPColumnId, MultiColumnSelector, PColumnSpec, PObjectId, PTableSorting } from "@milaboratories/pl-model-common";
|
|
@@ -39,8 +39,9 @@ type ColumnVisibilityRule = {
|
|
|
39
39
|
};
|
|
40
40
|
type ColumnMatcher = (spec: PColumnSpec) => boolean;
|
|
41
41
|
declare function createPlDataTableV3<A, U>(ctx: RenderCtxBase<A, U>, options: createPlDataTableOptionsV3): PlDataTableModel | undefined;
|
|
42
|
-
type TableColumnVariant = ColumnVariant<DiscoveredPColumnId> & {
|
|
42
|
+
type TableColumnVariant = (ColumnVariant<PObjectId> | (ColumnVariant<DiscoveredPColumnId> & {
|
|
43
43
|
readonly originalId: PObjectId;
|
|
44
|
+
})) & {
|
|
44
45
|
readonly isPrimary?: boolean;
|
|
45
46
|
};
|
|
46
47
|
//#endregion
|
|
@@ -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":";;;;;;;;;;;KA8CY,0BAAA;EACV,UAAA,GAAa,kBAAA;EAEb,OAAA,EAAS,GAAA,GAAM,0BAAA,GAA6B,kBAAA;EAC5C,OAAA,GAAU,kBAAA;EACV,OAAA,GAAU,aAAA;EACV,eAAA;EAEA,aAAA,GAAgB,mBAAA;EAChB,cAAA,GAAiB,qBAAA;AAAA;;KAIP,qBAAA;EACV,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,IAAA,GAAO,YAAA;EACP,OAAA;AAAA;AAAA,KAGU,qBAAA;EAX4B,uFAatC,QAAA,GAAW,eAAA,IArBE;EAuBb,UAAA,GAAa,oBAAA;AAAA;AAAA,KAGH,eAAA;EACV,KAAA,EAAO,aAAA,GAAgB,cAAA,EAxBvB;EA0BA,QAAA;AAAA;AAAA,KAGU,oBAAA;EACV,KAAA,EAAO,aAAA,GAAgB,cAAA;EACvB,UAAA;AAAA;AAAA,KAGU,aAAA,IAAiB,IAAA,EAAM,WAAA;AAAA,iBAEnB,mBAAA,MAAA,CACd,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,GACtB,OAAA,EAAS,0BAAA,GACR,gBAAA;AAAA,KA8HS,kBAAA,IACR,aAAA,CAAc,SAAA,KACb,aAAA,CAAc,mBAAA;EAAA,SAAkC,UAAA,EAAY,SAAA;AAAA;EAAA,SAEtD,SAAA;AAAA"}
|
|
@@ -2,9 +2,9 @@ import { collectFilterSpecColumns, traverseFilterSpec } from "../../../filters/t
|
|
|
2
2
|
import { upgradePlDataTableStateV2 } from "../state-migration.js";
|
|
3
3
|
import { createPTableDefV3 } from "./createPTableDefV3.js";
|
|
4
4
|
import { deriveAllLabels, deriveAllTooltips, evaluateRules, isColumnHidden, isColumnOptional, withDataStatusAnnotations, withHidenAxesAnnotations, withInfoAnnotations, withLabelAnnotations, withTableVisualAnnotations } from "./utils.js";
|
|
5
|
-
import { discoverTableColumnSnaphots } from "./discoverColumns.js";
|
|
5
|
+
import { discoverLabelColumnVariants, discoverTableColumnSnaphots } from "./discoverColumns.js";
|
|
6
6
|
import { canonicalizeJson, getAxisId, parseJson, uniqueBy } from "@milaboratories/pl-model-common";
|
|
7
|
-
import { isNil, isPlainObject, throwError } from "@milaboratories/helpers";
|
|
7
|
+
import { getField, isNil, isPlainObject, throwError } from "@milaboratories/helpers";
|
|
8
8
|
import { flow } from "es-toolkit";
|
|
9
9
|
import { isEmpty } from "es-toolkit/compat";
|
|
10
10
|
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts
|
|
@@ -12,7 +12,7 @@ function createPlDataTableV3(ctx, options) {
|
|
|
12
12
|
const pframeSpec = ctx.getService("pframeSpec");
|
|
13
13
|
const state = upgradePlDataTableStateV2(options.tableState);
|
|
14
14
|
const primaryJoinType = options.primaryJoinType ?? "full";
|
|
15
|
-
const discovered = isPlainObject(options.columns) ? discoverTableColumnSnaphots(ctx, options.columns) : options.columns;
|
|
15
|
+
const discovered = isPlainObject(options.columns) ? discoverTableColumnSnaphots(ctx, options.columns) : isNil(options.columns) ? options.columns : uniqueBy([...options.columns, ...discoverLabelColumnVariants(ctx, options.columns)], (c) => c.column.id);
|
|
16
16
|
if (isNil(discovered) || discovered.length === 0) return void 0;
|
|
17
17
|
const splited = splitDiscoveredColumns(discovered);
|
|
18
18
|
const derivedLabels = deriveAllLabels({
|
|
@@ -29,7 +29,7 @@ function createPlDataTableV3(ctx, options) {
|
|
|
29
29
|
});
|
|
30
30
|
const derivedTooltips = deriveAllTooltips({ columns: discovered.map((dc) => ({
|
|
31
31
|
id: dc.column.id,
|
|
32
|
-
originalId: dc
|
|
32
|
+
originalId: getField(dc, "originalId"),
|
|
33
33
|
spec: dc.column.spec,
|
|
34
34
|
linkerPath: dc.path,
|
|
35
35
|
qualifications: dc.qualifications
|
|
@@ -44,7 +44,7 @@ function createPlDataTableV3(ctx, options) {
|
|
|
44
44
|
const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);
|
|
45
45
|
const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);
|
|
46
46
|
if (primarySnapshots.length === 0) return void 0;
|
|
47
|
-
const columnIsAvailable = createColumnValidationById([...annotated.direct.map((v) => v.column), ...annotated.linked.flatMap((lc) => [...lc.path.map((s) => s.linker), lc.column])]);
|
|
47
|
+
const columnIsAvailable = createColumnValidationById([...annotated.direct.map((v) => v.column), ...annotated.linked.flatMap((lc) => [...(lc.path ?? []).map((s) => s.linker), lc.column])]);
|
|
48
48
|
const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);
|
|
49
49
|
const filters = filterFilters(concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters), columnIsAvailable);
|
|
50
50
|
const sorting = filterSorting(resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)), columnIsAvailable);
|
|
@@ -83,13 +83,13 @@ function createPlDataTableV3(ctx, options) {
|
|
|
83
83
|
/** Split discovered columns into direct (no linker path) and linked (with linker path). */
|
|
84
84
|
function splitDiscoveredColumns(columns) {
|
|
85
85
|
return {
|
|
86
|
-
direct: columns.filter((dc) => dc.path
|
|
87
|
-
linked: columns.filter((dc) => dc.path
|
|
86
|
+
direct: columns.filter((dc) => (dc.path?.length ?? 0) === 0),
|
|
87
|
+
linked: columns.filter((dc) => (dc.path?.length ?? 0) > 0)
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
90
|
/** All linker snapshots across the given linked columns, deduped by id. */
|
|
91
91
|
function collectLinkerSnapshots(linked) {
|
|
92
|
-
return uniqueBy(linked.flatMap((lc) => lc.path.map((s) => s.linker)), (c) => c.id);
|
|
92
|
+
return uniqueBy(linked.flatMap((lc) => (lc.path ?? []).map((s) => s.linker)), (c) => c.id);
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
95
|
* Annotate all column groups with derived labels and display-rule annotations.
|
|
@@ -124,7 +124,7 @@ function liftToVariantColumns(variants, fn) {
|
|
|
124
124
|
}));
|
|
125
125
|
}
|
|
126
126
|
function annotateLinkerPath(derivedLabels, path) {
|
|
127
|
-
if (path.length === 0) return path;
|
|
127
|
+
if (isNil(path) || path.length === 0) return path;
|
|
128
128
|
const annotatedLinkers = withHidenAxesAnnotations(withLabelAnnotations(derivedLabels, path.map((s) => s.linker)));
|
|
129
129
|
return path.map((s, i) => ({
|
|
130
130
|
...s,
|
|
@@ -194,16 +194,16 @@ function buildSecondaryGroups(direct, linked) {
|
|
|
194
194
|
return [...direct.map((c) => ({
|
|
195
195
|
entries: [{
|
|
196
196
|
column: resolveSnapshot(c.column),
|
|
197
|
-
qualifications: c.qualifications
|
|
197
|
+
qualifications: c.qualifications?.forHit
|
|
198
198
|
}],
|
|
199
|
-
primaryQualifications: c.qualifications
|
|
199
|
+
primaryQualifications: c.qualifications?.forQueries
|
|
200
200
|
})), ...linked.map((lc) => ({
|
|
201
201
|
entries: [{
|
|
202
202
|
column: resolveSnapshot(lc.column),
|
|
203
|
-
|
|
204
|
-
|
|
203
|
+
linkers: lc.path?.map((s) => resolveSnapshot(s.linker)),
|
|
204
|
+
qualifications: lc.qualifications?.forHit
|
|
205
205
|
}],
|
|
206
|
-
primaryQualifications: lc.qualifications
|
|
206
|
+
primaryQualifications: lc.qualifications?.forQueries
|
|
207
207
|
}))];
|
|
208
208
|
}
|
|
209
209
|
/** Determine which columns should be hidden based on state or optional-column defaults. */
|
|
@@ -243,7 +243,7 @@ function remapSortingColumnIds(sorting, columns) {
|
|
|
243
243
|
return sorting?.flatMap((s) => {
|
|
244
244
|
if (s.column.type === "axis") return [s];
|
|
245
245
|
const id = s.column.id;
|
|
246
|
-
const column = columns.find((c) => (c
|
|
246
|
+
const column = columns.find((c) => (getField(c, "originalId") ?? c.column.id) === id);
|
|
247
247
|
if (column === void 0) return [];
|
|
248
248
|
return [{
|
|
249
249
|
...s,
|
|
@@ -263,7 +263,7 @@ function remapFilterColumnIds(filters, columns) {
|
|
|
263
263
|
const originalId = parsed.id;
|
|
264
264
|
return canonicalizeJson({
|
|
265
265
|
type: "column",
|
|
266
|
-
id: (columns.find((c) => (c
|
|
266
|
+
id: (columns.find((c) => (getField(c, "originalId") ?? c.column.id) === originalId) ?? throwError(`Column ID "${parsed.id}" in filters does not match any discovered column`)).column.id
|
|
267
267
|
});
|
|
268
268
|
};
|
|
269
269
|
return traverseFilterSpec(filters, {
|
|
@@ -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 PFrameSpecDriver,\n DiscoveredPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, getAxisId, parseJson, uniqueBy } from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSelector, ColumnSnapshot, ColumnVariant, MatchingMode } from \"../../../columns\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n deriveAllTooltips,\n evaluateRules,\n isColumnHidden,\n isColumnOptional,\n withHidenAxesAnnotations,\n withLabelAnnotations,\n withTableVisualAnnotations,\n withInfoAnnotations,\n withDataStatusAnnotations,\n} from \"./utils\";\nimport type { PrimaryEntry, SecondaryGroup } from \"./createPTableDefV3\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport { discoverTableColumnSnaphots, type DiscoverTableColumnOptions } from \"./discoverColumns\";\nimport { isNil, isPlainObject, throwError, type Nil } from \"@milaboratories/helpers\";\nimport { flow } from \"es-toolkit\";\n\nexport type createPlDataTableOptionsV3 = {\n tableState?: PlDataTableStateV2;\n\n columns: Nil | DiscoverTableColumnOptions | TableColumnVariant[];\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher | ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher | ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const pframeSpec = ctx.getService(\"pframeSpec\");\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered = isPlainObject(options.columns)\n ? discoverTableColumnSnaphots(ctx, options.columns)\n : options.columns;\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const derivedTooltips = deriveAllTooltips({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n originalId: dc.originalId,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n });\n\n const annotated = annotateColumnGroups({\n pframeSpec,\n ...splited,\n derivedLabels,\n derivedTooltips,\n displayOptions: options.displayOptions,\n });\n\n const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);\n const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);\n\n if (primarySnapshots.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct.map((v) => v.column),\n ...annotated.linked.flatMap((lc) => [...lc.path.map((s) => s.linker), lc.column]),\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = filterFilters(\n concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n ),\n columnIsAvailable,\n );\n\n const sorting = filterSorting(\n resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)),\n columnIsAvailable,\n );\n\n const primaryEntries: PrimaryEntry<undefined | PColumnDataUniversal>[] = primarySnapshots.map(\n (v) => ({ column: resolveSnapshot(v.column) }),\n );\n const secondaryGroups: SecondaryGroup<undefined | PColumnDataUniversal>[] = buildSecondaryGroups(\n secondarySnapshots,\n annotated.linked,\n );\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: secondaryGroups,\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct.map((v) => resolveSnapshot(v.column)),\n ...annotated.linked.map((v) => resolveSnapshot(v.column)),\n ...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked].map((v) => v.column),\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds);\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(\n visible.direct.filter((c) => !c.isPrimary),\n visible.linked,\n ),\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\nexport type TableColumnVariant = ColumnVariant<DiscoveredPColumnId> & {\n readonly originalId: PObjectId;\n readonly isPrimary?: boolean;\n};\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(columns: TableColumnVariant[]): SplitDiscoveredColumns {\n const direct = columns.filter((dc) => dc.path.length === 0);\n const linked = columns.filter((dc) => dc.path.length > 0);\n return { direct, linked };\n}\n\n/** All linker snapshots across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: TableColumnVariant[]): ColumnSnapshot<PObjectId>[] {\n return uniqueBy(\n linked.flatMap((lc) => lc.path.map((s) => s.linker)),\n (c) => c.id,\n );\n}\n\n/**\n * Annotate all column groups with derived labels and display-rule annotations.\n * Evaluates `displayOptions` rules against all discovered columns (direct,\n * linked, labels, linkers) and writes the winning visibility/priority into\n * column annotations via `withTableVisualAnnotations`.\n */\nfunction annotateColumnGroups(params: {\n direct: TableColumnVariant[];\n linked: TableColumnVariant[];\n derivedLabels: Record<string, string>;\n derivedTooltips: Record<string, string>;\n displayOptions?: ColumnsDisplayOptions;\n pframeSpec: PFrameSpecDriver;\n}): AnnotatedColumnGroups {\n const { direct, linked, derivedLabels, derivedTooltips, displayOptions, pframeSpec } = params;\n\n const allColumnsForRules = [\n ...direct.map((v) => v.column),\n ...linked.map((v) => v.column),\n ...collectLinkerSnapshots(linked),\n ];\n const visibilityByColId = evaluateRules(\n displayOptions?.visibility ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n const orderByColId = evaluateRules(\n displayOptions?.ordering ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n\n const directAnnotated = liftToVariantColumns(\n direct,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n );\n\n const linkedAnnotated = liftToVariantColumns(\n linked,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withHidenAxesAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n ).map((lc) => ({ ...lc, path: annotateLinkerPath(derivedLabels, lc.path) }));\n\n return {\n direct: directAnnotated,\n linked: linkedAnnotated,\n };\n}\n\n/** Lift a snapshot-array transform so it runs on the inner `column` of each variant. */\nfunction liftToVariantColumns<V extends { readonly column: ColumnSnapshot<DiscoveredPColumnId> }>(\n variants: V[],\n fn: (cols: ColumnSnapshot<DiscoveredPColumnId>[]) => ColumnSnapshot<DiscoveredPColumnId>[],\n): V[] {\n const cols = fn(variants.map((v) => v.column));\n if (cols.length !== variants.length)\n throw new Error(\n `liftToVariantColumns: fn must preserve array length (got ${cols.length}, expected ${variants.length})`,\n );\n return variants.map((v, i) => ({ ...v, column: cols[i] }));\n}\n\nfunction annotateLinkerPath(\n derivedLabels: Record<string, string>,\n path: TableColumnVariant[\"path\"],\n): TableColumnVariant[\"path\"] {\n if (path.length === 0) return path;\n const annotatedLinkers = withHidenAxesAnnotations(\n withLabelAnnotations(\n derivedLabels,\n path.map((s) => s.linker),\n ),\n );\n return path.map((s, i) => ({ ...s, linker: annotatedLinkers[i] }));\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(\n fullColumns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Drop filter leaves whose column references are not available in the table. */\nfunction filterFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const isLeafValid = (leaf: PlDataTableFilterSpecLeaf): boolean => {\n if (leaf.type === undefined) return true;\n if (\"column\" in leaf && !isValidColumnId(leaf.column)) return false;\n if (\"rhs\" in leaf && !isValidColumnId(leaf.rhs)) return false;\n return true;\n };\n\n const prune = (node: PlDataTableFilterNode): Nil | PlDataTableFilterNode => {\n if (node.type === \"and\" || node.type === \"or\") {\n const kept = node.filters\n .map((f) => prune(f))\n .filter((f): f is PlDataTableFilterNode => !isNil(f));\n return { type: node.type, filters: kept };\n }\n if (node.type === \"not\") {\n const inner = prune(node.filter);\n return isNil(inner) ? undefined : { type: \"not\", filter: inner };\n }\n return isLeafValid(node) ? node : undefined;\n };\n\n return prune(filters) as Nil | PlDataTableFilters;\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Drop sorting entries whose column is not available in the table. */\nfunction filterSorting(\n sorting: PTableSorting[],\n isValidColumnId: (id: string) => boolean,\n): PTableSorting[] {\n return sorting.filter((s) => isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)));\n}\n\nfunction buildSecondaryGroups(\n direct: TableColumnVariant[],\n linked: TableColumnVariant[],\n): SecondaryGroup<undefined | PColumnDataUniversal>[] {\n return [\n ...direct.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [{ column: resolveSnapshot(c.column), qualifications: c.qualifications.forHit }],\n primaryQualifications: c.qualifications.forQueries,\n }),\n ),\n ...linked.map(\n (lc): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [\n {\n column: resolveSnapshot(lc.column),\n qualifications: lc.qualifications.forHit,\n linkers: lc.path.map((s) => resolveSnapshot(s.linker)),\n },\n ],\n primaryQualifications: lc.qualifications.forQueries,\n }),\n ),\n ];\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.column.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.column.id));\n return { direct, linked };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnVariant[],\n): Nil | PTableSorting[] {\n return sorting?.flatMap((s) => {\n if (s.column.type === \"axis\") return [s]; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column = columns.find((c) => (c.originalId ?? c.column.id) === id);\n if (column === undefined) return [];\n\n return [\n {\n ...s,\n column: {\n type: \"column\" as const,\n id: column.column.id,\n },\n },\n ];\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnVariant[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (c.originalId ?? c.column.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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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 \"../typesV6\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSelector, ColumnSnapshot, ColumnVariant, MatchingMode } from \"../../../columns\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n deriveAllTooltips,\n evaluateRules,\n isColumnHidden,\n isColumnOptional,\n withHidenAxesAnnotations,\n withLabelAnnotations,\n withTableVisualAnnotations,\n withInfoAnnotations,\n withDataStatusAnnotations,\n} from \"./utils\";\nimport type { PrimaryEntry, SecondaryGroup } from \"./createPTableDefV3\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport {\n discoverLabelColumnVariants,\n discoverTableColumnSnaphots,\n type DiscoverTableColumnOptions,\n} from \"./discoverColumns\";\nimport { getField, isNil, isPlainObject, throwError, type Nil } from \"@milaboratories/helpers\";\nimport { flow } from \"es-toolkit\";\n\nexport type createPlDataTableOptionsV3 = {\n tableState?: PlDataTableStateV2;\n\n columns: Nil | DiscoverTableColumnOptions | TableColumnVariant[];\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher | ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher | ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const pframeSpec = ctx.getService(\"pframeSpec\");\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered = isPlainObject(options.columns)\n ? discoverTableColumnSnaphots(ctx, options.columns)\n : isNil(options.columns)\n ? options.columns\n : uniqueBy(\n [...options.columns, ...discoverLabelColumnVariants(ctx, options.columns)],\n (c) => c.column.id,\n );\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const derivedTooltips = deriveAllTooltips({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n originalId: getField(dc, \"originalId\"),\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n });\n\n const annotated = annotateColumnGroups({\n pframeSpec,\n ...splited,\n derivedLabels,\n derivedTooltips,\n displayOptions: options.displayOptions,\n });\n\n const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);\n const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);\n\n if (primarySnapshots.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct.map((v) => v.column),\n ...annotated.linked.flatMap((lc) => [...(lc.path ?? []).map((s) => s.linker), lc.column]),\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = filterFilters(\n concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n ),\n columnIsAvailable,\n );\n\n const sorting = filterSorting(\n resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)),\n columnIsAvailable,\n );\n\n const primaryEntries: PrimaryEntry<undefined | PColumnDataUniversal>[] = primarySnapshots.map(\n (v) => ({ column: resolveSnapshot(v.column) }),\n );\n const secondaryGroups: SecondaryGroup<undefined | PColumnDataUniversal>[] = buildSecondaryGroups(\n secondarySnapshots,\n annotated.linked,\n );\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: secondaryGroups,\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct.map((v) => resolveSnapshot(v.column)),\n ...annotated.linked.map((v) => resolveSnapshot(v.column)),\n ...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked].map((v) => v.column),\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds);\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(\n visible.direct.filter((c) => !c.isPrimary),\n visible.linked,\n ),\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\nexport type TableColumnVariant = (\n | ColumnVariant<PObjectId>\n | (ColumnVariant<DiscoveredPColumnId> & { readonly originalId: PObjectId })\n) & {\n readonly isPrimary?: boolean;\n};\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(columns: TableColumnVariant[]): SplitDiscoveredColumns {\n const direct = columns.filter((dc) => (dc.path?.length ?? 0) === 0);\n const linked = columns.filter((dc) => (dc.path?.length ?? 0) > 0);\n return { direct, linked };\n}\n\n/** All linker snapshots across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: TableColumnVariant[]): ColumnSnapshot<PObjectId>[] {\n return uniqueBy(\n linked.flatMap((lc) => (lc.path ?? []).map((s) => s.linker)),\n (c) => c.id,\n );\n}\n\n/**\n * Annotate all column groups with derived labels and display-rule annotations.\n * Evaluates `displayOptions` rules against all discovered columns (direct,\n * linked, labels, linkers) and writes the winning visibility/priority into\n * column annotations via `withTableVisualAnnotations`.\n */\nfunction annotateColumnGroups(params: {\n direct: TableColumnVariant[];\n linked: TableColumnVariant[];\n derivedLabels: Record<string, string>;\n derivedTooltips: Record<string, string>;\n displayOptions?: ColumnsDisplayOptions;\n pframeSpec: PFrameSpecDriver;\n}): AnnotatedColumnGroups {\n const { direct, linked, derivedLabels, derivedTooltips, displayOptions, pframeSpec } = params;\n\n const allColumnsForRules = [\n ...direct.map((v) => v.column),\n ...linked.map((v) => v.column),\n ...collectLinkerSnapshots(linked),\n ];\n const visibilityByColId = evaluateRules(\n displayOptions?.visibility ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n const orderByColId = evaluateRules(\n displayOptions?.ordering ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n\n const directAnnotated = liftToVariantColumns(\n direct,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n );\n\n const linkedAnnotated = liftToVariantColumns(\n linked,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withHidenAxesAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n ).map((lc) => ({ ...lc, path: annotateLinkerPath(derivedLabels, lc.path) }));\n\n return {\n direct: directAnnotated,\n linked: linkedAnnotated,\n };\n}\n\n/** Lift a snapshot-array transform so it runs on the inner `column` of each variant. */\nfunction liftToVariantColumns<\n V extends { readonly column: ColumnSnapshot<PObjectId | DiscoveredPColumnId> },\n>(\n variants: V[],\n fn: (\n cols: ColumnSnapshot<PObjectId | DiscoveredPColumnId>[],\n ) => ColumnSnapshot<PObjectId | DiscoveredPColumnId>[],\n): V[] {\n const cols = fn(variants.map((v) => v.column));\n if (cols.length !== variants.length)\n throw new Error(\n `liftToVariantColumns: fn must preserve array length (got ${cols.length}, expected ${variants.length})`,\n );\n return variants.map((v, i) => ({ ...v, column: cols[i] }));\n}\n\nfunction annotateLinkerPath(\n derivedLabels: Record<string, string>,\n path: TableColumnVariant[\"path\"],\n): TableColumnVariant[\"path\"] {\n if (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/** Drop filter leaves whose column references are not available in the table. */\nfunction filterFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const isLeafValid = (leaf: PlDataTableFilterSpecLeaf): boolean => {\n if (leaf.type === undefined) return true;\n if (\"column\" in leaf && !isValidColumnId(leaf.column)) return false;\n if (\"rhs\" in leaf && !isValidColumnId(leaf.rhs)) return false;\n return true;\n };\n\n const prune = (node: PlDataTableFilterNode): Nil | PlDataTableFilterNode => {\n if (node.type === \"and\" || node.type === \"or\") {\n const kept = node.filters\n .map((f) => prune(f))\n .filter((f): f is PlDataTableFilterNode => !isNil(f));\n return { type: node.type, filters: kept };\n }\n if (node.type === \"not\") {\n const inner = prune(node.filter);\n return isNil(inner) ? undefined : { type: \"not\", filter: inner };\n }\n return isLeafValid(node) ? node : undefined;\n };\n\n return prune(filters) as Nil | PlDataTableFilters;\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Drop sorting entries whose column is not available in the table. */\nfunction filterSorting(\n sorting: PTableSorting[],\n isValidColumnId: (id: string) => boolean,\n): PTableSorting[] {\n return sorting.filter((s) => isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)));\n}\n\nfunction buildSecondaryGroups(\n direct: TableColumnVariant[],\n linked: TableColumnVariant[],\n): SecondaryGroup<undefined | PColumnDataUniversal>[] {\n return [\n ...direct.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [{ column: resolveSnapshot(c.column), qualifications: c.qualifications?.forHit }],\n primaryQualifications: c.qualifications?.forQueries,\n }),\n ),\n ...linked.map(\n (lc): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [\n {\n column: resolveSnapshot(lc.column),\n linkers: lc.path?.map((s) => resolveSnapshot(s.linker)),\n qualifications: lc.qualifications?.forHit,\n },\n ],\n primaryQualifications: lc.qualifications?.forQueries,\n }),\n ),\n ];\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.column.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.column.id));\n return { direct, linked };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnVariant[],\n): Nil | PTableSorting[] {\n return sorting?.flatMap((s) => {\n if (s.column.type === \"axis\") return [s]; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column = columns.find((c) => (getField(c, \"originalId\") ?? c.column.id) === id);\n if (column === undefined) return [];\n\n return [\n {\n ...s,\n column: {\n type: \"column\" as const,\n id: column.column.id,\n },\n },\n ];\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnVariant[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (getField(c, \"originalId\") ?? c.column.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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"}
|
|
@@ -17,7 +17,52 @@ function discoverTableColumnSnaphots(ctx, options) {
|
|
|
17
17
|
const collection = new require_column_collection_builder.ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSources(providers).build(resolvedOptions);
|
|
18
18
|
if (collection === void 0) return void 0;
|
|
19
19
|
try {
|
|
20
|
-
return mapToTableColumnVariants(collection.findColumnVariants(
|
|
20
|
+
return mapToTableColumnVariants(collection.findColumnVariants(resolvedOptions.selector), collection.getAnchors());
|
|
21
|
+
} finally {
|
|
22
|
+
collection.dispose();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Discover label columns matching the axes of the given value columns from
|
|
27
|
+
* ctx providers. Returns label snapshots wrapped as direct TableColumnVariants
|
|
28
|
+
* (path: [], empty qualifications, isPrimary: false).
|
|
29
|
+
*/
|
|
30
|
+
function discoverLabelColumnVariants(ctx, columns) {
|
|
31
|
+
if (columns.length === 0) return [];
|
|
32
|
+
const collection = new require_column_collection_builder.ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSources(require_ctx_column_sources.collectCtxColumnSnapshotProviders(ctx)).addSource(columns.map((c) => c.column)).build({
|
|
33
|
+
allowPartialColumnList: true,
|
|
34
|
+
anchors: Object.fromEntries(columns.filter((col) => (col.path?.length ?? 0) === 0 && col.isPrimary).map((col, i) => [`anchor_${i}`, col.column.spec]))
|
|
35
|
+
});
|
|
36
|
+
try {
|
|
37
|
+
const axes = columns.flatMap((col) => col.column.spec.axesSpec);
|
|
38
|
+
return collection.findColumnVariants({
|
|
39
|
+
include: axes.map((a) => ({
|
|
40
|
+
name: {
|
|
41
|
+
type: "exact",
|
|
42
|
+
value: _milaboratories_pl_model_common.PColumnName.Label
|
|
43
|
+
},
|
|
44
|
+
axes: [{ name: {
|
|
45
|
+
type: "exact",
|
|
46
|
+
value: a.name
|
|
47
|
+
} }]
|
|
48
|
+
})),
|
|
49
|
+
maxHops: columns.reduce((acc, c) => Math.max(acc, c.path?.length ?? 0), 0)
|
|
50
|
+
}).map((variant) => ({
|
|
51
|
+
...variant,
|
|
52
|
+
column: {
|
|
53
|
+
...variant.column,
|
|
54
|
+
id: (0, _milaboratories_pl_model_common.createDiscoveredPColumnId)({
|
|
55
|
+
column: variant.column.id,
|
|
56
|
+
path: variant.path?.map((p) => ({
|
|
57
|
+
type: "linker",
|
|
58
|
+
column: p.linker.id
|
|
59
|
+
})),
|
|
60
|
+
columnQualifications: variant.qualifications?.forHit,
|
|
61
|
+
queriesQualifications: variant.qualifications?.forQueries
|
|
62
|
+
}),
|
|
63
|
+
originalId: variant.column.id
|
|
64
|
+
}
|
|
65
|
+
}));
|
|
21
66
|
} finally {
|
|
22
67
|
collection.dispose();
|
|
23
68
|
}
|
|
@@ -43,12 +88,12 @@ function mapToTableColumnVariants(variants, anchors) {
|
|
|
43
88
|
column: {
|
|
44
89
|
id: (0, _milaboratories_pl_model_common.createDiscoveredPColumnId)({
|
|
45
90
|
column: snap.id,
|
|
46
|
-
path: variant.path
|
|
91
|
+
path: variant.path?.map((p) => ({
|
|
47
92
|
type: "linker",
|
|
48
93
|
column: p.linker.id
|
|
49
94
|
})),
|
|
50
|
-
columnQualifications: variant.qualifications
|
|
51
|
-
queriesQualifications: variant.qualifications
|
|
95
|
+
columnQualifications: variant.qualifications?.forHit,
|
|
96
|
+
queriesQualifications: variant.qualifications?.forQueries
|
|
52
97
|
}),
|
|
53
98
|
spec: snap.spec,
|
|
54
99
|
data: snap.data,
|
|
@@ -62,6 +107,7 @@ function mapToTableColumnVariants(variants, anchors) {
|
|
|
62
107
|
});
|
|
63
108
|
}
|
|
64
109
|
//#endregion
|
|
110
|
+
exports.discoverLabelColumnVariants = discoverLabelColumnVariants;
|
|
65
111
|
exports.discoverTableColumnSnaphots = discoverTableColumnSnaphots;
|
|
66
112
|
|
|
67
113
|
//# sourceMappingURL=discoverColumns.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discoverColumns.cjs","names":["ColumnCollectionBuilder","
|
|
1
|
+
{"version":3,"file":"discoverColumns.cjs","names":["ColumnCollectionBuilder","collectCtxColumnSnapshotProviders","PColumnName","toColumnSnapshotProvider"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"sourcesContent":["import type { PColumnSpec, PlRef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { createDiscoveredPColumnId, isPlRef, PColumnName } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../../render\";\nimport type {\n ColumnSource,\n ColumnVariant,\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, TableColumnVariant } from \"./createPlDataTableV3\";\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 TableColumnVariant list. */\nexport function discoverTableColumnSnaphots(\n ctx: RenderCtxBase,\n options: DiscoverTableColumnOptions,\n): TableColumnVariant[] | 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 variants = collection.findColumnVariants(resolvedOptions.selector);\n const anchors = collection.getAnchors();\n return mapToTableColumnVariants(variants, anchors);\n } finally {\n collection.dispose();\n }\n}\n\n/**\n * Discover label columns matching the axes of the given value columns from\n * ctx providers. Returns label snapshots wrapped as direct TableColumnVariants\n * (path: [], empty qualifications, isPrimary: false).\n */\nexport function discoverLabelColumnVariants<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: TableColumnVariant[],\n): TableColumnVariant[] {\n if (columns.length === 0) return [];\n const collection = new ColumnCollectionBuilder(ctx.getService(\"pframeSpec\"))\n .addSources(collectCtxColumnSnapshotProviders(ctx))\n .addSource(columns.map((c) => c.column))\n .build({\n allowPartialColumnList: true,\n anchors: Object.fromEntries(\n columns\n .filter((col) => (col.path?.length ?? 0) === 0 && col.isPrimary)\n .map((col, i) => [`anchor_${i}`, col.column.spec]),\n ),\n });\n\n try {\n const axes = columns.flatMap((col) => col.column.spec.axesSpec);\n return collection\n .findColumnVariants({\n include: axes.map((a) => ({\n name: { type: \"exact\", value: PColumnName.Label },\n axes: [{ name: { type: \"exact\", value: a.name } }],\n })),\n maxHops: columns.reduce((acc, c) => Math.max(acc, c.path?.length ?? 0), 0),\n })\n .map((variant) => ({\n ...variant,\n column: {\n ...variant.column,\n id: createDiscoveredPColumnId({\n column: variant.column.id,\n path: variant.path?.map((p) => ({\n type: \"linker\",\n column: p.linker.id,\n })),\n columnQualifications: variant.qualifications?.forHit,\n queriesQualifications: variant.qualifications?.forQueries,\n }),\n originalId: variant.column.id,\n },\n }));\n } finally {\n collection.dispose();\n }\n}\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 column variants into TableColumnVariant list with anchor-derived isPrimary flag. */\nfunction mapToTableColumnVariants(\n variants: readonly ColumnVariant[],\n anchors: Map<string, ColumnSnapshot<PObjectId>>,\n): TableColumnVariant[] {\n const columnIdToAnchorName = new Map<PObjectId, string>(\n Array.from(anchors.entries(), ([key, { id }]) => [id, key] as const),\n );\n\n return variants.map((variant): TableColumnVariant => {\n const snap = variant.column;\n const isPrimary = columnIdToAnchorName.get(snap.id) !== undefined;\n\n const discoveredId = createDiscoveredPColumnId({\n column: snap.id,\n path: variant.path?.map((p) => ({\n type: \"linker\",\n column: p.linker.id,\n })),\n columnQualifications: variant.qualifications?.forHit,\n queriesQualifications: variant.qualifications?.forQueries,\n });\n return {\n column: {\n id: discoveredId,\n spec: snap.spec,\n data: snap.data,\n dataStatus: snap.dataStatus,\n },\n path: variant.path,\n qualifications: variant.qualifications,\n originalId: snap.id,\n isPrimary,\n };\n });\n}\n"],"mappings":"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"}
|