@platforma-sdk/model 1.76.5 → 1.77.4

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.
Files changed (46) hide show
  1. package/dist/columns/column_collection_builder.cjs +6 -3
  2. package/dist/columns/column_collection_builder.cjs.map +1 -1
  3. package/dist/columns/column_collection_builder.js +6 -3
  4. package/dist/columns/column_collection_builder.js.map +1 -1
  5. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
  6. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
  7. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
  8. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
  9. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  10. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +1 -1
  11. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  12. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  13. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +1 -1
  14. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  15. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  16. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  17. package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
  18. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +1 -1
  19. package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -1
  20. package/dist/components/PlDataTable/index.d.ts +1 -1
  21. package/dist/components/PlDataTable/state-migration.cjs +32 -1
  22. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  23. package/dist/components/PlDataTable/state-migration.d.ts +4 -3
  24. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
  25. package/dist/components/PlDataTable/state-migration.js +33 -2
  26. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  27. package/dist/components/PlDataTable/typesV6.d.ts +26 -84
  28. package/dist/components/PlDataTable/typesV6.d.ts.map +1 -1
  29. package/dist/components/PlDataTable/typesV7.d.ts +98 -0
  30. package/dist/components/PlDataTable/typesV7.d.ts.map +1 -0
  31. package/dist/components/index.d.ts +1 -1
  32. package/dist/index.d.ts +1 -1
  33. package/dist/package.cjs +1 -1
  34. package/dist/package.js +1 -1
  35. package/package.json +8 -8
  36. package/src/columns/column_collection_builder.ts +12 -3
  37. package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +1 -1
  38. package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +1 -1
  39. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +1 -1
  40. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +1 -1
  41. package/src/components/PlDataTable/createPlDataTable/index.ts +1 -1
  42. package/src/components/PlDataTable/createPlDataTableSheet.ts +1 -1
  43. package/src/components/PlDataTable/index.ts +1 -1
  44. package/src/components/PlDataTable/state-migration.ts +71 -13
  45. package/src/components/PlDataTable/typesV6.ts +16 -138
  46. package/src/components/PlDataTable/typesV7.ts +151 -0
