@platforma-sdk/model 1.59.3 → 1.60.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/block_storage.cjs.map +1 -1
- package/dist/block_storage.d.ts +1 -11
- package/dist/block_storage.js.map +1 -1
- package/dist/block_storage_callbacks.cjs.map +1 -1
- package/dist/block_storage_callbacks.js.map +1 -1
- package/dist/columns/column_collection_builder.cjs +215 -0
- package/dist/columns/column_collection_builder.cjs.map +1 -0
- package/dist/columns/column_collection_builder.d.ts +112 -0
- package/dist/columns/column_collection_builder.js +214 -0
- package/dist/columns/column_collection_builder.js.map +1 -0
- package/dist/columns/column_selector.cjs +122 -0
- package/dist/columns/column_selector.cjs.map +1 -0
- package/dist/columns/column_selector.d.ts +41 -0
- package/dist/columns/column_selector.js +118 -0
- package/dist/columns/column_selector.js.map +1 -0
- package/dist/columns/column_snapshot.cjs +20 -0
- package/dist/columns/column_snapshot.cjs.map +1 -0
- package/dist/columns/column_snapshot.d.ts +39 -0
- package/dist/columns/column_snapshot.js +18 -0
- package/dist/columns/column_snapshot.js.map +1 -0
- package/dist/columns/column_snapshot_provider.cjs +112 -0
- package/dist/columns/column_snapshot_provider.cjs.map +1 -0
- package/dist/columns/column_snapshot_provider.d.ts +73 -0
- package/dist/columns/column_snapshot_provider.js +107 -0
- package/dist/columns/column_snapshot_provider.js.map +1 -0
- package/dist/columns/ctx_column_sources.cjs +84 -0
- package/dist/columns/ctx_column_sources.cjs.map +1 -0
- package/dist/columns/ctx_column_sources.d.ts +33 -0
- package/dist/columns/ctx_column_sources.js +82 -0
- package/dist/columns/ctx_column_sources.js.map +1 -0
- package/dist/columns/index.cjs +5 -0
- package/dist/columns/index.d.ts +5 -0
- package/dist/columns/index.js +5 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +111 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +25 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +110 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -0
- package/dist/components/PlDataTable/{table.cjs → createPlDataTable/createPlDataTableV3.cjs} +54 -54
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +39 -0
- package/dist/components/PlDataTable/{table.js → createPlDataTable/createPlDataTableV3.js} +53 -53
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/index.cjs +12 -0
- package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTable/index.d.ts +15 -0
- package/dist/components/PlDataTable/createPlDataTable/index.js +12 -0
- package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.cjs +18 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +11 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.js +17 -0
- package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -0
- package/dist/components/PlDataTable/index.cjs +4 -1
- package/dist/components/PlDataTable/index.d.ts +5 -2
- package/dist/components/PlDataTable/index.js +4 -1
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts +2 -2
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/{v4.d.ts → typesV4.d.ts} +2 -2
- package/dist/components/PlDataTable/{v5.d.ts → typesV5.d.ts} +2 -2
- package/dist/components/index.cjs +4 -1
- package/dist/components/index.d.ts +5 -2
- package/dist/components/index.js +4 -1
- package/dist/index.cjs +44 -16
- package/dist/index.d.ts +17 -5
- package/dist/index.js +15 -3
- package/dist/labels/derive_distinct_labels.cjs +156 -0
- package/dist/labels/derive_distinct_labels.cjs.map +1 -0
- package/dist/labels/derive_distinct_labels.d.ts +29 -0
- package/dist/labels/derive_distinct_labels.js +155 -0
- package/dist/labels/derive_distinct_labels.js.map +1 -0
- package/dist/labels/index.cjs +2 -0
- package/dist/labels/index.d.ts +2 -0
- package/dist/labels/index.js +2 -0
- package/dist/labels/write_labels_to_specs.cjs +15 -0
- package/dist/labels/write_labels_to_specs.cjs.map +1 -0
- package/dist/labels/write_labels_to_specs.d.ts +9 -0
- package/dist/labels/write_labels_to_specs.js +14 -0
- package/dist/labels/write_labels_to_specs.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/render/api.cjs +11 -2
- package/dist/render/api.cjs.map +1 -1
- package/dist/render/api.d.ts +9 -5
- package/dist/render/api.js +12 -3
- package/dist/render/api.js.map +1 -1
- package/dist/render/index.d.ts +2 -1
- package/dist/render/index.js +1 -1
- package/dist/render/internal.cjs.map +1 -1
- package/dist/render/internal.d.ts +5 -2
- package/dist/render/internal.js.map +1 -1
- package/dist/render/util/column_collection.cjs +3 -3
- package/dist/render/util/column_collection.cjs.map +1 -1
- package/dist/render/util/column_collection.d.ts +3 -2
- package/dist/render/util/column_collection.js +4 -4
- package/dist/render/util/column_collection.js.map +1 -1
- package/dist/render/util/index.d.ts +2 -1
- package/dist/render/util/index.js +1 -1
- package/dist/render/util/label.cjs +7 -134
- package/dist/render/util/label.cjs.map +1 -1
- package/dist/render/util/label.d.ts +5 -50
- package/dist/render/util/label.js +8 -132
- package/dist/render/util/label.js.map +1 -1
- package/dist/render/util/split_selectors.d.ts +2 -2
- package/package.json +9 -7
- package/src/block_storage.ts +0 -11
- package/src/block_storage_callbacks.ts +1 -1
- package/src/columns/column_collection_builder.test.ts +427 -0
- package/src/columns/column_collection_builder.ts +455 -0
- package/src/columns/column_selector.test.ts +472 -0
- package/src/columns/column_selector.ts +212 -0
- package/src/columns/column_snapshot.ts +55 -0
- package/src/columns/column_snapshot_provider.ts +177 -0
- package/src/columns/ctx_column_sources.ts +107 -0
- package/src/columns/expand_by_partition.test.ts +289 -0
- package/src/columns/expand_by_partition.ts +187 -0
- package/src/columns/index.ts +5 -0
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +193 -0
- package/src/components/PlDataTable/{table.ts → createPlDataTable/createPlDataTableV3.ts} +134 -70
- package/src/components/PlDataTable/createPlDataTable/index.ts +27 -0
- package/src/components/PlDataTable/createPlDataTableSheet.ts +20 -0
- package/src/components/PlDataTable/index.ts +6 -4
- package/src/components/PlDataTable/state-migration.ts +2 -2
- package/src/index.ts +2 -1
- package/src/labels/derive_distinct_labels.test.ts +461 -0
- package/src/labels/derive_distinct_labels.ts +289 -0
- package/src/labels/index.ts +2 -0
- package/src/labels/write_labels_to_specs.ts +12 -0
- package/src/render/api.ts +25 -3
- package/src/render/internal.ts +20 -1
- package/src/render/util/column_collection.ts +9 -6
- package/src/render/util/label.test.ts +1 -1
- package/src/render/util/label.ts +19 -235
- package/src/render/util/split_selectors.ts +3 -3
- package/dist/components/PlDataTable/table.cjs.map +0 -1
- package/dist/components/PlDataTable/table.d.ts +0 -30
- package/dist/components/PlDataTable/table.js.map +0 -1
- /package/src/components/PlDataTable/{v4.ts → typesV4.ts} +0 -0
- /package/src/components/PlDataTable/{v5.ts → typesV5.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPlDataTableV3.cjs","names":["distillFilterSpec","filterSpecToSpecQueryExpr","Annotation","isColumnSnapshotProvider","collectCtxColumnSnapshotProviders","ColumnCollectionBuilder","upgradePlDataTableStateV2","getAllLabelColumns","getMatchingLabelColumns","getColumnIdAndSpec","collectFilterSpecColumns","allPColumnsReady"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n DataInfo,\n PColumn,\n PColumnIdAndSpec,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableDefV2,\n PTableSorting,\n SpecQuery,\n SingleAxisSelector,\n SpecQueryExpression,\n SpecQueryJoinEntry,\n PColumnSpec,\n PlRef,\n MultiColumnSelector,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n readAnnotation,\n isBooleanExpression,\n parseJson,\n uniqueBy,\n} from \"@milaboratories/pl-model-common\";\nimport { filterSpecToSpecQueryExpr } from \"../../../filters\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, TreeNodeAccessor, PColumnDataUniversal } from \"../../../render\";\nimport { allPColumnsReady } from \"../../../render\";\nimport { isFunction, isNil } from \"es-toolkit\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { distillFilterSpec } from \"../../../filters/distill\";\nimport type { PlDataTableFilters, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSource, MatchingMode } from \"../../../columns\";\nimport { ColumnCollectionBuilder } from \"../../../columns\";\nimport { isColumnSnapshotProvider } from \"../../../columns/column_snapshot_provider\";\nimport { collectCtxColumnSnapshotProviders } from \"../../../columns/ctx_column_sources\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\n\n/** Convert a PTableColumnId to a SpecQueryExpression reference. */\nexport function columnIdToExpr(col: PTableColumnId): SpecQueryExpression {\n if (col.type === \"axis\") {\n return { type: \"axisRef\", value: col.id as SingleAxisSelector };\n }\n return { type: \"columnRef\", value: col.id };\n}\n\n/** Wrap a SpecQuery as a SpecQueryJoinEntry with empty qualifications. */\nexport function joinEntry<C>(input: SpecQuery<C>): SpecQueryJoinEntry<C> {\n return { entry: input, qualifications: [] };\n}\n\nexport function createPTableDef(params: {\n columns: PColumn<PColumnDataUniversal>[];\n labelColumns: PColumn<PColumnDataUniversal>[];\n coreJoinType: \"inner\" | \"full\";\n filters: null | PlDataTableFilters;\n sorting: PTableSorting[];\n coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;\n}): PTableDefV2<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> {\n let coreColumns = params.columns;\n const secondaryColumns: typeof params.columns = [];\n\n if (isFunction(params.coreColumnPredicate)) {\n coreColumns = [];\n for (const c of params.columns)\n if (params.coreColumnPredicate(getColumnIdAndSpec(c))) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...params.labelColumns);\n\n // Build SpecQuery directly from columns\n const coreJoinQuery: SpecQuery<\n PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>\n > = {\n type: params.coreJoinType === \"inner\" ? \"innerJoin\" : \"fullJoin\",\n entries: coreColumns.map((c) => joinEntry({ type: \"column\", column: c })),\n };\n\n let query: SpecQuery<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> = {\n type: \"outerJoin\",\n primary: joinEntry(coreJoinQuery),\n secondary: secondaryColumns.map((c) => joinEntry({ type: \"column\", column: c })),\n };\n\n // Apply filters\n if (params.filters !== null) {\n const nonEmpty = distillFilterSpec(params.filters);\n\n if (!isNil(nonEmpty)) {\n const pridicate = filterSpecToSpecQueryExpr(nonEmpty);\n if (!isBooleanExpression(pridicate)) {\n throw new Error(\n `Filter conversion produced a non-boolean expression (got type \"${pridicate.type}\"), expected a boolean predicate for query filtering`,\n );\n }\n query = {\n type: \"filter\",\n input: query,\n predicate: pridicate,\n };\n }\n }\n\n // Apply sorting\n if (params.sorting.length > 0) {\n query = {\n type: \"sort\",\n input: query,\n sortBy: params.sorting.map((s) => ({\n expression: columnIdToExpr(s.column),\n ascending: s.ascending,\n nullsFirst: !s.naAndAbsentAreLeastValues,\n })),\n };\n }\n\n return { query };\n}\n\n/** Check if column should be omitted from the table */\nexport function isColumnHidden(spec: { annotations?: Annotation }): boolean {\n return readAnnotation(spec, Annotation.Table.Visibility) === \"hidden\";\n}\n\n/** Check if column is hidden by default */\nexport function isColumnOptional(spec: { annotations?: Annotation }): boolean {\n return readAnnotation(spec, Annotation.Table.Visibility) === \"optional\";\n}\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\ntype ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n anchors?: Record<string, PlRef | PObjectId | PColumnSpec>;\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type createPlDataTableOptionsV3 = {\n source?: ColumnSource | ColumnSource[];\n columns: ColumnsSelectorConfig;\n\n // Existing from V2\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n coreJoinType?: \"inner\" | \"full\";\n coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;\n\n state?: PlDataTableStateV2;\n};\n\n// interface ColumnDisplayConfig {\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\n// interface ColumnOrderRule {\n// match: ColumnMatcher;\n// /** Higher number = further left in table */\n// priority: number;\n// }\n\n// interface ColumnVisibilityRule {\n// match: ColumnMatcher;\n// visibility: \"default\" | \"optional\" | \"hidden\";\n// }\n\n// type ColumnMatcher =\n// | ((spec: PColumnSpec) => boolean)\n// | { name: string | string[] }\n// | { annotation: Record<string, string> }\n// | { ids: Set<string> };\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const providers = options.source\n ? normalizeSourceList(options.source).filter(isColumnSnapshotProvider)\n : collectCtxColumnSnapshotProviders(ctx);\n\n if (providers.length === 0) return undefined;\n\n // Step 1: Build collection from sources\n const builder = new ColumnCollectionBuilder(ctx).addSources(providers);\n const anchors = options.columns.anchors;\n const collection = isNil(anchors) ? builder.build() : builder.build({ anchors });\n\n if (!collection) return undefined;\n\n // Step 2: Get data columns, excluding annotation-hidden ones\n const findOptions = options.columns\n ? {\n include: options.columns.include,\n exclude: options.columns.exclude,\n mode: options.columns.mode,\n maxHops: options.columns.maxHops,\n }\n : undefined;\n const findResult = collection.findColumns(findOptions);\n const snapshots = findResult.map((v) => (\"column\" in v ? v.column : v));\n const dataSnapshots = snapshots.filter((s) => !isColumnHidden(s.spec));\n if (dataSnapshots.length === 0) return undefined;\n\n // Convert snapshots to PColumn<PColumnDataUniversal>[]\n const columns: PColumn<PColumnDataUniversal>[] = [];\n for (const snap of dataSnapshots) {\n if (!snap.data) return undefined;\n const data = snap.data.get();\n if (data === undefined) return undefined;\n columns.push({ id: snap.id, spec: snap.spec, data });\n }\n\n // Step 3: Normalize table state\n const tableStateNormalized = upgradePlDataTableStateV2(options.state);\n\n // Step 4: Get label columns from result pool and match to data columns\n const allLabelColumns = getAllLabelColumns(ctx.resultPool);\n if (!allLabelColumns) return undefined;\n\n const fullLabelColumns = getMatchingLabelColumns(\n columns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n const fullColumns = [...columns, ...fullLabelColumns];\n\n // Step 5: Build column ID set for filter/sorting validation\n const fullColumnsAxes = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))),\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: string): boolean =>\n fullColumnsIdsSet.has(id as CanonicalizedJson<PTableColumnId>);\n\n // Step 6: Filtering validation\n const stateFilters = tableStateNormalized.pTableParams.filters;\n const opsFilters = options?.filters ?? null;\n const filters: null | PlDataTableFilters =\n stateFilters != null && opsFilters != null\n ? { type: \"and\", filters: [stateFilters, opsFilters] }\n : (stateFilters ?? opsFilters);\n const filterColumns = filters ? collectFilterSpecColumns(filters) : [];\n const firstInvalidFilterColumn = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidFilterColumn)\n throw new Error(\n `Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`,\n );\n\n // Step 7: Sorting validation\n const userSorting = tableStateNormalized.pTableParams.sorting;\n const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];\n const firstInvalidSortingColumn = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalidSortingColumn)\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`,\n );\n\n // Step 8: Build full table definition and handles\n const coreJoinType = options?.coreJoinType ?? \"full\";\n const fullDef = createPTableDef({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n // Step 9: Determine hidden columns\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter — all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds) return hiddenColIds;\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n // Step 10: Build visible table definition\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(\n visibleColumns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDef({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n\n/** Normalize raw ColumnSource | ColumnSource[] into a flat list of sources. */\nfunction normalizeSourceList(source: ColumnSource | ColumnSource[]): ColumnSource[] {\n if (\n Array.isArray(source) &&\n source.length > 0 &&\n (Array.isArray(source[0]) || isColumnSnapshotProvider(source[0]))\n ) {\n return source as ColumnSource[];\n }\n return [source as ColumnSource];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { RenderCtxBase } from "../../../render/api.js";
|
|
2
|
+
import "../../../render/index.js";
|
|
3
|
+
import { PlDataTableFilters, PlDataTableModel } from "../typesV5.js";
|
|
4
|
+
import { PlDataTableStateV2 } from "../state-migration.js";
|
|
5
|
+
import { ColumnSource } from "../../../columns/column_snapshot_provider.js";
|
|
6
|
+
import { MatchingMode } from "../../../columns/column_collection_builder.js";
|
|
7
|
+
import "../../../columns/index.js";
|
|
8
|
+
import { Annotation, DataInfo, MultiColumnSelector, PColumn, PColumnIdAndSpec, PColumnSpec, PColumnValues, PObjectId, PTableColumnId, PTableDefV2, PTableSorting, PlRef, SpecQueryExpression } from "@milaboratories/pl-model-common";
|
|
9
|
+
|
|
10
|
+
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts
|
|
11
|
+
/** Check if column should be omitted from the table */
|
|
12
|
+
declare function isColumnHidden(spec: {
|
|
13
|
+
annotations?: Annotation;
|
|
14
|
+
}): boolean;
|
|
15
|
+
/** Check if column is hidden by default */
|
|
16
|
+
declare function isColumnOptional(spec: {
|
|
17
|
+
annotations?: Annotation;
|
|
18
|
+
}): boolean;
|
|
19
|
+
/** Structured source config — selectors/anchors instead of raw ColumnSource. */
|
|
20
|
+
type ColumnsSelectorConfig = {
|
|
21
|
+
include?: MultiColumnSelector | MultiColumnSelector[];
|
|
22
|
+
exclude?: MultiColumnSelector | MultiColumnSelector[];
|
|
23
|
+
anchors?: Record<string, PlRef | PObjectId | PColumnSpec>;
|
|
24
|
+
mode?: MatchingMode;
|
|
25
|
+
maxHops?: number;
|
|
26
|
+
};
|
|
27
|
+
type createPlDataTableOptionsV3 = {
|
|
28
|
+
source?: ColumnSource | ColumnSource[];
|
|
29
|
+
columns: ColumnsSelectorConfig;
|
|
30
|
+
filters?: PlDataTableFilters;
|
|
31
|
+
sorting?: PTableSorting[];
|
|
32
|
+
coreJoinType?: "inner" | "full";
|
|
33
|
+
coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;
|
|
34
|
+
state?: PlDataTableStateV2;
|
|
35
|
+
};
|
|
36
|
+
declare function createPlDataTableV3<A, U>(ctx: RenderCtxBase<A, U>, options: createPlDataTableOptionsV3): PlDataTableModel | undefined;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { createPlDataTableOptionsV3, createPlDataTableV3, isColumnHidden, isColumnOptional };
|
|
39
|
+
//# sourceMappingURL=createPlDataTableV3.d.ts.map
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import "
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import "
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
1
|
+
import { allPColumnsReady } from "../../../render/util/pcolumn_data.js";
|
|
2
|
+
import "../../../render/index.js";
|
|
3
|
+
import { collectFilterSpecColumns } from "../../../filters/traverse.js";
|
|
4
|
+
import { filterSpecToSpecQueryExpr } from "../../../filters/converters/filterToQuery.js";
|
|
5
|
+
import { distillFilterSpec } from "../../../filters/distill.js";
|
|
6
|
+
import "../../../filters/index.js";
|
|
7
|
+
import { upgradePlDataTableStateV2 } from "../state-migration.js";
|
|
8
|
+
import { getAllLabelColumns, getMatchingLabelColumns } from "../labels.js";
|
|
9
|
+
import { isColumnSnapshotProvider } from "../../../columns/column_snapshot_provider.js";
|
|
10
|
+
import { ColumnCollectionBuilder } from "../../../columns/column_collection_builder.js";
|
|
11
|
+
import { collectCtxColumnSnapshotProviders } from "../../../columns/ctx_column_sources.js";
|
|
12
|
+
import "../../../columns/index.js";
|
|
10
13
|
import { Annotation, canonicalizeJson, getAxisId, getColumnIdAndSpec, isBooleanExpression, isLinkerColumn, parseJson, readAnnotation, uniqueBy } from "@milaboratories/pl-model-common";
|
|
11
14
|
import { isEmpty } from "es-toolkit/compat";
|
|
12
|
-
import {
|
|
15
|
+
import { isFunction, isNil } from "es-toolkit";
|
|
13
16
|
|
|
14
|
-
//#region src/components/PlDataTable/
|
|
17
|
+
//#region src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts
|
|
15
18
|
/** Convert a PTableColumnId to a SpecQueryExpression reference. */
|
|
16
19
|
function columnIdToExpr(col) {
|
|
17
20
|
if (col.type === "axis") return {
|
|
@@ -84,32 +87,36 @@ function isColumnHidden(spec) {
|
|
|
84
87
|
function isColumnOptional(spec) {
|
|
85
88
|
return readAnnotation(spec, Annotation.Table.Visibility) === "optional";
|
|
86
89
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
90
|
+
function createPlDataTableV3(ctx, options) {
|
|
91
|
+
const providers = options.source ? normalizeSourceList(options.source).filter(isColumnSnapshotProvider) : collectCtxColumnSnapshotProviders(ctx);
|
|
92
|
+
if (providers.length === 0) return void 0;
|
|
93
|
+
const builder = new ColumnCollectionBuilder(ctx).addSources(providers);
|
|
94
|
+
const anchors = options.columns.anchors;
|
|
95
|
+
const collection = isNil(anchors) ? builder.build() : builder.build({ anchors });
|
|
96
|
+
if (!collection) return void 0;
|
|
97
|
+
const findOptions = options.columns ? {
|
|
98
|
+
include: options.columns.include,
|
|
99
|
+
exclude: options.columns.exclude,
|
|
100
|
+
mode: options.columns.mode,
|
|
101
|
+
maxHops: options.columns.maxHops
|
|
102
|
+
} : void 0;
|
|
103
|
+
const dataSnapshots = collection.findColumns(findOptions).map((v) => "column" in v ? v.column : v).filter((s) => !isColumnHidden(s.spec));
|
|
104
|
+
if (dataSnapshots.length === 0) return void 0;
|
|
105
|
+
const columns = [];
|
|
106
|
+
for (const snap of dataSnapshots) {
|
|
107
|
+
if (!snap.data) return void 0;
|
|
108
|
+
const data = snap.data.get();
|
|
109
|
+
if (data === void 0) return void 0;
|
|
110
|
+
columns.push({
|
|
111
|
+
id: snap.id,
|
|
112
|
+
spec: snap.spec,
|
|
113
|
+
data
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const tableStateNormalized = upgradePlDataTableStateV2(options.state);
|
|
98
117
|
const allLabelColumns = getAllLabelColumns(ctx.resultPool);
|
|
99
118
|
if (!allLabelColumns) return void 0;
|
|
100
|
-
|
|
101
|
-
fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map((v) => {
|
|
102
|
-
return {
|
|
103
|
-
...v.value,
|
|
104
|
-
spec: {
|
|
105
|
-
...v.value.spec,
|
|
106
|
-
annotations: {
|
|
107
|
-
...v.value.spec.annotations,
|
|
108
|
-
[Annotation.Label]: v.label
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
});
|
|
119
|
+
const fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);
|
|
113
120
|
const fullColumns = [...columns, ...fullLabelColumns];
|
|
114
121
|
const fullColumnsIds = [...uniqueBy(fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))), (a) => canonicalizeJson(a)).map((a) => ({
|
|
115
122
|
type: "axis",
|
|
@@ -121,7 +128,7 @@ function createPlDataTableV2(ctx, columns, tableState, ops) {
|
|
|
121
128
|
const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson(c)));
|
|
122
129
|
const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
|
|
123
130
|
const stateFilters = tableStateNormalized.pTableParams.filters;
|
|
124
|
-
const opsFilters =
|
|
131
|
+
const opsFilters = options?.filters ?? null;
|
|
125
132
|
const filters = stateFilters != null && opsFilters != null ? {
|
|
126
133
|
type: "and",
|
|
127
134
|
filters: [stateFilters, opsFilters]
|
|
@@ -129,17 +136,17 @@ function createPlDataTableV2(ctx, columns, tableState, ops) {
|
|
|
129
136
|
const firstInvalidFilterColumn = (filters ? collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
|
|
130
137
|
if (firstInvalidFilterColumn) throw new Error(`Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`);
|
|
131
138
|
const userSorting = tableStateNormalized.pTableParams.sorting;
|
|
132
|
-
const sorting = (isEmpty(userSorting) ?
|
|
139
|
+
const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];
|
|
133
140
|
const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId(canonicalizeJson(s.column)));
|
|
134
141
|
if (firstInvalidSortingColumn) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`);
|
|
135
|
-
const coreJoinType =
|
|
142
|
+
const coreJoinType = options?.coreJoinType ?? "full";
|
|
136
143
|
const fullDef = createPTableDef({
|
|
137
144
|
columns,
|
|
138
145
|
labelColumns: fullLabelColumns,
|
|
139
146
|
coreJoinType,
|
|
140
147
|
filters,
|
|
141
148
|
sorting,
|
|
142
|
-
coreColumnPredicate:
|
|
149
|
+
coreColumnPredicate: options?.coreColumnPredicate
|
|
143
150
|
});
|
|
144
151
|
const fullHandle = ctx.createPTableV2(fullDef);
|
|
145
152
|
const pframeHandle = ctx.createPFrame(fullColumns);
|
|
@@ -151,7 +158,7 @@ function createPlDataTableV2(ctx, columns, tableState, ops) {
|
|
|
151
158
|
return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);
|
|
152
159
|
})());
|
|
153
160
|
columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
|
|
154
|
-
const coreColumnPredicate =
|
|
161
|
+
const coreColumnPredicate = options?.coreColumnPredicate;
|
|
155
162
|
if (coreColumnPredicate) columns.flatMap((c) => coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : []).forEach((c) => hiddenColumns.delete(c));
|
|
156
163
|
sorting.map((s) => s.column).filter((c) => c.type === "column").forEach((c) => hiddenColumns.delete(c.id));
|
|
157
164
|
if (filters) collectFilterSpecColumns(filters).flatMap((c) => {
|
|
@@ -178,19 +185,12 @@ function createPlDataTableV2(ctx, columns, tableState, ops) {
|
|
|
178
185
|
visibleTableHandle: visibleHandle
|
|
179
186
|
};
|
|
180
187
|
}
|
|
181
|
-
/**
|
|
182
|
-
function
|
|
183
|
-
|
|
184
|
-
return
|
|
185
|
-
axis,
|
|
186
|
-
options: values.map((v) => ({
|
|
187
|
-
value: v,
|
|
188
|
-
label: labels?.[v] ?? v.toString()
|
|
189
|
-
})),
|
|
190
|
-
defaultValue: values[0]
|
|
191
|
-
};
|
|
188
|
+
/** Normalize raw ColumnSource | ColumnSource[] into a flat list of sources. */
|
|
189
|
+
function normalizeSourceList(source) {
|
|
190
|
+
if (Array.isArray(source) && source.length > 0 && (Array.isArray(source[0]) || isColumnSnapshotProvider(source[0]))) return source;
|
|
191
|
+
return [source];
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
//#endregion
|
|
195
|
-
export {
|
|
196
|
-
//# sourceMappingURL=
|
|
195
|
+
export { createPTableDef, createPlDataTableV3, isColumnHidden, isColumnOptional };
|
|
196
|
+
//# sourceMappingURL=createPlDataTableV3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPlDataTableV3.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n DataInfo,\n PColumn,\n PColumnIdAndSpec,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableDefV2,\n PTableSorting,\n SpecQuery,\n SingleAxisSelector,\n SpecQueryExpression,\n SpecQueryJoinEntry,\n PColumnSpec,\n PlRef,\n MultiColumnSelector,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n readAnnotation,\n isBooleanExpression,\n parseJson,\n uniqueBy,\n} from \"@milaboratories/pl-model-common\";\nimport { filterSpecToSpecQueryExpr } from \"../../../filters\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, TreeNodeAccessor, PColumnDataUniversal } from \"../../../render\";\nimport { allPColumnsReady } from \"../../../render\";\nimport { isFunction, isNil } from \"es-toolkit\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { distillFilterSpec } from \"../../../filters/distill\";\nimport type { PlDataTableFilters, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSource, MatchingMode } from \"../../../columns\";\nimport { ColumnCollectionBuilder } from \"../../../columns\";\nimport { isColumnSnapshotProvider } from \"../../../columns/column_snapshot_provider\";\nimport { collectCtxColumnSnapshotProviders } from \"../../../columns/ctx_column_sources\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\n\n/** Convert a PTableColumnId to a SpecQueryExpression reference. */\nexport function columnIdToExpr(col: PTableColumnId): SpecQueryExpression {\n if (col.type === \"axis\") {\n return { type: \"axisRef\", value: col.id as SingleAxisSelector };\n }\n return { type: \"columnRef\", value: col.id };\n}\n\n/** Wrap a SpecQuery as a SpecQueryJoinEntry with empty qualifications. */\nexport function joinEntry<C>(input: SpecQuery<C>): SpecQueryJoinEntry<C> {\n return { entry: input, qualifications: [] };\n}\n\nexport function createPTableDef(params: {\n columns: PColumn<PColumnDataUniversal>[];\n labelColumns: PColumn<PColumnDataUniversal>[];\n coreJoinType: \"inner\" | \"full\";\n filters: null | PlDataTableFilters;\n sorting: PTableSorting[];\n coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;\n}): PTableDefV2<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> {\n let coreColumns = params.columns;\n const secondaryColumns: typeof params.columns = [];\n\n if (isFunction(params.coreColumnPredicate)) {\n coreColumns = [];\n for (const c of params.columns)\n if (params.coreColumnPredicate(getColumnIdAndSpec(c))) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...params.labelColumns);\n\n // Build SpecQuery directly from columns\n const coreJoinQuery: SpecQuery<\n PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>\n > = {\n type: params.coreJoinType === \"inner\" ? \"innerJoin\" : \"fullJoin\",\n entries: coreColumns.map((c) => joinEntry({ type: \"column\", column: c })),\n };\n\n let query: SpecQuery<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> = {\n type: \"outerJoin\",\n primary: joinEntry(coreJoinQuery),\n secondary: secondaryColumns.map((c) => joinEntry({ type: \"column\", column: c })),\n };\n\n // Apply filters\n if (params.filters !== null) {\n const nonEmpty = distillFilterSpec(params.filters);\n\n if (!isNil(nonEmpty)) {\n const pridicate = filterSpecToSpecQueryExpr(nonEmpty);\n if (!isBooleanExpression(pridicate)) {\n throw new Error(\n `Filter conversion produced a non-boolean expression (got type \"${pridicate.type}\"), expected a boolean predicate for query filtering`,\n );\n }\n query = {\n type: \"filter\",\n input: query,\n predicate: pridicate,\n };\n }\n }\n\n // Apply sorting\n if (params.sorting.length > 0) {\n query = {\n type: \"sort\",\n input: query,\n sortBy: params.sorting.map((s) => ({\n expression: columnIdToExpr(s.column),\n ascending: s.ascending,\n nullsFirst: !s.naAndAbsentAreLeastValues,\n })),\n };\n }\n\n return { query };\n}\n\n/** Check if column should be omitted from the table */\nexport function isColumnHidden(spec: { annotations?: Annotation }): boolean {\n return readAnnotation(spec, Annotation.Table.Visibility) === \"hidden\";\n}\n\n/** Check if column is hidden by default */\nexport function isColumnOptional(spec: { annotations?: Annotation }): boolean {\n return readAnnotation(spec, Annotation.Table.Visibility) === \"optional\";\n}\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\ntype ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n anchors?: Record<string, PlRef | PObjectId | PColumnSpec>;\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type createPlDataTableOptionsV3 = {\n source?: ColumnSource | ColumnSource[];\n columns: ColumnsSelectorConfig;\n\n // Existing from V2\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n coreJoinType?: \"inner\" | \"full\";\n coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;\n\n state?: PlDataTableStateV2;\n};\n\n// interface ColumnDisplayConfig {\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\n// interface ColumnOrderRule {\n// match: ColumnMatcher;\n// /** Higher number = further left in table */\n// priority: number;\n// }\n\n// interface ColumnVisibilityRule {\n// match: ColumnMatcher;\n// visibility: \"default\" | \"optional\" | \"hidden\";\n// }\n\n// type ColumnMatcher =\n// | ((spec: PColumnSpec) => boolean)\n// | { name: string | string[] }\n// | { annotation: Record<string, string> }\n// | { ids: Set<string> };\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const providers = options.source\n ? normalizeSourceList(options.source).filter(isColumnSnapshotProvider)\n : collectCtxColumnSnapshotProviders(ctx);\n\n if (providers.length === 0) return undefined;\n\n // Step 1: Build collection from sources\n const builder = new ColumnCollectionBuilder(ctx).addSources(providers);\n const anchors = options.columns.anchors;\n const collection = isNil(anchors) ? builder.build() : builder.build({ anchors });\n\n if (!collection) return undefined;\n\n // Step 2: Get data columns, excluding annotation-hidden ones\n const findOptions = options.columns\n ? {\n include: options.columns.include,\n exclude: options.columns.exclude,\n mode: options.columns.mode,\n maxHops: options.columns.maxHops,\n }\n : undefined;\n const findResult = collection.findColumns(findOptions);\n const snapshots = findResult.map((v) => (\"column\" in v ? v.column : v));\n const dataSnapshots = snapshots.filter((s) => !isColumnHidden(s.spec));\n if (dataSnapshots.length === 0) return undefined;\n\n // Convert snapshots to PColumn<PColumnDataUniversal>[]\n const columns: PColumn<PColumnDataUniversal>[] = [];\n for (const snap of dataSnapshots) {\n if (!snap.data) return undefined;\n const data = snap.data.get();\n if (data === undefined) return undefined;\n columns.push({ id: snap.id, spec: snap.spec, data });\n }\n\n // Step 3: Normalize table state\n const tableStateNormalized = upgradePlDataTableStateV2(options.state);\n\n // Step 4: Get label columns from result pool and match to data columns\n const allLabelColumns = getAllLabelColumns(ctx.resultPool);\n if (!allLabelColumns) return undefined;\n\n const fullLabelColumns = getMatchingLabelColumns(\n columns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n const fullColumns = [...columns, ...fullLabelColumns];\n\n // Step 5: Build column ID set for filter/sorting validation\n const fullColumnsAxes = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))),\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: string): boolean =>\n fullColumnsIdsSet.has(id as CanonicalizedJson<PTableColumnId>);\n\n // Step 6: Filtering validation\n const stateFilters = tableStateNormalized.pTableParams.filters;\n const opsFilters = options?.filters ?? null;\n const filters: null | PlDataTableFilters =\n stateFilters != null && opsFilters != null\n ? { type: \"and\", filters: [stateFilters, opsFilters] }\n : (stateFilters ?? opsFilters);\n const filterColumns = filters ? collectFilterSpecColumns(filters) : [];\n const firstInvalidFilterColumn = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidFilterColumn)\n throw new Error(\n `Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`,\n );\n\n // Step 7: Sorting validation\n const userSorting = tableStateNormalized.pTableParams.sorting;\n const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];\n const firstInvalidSortingColumn = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalidSortingColumn)\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`,\n );\n\n // Step 8: Build full table definition and handles\n const coreJoinType = options?.coreJoinType ?? \"full\";\n const fullDef = createPTableDef({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n // Step 9: Determine hidden columns\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter — all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds) return hiddenColIds;\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n // Step 10: Build visible table definition\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(\n visibleColumns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDef({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n\n/** Normalize raw ColumnSource | ColumnSource[] into a flat list of sources. */\nfunction normalizeSourceList(source: ColumnSource | ColumnSource[]): ColumnSource[] {\n if (\n Array.isArray(source) &&\n source.length > 0 &&\n (Array.isArray(source[0]) || isColumnSnapshotProvider(source[0]))\n ) {\n return source as ColumnSource[];\n }\n return [source as ColumnSource];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const require_createPlDataTableV3 = require('./createPlDataTableV3.cjs');
|
|
2
|
+
const require_createPlDataTableV2 = require('./createPlDataTableV2.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/components/PlDataTable/createPlDataTable/index.ts
|
|
5
|
+
function createPlDataTable(ctx, options) {
|
|
6
|
+
if (options.version === "v2") return require_createPlDataTableV2.createPlDataTableV2(ctx, options.columns, options.tableState, options.options);
|
|
7
|
+
else return require_createPlDataTableV3.createPlDataTableV3(ctx, options);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
exports.createPlDataTable = createPlDataTable;
|
|
12
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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 \"../typesV5\";\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"],"mappings":";;;;AAcA,SAAgB,kBACd,KACA,SAG8B;AAC9B,KAAI,QAAQ,YAAY,KACtB,QAAOA,gDAAoB,KAAK,QAAQ,SAAS,QAAQ,YAAY,QAAQ,QAAQ;KAGrF,QAAOC,gDAAoB,KAAK,QAAQ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RenderCtxBase } from "../../../render/api.js";
|
|
2
|
+
import "../../../render/index.js";
|
|
3
|
+
import { createPlDataTableOptionsV2, createPlDataTableV2 } from "./createPlDataTableV2.js";
|
|
4
|
+
import { createPlDataTableOptionsV3, createPlDataTableV3 } from "./createPlDataTableV3.js";
|
|
5
|
+
|
|
6
|
+
//#region src/components/PlDataTable/createPlDataTable/index.d.ts
|
|
7
|
+
declare function createPlDataTable<A, U>(ctx: RenderCtxBase<A, U>, options: {
|
|
8
|
+
version: "v2";
|
|
9
|
+
} & createPlDataTableOptionsV2): ReturnType<typeof createPlDataTableV2>;
|
|
10
|
+
declare function createPlDataTable<A, U>(ctx: RenderCtxBase<A, U>, options: {
|
|
11
|
+
version?: "v3";
|
|
12
|
+
} & createPlDataTableOptionsV3): ReturnType<typeof createPlDataTableV3>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { createPlDataTable };
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createPlDataTableV3 } from "./createPlDataTableV3.js";
|
|
2
|
+
import { createPlDataTableV2 } from "./createPlDataTableV2.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/PlDataTable/createPlDataTable/index.ts
|
|
5
|
+
function createPlDataTable(ctx, options) {
|
|
6
|
+
if (options.version === "v2") return createPlDataTableV2(ctx, options.columns, options.tableState, options.options);
|
|
7
|
+
else return createPlDataTableV3(ctx, options);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { createPlDataTable };
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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 \"../typesV5\";\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"],"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/components/PlDataTable/createPlDataTableSheet.ts
|
|
3
|
+
/** Create sheet entries for PlDataTable */
|
|
4
|
+
function createPlDataTableSheet(ctx, axis, values) {
|
|
5
|
+
const labels = ctx.resultPool.findLabels(axis);
|
|
6
|
+
return {
|
|
7
|
+
axis,
|
|
8
|
+
options: values.map((v) => ({
|
|
9
|
+
value: v,
|
|
10
|
+
label: labels?.[v] ?? v.toString()
|
|
11
|
+
})),
|
|
12
|
+
defaultValue: values[0]
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
exports.createPlDataTableSheet = createPlDataTableSheet;
|
|
18
|
+
//# sourceMappingURL=createPlDataTableSheet.cjs.map
|
|
@@ -0,0 +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 \"./typesV5\";\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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { RenderCtxBase } from "../../render/api.js";
|
|
2
|
+
import "../../render/index.js";
|
|
3
|
+
import { PlDataTableSheet } from "./typesV5.js";
|
|
4
|
+
import { AxisSpec } from "@milaboratories/pl-model-common";
|
|
5
|
+
|
|
6
|
+
//#region src/components/PlDataTable/createPlDataTableSheet.d.ts
|
|
7
|
+
/** Create sheet entries for PlDataTable */
|
|
8
|
+
declare function createPlDataTableSheet<A, U>(ctx: RenderCtxBase<A, U>, axis: AxisSpec, values: (string | number)[]): PlDataTableSheet;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { createPlDataTableSheet };
|
|
11
|
+
//# sourceMappingURL=createPlDataTableSheet.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/components/PlDataTable/createPlDataTableSheet.ts
|
|
2
|
+
/** Create sheet entries for PlDataTable */
|
|
3
|
+
function createPlDataTableSheet(ctx, axis, values) {
|
|
4
|
+
const labels = ctx.resultPool.findLabels(axis);
|
|
5
|
+
return {
|
|
6
|
+
axis,
|
|
7
|
+
options: values.map((v) => ({
|
|
8
|
+
value: v,
|
|
9
|
+
label: labels?.[v] ?? v.toString()
|
|
10
|
+
})),
|
|
11
|
+
defaultValue: values[0]
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { createPlDataTableSheet };
|
|
17
|
+
//# sourceMappingURL=createPlDataTableSheet.js.map
|
|
@@ -0,0 +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 \"./typesV5\";\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,2 +1,5 @@
|
|
|
1
1
|
const require_state_migration = require('./state-migration.cjs');
|
|
2
|
-
const
|
|
2
|
+
const require_createPlDataTableSheet = require('./createPlDataTableSheet.cjs');
|
|
3
|
+
const require_createPlDataTableV3 = require('./createPlDataTable/createPlDataTableV3.cjs');
|
|
4
|
+
const require_createPlDataTableV2 = require('./createPlDataTable/createPlDataTableV2.cjs');
|
|
5
|
+
const require_index = require('./createPlDataTable/index.cjs');
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import { PTableParamsV2, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnId, PlTableColumnIdJson } from "./
|
|
1
|
+
import { PTableParamsV2, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnId, PlTableColumnIdJson } from "./typesV5.js";
|
|
2
2
|
import { PlDataTableStateV2, createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./state-migration.js";
|
|
3
|
-
import { createPlDataTableSheet
|
|
3
|
+
import { createPlDataTableSheet } from "./createPlDataTableSheet.js";
|
|
4
|
+
import { createPlDataTableV2 } from "./createPlDataTable/createPlDataTableV2.js";
|
|
5
|
+
import { createPlDataTableV3, isColumnHidden, isColumnOptional } from "./createPlDataTable/createPlDataTableV3.js";
|
|
6
|
+
import { createPlDataTable } from "./createPlDataTable/index.js";
|
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
import { createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./state-migration.js";
|
|
2
|
-
import { createPlDataTableSheet
|
|
2
|
+
import { createPlDataTableSheet } from "./createPlDataTableSheet.js";
|
|
3
|
+
import { createPlDataTableV3, isColumnHidden, isColumnOptional } from "./createPlDataTable/createPlDataTableV3.js";
|
|
4
|
+
import { createPlDataTableV2 } from "./createPlDataTable/createPlDataTableV2.js";
|
|
5
|
+
import { createPlDataTable } from "./createPlDataTable/index.js";
|
|
@@ -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 } from \"@milaboratories/pl-model-common\";\nimport { distillFilterSpec } from \"../../filters\";\nimport type { PlDataTableFilterState, PlTableFilter } from \"./v4\";\nimport type {\n PlDataTableFiltersWithMeta,\n PlDataTableGridStateCore,\n PlDataTableSheetState,\n PlDataTableStateV2CacheEntry,\n PlDataTableStateV2Normalized,\n PTableParamsV2,\n} from \"./v5\";\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 // 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 -> v5: migrate per-column filters to tree-based format\n if (state.version === 4) {\n state = migrateV4toV5(state);\n }\n return state;\n}\n\n/** Migrate v4 state to v5: convert per-column filters to tree-based format */\nfunction migrateV4toV5(\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 };\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: 5,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds: state.pTableParams.hiddenColIds,\n filters: distillFilterSpec(currentCache.filtersState),\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 sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 5,\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 { canonicalizeJson } 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 \"./typesV5\";\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 // 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 -> v5: migrate per-column filters to tree-based format\n if (state.version === 4) {\n state = migrateV4toV5(state);\n }\n return state;\n}\n\n/** Migrate v4 state to v5: convert per-column filters to tree-based format */\nfunction migrateV4toV5(\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 };\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: 5,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds: state.pTableParams.hiddenColIds,\n filters: distillFilterSpec(currentCache.filtersState),\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 sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 5,\n stateCache: [],\n pTableParams: createDefaultPTableParams(),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PTableParamsV2, PlDataTableGridStateCore, PlDataTableSheetState, PlDataTableStateV2Normalized } from "./
|
|
2
|
-
import { PlDataTableFilterState } from "./
|
|
1
|
+
import { PTableParamsV2, PlDataTableGridStateCore, PlDataTableSheetState, PlDataTableStateV2Normalized } from "./typesV5.js";
|
|
2
|
+
import { PlDataTableFilterState } from "./typesV4.js";
|
|
3
3
|
import { AxisId, CanonicalizedJson, PObjectId, PTableColumnSpec, PTableRecordFilter, PTableSorting } from "@milaboratories/pl-model-common";
|
|
4
4
|
|
|
5
5
|
//#region src/components/PlDataTable/state-migration.d.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-migration.js","names":[],"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 } from \"@milaboratories/pl-model-common\";\nimport { distillFilterSpec } from \"../../filters\";\nimport type { PlDataTableFilterState, PlTableFilter } from \"./v4\";\nimport type {\n PlDataTableFiltersWithMeta,\n PlDataTableGridStateCore,\n PlDataTableSheetState,\n PlDataTableStateV2CacheEntry,\n PlDataTableStateV2Normalized,\n PTableParamsV2,\n} from \"./v5\";\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 // 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 -> v5: migrate per-column filters to tree-based format\n if (state.version === 4) {\n state = migrateV4toV5(state);\n }\n return state;\n}\n\n/** Migrate v4 state to v5: convert per-column filters to tree-based format */\nfunction migrateV4toV5(\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 };\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: 5,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds: state.pTableParams.hiddenColIds,\n filters: distillFilterSpec(currentCache.filtersState),\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 sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 5,\n stateCache: [],\n pTableParams: createDefaultPTableParams(),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"state-migration.js","names":[],"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 } 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 \"./typesV5\";\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 // 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 -> v5: migrate per-column filters to tree-based format\n if (state.version === 4) {\n state = migrateV4toV5(state);\n }\n return state;\n}\n\n/** Migrate v4 state to v5: convert per-column filters to tree-based format */\nfunction migrateV4toV5(\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 };\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: 5,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds: state.pTableParams.hiddenColIds,\n filters: distillFilterSpec(currentCache.filtersState),\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 sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 5,\n stateCache: [],\n pTableParams: createDefaultPTableParams(),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PTableColumnId } from "@milaboratories/pl-model-common";
|
|
2
2
|
|
|
3
|
-
//#region src/components/PlDataTable/
|
|
3
|
+
//#region src/components/PlDataTable/typesV4.d.ts
|
|
4
4
|
type PlDataTableFilterState = {
|
|
5
5
|
id: PTableColumnId;
|
|
6
6
|
alphabetic: boolean;
|
|
@@ -119,4 +119,4 @@ type PlTableFilterString = PlTableFilterCommon | PlTableFilterStringEquals | PlT
|
|
|
119
119
|
type PlTableFilter = PlTableFilterNumber | PlTableFilterString;
|
|
120
120
|
//#endregion
|
|
121
121
|
export { PlDataTableFilterState };
|
|
122
|
-
//# sourceMappingURL=
|
|
122
|
+
//# sourceMappingURL=typesV4.d.ts.map
|
|
@@ -2,7 +2,7 @@ import { FilterSpecLeaf as FilterSpecLeaf$1 } from "../../filters/types.js";
|
|
|
2
2
|
import "../../filters/index.js";
|
|
3
3
|
import { AxisId, AxisSpec, CanonicalizedJson, ListOptionBase, PColumnIdAndSpec, PFrameHandle, PObjectId, PTableColumnId, PTableColumnSpec, PTableHandle, PTableSorting, RootFilterSpec } from "@milaboratories/pl-model-common";
|
|
4
4
|
|
|
5
|
-
//#region src/components/PlDataTable/
|
|
5
|
+
//#region src/components/PlDataTable/typesV5.d.ts
|
|
6
6
|
type PlTableColumnId = {
|
|
7
7
|
/** Original column spec */source: PTableColumnSpec; /** Column spec with labeled axes replaced by label columns */
|
|
8
8
|
labeled: PTableColumnSpec;
|
|
@@ -92,4 +92,4 @@ type CreatePlDataTableOps = {
|
|
|
92
92
|
};
|
|
93
93
|
//#endregion
|
|
94
94
|
export { CreatePlDataTableOps, PTableParamsV2, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnId, PlTableColumnIdJson };
|
|
95
|
-
//# sourceMappingURL=
|
|
95
|
+
//# sourceMappingURL=typesV5.d.ts.map
|