@@ -1 +1 @@
1
- {"version":3,"file":"createPlDataTableV3.cjs","names":["upgradePlDataTableStateV2","discoverTableColumnSnaphots","discoverLabelColumnVariants","deriveAllLabels","isColumnHidden","deriveAllTooltips","createPTableDefV3","evaluateRules","withDataStatusAnnotations","withLabelAnnotations","withInfoAnnotations","withTableVisualAnnotations","withHidenAxesAnnotations","getAxisId","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\n .map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n }))\n .filter((v) => !isColumnHidden(v.spec)),\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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"}
1
+ {"version":3,"file":"createPlDataTableV3.cjs","names":["upgradePlDataTableStateV2","discoverTableColumnSnaphots","discoverLabelColumnVariants","deriveAllLabels","isColumnHidden","deriveAllTooltips","createPTableDefV3","evaluateRules","withDataStatusAnnotations","withLabelAnnotations","withInfoAnnotations","withTableVisualAnnotations","withHidenAxesAnnotations","getAxisId","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 \"../typesV7\";\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\n .map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n }))\n .filter((v) => !isColumnHidden(v.spec)),\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 "../typesV6.js";
5
+ import { PlDataTableFilters, PlDataTableModel } from "../typesV7.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";
@@ -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 \"../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\n .map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n }))\n .filter((v) => !isColumnHidden(v.spec)),\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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"}
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 \"../typesV7\";\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\n .map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n }))\n .filter((v) => !isColumnHidden(v.spec)),\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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["createPlDataTableV2","createPlDataTableV3"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/index.ts"],"sourcesContent":["import type { RenderCtxBase } from \"../../../render\";\nimport type { PlDataTableModel } from \"../typesV6\";\nimport { createPlDataTableOptionsV2, createPlDataTableV2 } from \"./createPlDataTableV2\";\nimport { createPlDataTableV3 } from \"./createPlDataTableV3\";\nimport type { createPlDataTableOptionsV3 } from \"./createPlDataTableV3\";\n\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version: \"v2\" } & createPlDataTableOptionsV2,\n): ReturnType<typeof createPlDataTableV2>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version?: \"v3\" } & createPlDataTableOptionsV3,\n): ReturnType<typeof createPlDataTableV3>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options:\n | ({ version: \"v2\" } & createPlDataTableOptionsV2)\n | ({ version?: \"v3\" } & createPlDataTableOptionsV3),\n): PlDataTableModel | undefined {\n if (options.version === \"v2\") {\n return createPlDataTableV2(ctx, options.columns, options.tableState, options.options);\n } else {\n // default version is last (v3 at the moment)\n return createPlDataTableV3(ctx, options);\n }\n}\n\nexport { discoverTableColumnSnaphots } from \"./discoverColumns\";\n"],"mappings":";;;;AAcA,SAAgB,kBACd,KACA,SAG8B;AAC9B,KAAI,QAAQ,YAAY,KACtB,QAAOA,4BAAAA,oBAAoB,KAAK,QAAQ,SAAS,QAAQ,YAAY,QAAQ,QAAQ;KAGrF,QAAOC,4BAAAA,oBAAoB,KAAK,QAAQ"}
1
+ {"version":3,"file":"index.cjs","names":["createPlDataTableV2","createPlDataTableV3"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/index.ts"],"sourcesContent":["import type { RenderCtxBase } from \"../../../render\";\nimport type { PlDataTableModel } from \"../typesV7\";\nimport { createPlDataTableOptionsV2, createPlDataTableV2 } from \"./createPlDataTableV2\";\nimport { createPlDataTableV3 } from \"./createPlDataTableV3\";\nimport type { createPlDataTableOptionsV3 } from \"./createPlDataTableV3\";\n\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version: \"v2\" } & createPlDataTableOptionsV2,\n): ReturnType<typeof createPlDataTableV2>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version?: \"v3\" } & createPlDataTableOptionsV3,\n): ReturnType<typeof createPlDataTableV3>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options:\n | ({ version: \"v2\" } & createPlDataTableOptionsV2)\n | ({ version?: \"v3\" } & createPlDataTableOptionsV3),\n): PlDataTableModel | undefined {\n if (options.version === \"v2\") {\n return createPlDataTableV2(ctx, options.columns, options.tableState, options.options);\n } else {\n // default version is last (v3 at the moment)\n return createPlDataTableV3(ctx, options);\n }\n}\n\nexport { discoverTableColumnSnaphots } from \"./discoverColumns\";\n"],"mappings":";;;;AAcA,SAAgB,kBACd,KACA,SAG8B;AAC9B,KAAI,QAAQ,YAAY,KACtB,QAAOA,4BAAAA,oBAAoB,KAAK,QAAQ,SAAS,QAAQ,YAAY,QAAQ,QAAQ;KAGrF,QAAOC,4BAAAA,oBAAoB,KAAK,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/index.ts"],"sourcesContent":["import type { RenderCtxBase } from \"../../../render\";\nimport type { PlDataTableModel } from \"../typesV6\";\nimport { createPlDataTableOptionsV2, createPlDataTableV2 } from \"./createPlDataTableV2\";\nimport { createPlDataTableV3 } from \"./createPlDataTableV3\";\nimport type { createPlDataTableOptionsV3 } from \"./createPlDataTableV3\";\n\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version: \"v2\" } & createPlDataTableOptionsV2,\n): ReturnType<typeof createPlDataTableV2>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version?: \"v3\" } & createPlDataTableOptionsV3,\n): ReturnType<typeof createPlDataTableV3>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options:\n | ({ version: \"v2\" } & createPlDataTableOptionsV2)\n | ({ version?: \"v3\" } & createPlDataTableOptionsV3),\n): PlDataTableModel | undefined {\n if (options.version === \"v2\") {\n return createPlDataTableV2(ctx, options.columns, options.tableState, options.options);\n } else {\n // default version is last (v3 at the moment)\n return createPlDataTableV3(ctx, options);\n }\n}\n\nexport { discoverTableColumnSnaphots } from \"./discoverColumns\";\n"],"mappings":";;;;AAcA,SAAgB,kBACd,KACA,SAG8B;AAC9B,KAAI,QAAQ,YAAY,KACtB,QAAO,oBAAoB,KAAK,QAAQ,SAAS,QAAQ,YAAY,QAAQ,QAAQ;KAGrF,QAAO,oBAAoB,KAAK,QAAQ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/index.ts"],"sourcesContent":["import type { RenderCtxBase } from \"../../../render\";\nimport type { PlDataTableModel } from \"../typesV7\";\nimport { createPlDataTableOptionsV2, createPlDataTableV2 } from \"./createPlDataTableV2\";\nimport { createPlDataTableV3 } from \"./createPlDataTableV3\";\nimport type { createPlDataTableOptionsV3 } from \"./createPlDataTableV3\";\n\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version: \"v2\" } & createPlDataTableOptionsV2,\n): ReturnType<typeof createPlDataTableV2>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version?: \"v3\" } & createPlDataTableOptionsV3,\n): ReturnType<typeof createPlDataTableV3>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options:\n | ({ version: \"v2\" } & createPlDataTableOptionsV2)\n | ({ version?: \"v3\" } & createPlDataTableOptionsV3),\n): PlDataTableModel | undefined {\n if (options.version === \"v2\") {\n return createPlDataTableV2(ctx, options.columns, options.tableState, options.options);\n } else {\n // default version is last (v3 at the moment)\n return createPlDataTableV3(ctx, options);\n }\n}\n\nexport { discoverTableColumnSnaphots } from \"./discoverColumns\";\n"],"mappings":";;;;AAcA,SAAgB,kBACd,KACA,SAG8B;AAC9B,KAAI,QAAQ,YAAY,KACtB,QAAO,oBAAoB,KAAK,QAAQ,SAAS,QAAQ,YAAY,QAAQ,QAAQ;KAGrF,QAAO,oBAAoB,KAAK,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"createPlDataTableSheet.cjs","names":[],"sources":["../../../src/components/PlDataTable/createPlDataTableSheet.ts"],"sourcesContent":["import type { AxisSpec } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../render\";\nimport type { PlDataTableSheet } from \"./typesV6\";\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtxBase<A, U>,\n axis: AxisSpec,\n values: (string | number)[],\n): PlDataTableSheet {\n const labels = ctx.resultPool.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString(),\n })),\n defaultValue: values[0],\n };\n}\n"],"mappings":";;AAKA,SAAgB,uBACd,KACA,MACA,QACkB;CAClB,MAAM,SAAS,IAAI,WAAW,WAAW,KAAK;AAC9C,QAAO;EACL;EACA,SAAS,OAAO,KAAK,OAAO;GAC1B,OAAO;GACP,OAAO,SAAS,MAAM,EAAE,UAAU;GACnC,EAAE;EACH,cAAc,OAAO;EACtB"}
1
+ {"version":3,"file":"createPlDataTableSheet.cjs","names":[],"sources":["../../../src/components/PlDataTable/createPlDataTableSheet.ts"],"sourcesContent":["import type { AxisSpec } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../render\";\nimport type { PlDataTableSheet } from \"./typesV7\";\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtxBase<A, U>,\n axis: AxisSpec,\n values: (string | number)[],\n): PlDataTableSheet {\n const labels = ctx.resultPool.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString(),\n })),\n defaultValue: values[0],\n };\n}\n"],"mappings":";;AAKA,SAAgB,uBACd,KACA,MACA,QACkB;CAClB,MAAM,SAAS,IAAI,WAAW,WAAW,KAAK;AAC9C,QAAO;EACL;EACA,SAAS,OAAO,KAAK,OAAO;GAC1B,OAAO;GACP,OAAO,SAAS,MAAM,EAAE,UAAU;GACnC,EAAE;EACH,cAAc,OAAO;EACtB"}
@@ -1,5 +1,5 @@
1
1
  import { RenderCtxBase } from "../../render/api.js";
2
- import { PlDataTableSheet } from "./typesV6.js";
2
+ import { PlDataTableSheet } from "./typesV7.js";
3
3
  import { AxisSpec } from "@milaboratories/pl-model-common";
4
4
 
5
5
  //#region src/components/PlDataTable/createPlDataTableSheet.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"createPlDataTableSheet.js","names":[],"sources":["../../../src/components/PlDataTable/createPlDataTableSheet.ts"],"sourcesContent":["import type { AxisSpec } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../render\";\nimport type { PlDataTableSheet } from \"./typesV6\";\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtxBase<A, U>,\n axis: AxisSpec,\n values: (string | number)[],\n): PlDataTableSheet {\n const labels = ctx.resultPool.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString(),\n })),\n defaultValue: values[0],\n };\n}\n"],"mappings":";;AAKA,SAAgB,uBACd,KACA,MACA,QACkB;CAClB,MAAM,SAAS,IAAI,WAAW,WAAW,KAAK;AAC9C,QAAO;EACL;EACA,SAAS,OAAO,KAAK,OAAO;GAC1B,OAAO;GACP,OAAO,SAAS,MAAM,EAAE,UAAU;GACnC,EAAE;EACH,cAAc,OAAO;EACtB"}
1
+ {"version":3,"file":"createPlDataTableSheet.js","names":[],"sources":["../../../src/components/PlDataTable/createPlDataTableSheet.ts"],"sourcesContent":["import type { AxisSpec } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../render\";\nimport type { PlDataTableSheet } from \"./typesV7\";\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtxBase<A, U>,\n axis: AxisSpec,\n values: (string | number)[],\n): PlDataTableSheet {\n const labels = ctx.resultPool.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString(),\n })),\n defaultValue: values[0],\n };\n}\n"],"mappings":";;AAKA,SAAgB,uBACd,KACA,MACA,QACkB;CAClB,MAAM,SAAS,IAAI,WAAW,WAAW,KAAK;AAC9C,QAAO;EACL;EACA,SAAS,OAAO,KAAK,OAAO;GAC1B,OAAO;GACP,OAAO,SAAS,MAAM,EAAE,UAAU;GACnC,EAAE;EACH,cAAc,OAAO;EACtB"}
@@ -1,4 +1,4 @@
1
- import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson } from "./typesV6.js";
1
+ import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson } from "./typesV7.js";
2
2
  import { PlDataTableStateV2, createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./state-migration.js";
3
3
  import { createPlDataTableSheet } from "./createPlDataTableSheet.js";
4
4
  import { createPlDataTableV2 } from "./createPlDataTable/createPlDataTableV2.js";
@@ -19,6 +19,7 @@ function upgradePlDataTableStateV2(state) {
19
19
  if (state.version === 3) state = createPlDataTableStateV2();
20
20
  if (state.version === 4) state = migrateV4toV6(state);
21
21
  if (state.version === 5) state = migrateV5toV6(state);
22
+ if (state.version === 6) state = migrateV6toV7(state);
22
23
  return state;
23
24
  }
24
25
  /** Migrate v5 to v6: unwrap `{source, labeled}` colIds in gridState. */
@@ -50,6 +51,36 @@ function unwrapV5GridState(gridState) {
50
51
  columnVisibility: gridState.columnVisibility ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(unwrapAs) } : void 0
51
52
  };
52
53
  }
54
+ /** Migrate v6 to v7: rewrite each colId from a full PTableColumnSpec to its
55
+ * compact PTableColumnId (drops annotations/spec body, ~16× smaller per column). */
56
+ function migrateV6toV7(state) {
57
+ return {
58
+ version: 7,
59
+ stateCache: state.stateCache.map((entry) => ({
60
+ ...entry,
61
+ gridState: shrinkV6GridState(entry.gridState)
62
+ })),
63
+ pTableParams: state.pTableParams
64
+ };
65
+ }
66
+ /** Convert a v6 fat colId (canonicalized PTableColumnSpec) to a v7 compact colId
67
+ * (canonicalized PTableColumnId). The row-number sentinel is a string literal,
68
+ * not a spec — pass it through unchanged. */
69
+ function shrinkV6ColId(json) {
70
+ const parsed = (0, _milaboratories_pl_model_common.parseJsonSafely)(json);
71
+ if (!(0, es_toolkit.isNil)(parsed) && typeof parsed === "object" && "type" in parsed && "id" in parsed) return (0, _milaboratories_pl_model_common.canonicalizeJson)((0, _milaboratories_pl_model_common.getPTableColumnId)(parsed));
72
+ return json;
73
+ }
74
+ function shrinkV6GridState(gridState) {
75
+ return {
76
+ columnOrder: gridState.columnOrder ? { orderedColIds: gridState.columnOrder.orderedColIds.map(shrinkV6ColId) } : void 0,
77
+ sort: gridState.sort ? { sortModel: gridState.sort.sortModel.map((s) => ({
78
+ colId: shrinkV6ColId(s.colId),
79
+ sort: s.sort
80
+ })) } : void 0,
81
+ columnVisibility: gridState.columnVisibility ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(shrinkV6ColId) } : void 0
82
+ };
83
+ }
53
84
  /** Migrate v4 state to v6: convert per-column filters to tree-based format (skips v5). */
54
85
  function migrateV4toV6(state) {
55
86
  let idCounter = 0;
@@ -227,7 +258,7 @@ function createDefaultPTableParams() {
227
258
  }
228
259
  function createPlDataTableStateV2() {
229
260
  return {
230
- version: 6,
261
+ version: 7,
231
262
  stateCache: [],
232
263
  pTableParams: createDefaultPTableParams()
233
264
  };
@@ -1 +1 @@
1
- {"version":3,"file":"state-migration.cjs","names":["distillFilterSpec"],"sources":["../../../src/components/PlDataTable/state-migration.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n PObjectId,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n PTableSorting,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, parseJsonSafely } from \"@milaboratories/pl-model-common\";\nimport { distillFilterSpec } from \"../../filters\";\nimport type { PlDataTableFilterState, PlTableFilter } from \"./typesV4\";\nimport type {\n PlDataTableFiltersWithMeta,\n PlDataTableGridStateCore,\n PlDataTableSheetState,\n PlDataTableStateV2CacheEntry,\n PlDataTableStateV2Normalized,\n PTableParamsV2,\n} from \"./typesV6\";\nimport type {\n PlDataTableGridStateV5,\n PlDataTableV5ColIdJson,\n PlDataTableV5ColIdWrapper,\n} from \"./typesV5\";\nimport { isNil } from \"es-toolkit\";\n\n/**\n * PlDataTableV2 persisted state\n */\nexport type PlDataTableStateV2 =\n // Old versions of the state\n | {\n // no version\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sourceId?: string;\n sheets?: Record<CanonicalizedJson<AxisId>, string | number>;\n };\n pTableParams?: {\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n };\n }\n | {\n version: 2;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n }[];\n pTableParams: {\n hiddenColIds: PObjectId[] | null;\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n }\n | {\n version: 3;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n pTableParams: PTableParamsV2;\n }\n | {\n version: 4;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateCore;\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n /** Old format; only fields used in migration are typed */\n pTableParams: {\n sourceId: string | null;\n hiddenColIds: PObjectId[] | null;\n sorting: PTableSorting[];\n };\n }\n // v5 stored colIds as `{source, labeled}` wrappers; only the gridState shape differs.\n | {\n version: 5;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateV5;\n sheetsState: PlDataTableSheetState[];\n filtersState: null | PlDataTableFiltersWithMeta;\n defaultFiltersState: null | PlDataTableFiltersWithMeta;\n searchString?: string;\n }[];\n pTableParams: PTableParamsV2;\n }\n // Normalized state\n | PlDataTableStateV2Normalized;\n\n/** Upgrade PlDataTableStateV2 to the latest version */\nexport function upgradePlDataTableStateV2(\n state: PlDataTableStateV2 | undefined,\n): PlDataTableStateV2Normalized {\n // Block just added, had no state, model started earlier than the UI\n if (!state) {\n return createPlDataTableStateV2();\n }\n // v1 -> v2\n if (!(\"version\" in state)) {\n // Non upgradeable as sourceId calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v2 -> v3\n if (state.version === 2) {\n state = {\n version: 3,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n filtersState: [],\n })),\n pTableParams: createDefaultPTableParams(),\n };\n }\n // v3 -> v4\n if (state.version === 3) {\n // Non upgradeable as column ids calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v4 -> v6: migrate per-column filters to tree-based format (skips v5).\n // v4 gridState already used bare PTableColumnSpec colIds, so we jump\n // straight to v6 without going through the v5 wrapper format.\n if (state.version === 4) {\n state = migrateV4toV6(state);\n }\n // v5 -> v6: unwrap `{source, labeled}` colIds in gridState back to bare PTableColumnSpec.\n if (state.version === 5) {\n state = migrateV5toV6(state);\n }\n return state;\n}\n\n/** Migrate v5 to v6: unwrap `{source, labeled}` colIds in gridState. */\nfunction migrateV5toV6(\n state: Extract<PlDataTableStateV2, { version: 5 }>,\n): PlDataTableStateV2Normalized {\n // pTableParams reset: v5 stored DiscoveredPColumnId-based hiddenColIds with\n // empty-array fields (e.g. `{column, path: [], columnQualifications: [], ...}`).\n // v6 distills empty fields, so the same logical column serialises differently\n // and lookups would silently miss every previously-hidden discovered column.\n // gridState colIds are derived from PTableColumnSpec and unaffected.\n return {\n version: 6,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n gridState: unwrapV5GridState(entry.gridState),\n })),\n pTableParams: createDefaultPTableParams(),\n };\n}\n\n/** Convert v5 wrapped colId JSON to bare PTableColumnSpec JSON, taking `.source`.\n * gridState colIds may include the row-number sentinel (a JSON-stringified\n * literal, not a wrapped spec) — those pass through unchanged. */\nfunction unwrapV5ColId(json: string): string {\n const parsed: unknown = parseJsonSafely(json as CanonicalizedJson<unknown>);\n return !isNil(parsed) && typeof parsed === \"object\" && \"source\" in parsed\n ? canonicalizeJson((parsed as PlDataTableV5ColIdWrapper).source)\n : json;\n}\n\nfunction unwrapV5GridState(gridState: PlDataTableGridStateV5): PlDataTableGridStateCore {\n const unwrapAs = (json: PlDataTableV5ColIdJson) =>\n unwrapV5ColId(json) as CanonicalizedJson<PTableColumnSpec>;\n return {\n columnOrder: gridState.columnOrder\n ? { orderedColIds: gridState.columnOrder.orderedColIds.map(unwrapAs) }\n : undefined,\n sort: gridState.sort\n ? {\n sortModel: gridState.sort.sortModel.map((s) => ({\n colId: unwrapAs(s.colId),\n sort: s.sort,\n })),\n }\n : undefined,\n columnVisibility: gridState.columnVisibility\n ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(unwrapAs) }\n : undefined,\n };\n}\n\n/** Migrate v4 state to v6: convert per-column filters to tree-based format (skips v5). */\nfunction migrateV4toV6(\n state: Extract<PlDataTableStateV2, { version: 4 }>,\n): PlDataTableStateV2Normalized {\n let idCounter = 0;\n const nextId = () => ++idCounter;\n\n const migratedCache: PlDataTableStateV2CacheEntry[] = state.stateCache.map((entry) => {\n const leaves: PlDataTableFiltersWithMeta[\"filters\"] = [];\n for (const f of entry.filtersState) {\n if (f.filter !== null && !f.filter.disabled) {\n const column = canonicalizeJson(f.id);\n leaves.push(migrateTableFilter(column, f.filter.value, nextId));\n }\n }\n const filtersState: PlDataTableFiltersWithMeta | null =\n leaves.length > 0 ? { id: nextId(), type: \"and\", filters: leaves } : null;\n\n return {\n sourceId: entry.sourceId,\n gridState: entry.gridState,\n sheetsState: entry.sheetsState,\n filtersState,\n defaultFiltersState: null,\n };\n });\n\n const oldSourceId = state.pTableParams.sourceId;\n const currentCache = oldSourceId\n ? migratedCache.find((e) => e.sourceId === oldSourceId)\n : undefined;\n\n return {\n version: 6,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds:\n state.pTableParams.hiddenColIds?.map((id) => ({ type: \"column\" as const, id })) ??\n null,\n filters: distillFilterSpec(currentCache.filtersState),\n defaultFilters: null,\n sorting: state.pTableParams.sorting,\n }\n : createDefaultPTableParams(),\n };\n}\n\n/** Migrate a single per-column PlTableFilter to a tree-based FilterSpec node */\nfunction migrateTableFilter(\n column: CanonicalizedJson<PTableColumnId>,\n filter: PlTableFilter,\n nextId: () => number,\n): PlDataTableFiltersWithMeta[\"filters\"][number] {\n const id = nextId();\n switch (filter.type) {\n case \"isNA\":\n return { id, type: \"isNA\", column };\n case \"isNotNA\":\n return { id, type: \"isNotNA\", column };\n case \"number_equals\":\n return { id, type: \"equal\", column, x: filter.reference };\n case \"number_notEquals\":\n return { id, type: \"notEqual\", column, x: filter.reference };\n case \"number_greaterThan\":\n return { id, type: \"greaterThan\", column, x: filter.reference };\n case \"number_greaterThanOrEqualTo\":\n return { id, type: \"greaterThanOrEqual\", column, x: filter.reference };\n case \"number_lessThan\":\n return { id, type: \"lessThan\", column, x: filter.reference };\n case \"number_lessThanOrEqualTo\":\n return { id, type: \"lessThanOrEqual\", column, x: filter.reference };\n case \"number_between\":\n return {\n id,\n type: \"and\",\n filters: [\n filter.includeLowerBound\n ? { id: nextId(), type: \"greaterThanOrEqual\" as const, column, x: filter.lowerBound }\n : { id: nextId(), type: \"greaterThan\" as const, column, x: filter.lowerBound },\n filter.includeUpperBound\n ? { id: nextId(), type: \"lessThanOrEqual\" as const, column, x: filter.upperBound }\n : { id: nextId(), type: \"lessThan\" as const, column, x: filter.upperBound },\n ],\n };\n case \"string_equals\":\n return { id, type: \"patternEquals\", column, value: filter.reference };\n case \"string_notEquals\":\n return { id, type: \"patternNotEquals\", column, value: filter.reference };\n case \"string_contains\":\n return { id, type: \"patternContainSubsequence\", column, value: filter.reference };\n case \"string_doesNotContain\":\n return { id, type: \"patternNotContainSubsequence\", column, value: filter.reference };\n case \"string_matches\":\n return { id, type: \"patternMatchesRegularExpression\", column, value: filter.reference };\n case \"string_doesNotMatch\":\n return {\n id,\n type: \"not\",\n filter: {\n id: nextId(),\n type: \"patternMatchesRegularExpression\",\n column,\n value: filter.reference,\n },\n };\n case \"string_containsFuzzyMatch\":\n return {\n id,\n type: \"patternFuzzyContainSubsequence\",\n column,\n value: filter.reference,\n maxEdits: filter.maxEdits,\n substitutionsOnly: filter.substitutionsOnly,\n ...(filter.wildcard !== undefined ? { wildcard: filter.wildcard } : {}),\n };\n }\n}\n\nexport function createDefaultPTableParams(): PTableParamsV2 {\n return {\n sourceId: null,\n hiddenColIds: null,\n filters: null,\n defaultFilters: null,\n sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 6,\n stateCache: [],\n pTableParams: createDefaultPTableParams(),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"state-migration.cjs","names":["distillFilterSpec"],"sources":["../../../src/components/PlDataTable/state-migration.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n PObjectId,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n PTableSorting,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeJson,\n getPTableColumnId,\n parseJsonSafely,\n} from \"@milaboratories/pl-model-common\";\nimport { distillFilterSpec } from \"../../filters\";\nimport type { PlDataTableFilterState, PlTableFilter } from \"./typesV4\";\nimport type {\n PlDataTableFiltersWithMeta,\n PlDataTableGridStateCore,\n PlDataTableSheetState,\n PlDataTableStateV2CacheEntry,\n PlDataTableStateV2Normalized,\n PlTableColumnIdJson,\n PTableParamsV2,\n} from \"./typesV7\";\nimport type {\n PlDataTableGridStateV6,\n PlDataTableStateV2V6,\n PlDataTableStateV2V6CacheEntry,\n PlDataTableV6ColIdJson,\n} from \"./typesV6\";\nimport type {\n PlDataTableGridStateV5,\n PlDataTableV5ColIdJson,\n PlDataTableV5ColIdWrapper,\n} from \"./typesV5\";\nimport { isNil } from \"es-toolkit\";\n\n/**\n * PlDataTableV2 persisted state\n */\nexport type PlDataTableStateV2 =\n // Old versions of the state\n | {\n // no version\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sourceId?: string;\n sheets?: Record<CanonicalizedJson<AxisId>, string | number>;\n };\n pTableParams?: {\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n };\n }\n | {\n version: 2;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n }[];\n pTableParams: {\n hiddenColIds: PObjectId[] | null;\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n }\n | {\n version: 3;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n pTableParams: PTableParamsV2;\n }\n | {\n version: 4;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateV6;\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n /** Old format; only fields used in migration are typed */\n pTableParams: {\n sourceId: string | null;\n hiddenColIds: PObjectId[] | null;\n sorting: PTableSorting[];\n };\n }\n // v5 stored colIds as `{source, labeled}` wrappers; only the gridState shape differs.\n | {\n version: 5;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateV5;\n sheetsState: PlDataTableSheetState[];\n filtersState: null | PlDataTableFiltersWithMeta;\n defaultFiltersState: null | PlDataTableFiltersWithMeta;\n searchString?: string;\n }[];\n pTableParams: PTableParamsV2;\n }\n // v6 stored colIds as canonicalized full `PTableColumnSpec` (including\n // annotations + `pl7.app/trace`). v7 strips down to `PTableColumnId`.\n | PlDataTableStateV2V6\n // Normalized state\n | PlDataTableStateV2Normalized;\n\n/** Upgrade PlDataTableStateV2 to the latest version */\nexport function upgradePlDataTableStateV2(\n state: PlDataTableStateV2 | undefined,\n): PlDataTableStateV2Normalized {\n // Block just added, had no state, model started earlier than the UI\n if (!state) {\n return createPlDataTableStateV2();\n }\n // v1 -> v2\n if (!(\"version\" in state)) {\n // Non upgradeable as sourceId calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v2 -> v3\n if (state.version === 2) {\n state = {\n version: 3,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n filtersState: [],\n })),\n pTableParams: createDefaultPTableParams(),\n };\n }\n // v3 -> v4\n if (state.version === 3) {\n // Non upgradeable as column ids calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v4 -> v6: migrate per-column filters to tree-based format (skips v5).\n // v4 gridState already used bare PTableColumnSpec colIds, so we jump\n // straight to v6 without going through the v5 wrapper format.\n if (state.version === 4) {\n state = migrateV4toV6(state);\n }\n // v5 -> v6: unwrap `{source, labeled}` colIds in gridState back to bare PTableColumnSpec.\n if (state.version === 5) {\n state = migrateV5toV6(state);\n }\n // v6 -> v7: shrink colIds from full PTableColumnSpec to PTableColumnId.\n if (state.version === 6) {\n state = migrateV6toV7(state);\n }\n return state;\n}\n\n/** Migrate v5 to v6: unwrap `{source, labeled}` colIds in gridState. */\nfunction migrateV5toV6(state: Extract<PlDataTableStateV2, { version: 5 }>): PlDataTableStateV2V6 {\n // pTableParams reset: v5 stored DiscoveredPColumnId-based hiddenColIds with\n // empty-array fields (e.g. `{column, path: [], columnQualifications: [], ...}`).\n // v6 distills empty fields, so the same logical column serialises differently\n // and lookups would silently miss every previously-hidden discovered column.\n // gridState colIds are derived from PTableColumnSpec and unaffected.\n return {\n version: 6,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n gridState: unwrapV5GridState(entry.gridState),\n })),\n pTableParams: createDefaultPTableParams(),\n };\n}\n\n/** Convert v5 wrapped colId JSON to bare PTableColumnSpec JSON, taking `.source`.\n * gridState colIds may include the row-number sentinel (a JSON-stringified\n * literal, not a wrapped spec) — those pass through unchanged. */\nfunction unwrapV5ColId(json: string): string {\n const parsed: unknown = parseJsonSafely(json as CanonicalizedJson<unknown>);\n return !isNil(parsed) && typeof parsed === \"object\" && \"source\" in parsed\n ? canonicalizeJson((parsed as PlDataTableV5ColIdWrapper).source)\n : json;\n}\n\nfunction unwrapV5GridState(gridState: PlDataTableGridStateV5): PlDataTableGridStateV6 {\n const unwrapAs = (json: PlDataTableV5ColIdJson) => unwrapV5ColId(json) as PlDataTableV6ColIdJson;\n return {\n columnOrder: gridState.columnOrder\n ? { orderedColIds: gridState.columnOrder.orderedColIds.map(unwrapAs) }\n : undefined,\n sort: gridState.sort\n ? {\n sortModel: gridState.sort.sortModel.map((s) => ({\n colId: unwrapAs(s.colId),\n sort: s.sort,\n })),\n }\n : undefined,\n columnVisibility: gridState.columnVisibility\n ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(unwrapAs) }\n : undefined,\n };\n}\n\n/** Migrate v6 to v7: rewrite each colId from a full PTableColumnSpec to its\n * compact PTableColumnId (drops annotations/spec body, ~16× smaller per column). */\nfunction migrateV6toV7(state: PlDataTableStateV2V6): PlDataTableStateV2Normalized {\n return {\n version: 7,\n stateCache: state.stateCache.map(\n (entry): PlDataTableStateV2CacheEntry => ({\n ...entry,\n gridState: shrinkV6GridState(entry.gridState),\n }),\n ),\n pTableParams: state.pTableParams,\n };\n}\n\n/** Convert a v6 fat colId (canonicalized PTableColumnSpec) to a v7 compact colId\n * (canonicalized PTableColumnId). The row-number sentinel is a string literal,\n * not a spec — pass it through unchanged. */\nfunction shrinkV6ColId(json: PlDataTableV6ColIdJson): PlTableColumnIdJson {\n const parsed: unknown = parseJsonSafely(json);\n if (!isNil(parsed) && typeof parsed === \"object\" && \"type\" in parsed && \"id\" in parsed) {\n return canonicalizeJson(getPTableColumnId(parsed as PTableColumnSpec));\n }\n return json as unknown as PlTableColumnIdJson;\n}\n\nfunction shrinkV6GridState(gridState: PlDataTableGridStateV6): PlDataTableGridStateCore {\n return {\n columnOrder: gridState.columnOrder\n ? { orderedColIds: gridState.columnOrder.orderedColIds.map(shrinkV6ColId) }\n : undefined,\n sort: gridState.sort\n ? {\n sortModel: gridState.sort.sortModel.map((s) => ({\n colId: shrinkV6ColId(s.colId),\n sort: s.sort,\n })),\n }\n : undefined,\n columnVisibility: gridState.columnVisibility\n ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(shrinkV6ColId) }\n : undefined,\n };\n}\n\n/** Migrate v4 state to v6: convert per-column filters to tree-based format (skips v5). */\nfunction migrateV4toV6(state: Extract<PlDataTableStateV2, { version: 4 }>): PlDataTableStateV2V6 {\n let idCounter = 0;\n const nextId = () => ++idCounter;\n\n const migratedCache: PlDataTableStateV2V6CacheEntry[] = state.stateCache.map((entry) => {\n const leaves: PlDataTableFiltersWithMeta[\"filters\"] = [];\n for (const f of entry.filtersState) {\n if (f.filter !== null && !f.filter.disabled) {\n const column = canonicalizeJson(f.id);\n leaves.push(migrateTableFilter(column, f.filter.value, nextId));\n }\n }\n const filtersState: PlDataTableFiltersWithMeta | null =\n leaves.length > 0 ? { id: nextId(), type: \"and\", filters: leaves } : null;\n\n return {\n sourceId: entry.sourceId,\n gridState: entry.gridState,\n sheetsState: entry.sheetsState,\n filtersState,\n defaultFiltersState: null,\n };\n });\n\n const oldSourceId = state.pTableParams.sourceId;\n const currentCache = oldSourceId\n ? migratedCache.find((e) => e.sourceId === oldSourceId)\n : undefined;\n\n return {\n version: 6,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds:\n state.pTableParams.hiddenColIds?.map((id) => ({ type: \"column\" as const, id })) ??\n null,\n filters: distillFilterSpec(currentCache.filtersState),\n defaultFilters: null,\n sorting: state.pTableParams.sorting,\n }\n : createDefaultPTableParams(),\n };\n}\n\n/** Migrate a single per-column PlTableFilter to a tree-based FilterSpec node */\nfunction migrateTableFilter(\n column: CanonicalizedJson<PTableColumnId>,\n filter: PlTableFilter,\n nextId: () => number,\n): PlDataTableFiltersWithMeta[\"filters\"][number] {\n const id = nextId();\n switch (filter.type) {\n case \"isNA\":\n return { id, type: \"isNA\", column };\n case \"isNotNA\":\n return { id, type: \"isNotNA\", column };\n case \"number_equals\":\n return { id, type: \"equal\", column, x: filter.reference };\n case \"number_notEquals\":\n return { id, type: \"notEqual\", column, x: filter.reference };\n case \"number_greaterThan\":\n return { id, type: \"greaterThan\", column, x: filter.reference };\n case \"number_greaterThanOrEqualTo\":\n return { id, type: \"greaterThanOrEqual\", column, x: filter.reference };\n case \"number_lessThan\":\n return { id, type: \"lessThan\", column, x: filter.reference };\n case \"number_lessThanOrEqualTo\":\n return { id, type: \"lessThanOrEqual\", column, x: filter.reference };\n case \"number_between\":\n return {\n id,\n type: \"and\",\n filters: [\n filter.includeLowerBound\n ? { id: nextId(), type: \"greaterThanOrEqual\" as const, column, x: filter.lowerBound }\n : { id: nextId(), type: \"greaterThan\" as const, column, x: filter.lowerBound },\n filter.includeUpperBound\n ? { id: nextId(), type: \"lessThanOrEqual\" as const, column, x: filter.upperBound }\n : { id: nextId(), type: \"lessThan\" as const, column, x: filter.upperBound },\n ],\n };\n case \"string_equals\":\n return { id, type: \"patternEquals\", column, value: filter.reference };\n case \"string_notEquals\":\n return { id, type: \"patternNotEquals\", column, value: filter.reference };\n case \"string_contains\":\n return { id, type: \"patternContainSubsequence\", column, value: filter.reference };\n case \"string_doesNotContain\":\n return { id, type: \"patternNotContainSubsequence\", column, value: filter.reference };\n case \"string_matches\":\n return { id, type: \"patternMatchesRegularExpression\", column, value: filter.reference };\n case \"string_doesNotMatch\":\n return {\n id,\n type: \"not\",\n filter: {\n id: nextId(),\n type: \"patternMatchesRegularExpression\",\n column,\n value: filter.reference,\n },\n };\n case \"string_containsFuzzyMatch\":\n return {\n id,\n type: \"patternFuzzyContainSubsequence\",\n column,\n value: filter.reference,\n maxEdits: filter.maxEdits,\n substitutionsOnly: filter.substitutionsOnly,\n ...(filter.wildcard !== undefined ? { wildcard: filter.wildcard } : {}),\n };\n }\n}\n\nexport function createDefaultPTableParams(): PTableParamsV2 {\n return {\n sourceId: null,\n hiddenColIds: null,\n filters: null,\n defaultFilters: null,\n sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 7,\n stateCache: [],\n pTableParams: createDefaultPTableParams(),\n };\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import { PTableParamsV2, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableSheetState, PlDataTableStateV2Normalized } from "./typesV6.js";
1
+ import { PTableParamsV2, PlDataTableFiltersWithMeta, PlDataTableSheetState, PlDataTableStateV2Normalized } from "./typesV7.js";
2
2
  import { PlDataTableFilterState } from "./typesV4.js";
3
+ import { PlDataTableGridStateV6, PlDataTableStateV2V6 } from "./typesV6.js";
3
4
  import { PlDataTableGridStateV5 } from "./typesV5.js";
4
5
  import { AxisId, CanonicalizedJson, PObjectId, PTableColumnSpec, PTableRecordFilter, PTableSorting } from "@milaboratories/pl-model-common";
5
6
 
@@ -79,7 +80,7 @@ type PlDataTableStateV2 = {
79
80
  version: 4;
80
81
  stateCache: {
81
82
  sourceId: string;
82
- gridState: PlDataTableGridStateCore;
83
+ gridState: PlDataTableGridStateV6;
83
84
  sheetsState: PlDataTableSheetState[];
84
85
  filtersState: PlDataTableFilterState[];
85
86
  }[]; /** Old format; only fields used in migration are typed */
@@ -99,7 +100,7 @@ type PlDataTableStateV2 = {
99
100
  searchString?: string;
100
101
  }[];
101
102
  pTableParams: PTableParamsV2;
102
- } | PlDataTableStateV2Normalized;
103
+ } | PlDataTableStateV2V6 | PlDataTableStateV2Normalized;
103
104
  /** Upgrade PlDataTableStateV2 to the latest version */
104
105
  declare function upgradePlDataTableStateV2(state: PlDataTableStateV2 | undefined): PlDataTableStateV2Normalized;
105
106
  declare function createDefaultPTableParams(): PTableParamsV2;
@@ -1 +1 @@
1
- {"version":3,"file":"state-migration.d.ts","names":[],"sources":["../../../src/components/PlDataTable/state-migration.ts"],"mappings":";;;;;;;;AA8BA;KAAY,kBAAA;EAIN,SAAA;IACE,WAAA;MACE,aAAA,EAAe,iBAAA,CAAkB,gBAAA;IAAA;IAEnC,IAAA;MACE,SAAA;QACE,KAAA,EAAO,iBAAA,CAAkB,gBAAA;QACzB,IAAA;MAAA;IAAA;IAGJ,gBAAA;MACE,YAAA,EAAc,iBAAA,CAAkB,gBAAA;IAAA;IAElC,QAAA;IACA,MAAA,GAAS,MAAA,CAAO,iBAAA,CAAkB,MAAA;EAAA;EAEpC,YAAA;IACE,OAAA,GAAU,aAAA;IACV,OAAA,GAAU,kBAAA;EAAA;AAAA;EAIZ,OAAA;EACA,UAAA;IACE,QAAA;IACA,SAAA;MACE,WAAA;QACE,aAAA,EAAe,iBAAA,CAAkB,gBAAA;MAAA;MAEnC,IAAA;QACE,SAAA;UACE,KAAA,EAAO,iBAAA,CAAkB,gBAAA;UACzB,IAAA;QAAA;MAAA;MAGJ,gBAAA;QACE,YAAA,EAAc,iBAAA,CAAkB,gBAAA;MAAA;IAAA;IAGpC,WAAA,EAAa,qBAAA;EAAA;EAEf,YAAA;IACE,YAAA,EAAc,SAAA;IACd,OAAA,EAAS,kBAAA;IACT,OAAA,EAAS,aAAA;EAAA;AAAA;EAIX,OAAA;EACA,UAAA;IACE,QAAA;IACA,SAAA;MACE,WAAA;QACE,aAAA,EAAe,iBAAA,CAAkB,gBAAA;MAAA;MAEnC,IAAA;QACE,SAAA;UACE,KAAA,EAAO,iBAAA,CAAkB,gBAAA;UACzB,IAAA;QAAA;MAAA;MAGJ,gBAAA;QACE,YAAA,EAAc,iBAAA,CAAkB,gBAAA;MAAA;IAAA;IAGpC,WAAA,EAAa,qBAAA;IACb,YAAA,EAAc,sBAAA;EAAA;EAEhB,YAAA,EAAc,cAAA;AAAA;EAGd,OAAA;EACA,UAAA;IACE,QAAA;IACA,SAAA,EAAW,wBAAA;IACX,WAAA,EAAa,qBAAA;IACb,YAAA,EAAc,sBAAA;EAAA,KAjDK;EAoDrB,YAAA;IACE,QAAA;IACA,YAAA,EAAc,SAAA;IACd,OAAA,EAAS,aAAA;EAAA;AAAA;EAKX,OAAA;EACA,UAAA;IACE,QAAA;IACA,SAAA,EAAW,sBAAA;IACX,WAAA,EAAa,qBAAA;IACb,YAAA,SAAqB,0BAAA;IACrB,mBAAA,SAA4B,0BAAA;IAC5B,YAAA;EAAA;EAEF,YAAA,EAAc,cAAA;AAAA,IAGhB,4BAAA;;iBAGY,yBAAA,CACd,KAAA,EAAO,kBAAA,eACN,4BAAA;AAAA,iBAkNa,yBAAA,CAAA,GAA6B,cAAA;AAAA,iBAU7B,wBAAA,CAAA,GAA4B,4BAAA"}
1
+ {"version":3,"file":"state-migration.d.ts","names":[],"sources":["../../../src/components/PlDataTable/state-migration.ts"],"mappings":";;;;;;;;;AAyCA;KAAY,kBAAA;EAIN,SAAA;IACE,WAAA;MACE,aAAA,EAAe,iBAAA,CAAkB,gBAAA;IAAA;IAEnC,IAAA;MACE,SAAA;QACE,KAAA,EAAO,iBAAA,CAAkB,gBAAA;QACzB,IAAA;MAAA;IAAA;IAGJ,gBAAA;MACE,YAAA,EAAc,iBAAA,CAAkB,gBAAA;IAAA;IAElC,QAAA;IACA,MAAA,GAAS,MAAA,CAAO,iBAAA,CAAkB,MAAA;EAAA;EAEpC,YAAA;IACE,OAAA,GAAU,aAAA;IACV,OAAA,GAAU,kBAAA;EAAA;AAAA;EAIZ,OAAA;EACA,UAAA;IACE,QAAA;IACA,SAAA;MACE,WAAA;QACE,aAAA,EAAe,iBAAA,CAAkB,gBAAA;MAAA;MAEnC,IAAA;QACE,SAAA;UACE,KAAA,EAAO,iBAAA,CAAkB,gBAAA;UACzB,IAAA;QAAA;MAAA;MAGJ,gBAAA;QACE,YAAA,EAAc,iBAAA,CAAkB,gBAAA;MAAA;IAAA;IAGpC,WAAA,EAAa,qBAAA;EAAA;EAEf,YAAA;IACE,YAAA,EAAc,SAAA;IACd,OAAA,EAAS,kBAAA;IACT,OAAA,EAAS,aAAA;EAAA;AAAA;EAIX,OAAA;EACA,UAAA;IACE,QAAA;IACA,SAAA;MACE,WAAA;QACE,aAAA,EAAe,iBAAA,CAAkB,gBAAA;MAAA;MAEnC,IAAA;QACE,SAAA;UACE,KAAA,EAAO,iBAAA,CAAkB,gBAAA;UACzB,IAAA;QAAA;MAAA;MAGJ,gBAAA;QACE,YAAA,EAAc,iBAAA,CAAkB,gBAAA;MAAA;IAAA;IAGpC,WAAA,EAAa,qBAAA;IACb,YAAA,EAAc,sBAAA;EAAA;EAEhB,YAAA,EAAc,cAAA;AAAA;EAGd,OAAA;EACA,UAAA;IACE,QAAA;IACA,SAAA,EAAW,sBAAA;IACX,WAAA,EAAa,qBAAA;IACb,YAAA,EAAc,sBAAA;EAAA,KAjDV;EAoDN,YAAA;IACE,QAAA;IACA,YAAA,EAAc,SAAA;IACd,OAAA,EAAS,aAAA;EAAA;AAAA;EAKX,OAAA;EACA,UAAA;IACE,QAAA;IACA,SAAA,EAAW,sBAAA;IACX,WAAA,EAAa,qBAAA;IACb,YAAA,SAAqB,0BAAA;IACrB,mBAAA,SAA4B,0BAAA;IAC5B,YAAA;EAAA;EAEF,YAAA,EAAc,cAAA;AAAA,IAIhB,oBAAA,GAEA,4BAAA;;iBAGY,yBAAA,CACd,KAAA,EAAO,kBAAA,eACN,4BAAA;AAAA,iBA8Pa,yBAAA,CAAA,GAA6B,cAAA;AAAA,iBAU7B,wBAAA,CAAA,GAA4B,4BAAA"}
@@ -1,6 +1,6 @@
1
1
  import { distillFilterSpec } from "../../filters/distill.js";
2
2
  import "../../filters/index.js";
3
- import { canonicalizeJson, parseJsonSafely } from "@milaboratories/pl-model-common";
3
+ import { canonicalizeJson, getPTableColumnId, parseJsonSafely } from "@milaboratories/pl-model-common";
4
4
  import { isNil } from "es-toolkit";
5
5
  //#region src/components/PlDataTable/state-migration.ts
6
6
  /** Upgrade PlDataTableStateV2 to the latest version */
@@ -18,6 +18,7 @@ function upgradePlDataTableStateV2(state) {
18
18
  if (state.version === 3) state = createPlDataTableStateV2();
19
19
  if (state.version === 4) state = migrateV4toV6(state);
20
20
  if (state.version === 5) state = migrateV5toV6(state);
21
+ if (state.version === 6) state = migrateV6toV7(state);
21
22
  return state;
22
23
  }
23
24
  /** Migrate v5 to v6: unwrap `{source, labeled}` colIds in gridState. */
@@ -49,6 +50,36 @@ function unwrapV5GridState(gridState) {
49
50
  columnVisibility: gridState.columnVisibility ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(unwrapAs) } : void 0
50
51
  };
51
52
  }
53
+ /** Migrate v6 to v7: rewrite each colId from a full PTableColumnSpec to its
54
+ * compact PTableColumnId (drops annotations/spec body, ~16× smaller per column). */
55
+ function migrateV6toV7(state) {
56
+ return {
57
+ version: 7,
58
+ stateCache: state.stateCache.map((entry) => ({
59
+ ...entry,
60
+ gridState: shrinkV6GridState(entry.gridState)
61
+ })),
62
+ pTableParams: state.pTableParams
63
+ };
64
+ }
65
+ /** Convert a v6 fat colId (canonicalized PTableColumnSpec) to a v7 compact colId
66
+ * (canonicalized PTableColumnId). The row-number sentinel is a string literal,
67
+ * not a spec — pass it through unchanged. */
68
+ function shrinkV6ColId(json) {
69
+ const parsed = parseJsonSafely(json);
70
+ if (!isNil(parsed) && typeof parsed === "object" && "type" in parsed && "id" in parsed) return canonicalizeJson(getPTableColumnId(parsed));
71
+ return json;
72
+ }
73
+ function shrinkV6GridState(gridState) {
74
+ return {
75
+ columnOrder: gridState.columnOrder ? { orderedColIds: gridState.columnOrder.orderedColIds.map(shrinkV6ColId) } : void 0,
76
+ sort: gridState.sort ? { sortModel: gridState.sort.sortModel.map((s) => ({
77
+ colId: shrinkV6ColId(s.colId),
78
+ sort: s.sort
79
+ })) } : void 0,
80
+ columnVisibility: gridState.columnVisibility ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(shrinkV6ColId) } : void 0
81
+ };
82
+ }
52
83
  /** Migrate v4 state to v6: convert per-column filters to tree-based format (skips v5). */
53
84
  function migrateV4toV6(state) {
54
85
  let idCounter = 0;
@@ -226,7 +257,7 @@ function createDefaultPTableParams() {
226
257
  }
227
258
  function createPlDataTableStateV2() {
228
259
  return {
229
- version: 6,
260
+ version: 7,
230
261
  stateCache: [],
231
262
  pTableParams: createDefaultPTableParams()
232
263
  };