@platforma-sdk/model 1.64.0 → 1.65.3

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 (27) hide show
  1. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +7 -8
  2. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  3. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +7 -8
  4. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  5. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +17 -16
  6. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  7. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
  8. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +17 -16
  9. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  10. package/dist/components/PlDataTable/index.d.ts +1 -1
  11. package/dist/components/PlDataTable/state-migration.cjs +4 -1
  12. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  13. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
  14. package/dist/components/PlDataTable/state-migration.js +4 -1
  15. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  16. package/dist/components/PlDataTable/typesV5.d.ts +21 -14
  17. package/dist/components/PlDataTable/typesV5.d.ts.map +1 -1
  18. package/dist/components/index.d.ts +1 -1
  19. package/dist/index.d.ts +2 -2
  20. package/dist/package.cjs +1 -1
  21. package/dist/package.js +1 -1
  22. package/package.json +6 -6
  23. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +12 -8
  24. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +22 -24
  25. package/src/components/PlDataTable/index.ts +2 -0
  26. package/src/components/PlDataTable/state-migration.ts +3 -0
  27. package/src/components/PlDataTable/typesV5.ts +21 -8
@@ -48,14 +48,12 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
48
48
  }))];
49
49
  const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => (0, _milaboratories_pl_model_common.canonicalizeJson)(c)));
50
50
  const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
51
- const stateFilters = tableStateNormalized.pTableParams.filters;
52
- const opsFilters = options?.filters ?? null;
53
- const filters = stateFilters != null && opsFilters != null ? {
54
- type: "and",
55
- filters: [stateFilters, opsFilters]
56
- } : stateFilters ?? opsFilters;
57
- const firstInvalidFilterColumn = (filters ? require_traverse.collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
51
+ const filters = tableStateNormalized.pTableParams.filters;
52
+ const defaultFilters = options?.filters ?? void 0;
53
+ const firstInvalidFilterColumn = (filters !== null ? require_traverse.collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
58
54
  if (firstInvalidFilterColumn) throw new Error(`Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`);
55
+ const firstInvalidDefaultFilterColumn = (defaultFilters !== void 0 ? require_traverse.collectFilterSpecColumns(defaultFilters) : []).find((col) => !isValidColumnId(col));
56
+ if (firstInvalidDefaultFilterColumn) throw new Error(`Invalid default filter column ${firstInvalidDefaultFilterColumn}: column reference does not match the table columns`);
59
57
  const userSorting = tableStateNormalized.pTableParams.sorting;
60
58
  const sorting = ((0, es_toolkit_compat.isEmpty)(userSorting) ? options?.sorting : userSorting) ?? [];
61
59
  const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId((0, _milaboratories_pl_model_common.canonicalizeJson)(s.column)));
@@ -103,7 +101,8 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
103
101
  sourceId: tableStateNormalized.pTableParams.sourceId,
104
102
  fullTableHandle: fullHandle,
105
103
  fullPframeHandle: pframeHandle,
106
- visibleTableHandle: visibleHandle
104
+ visibleTableHandle: visibleHandle,
105
+ defaultFilters
107
106
  };
108
107
  }
109
108
  function getAllLabelColumns(resultPool) {
@@ -1 +1 @@
1
- {"version":3,"file":"createPlDataTableV2.cjs","names":["upgradePlDataTableStateV2","getMatchingLabelColumns","deriveLabels","identity","Annotation","collectFilterSpecColumns","createPTableDefV2","isColumnOptional","getColumnIdAndSpec","allPColumnsReady","PColumnCollection","PColumnName"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts"],"sourcesContent":["import type {\n AxisId,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n CanonicalizedJson,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n uniqueBy,\n parseJson,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n AxisLabelProvider,\n ColumnProvider,\n PColumnDataUniversal,\n RenderCtxBase,\n} from \"../../../render\";\nimport { allPColumnsReady, deriveLabels, PColumnCollection } from \"../../../render\";\nimport { identity } from \"es-toolkit\";\nimport type { CreatePlDataTableOps, PlDataTableFilters, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport { getMatchingLabelColumns } from \"../labels\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { createPTableDefV2 } from \"./createPTableDefV2\";\nimport { isColumnOptional } from \"./utils\";\n\n/**\n * @deprecated This function is deprecated and will be removed in future. Please migrate to createPlDataTable with v3 options for improved column discovery and display configuration. See createPlDataTableOptionsV3 for details on the new options format and migration guidance.\n */\nexport type createPlDataTableOptionsV2 = {\n columns: PColumn<PColumnDataUniversal>[];\n tableState?: PlDataTableStateV2;\n options?: CreatePlDataTableOps;\n};\n\n/**\n * Create p-table spec and handle given ui table state\n *\n * @deprecated This version of createPlDataTable is deprecated and will be removed in future. Please migrate to v3 by switching to the new options format and providing necessary information for column discovery and display configuration. See createPlDataTableOptionsV3 for details.\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns PlAgDataTableV2 table source\n */\nexport function createPlDataTableV2<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: createPlDataTableOptionsV2[\"columns\"],\n tableState?: createPlDataTableOptionsV2[\"tableState\"],\n options?: createPlDataTableOptionsV2[\"options\"],\n): PlDataTableModel | undefined {\n if (columns.length === 0) return undefined;\n\n const tableStateNormalized = upgradePlDataTableStateV2(tableState);\n const allLabelColumns = getAllLabelColumns(ctx.resultPool) ?? [];\n\n let fullLabelColumns = getMatchingLabelColumns(columns, allLabelColumns);\n fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map(\n (v) => {\n return {\n ...v.value,\n spec: {\n ...v.value.spec,\n annotations: {\n ...v.value.spec.annotations,\n [Annotation.Label]: v.label,\n },\n },\n };\n },\n );\n\n const fullColumns = [...columns, ...fullLabelColumns];\n\n const fullColumnsAxes = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))),\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: string): boolean =>\n fullColumnsIdsSet.has(id as CanonicalizedJson<PTableColumnId>);\n\n // -- Filtering validation --\n const stateFilters = tableStateNormalized.pTableParams.filters;\n const opsFilters = options?.filters ?? null;\n const filters: null | PlDataTableFilters =\n stateFilters != null && opsFilters != null\n ? { type: \"and\", filters: [stateFilters, opsFilters] }\n : (stateFilters ?? opsFilters);\n const filterColumns = filters ? collectFilterSpecColumns(filters) : [];\n const firstInvalidFilterColumn = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidFilterColumn)\n throw new Error(\n `Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`,\n );\n\n // -- Sorting validation --\n const userSorting = tableStateNormalized.pTableParams.sorting;\n const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];\n const firstInvalidSortingColumn = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalidSortingColumn)\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`,\n );\n\n const coreJoinType = options?.coreJoinType ?? \"full\";\n const fullDef = createPTableDefV2({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds !== null) {\n return hiddenColIds\n .filter((s): s is PTableColumnIdColumn => s.type === \"column\")\n .map((s) => s.id);\n }\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(\n visibleColumns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n // if at least one column is not yet computed, we can't show the table\n if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDefV2({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n\nfunction getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"createPlDataTableV2.cjs","names":["upgradePlDataTableStateV2","getMatchingLabelColumns","deriveLabels","identity","Annotation","collectFilterSpecColumns","createPTableDefV2","isColumnOptional","getColumnIdAndSpec","allPColumnsReady","PColumnCollection","PColumnName"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts"],"sourcesContent":["import type {\n AxisId,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n CanonicalizedJson,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n uniqueBy,\n parseJson,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n AxisLabelProvider,\n ColumnProvider,\n PColumnDataUniversal,\n RenderCtxBase,\n} from \"../../../render\";\nimport { allPColumnsReady, deriveLabels, PColumnCollection } from \"../../../render\";\nimport { identity } from \"es-toolkit\";\nimport type { CreatePlDataTableOps, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport { getMatchingLabelColumns } from \"../labels\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { createPTableDefV2 } from \"./createPTableDefV2\";\nimport { isColumnOptional } from \"./utils\";\n\n/**\n * @deprecated This function is deprecated and will be removed in future. Please migrate to createPlDataTable with v3 options for improved column discovery and display configuration. See createPlDataTableOptionsV3 for details on the new options format and migration guidance.\n */\nexport type createPlDataTableOptionsV2 = {\n columns: PColumn<PColumnDataUniversal>[];\n tableState?: PlDataTableStateV2;\n options?: CreatePlDataTableOps;\n};\n\n/**\n * Create p-table spec and handle given ui table state\n *\n * @deprecated This version of createPlDataTable is deprecated and will be removed in future. Please migrate to v3 by switching to the new options format and providing necessary information for column discovery and display configuration. See createPlDataTableOptionsV3 for details.\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns PlAgDataTableV2 table source\n */\nexport function createPlDataTableV2<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: createPlDataTableOptionsV2[\"columns\"],\n tableState?: createPlDataTableOptionsV2[\"tableState\"],\n options?: createPlDataTableOptionsV2[\"options\"],\n): PlDataTableModel | undefined {\n if (columns.length === 0) return undefined;\n\n const tableStateNormalized = upgradePlDataTableStateV2(tableState);\n const allLabelColumns = getAllLabelColumns(ctx.resultPool) ?? [];\n\n let fullLabelColumns = getMatchingLabelColumns(columns, allLabelColumns);\n fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map(\n (v) => {\n return {\n ...v.value,\n spec: {\n ...v.value.spec,\n annotations: {\n ...v.value.spec.annotations,\n [Annotation.Label]: v.label,\n },\n },\n };\n },\n );\n\n const fullColumns = [...columns, ...fullLabelColumns];\n\n const fullColumnsAxes = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))),\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: string): boolean =>\n fullColumnsIdsSet.has(id as CanonicalizedJson<PTableColumnId>);\n\n // -- Filtering validation --\n const filters = tableStateNormalized.pTableParams.filters;\n const defaultFilters = options?.filters ?? undefined;\n const filterColumns = filters !== null ? collectFilterSpecColumns(filters) : [];\n const firstInvalidFilterColumn = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidFilterColumn)\n throw new Error(\n `Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`,\n );\n const defaultFilterColumns =\n defaultFilters !== undefined ? collectFilterSpecColumns(defaultFilters) : [];\n const firstInvalidDefaultFilterColumn = defaultFilterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidDefaultFilterColumn)\n throw new Error(\n `Invalid default filter column ${firstInvalidDefaultFilterColumn}: column reference does not match the table columns`,\n );\n\n // -- Sorting validation --\n const userSorting = tableStateNormalized.pTableParams.sorting;\n const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];\n const firstInvalidSortingColumn = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalidSortingColumn)\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`,\n );\n\n const coreJoinType = options?.coreJoinType ?? \"full\";\n const fullDef = createPTableDefV2({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds !== null) {\n return hiddenColIds\n .filter((s): s is PTableColumnIdColumn => s.type === \"column\")\n .map((s) => s.id);\n }\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(\n visibleColumns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n // if at least one column is not yet computed, we can't show the table\n if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDefV2({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters,\n } satisfies PlDataTableModel;\n}\n\nfunction getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n"],"mappings":"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"}
@@ -47,14 +47,12 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
47
47
  }))];
48
48
  const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson(c)));
49
49
  const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
50
- const stateFilters = tableStateNormalized.pTableParams.filters;
51
- const opsFilters = options?.filters ?? null;
52
- const filters = stateFilters != null && opsFilters != null ? {
53
- type: "and",
54
- filters: [stateFilters, opsFilters]
55
- } : stateFilters ?? opsFilters;
56
- const firstInvalidFilterColumn = (filters ? collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
50
+ const filters = tableStateNormalized.pTableParams.filters;
51
+ const defaultFilters = options?.filters ?? void 0;
52
+ const firstInvalidFilterColumn = (filters !== null ? collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
57
53
  if (firstInvalidFilterColumn) throw new Error(`Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`);
54
+ const firstInvalidDefaultFilterColumn = (defaultFilters !== void 0 ? collectFilterSpecColumns(defaultFilters) : []).find((col) => !isValidColumnId(col));
55
+ if (firstInvalidDefaultFilterColumn) throw new Error(`Invalid default filter column ${firstInvalidDefaultFilterColumn}: column reference does not match the table columns`);
58
56
  const userSorting = tableStateNormalized.pTableParams.sorting;
59
57
  const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];
60
58
  const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId(canonicalizeJson(s.column)));
@@ -102,7 +100,8 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
102
100
  sourceId: tableStateNormalized.pTableParams.sourceId,
103
101
  fullTableHandle: fullHandle,
104
102
  fullPframeHandle: pframeHandle,
105
- visibleTableHandle: visibleHandle
103
+ visibleTableHandle: visibleHandle,
104
+ defaultFilters
106
105
  };
107
106
  }
108
107
  function getAllLabelColumns(resultPool) {
@@ -1 +1 @@
1
- {"version":3,"file":"createPlDataTableV2.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts"],"sourcesContent":["import type {\n AxisId,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n CanonicalizedJson,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n uniqueBy,\n parseJson,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n AxisLabelProvider,\n ColumnProvider,\n PColumnDataUniversal,\n RenderCtxBase,\n} from \"../../../render\";\nimport { allPColumnsReady, deriveLabels, PColumnCollection } from \"../../../render\";\nimport { identity } from \"es-toolkit\";\nimport type { CreatePlDataTableOps, PlDataTableFilters, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport { getMatchingLabelColumns } from \"../labels\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { createPTableDefV2 } from \"./createPTableDefV2\";\nimport { isColumnOptional } from \"./utils\";\n\n/**\n * @deprecated This function is deprecated and will be removed in future. Please migrate to createPlDataTable with v3 options for improved column discovery and display configuration. See createPlDataTableOptionsV3 for details on the new options format and migration guidance.\n */\nexport type createPlDataTableOptionsV2 = {\n columns: PColumn<PColumnDataUniversal>[];\n tableState?: PlDataTableStateV2;\n options?: CreatePlDataTableOps;\n};\n\n/**\n * Create p-table spec and handle given ui table state\n *\n * @deprecated This version of createPlDataTable is deprecated and will be removed in future. Please migrate to v3 by switching to the new options format and providing necessary information for column discovery and display configuration. See createPlDataTableOptionsV3 for details.\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns PlAgDataTableV2 table source\n */\nexport function createPlDataTableV2<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: createPlDataTableOptionsV2[\"columns\"],\n tableState?: createPlDataTableOptionsV2[\"tableState\"],\n options?: createPlDataTableOptionsV2[\"options\"],\n): PlDataTableModel | undefined {\n if (columns.length === 0) return undefined;\n\n const tableStateNormalized = upgradePlDataTableStateV2(tableState);\n const allLabelColumns = getAllLabelColumns(ctx.resultPool) ?? [];\n\n let fullLabelColumns = getMatchingLabelColumns(columns, allLabelColumns);\n fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map(\n (v) => {\n return {\n ...v.value,\n spec: {\n ...v.value.spec,\n annotations: {\n ...v.value.spec.annotations,\n [Annotation.Label]: v.label,\n },\n },\n };\n },\n );\n\n const fullColumns = [...columns, ...fullLabelColumns];\n\n const fullColumnsAxes = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))),\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: string): boolean =>\n fullColumnsIdsSet.has(id as CanonicalizedJson<PTableColumnId>);\n\n // -- Filtering validation --\n const stateFilters = tableStateNormalized.pTableParams.filters;\n const opsFilters = options?.filters ?? null;\n const filters: null | PlDataTableFilters =\n stateFilters != null && opsFilters != null\n ? { type: \"and\", filters: [stateFilters, opsFilters] }\n : (stateFilters ?? opsFilters);\n const filterColumns = filters ? collectFilterSpecColumns(filters) : [];\n const firstInvalidFilterColumn = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidFilterColumn)\n throw new Error(\n `Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`,\n );\n\n // -- Sorting validation --\n const userSorting = tableStateNormalized.pTableParams.sorting;\n const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];\n const firstInvalidSortingColumn = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalidSortingColumn)\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`,\n );\n\n const coreJoinType = options?.coreJoinType ?? \"full\";\n const fullDef = createPTableDefV2({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds !== null) {\n return hiddenColIds\n .filter((s): s is PTableColumnIdColumn => s.type === \"column\")\n .map((s) => s.id);\n }\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(\n visibleColumns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n // if at least one column is not yet computed, we can't show the table\n if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDefV2({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n\nfunction getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"createPlDataTableV2.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts"],"sourcesContent":["import type {\n AxisId,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n CanonicalizedJson,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n uniqueBy,\n parseJson,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type {\n AxisLabelProvider,\n ColumnProvider,\n PColumnDataUniversal,\n RenderCtxBase,\n} from \"../../../render\";\nimport { allPColumnsReady, deriveLabels, PColumnCollection } from \"../../../render\";\nimport { identity } from \"es-toolkit\";\nimport type { CreatePlDataTableOps, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport { getMatchingLabelColumns } from \"../labels\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { createPTableDefV2 } from \"./createPTableDefV2\";\nimport { isColumnOptional } from \"./utils\";\n\n/**\n * @deprecated This function is deprecated and will be removed in future. Please migrate to createPlDataTable with v3 options for improved column discovery and display configuration. See createPlDataTableOptionsV3 for details on the new options format and migration guidance.\n */\nexport type createPlDataTableOptionsV2 = {\n columns: PColumn<PColumnDataUniversal>[];\n tableState?: PlDataTableStateV2;\n options?: CreatePlDataTableOps;\n};\n\n/**\n * Create p-table spec and handle given ui table state\n *\n * @deprecated This version of createPlDataTable is deprecated and will be removed in future. Please migrate to v3 by switching to the new options format and providing necessary information for column discovery and display configuration. See createPlDataTableOptionsV3 for details.\n * @param ctx context\n * @param columns column list\n * @param tableState table ui state\n * @returns PlAgDataTableV2 table source\n */\nexport function createPlDataTableV2<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: createPlDataTableOptionsV2[\"columns\"],\n tableState?: createPlDataTableOptionsV2[\"tableState\"],\n options?: createPlDataTableOptionsV2[\"options\"],\n): PlDataTableModel | undefined {\n if (columns.length === 0) return undefined;\n\n const tableStateNormalized = upgradePlDataTableStateV2(tableState);\n const allLabelColumns = getAllLabelColumns(ctx.resultPool) ?? [];\n\n let fullLabelColumns = getMatchingLabelColumns(columns, allLabelColumns);\n fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map(\n (v) => {\n return {\n ...v.value,\n spec: {\n ...v.value.spec,\n annotations: {\n ...v.value.spec.annotations,\n [Annotation.Label]: v.label,\n },\n },\n };\n },\n );\n\n const fullColumns = [...columns, ...fullLabelColumns];\n\n const fullColumnsAxes = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))),\n (a) => canonicalizeJson<AxisId>(a),\n );\n const fullColumnsIds: PTableColumnId[] = [\n ...fullColumnsAxes.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n const isValidColumnId = (id: string): boolean =>\n fullColumnsIdsSet.has(id as CanonicalizedJson<PTableColumnId>);\n\n // -- Filtering validation --\n const filters = tableStateNormalized.pTableParams.filters;\n const defaultFilters = options?.filters ?? undefined;\n const filterColumns = filters !== null ? collectFilterSpecColumns(filters) : [];\n const firstInvalidFilterColumn = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidFilterColumn)\n throw new Error(\n `Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`,\n );\n const defaultFilterColumns =\n defaultFilters !== undefined ? collectFilterSpecColumns(defaultFilters) : [];\n const firstInvalidDefaultFilterColumn = defaultFilterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalidDefaultFilterColumn)\n throw new Error(\n `Invalid default filter column ${firstInvalidDefaultFilterColumn}: column reference does not match the table columns`,\n );\n\n // -- Sorting validation --\n const userSorting = tableStateNormalized.pTableParams.sorting;\n const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];\n const firstInvalidSortingColumn = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalidSortingColumn)\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`,\n );\n\n const coreJoinType = options?.coreJoinType ?? \"full\";\n const fullDef = createPTableDefV2({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds !== null) {\n return hiddenColIds\n .filter((s): s is PTableColumnIdColumn => s.type === \"column\")\n .map((s) => s.id);\n }\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));\n const visibleLabelColumns = getMatchingLabelColumns(\n visibleColumns.map(getColumnIdAndSpec),\n allLabelColumns,\n );\n\n // if at least one column is not yet computed, we can't show the table\n if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return undefined;\n\n const visibleDef = createPTableDefV2({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters,\n } satisfies PlDataTableModel;\n}\n\nfunction getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n"],"mappings":"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"}
@@ -28,19 +28,20 @@ function createPlDataTableV3(ctx, options) {
28
28
  ...options.labelsOptions
29
29
  }
30
30
  }), options.columnsDisplayOptions);
31
+ const primaryColumnIds = new Set(discovered.filter((dc) => dc.isPrimary).map((dc) => dc.id));
32
+ const primaryColumns = annotated.direct.filter((c) => primaryColumnIds.has(c.id));
33
+ const secondaryColumns = annotated.direct.filter((c) => !primaryColumnIds.has(c.id));
34
+ if (primaryColumns.length === 0) return void 0;
31
35
  const columnIsAvailable = createColumnValidationById([
32
36
  ...annotated.direct,
33
37
  ...annotated.linked.flatMap((lc) => [...annotated.linkers.get(lc.id) ?? [], lc]),
34
38
  ...annotated.labels
35
39
  ]);
36
- const filters = mergeFilters(state.pTableParams.filters, remapFilterColumnIds(options.filters, discovered));
40
+ const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);
41
+ const filters = concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters);
37
42
  validateFilters(filters, columnIsAvailable);
38
43
  const sorting = resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered));
39
44
  validateSorting(sorting, columnIsAvailable);
40
- const primaryColumnIds = new Set(discovered.filter((dc) => dc.isPrimary).map((dc) => dc.id));
41
- const primaryColumns = annotated.direct.filter((c) => primaryColumnIds.has(c.id));
42
- const secondaryColumns = annotated.direct.filter((c) => !primaryColumnIds.has(c.id));
43
- if (primaryColumns.length === 0) return void 0;
44
45
  const fullDef = require_createPTableDefV3.createPTableDefV3({
45
46
  primaryJoinType,
46
47
  primaryColumns,
@@ -59,7 +60,6 @@ function createPlDataTableV3(ctx, options) {
59
60
  ...annotated.labels,
60
61
  ...(0, _milaboratories_pl_model_common.uniqueBy)([...annotated.linkers.values()].flat(), (c) => c.id)
61
62
  ]);
62
- if (!fullHandle || !pframeHandle) return void 0;
63
63
  const hiddenSpecs = state.pTableParams.hiddenColIds;
64
64
  const hiddenColumnIds = computeHiddenColumns([...annotated.direct, ...annotated.linked], sorting, filters, hiddenSpecs);
65
65
  const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);
@@ -77,12 +77,12 @@ function createPlDataTableV3(ctx, options) {
77
77
  sorting
78
78
  });
79
79
  const visibleHandle = ctx.createPTableV2(visibleDef);
80
- if (!visibleHandle) return void 0;
81
80
  return {
82
81
  sourceId: state.pTableParams.sourceId,
83
82
  fullTableHandle: fullHandle,
84
83
  fullPframeHandle: pframeHandle,
85
- visibleTableHandle: visibleHandle
84
+ visibleTableHandle: visibleHandle,
85
+ defaultFilters: remapedDefaultFilters
86
86
  };
87
87
  }
88
88
  /** Split discovered columns into direct (no linker path) and linked (with linker path). */
@@ -126,20 +126,21 @@ function createColumnValidationById(fullColumns) {
126
126
  return validIdSet.has(id);
127
127
  };
128
128
  }
129
- /** Merge filters from table state and options into a single filter spec. */
130
- function mergeFilters(stateFilters, optionsFilters) {
131
- const normalized = optionsFilters ?? null;
132
- return stateFilters !== null && normalized !== null ? {
133
- type: "and",
134
- filters: [stateFilters, normalized]
135
- } : stateFilters ?? normalized;
136
- }
137
129
  /** Validate that all column references in filters exist in the table. */
138
130
  function validateFilters(filters, isValidColumnId) {
139
131
  if (filters == null) return;
140
132
  const firstInvalid = require_traverse.collectFilterSpecColumns(filters).find((col) => !isValidColumnId(col));
141
133
  if (firstInvalid !== void 0) throw new Error(`Invalid filter column ${firstInvalid}: column reference does not match the table columns`);
142
134
  }
135
+ /** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */
136
+ function concatFilters(a, b) {
137
+ if ((0, _milaboratories_helpers.isNil)(a)) return b;
138
+ if ((0, _milaboratories_helpers.isNil)(b)) return a;
139
+ return {
140
+ ...a,
141
+ filters: [...a.filters, ...b.filters]
142
+ };
143
+ }
143
144
  /** Pick user sorting from state if non-empty, otherwise fall back to options default. */
144
145
  function resolveSorting(userSorting, defaultSorting) {
145
146
  return ((0, es_toolkit_compat.isEmpty)(userSorting) ? defaultSorting : userSorting) ?? [];
@@ -1 +1 @@
1
- {"version":3,"file":"createPlDataTableV3.cjs","names":["upgradePlDataTableStateV2","discoverTableColumnSnaphots","getMatchingLabelColumns","getAllLabelColumns","deriveAllLabels","createPTableDefV3","withTableVisualAnnotations","withLabelAnnotations","getAxisId","collectFilterSpecColumns","isColumnHidden","isColumnOptional","getColumnIdAndSpec","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 SUniversalPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n parseJson,\n uniqueBy,\n} from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnMatch, ColumnSnapshot, MatchingMode } from \"../../../columns\";\nimport { Services, type RequireServices } from \"@milaboratories/pl-model-common\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n isColumnHidden,\n isColumnOptional,\n withLabelAnnotations,\n withTableVisualAnnotations,\n} from \"./utils\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport { discoverTableColumnSnaphots, type DiscoveredTableColumnOptions } from \"./discoverColumns\";\nimport { isNil, RequiredBy, throwError, type Nil } from \"@milaboratories/helpers\";\n\nexport type createPlDataTableOptionsV3 = (\n | {\n discoverColumnOptions: DiscoveredTableColumnOptions;\n }\n | {\n columns: Nil | TableColumnSnapshot<SUniversalPColumnId>[];\n }\n) & {\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n tableState?: PlDataTableStateV2;\n labelsOptions?: DeriveLabelsOptions;\n columnsDisplayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\n// Main Function\n\nexport function createPlDataTableV3<A, U, S extends RequireServices<typeof Services.PFrameSpec>>(\n ctx: RenderCtxBase<A, U, S>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered =\n \"discoverColumnOptions\" in options\n ? discoverTableColumnSnaphots(ctx, options.discoverColumnOptions)\n : options.columns;\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n const resolved = resolveDiscoveredColumns(splited, discovered);\n\n const labelColumns = getMatchingLabelColumns(resolved.all, getAllLabelColumns(ctx));\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.id,\n spec: dc.spec,\n linkerPath: dc.linkerPath?.map((lp) => ({ spec: lp.linker.spec })),\n })),\n labelColumns,\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const annotated = annotateColumnGroups(\n resolved,\n labelColumns,\n derivedLabels,\n options.columnsDisplayOptions,\n );\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct,\n ...annotated.linked.flatMap((lc) => [...(annotated.linkers.get(lc.id) ?? []), lc]),\n ...annotated.labels,\n ]);\n\n const filters = mergeFilters(\n state.pTableParams.filters,\n remapFilterColumnIds(options.filters, discovered),\n );\n validateFilters(filters, columnIsAvailable);\n\n const sorting = resolveSorting(\n state.pTableParams.sorting,\n remapSortingColumnIds(options.sorting, discovered),\n );\n validateSorting(sorting, columnIsAvailable);\n\n const primaryColumnIds = new Set<PObjectId>(\n discovered.filter((dc) => dc.isPrimary).map((dc) => dc.id),\n );\n const primaryColumns = annotated.direct.filter((c) => primaryColumnIds.has(c.id));\n const secondaryColumns = annotated.direct.filter((c) => !primaryColumnIds.has(c.id));\n\n if (primaryColumns.length === 0) return undefined;\n\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primaryColumns,\n secondaryGroups: [\n ...secondaryColumns.map((c) => [c]),\n ...annotated.linked.map((lc) => [...(annotated.linkers.get(lc.id) ?? []), lc]),\n ...annotated.labels.map((c) => [c]),\n ],\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct,\n ...annotated.linked,\n ...annotated.labels,\n ...uniqueBy([...annotated.linkers.values()].flat(), (c) => c.id),\n ]);\n if (!fullHandle || !pframeHandle) return undefined;\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked],\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);\n const visibleNonCoreDirect = secondaryColumns.filter((c) => !hiddenColumnIds.has(c.id));\n const visibleLinkedGroups = buildVisibleLinkedGroups(\n visible.direct,\n visible.linked,\n annotated.linkers,\n hiddenSpecs,\n );\n\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primaryColumns,\n secondaryGroups: [\n ...visibleNonCoreDirect.map((c) => [c]),\n ...visibleLinkedGroups,\n ...visible.labels.map((c) => [c]),\n ],\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n\n/** A single column discovered from sources — normalized from raw ColumnSnapshot/ColumnMatch. */\nexport type TableColumnSnapshot<Id extends PObjectId | SUniversalPColumnId> = ColumnSnapshot<Id> & {\n readonly isPrimary?: boolean;\n readonly originalId?: PObjectId;\n readonly linkerPath?: ColumnMatch[\"path\"];\n};\n\ntype TableColumn = PColumn<undefined | PColumnDataUniversal>;\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnSnapshot<SUniversalPColumnId>[];\n readonly linked: TableColumnSnapshot<SUniversalPColumnId>[];\n};\n\ntype ResolvedColumns = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly linkers: Map<PObjectId, TableColumn[]>;\n readonly all: TableColumn[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly linkers: Map<PObjectId, TableColumn[]>;\n readonly labels: TableColumn[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly labels: PColumn<PColumnDataUniversal>[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(\n columns: TableColumnSnapshot<SUniversalPColumnId>[],\n): SplitDiscoveredColumns {\n return {\n direct: columns.filter((dc) => isNil(dc.linkerPath) || dc.linkerPath.length === 0),\n linked: columns.filter((dc) => !isNil(dc.linkerPath) && dc.linkerPath.length > 0),\n };\n}\n\n/** Resolve DiscoveredColumn snapshots into PColumn objects with lazily-evaluated data. */\nfunction resolveDiscoveredColumns(\n split: SplitDiscoveredColumns,\n allDiscovered: TableColumnSnapshot<SUniversalPColumnId>[],\n): ResolvedColumns {\n const linked = split.linked.map(resolveSnapshot);\n const linkers = new Map<PObjectId, TableColumn[]>(\n split.linked\n .filter(\n (dc): dc is RequiredBy<TableColumnSnapshot<SUniversalPColumnId>, \"linkerPath\"> =>\n !isNil(dc.linkerPath),\n )\n .map((dc, i) => [linked[i].id, dc.linkerPath.map((s) => resolveSnapshot(s.linker))]),\n );\n\n return {\n all: allDiscovered.map(resolveSnapshot),\n direct: split.direct.map(resolveSnapshot),\n linked,\n linkers,\n };\n}\n\n/** Annotate all column groups with derived labels and display options. */\nfunction annotateColumnGroups(\n resolved: ResolvedColumns,\n labelColumns: PColumn<PColumnDataUniversal>[],\n derivedLabels: Record<string, string>,\n displayOptions: ColumnsDisplayOptions | undefined,\n): AnnotatedColumnGroups {\n const direct = withTableVisualAnnotations(\n displayOptions,\n withLabelAnnotations(derivedLabels, resolved.direct),\n );\n const linked = withTableVisualAnnotations(\n displayOptions,\n withLabelAnnotations(derivedLabels, resolved.linked),\n );\n const linkers = new Map<PObjectId, TableColumn[]>(\n [...resolved.linkers].map(([id, cols]) => [id, withLabelAnnotations(derivedLabels, cols)]),\n );\n const labels = withLabelAnnotations(derivedLabels, labelColumns);\n\n return { direct, linked, linkers, labels };\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(fullColumns: TableColumn[]) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Merge filters from table state and options into a single filter spec. */\nfunction mergeFilters(\n stateFilters: PlDataTableFilters | null,\n optionsFilters: PlDataTableFilters | null | undefined,\n): Nil | PlDataTableFilters {\n const normalized = optionsFilters ?? null;\n return stateFilters !== null && normalized !== null\n ? { type: \"and\", filters: [stateFilters, normalized] }\n : (stateFilters ?? normalized);\n}\n\n/** Validate that all column references in filters exist in the table. */\nfunction validateFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): void {\n if (filters == null) return;\n const filterColumns = collectFilterSpecColumns(filters);\n const firstInvalid = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid filter column ${firstInvalid}: column reference does not match the table columns`,\n );\n }\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Validate that all column references in sorting exist in the table. */\nfunction validateSorting(sorting: PTableSorting[], isValidColumnId: (id: string) => boolean): void {\n const firstInvalid = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`,\n );\n }\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: TableColumn[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/**\n * Build visible linked column groups. Non-hidden groups are included fully;\n * hidden groups are trimmed to only the prefix that brings axes not yet\n * covered by earlier groups (visible or previously trimmed).\n */\nfunction buildVisibleLinkedGroups(\n direct: TableColumn[],\n linked: TableColumn[],\n linkers: Map<PObjectId, TableColumn[]>,\n hiddenSpecs: PTableColumnId[] | null,\n): TableColumn[][] {\n const result: TableColumn[][] = [];\n const coveredAxisIds = new Set<CanonicalizedJson<AxisId>>();\n\n const collectAxes = (group: TableColumn[]) => {\n for (const col of group) {\n for (const as of col.spec.axesSpec) {\n coveredAxisIds.add(canonicalizeJson(getAxisId(as)));\n }\n }\n };\n\n collectAxes(direct);\n\n for (const lc of linked) {\n const group = [...(linkers.get(lc.id) ?? []), lc];\n result.push(group);\n collectAxes(group);\n }\n\n for (const group of linkers.values()) {\n const trimmed = trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds);\n if (trimmed.length > 0) {\n result.push(trimmed);\n collectAxes(trimmed);\n }\n }\n\n return result;\n}\n\n/**\n * For a linked column group [linker1, ..., linkerN, column], find the rightmost\n * element that has at least one non-hidden and not-yet-covered axis.\n * Return the prefix up to and including that element.\n * If no element has such an axis, return empty array.\n */\nfunction trimGroupByVisibleAxes(\n group: TableColumn[],\n hiddenSpecs: PTableColumnId[] | null,\n coveredAxisIds: Set<CanonicalizedJson<AxisId>>,\n): TableColumn[] {\n if (hiddenSpecs === null) return group;\n\n const hiddenAxisIds = new Set(\n hiddenSpecs\n .filter((s): s is PTableColumnIdAxis => s.type === \"axis\")\n .map((s) => canonicalizeJson(s.id)),\n );\n\n const uncoveredAxisIds = new Set(\n group\n .flatMap((c) => c.spec.axesSpec.map((as) => canonicalizeJson(getAxisId(as))))\n .filter((id) => !hiddenAxisIds.has(id) && !coveredAxisIds.has(id)),\n );\n\n let lastNeeded = -1;\n for (let i = 0; i < group.length; i++) {\n const newAxes = group[i].spec.axesSpec\n .map((as) => canonicalizeJson(getAxisId(as)))\n .filter((id) => uncoveredAxisIds.has(id));\n if (newAxes.length > 0) {\n for (const id of newAxes) uncoveredAxisIds.delete(id);\n lastNeeded = i;\n }\n }\n return lastNeeded === -1 ? [] : group.slice(0, lastNeeded + 1);\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n originalLabelColumns: PColumn<PColumnDataUniversal>[],\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.id));\n const labels = getMatchingLabelColumns(\n [...direct, ...linked].map(getColumnIdAndSpec),\n originalLabelColumns,\n );\n return { direct, linked, labels };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnSnapshot<PObjectId | SUniversalPColumnId>[],\n): Nil | PTableSorting[] {\n return sorting?.map((s) => {\n if (s.column.type === \"axis\") return s; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column =\n columns.find((c) => (c.originalId ?? c.id) === id) ??\n throwError(`Column ID \"${id}\" in sorting does not match any discovered column`);\n\n return {\n ...s,\n column: {\n type: \"column\",\n id: column.id,\n },\n };\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnSnapshot<PObjectId | SUniversalPColumnId>[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (c.originalId ?? c.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"createPlDataTableV3.cjs","names":["upgradePlDataTableStateV2","discoverTableColumnSnaphots","getMatchingLabelColumns","getAllLabelColumns","deriveAllLabels","createPTableDefV3","withTableVisualAnnotations","withLabelAnnotations","getAxisId","collectFilterSpecColumns","isColumnHidden","isColumnOptional","getColumnIdAndSpec","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 SUniversalPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n parseJson,\n uniqueBy,\n} from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV5\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnMatch, ColumnSnapshot, MatchingMode } from \"../../../columns\";\nimport { Services, type RequireServices } from \"@milaboratories/pl-model-common\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n isColumnHidden,\n isColumnOptional,\n withLabelAnnotations,\n withTableVisualAnnotations,\n} from \"./utils\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport { discoverTableColumnSnaphots, type DiscoveredTableColumnOptions } from \"./discoverColumns\";\nimport { isNil, RequiredBy, throwError, type Nil } from \"@milaboratories/helpers\";\n\nexport type createPlDataTableOptionsV3 = (\n | {\n discoverColumnOptions: DiscoveredTableColumnOptions;\n }\n | {\n columns: Nil | TableColumnSnapshot<SUniversalPColumnId>[];\n }\n) & {\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n tableState?: PlDataTableStateV2;\n labelsOptions?: DeriveLabelsOptions;\n columnsDisplayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\n// Main Function\n\nexport function createPlDataTableV3<A, U, S extends RequireServices<typeof Services.PFrameSpec>>(\n ctx: RenderCtxBase<A, U, S>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered =\n \"discoverColumnOptions\" in options\n ? discoverTableColumnSnaphots(ctx, options.discoverColumnOptions)\n : options.columns;\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n const resolved = resolveDiscoveredColumns(splited, discovered);\n\n const labelColumns = getMatchingLabelColumns(resolved.all, getAllLabelColumns(ctx));\n\n const derivedLabels = deriveAllLabels({\n columns: discovered.map((dc) => ({\n id: dc.id,\n spec: dc.spec,\n linkerPath: dc.linkerPath?.map((lp) => ({ spec: lp.linker.spec })),\n })),\n labelColumns,\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const annotated = annotateColumnGroups(\n resolved,\n labelColumns,\n derivedLabels,\n options.columnsDisplayOptions,\n );\n\n const primaryColumnIds = new Set<PObjectId>(\n discovered.filter((dc) => dc.isPrimary).map((dc) => dc.id),\n );\n const primaryColumns = annotated.direct.filter((c) => primaryColumnIds.has(c.id));\n const secondaryColumns = annotated.direct.filter((c) => !primaryColumnIds.has(c.id));\n\n if (primaryColumns.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct,\n ...annotated.linked.flatMap((lc) => [...(annotated.linkers.get(lc.id) ?? []), lc]),\n ...annotated.labels,\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n );\n validateFilters(filters, columnIsAvailable);\n\n const sorting = resolveSorting(\n state.pTableParams.sorting,\n remapSortingColumnIds(options.sorting, discovered),\n );\n validateSorting(sorting, columnIsAvailable);\n\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primaryColumns,\n secondaryGroups: [\n ...secondaryColumns.map((c) => [c]),\n ...annotated.linked.map((lc) => [...(annotated.linkers.get(lc.id) ?? []), lc]),\n ...annotated.labels.map((c) => [c]),\n ],\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct,\n ...annotated.linked,\n ...annotated.labels,\n ...uniqueBy([...annotated.linkers.values()].flat(), (c) => c.id),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked],\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);\n const visibleNonCoreDirect = secondaryColumns.filter((c) => !hiddenColumnIds.has(c.id));\n const visibleLinkedGroups = buildVisibleLinkedGroups(\n visible.direct,\n visible.linked,\n annotated.linkers,\n hiddenSpecs,\n );\n\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primaryColumns,\n secondaryGroups: [\n ...visibleNonCoreDirect.map((c) => [c]),\n ...visibleLinkedGroups,\n ...visible.labels.map((c) => [c]),\n ],\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\n/** A single column discovered from sources — normalized from raw ColumnSnapshot/ColumnMatch. */\nexport type TableColumnSnapshot<Id extends PObjectId | SUniversalPColumnId> = ColumnSnapshot<Id> & {\n readonly isPrimary?: boolean;\n readonly originalId?: PObjectId;\n readonly linkerPath?: ColumnMatch[\"path\"];\n};\n\ntype TableColumn = PColumn<undefined | PColumnDataUniversal>;\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnSnapshot<SUniversalPColumnId>[];\n readonly linked: TableColumnSnapshot<SUniversalPColumnId>[];\n};\n\ntype ResolvedColumns = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly linkers: Map<PObjectId, TableColumn[]>;\n readonly all: TableColumn[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly linkers: Map<PObjectId, TableColumn[]>;\n readonly labels: TableColumn[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumn[];\n readonly linked: TableColumn[];\n readonly labels: PColumn<PColumnDataUniversal>[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(\n columns: TableColumnSnapshot<SUniversalPColumnId>[],\n): SplitDiscoveredColumns {\n return {\n direct: columns.filter((dc) => isNil(dc.linkerPath) || dc.linkerPath.length === 0),\n linked: columns.filter((dc) => !isNil(dc.linkerPath) && dc.linkerPath.length > 0),\n };\n}\n\n/** Resolve DiscoveredColumn snapshots into PColumn objects with lazily-evaluated data. */\nfunction resolveDiscoveredColumns(\n split: SplitDiscoveredColumns,\n allDiscovered: TableColumnSnapshot<SUniversalPColumnId>[],\n): ResolvedColumns {\n const linked = split.linked.map(resolveSnapshot);\n const linkers = new Map<PObjectId, TableColumn[]>(\n split.linked\n .filter(\n (dc): dc is RequiredBy<TableColumnSnapshot<SUniversalPColumnId>, \"linkerPath\"> =>\n !isNil(dc.linkerPath),\n )\n .map((dc, i) => [linked[i].id, dc.linkerPath.map((s) => resolveSnapshot(s.linker))]),\n );\n\n return {\n all: allDiscovered.map(resolveSnapshot),\n direct: split.direct.map(resolveSnapshot),\n linked,\n linkers,\n };\n}\n\n/** Annotate all column groups with derived labels and display options. */\nfunction annotateColumnGroups(\n resolved: ResolvedColumns,\n labelColumns: PColumn<PColumnDataUniversal>[],\n derivedLabels: Record<string, string>,\n displayOptions: ColumnsDisplayOptions | undefined,\n): AnnotatedColumnGroups {\n const direct = withTableVisualAnnotations(\n displayOptions,\n withLabelAnnotations(derivedLabels, resolved.direct),\n );\n const linked = withTableVisualAnnotations(\n displayOptions,\n withLabelAnnotations(derivedLabels, resolved.linked),\n );\n const linkers = new Map<PObjectId, TableColumn[]>(\n [...resolved.linkers].map(([id, cols]) => [id, withLabelAnnotations(derivedLabels, cols)]),\n );\n const labels = withLabelAnnotations(derivedLabels, labelColumns);\n\n return { direct, linked, linkers, labels };\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(fullColumns: TableColumn[]) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Validate that all column references in filters exist in the table. */\nfunction validateFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): void {\n if (filters == null) return;\n const filterColumns = collectFilterSpecColumns(filters);\n const firstInvalid = filterColumns.find((col) => !isValidColumnId(col));\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid filter column ${firstInvalid}: column reference does not match the table columns`,\n );\n }\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Validate that all column references in sorting exist in the table. */\nfunction validateSorting(sorting: PTableSorting[], isValidColumnId: (id: string) => boolean): void {\n const firstInvalid = sorting.find(\n (s) => !isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)),\n );\n if (firstInvalid !== undefined) {\n throw new Error(\n `Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`,\n );\n }\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: TableColumn[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/**\n * Build visible linked column groups. Non-hidden groups are included fully;\n * hidden groups are trimmed to only the prefix that brings axes not yet\n * covered by earlier groups (visible or previously trimmed).\n */\nfunction buildVisibleLinkedGroups(\n direct: TableColumn[],\n linked: TableColumn[],\n linkers: Map<PObjectId, TableColumn[]>,\n hiddenSpecs: PTableColumnId[] | null,\n): TableColumn[][] {\n const result: TableColumn[][] = [];\n const coveredAxisIds = new Set<CanonicalizedJson<AxisId>>();\n\n const collectAxes = (group: TableColumn[]) => {\n for (const col of group) {\n for (const as of col.spec.axesSpec) {\n coveredAxisIds.add(canonicalizeJson(getAxisId(as)));\n }\n }\n };\n\n collectAxes(direct);\n\n for (const lc of linked) {\n const group = [...(linkers.get(lc.id) ?? []), lc];\n result.push(group);\n collectAxes(group);\n }\n\n for (const group of linkers.values()) {\n const trimmed = trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds);\n if (trimmed.length > 0) {\n result.push(trimmed);\n collectAxes(trimmed);\n }\n }\n\n return result;\n}\n\n/**\n * For a linked column group [linker1, ..., linkerN, column], find the rightmost\n * element that has at least one non-hidden and not-yet-covered axis.\n * Return the prefix up to and including that element.\n * If no element has such an axis, return empty array.\n */\nfunction trimGroupByVisibleAxes(\n group: TableColumn[],\n hiddenSpecs: PTableColumnId[] | null,\n coveredAxisIds: Set<CanonicalizedJson<AxisId>>,\n): TableColumn[] {\n if (hiddenSpecs === null) return group;\n\n const hiddenAxisIds = new Set(\n hiddenSpecs\n .filter((s): s is PTableColumnIdAxis => s.type === \"axis\")\n .map((s) => canonicalizeJson(s.id)),\n );\n\n const uncoveredAxisIds = new Set(\n group\n .flatMap((c) => c.spec.axesSpec.map((as) => canonicalizeJson(getAxisId(as))))\n .filter((id) => !hiddenAxisIds.has(id) && !coveredAxisIds.has(id)),\n );\n\n let lastNeeded = -1;\n for (let i = 0; i < group.length; i++) {\n const newAxes = group[i].spec.axesSpec\n .map((as) => canonicalizeJson(getAxisId(as)))\n .filter((id) => uncoveredAxisIds.has(id));\n if (newAxes.length > 0) {\n for (const id of newAxes) uncoveredAxisIds.delete(id);\n lastNeeded = i;\n }\n }\n return lastNeeded === -1 ? [] : group.slice(0, lastNeeded + 1);\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n originalLabelColumns: PColumn<PColumnDataUniversal>[],\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.id));\n const labels = getMatchingLabelColumns(\n [...direct, ...linked].map(getColumnIdAndSpec),\n originalLabelColumns,\n );\n return { direct, linked, labels };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnSnapshot<PObjectId | SUniversalPColumnId>[],\n): Nil | PTableSorting[] {\n return sorting?.map((s) => {\n if (s.column.type === \"axis\") return s; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column =\n columns.find((c) => (c.originalId ?? c.id) === id) ??\n throwError(`Column ID \"${id}\" in sorting does not match any discovered column`);\n\n return {\n ...s,\n column: {\n type: \"column\",\n id: column.id,\n },\n };\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnSnapshot<PObjectId | SUniversalPColumnId>[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (c.originalId ?? c.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":";;;;;;;;;;;AAyFA,SAAgB,oBACd,KACA,SAC8B;CAC9B,MAAM,QAAQA,wBAAAA,0BAA0B,QAAQ,WAAW;CAC3D,MAAM,kBAAkB,QAAQ,mBAAmB;CAEnD,MAAM,aACJ,2BAA2B,UACvBC,wBAAAA,4BAA4B,KAAK,QAAQ,sBAAsB,GAC/D,QAAQ;AACd,MAAA,GAAA,wBAAA,OAAU,WAAW,IAAI,WAAW,WAAW,EAAG,QAAO,KAAA;CAGzD,MAAM,WAAW,yBADD,uBAAuB,WAAW,EACC,WAAW;CAE9D,MAAM,eAAeC,eAAAA,wBAAwB,SAAS,KAAKC,eAAAA,mBAAmB,IAAI,CAAC;CAenF,MAAM,YAAY,qBAChB,UACA,cAfoBC,cAAAA,gBAAgB;EACpC,SAAS,WAAW,KAAK,QAAQ;GAC/B,IAAI,GAAG;GACP,MAAM,GAAG;GACT,YAAY,GAAG,YAAY,KAAK,QAAQ,EAAE,MAAM,GAAG,OAAO,MAAM,EAAE;GACnE,EAAE;EACH;EACA,qBAAqB;GACnB,oBAAoB;GACpB,GAAG,QAAQ;GACZ;EACF,CAAC,EAMA,QAAQ,sBACT;CAED,MAAM,mBAAmB,IAAI,IAC3B,WAAW,QAAQ,OAAO,GAAG,UAAU,CAAC,KAAK,OAAO,GAAG,GAAG,CAC3D;CACD,MAAM,iBAAiB,UAAU,OAAO,QAAQ,MAAM,iBAAiB,IAAI,EAAE,GAAG,CAAC;CACjF,MAAM,mBAAmB,UAAU,OAAO,QAAQ,MAAM,CAAC,iBAAiB,IAAI,EAAE,GAAG,CAAC;AAEpF,KAAI,eAAe,WAAW,EAAG,QAAO,KAAA;CAExC,MAAM,oBAAoB,2BAA2B;EACnD,GAAG,UAAU;EACb,GAAG,UAAU,OAAO,SAAS,OAAO,CAAC,GAAI,UAAU,QAAQ,IAAI,GAAG,GAAG,IAAI,EAAE,EAAG,GAAG,CAAC;EAClF,GAAG,UAAU;EACd,CAAC;CAEF,MAAM,wBAAwB,qBAAqB,QAAQ,SAAS,WAAW;CAC/E,MAAM,UAAU,cACd,MAAM,aAAa,SACnB,MAAM,aAAa,kBAAkB,sBACtC;AACD,iBAAgB,SAAS,kBAAkB;CAE3C,MAAM,UAAU,eACd,MAAM,aAAa,SACnB,sBAAsB,QAAQ,SAAS,WAAW,CACnD;AACD,iBAAgB,SAAS,kBAAkB;CAE3C,MAAM,UAAUC,0BAAAA,kBAAkB;EAChC;EACA;EACA,iBAAiB;GACf,GAAG,iBAAiB,KAAK,MAAM,CAAC,EAAE,CAAC;GACnC,GAAG,UAAU,OAAO,KAAK,OAAO,CAAC,GAAI,UAAU,QAAQ,IAAI,GAAG,GAAG,IAAI,EAAE,EAAG,GAAG,CAAC;GAC9E,GAAG,UAAU,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC;GACpC;EACD;EACA;EACD,CAAC;CAEF,MAAM,aAAa,IAAI,eAAe,QAAQ;CAC9C,MAAM,eAAe,IAAI,aAAa;EACpC,GAAG,UAAU;EACb,GAAG,UAAU;EACb,GAAG,UAAU;EACb,IAAA,GAAA,gCAAA,UAAY,CAAC,GAAG,UAAU,QAAQ,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG;EACjE,CAAC;CAEF,MAAM,cAAc,MAAM,aAAa;CACvC,MAAM,kBAAkB,qBACtB,CAAC,GAAG,UAAU,QAAQ,GAAG,UAAU,OAAO,EAC1C,SACA,SACA,YACD;CAED,MAAM,UAAU,oBAAoB,WAAW,iBAAiB,aAAa;CAC7E,MAAM,uBAAuB,iBAAiB,QAAQ,MAAM,CAAC,gBAAgB,IAAI,EAAE,GAAG,CAAC;CACvF,MAAM,sBAAsB,yBAC1B,QAAQ,QACR,QAAQ,QACR,UAAU,SACV,YACD;CAED,MAAM,aAAaA,0BAAAA,kBAAkB;EACnC;EACA;EACA,iBAAiB;GACf,GAAG,qBAAqB,KAAK,MAAM,CAAC,EAAE,CAAC;GACvC,GAAG;GACH,GAAG,QAAQ,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC;GAClC;EACD;EACA;EACD,CAAC;CACF,MAAM,gBAAgB,IAAI,eAAe,WAAW;AAEpD,QAAO;EACL,UAAU,MAAM,aAAa;EAC7B,iBAAiB;EACjB,kBAAkB;EAClB,oBAAoB;EACpB,gBAAgB;EACjB;;;AAsCH,SAAS,uBACP,SACwB;AACxB,QAAO;EACL,QAAQ,QAAQ,QAAQ,QAAA,GAAA,wBAAA,OAAa,GAAG,WAAW,IAAI,GAAG,WAAW,WAAW,EAAE;EAClF,QAAQ,QAAQ,QAAQ,OAAO,EAAA,GAAA,wBAAA,OAAO,GAAG,WAAW,IAAI,GAAG,WAAW,SAAS,EAAE;EAClF;;;AAIH,SAAS,yBACP,OACA,eACiB;CACjB,MAAM,SAAS,MAAM,OAAO,IAAI,gBAAgB;CAChD,MAAM,UAAU,IAAI,IAClB,MAAM,OACH,QACE,OACC,EAAA,GAAA,wBAAA,OAAO,GAAG,WAAW,CACxB,CACA,KAAK,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,WAAW,KAAK,MAAM,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CACvF;AAED,QAAO;EACL,KAAK,cAAc,IAAI,gBAAgB;EACvC,QAAQ,MAAM,OAAO,IAAI,gBAAgB;EACzC;EACA;EACD;;;AAIH,SAAS,qBACP,UACA,cACA,eACA,gBACuB;AAcvB,QAAO;EAAE,QAbMC,cAAAA,2BACb,gBACAC,cAAAA,qBAAqB,eAAe,SAAS,OAAO,CACrD;EAUgB,QATFD,cAAAA,2BACb,gBACAC,cAAAA,qBAAqB,eAAe,SAAS,OAAO,CACrD;EAMwB,SALT,IAAI,IAClB,CAAC,GAAG,SAAS,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAIA,cAAAA,qBAAqB,eAAe,KAAK,CAAC,CAAC,CAC3F;EAGiC,QAFnBA,cAAAA,qBAAqB,eAAe,aAAa;EAEtB;;;AAI5C,SAAS,2BAA2B,aAA4B;CAM9D,MAAM,SAA2B,CAC/B,IAAA,GAAA,gCAAA,UALA,YAAY,SAAS,MAAM,EAAE,KAAK,SAAS,IAAIC,gCAAAA,UAAU,CAAC,GACzD,OAAA,GAAA,gCAAA,kBAA+B,EAAE,CACnC,CAGY,KAAK,OAAO;EAAE,MAAM;EAAQ,IAAI;EAAG,EAA+B,EAC7E,GAAG,YAAY,KAAK,OAAO;EAAE,MAAM;EAAU,IAAI,EAAE;EAAI,EAAiC,CACzF;CAED,MAAM,aAAa,IAAI,IAAI,OAAO,KAAK,OAAA,GAAA,gCAAA,kBAAuC,EAAE,CAAC,CAAC;AAElF,SAAQ,OAAwB;AAC9B,SAAO,WAAW,IAAI,GAAwC;;;;AAKlE,SAAS,gBACP,SACA,iBACM;AACN,KAAI,WAAW,KAAM;CAErB,MAAM,eADgBC,iBAAAA,yBAAyB,QAAQ,CACpB,MAAM,QAAQ,CAAC,gBAAgB,IAAI,CAAC;AACvE,KAAI,iBAAiB,KAAA,EACnB,OAAM,IAAI,MACR,yBAAyB,aAAa,qDACvC;;;AAKL,SAAS,cACP,GACA,GAC0B;AAC1B,MAAA,GAAA,wBAAA,OAAU,EAAE,CAAE,QAAO;AACrB,MAAA,GAAA,wBAAA,OAAU,EAAE,CAAE,QAAO;AACrB,QAAO;EAAE,GAAG;EAAG,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;EAAE;;;AAIxD,SAAS,eACP,aACA,gBACiB;AACjB,UAAA,GAAA,kBAAA,SAAgB,YAAY,GAAG,iBAAiB,gBAAgB,EAAE;;;AAIpE,SAAS,gBAAgB,SAA0B,iBAAgD;CACjG,MAAM,eAAe,QAAQ,MAC1B,MAAM,CAAC,iBAAA,GAAA,gCAAA,kBAAiD,EAAE,OAAO,CAAC,CACpE;AACD,KAAI,iBAAiB,KAAA,EACnB,OAAM,IAAI,MACR,0BAA0B,KAAK,UAAU,aAAa,OAAO,CAAC,qDAC/D;;;AAKL,SAAS,qBACP,SACA,SACA,SACA,aACgB;CAChB,MAAM,eAAe,QAAQ,QAAQ,MAAMC,cAAAA,eAAe,EAAE,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG;CACnF,MAAM,iBAAiB,EAAA,GAAA,wBAAA,OAAO,YAAY,GACtC,YAAY,QAAQ,MAAiC,EAAE,SAAS,SAAS,CAAC,KAAK,MAAM,EAAE,GAAG,GAC1F,QAAQ,QAAQ,MAAMC,cAAAA,iBAAiB,EAAE,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG;CACpE,MAAM,UAAU,CAAC,GAAG,cAAc,GAAG,eAAe;CACpD,MAAM,YAAY,0BAA0B,SAAS,QAAQ;AAE7D,QAAO,IAAI,IAAI,QAAQ,QAAQ,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;;;;;;;AAQ5D,SAAS,yBACP,QACA,QACA,SACA,aACiB;CACjB,MAAM,SAA0B,EAAE;CAClC,MAAM,iCAAiB,IAAI,KAAgC;CAE3D,MAAM,eAAe,UAAyB;AAC5C,OAAK,MAAM,OAAO,MAChB,MAAK,MAAM,MAAM,IAAI,KAAK,SACxB,gBAAe,KAAA,GAAA,gCAAA,mBAAA,GAAA,gCAAA,WAA+B,GAAG,CAAC,CAAC;;AAKzD,aAAY,OAAO;AAEnB,MAAK,MAAM,MAAM,QAAQ;EACvB,MAAM,QAAQ,CAAC,GAAI,QAAQ,IAAI,GAAG,GAAG,IAAI,EAAE,EAAG,GAAG;AACjD,SAAO,KAAK,MAAM;AAClB,cAAY,MAAM;;AAGpB,MAAK,MAAM,SAAS,QAAQ,QAAQ,EAAE;EACpC,MAAM,UAAU,uBAAuB,OAAO,aAAa,eAAe;AAC1E,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAO,KAAK,QAAQ;AACpB,eAAY,QAAQ;;;AAIxB,QAAO;;;;;;;;AAST,SAAS,uBACP,OACA,aACA,gBACe;AACf,KAAI,gBAAgB,KAAM,QAAO;CAEjC,MAAM,gBAAgB,IAAI,IACxB,YACG,QAAQ,MAA+B,EAAE,SAAS,OAAO,CACzD,KAAK,OAAA,GAAA,gCAAA,kBAAuB,EAAE,GAAG,CAAC,CACtC;CAED,MAAM,mBAAmB,IAAI,IAC3B,MACG,SAAS,MAAM,EAAE,KAAK,SAAS,KAAK,QAAA,GAAA,gCAAA,mBAAA,GAAA,gCAAA,WAAkC,GAAG,CAAC,CAAC,CAAC,CAC5E,QAAQ,OAAO,CAAC,cAAc,IAAI,GAAG,IAAI,CAAC,eAAe,IAAI,GAAG,CAAC,CACrE;CAED,IAAI,aAAa;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,UAAU,MAAM,GAAG,KAAK,SAC3B,KAAK,QAAA,GAAA,gCAAA,mBAAA,GAAA,gCAAA,WAAkC,GAAG,CAAC,CAAC,CAC5C,QAAQ,OAAO,iBAAiB,IAAI,GAAG,CAAC;AAC3C,MAAI,QAAQ,SAAS,GAAG;AACtB,QAAK,MAAM,MAAM,QAAS,kBAAiB,OAAO,GAAG;AACrD,gBAAa;;;AAGjB,QAAO,eAAe,KAAK,EAAE,GAAG,MAAM,MAAM,GAAG,aAAa,EAAE;;;AAIhE,SAAS,0BACP,SACA,SACgB;CAChB,MAAM,aAAa,WAAW,EAAE,EAC7B,KAAK,MAAM,EAAE,OAAO,CACpB,QAAQ,MAAiC,EAAE,SAAS,SAAS,CAC7D,KAAK,MAAM,EAAE,GAAG;CAEnB,MAAM,YAAY,EAAA,GAAA,wBAAA,OAAO,QAAQ,GAC7BF,iBAAAA,yBAAyB,QAAQ,CAAC,SAAS,MAAM;EAC/C,MAAM,OAAA,GAAA,gCAAA,WAAgB,EAAE;AACxB,SAAO,IAAI,SAAS,WAAW,CAAC,IAAI,GAAG,GAAG,EAAE;GAC5C,GACF,EAAE;AAEN,QAAO,IAAI,IAAe,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC;;;AAIzD,SAAS,oBACP,WACA,eACA,sBACgB;CAChB,MAAM,SAAS,UAAU,OAAO,QAAQ,MAAM,CAAC,cAAc,IAAI,EAAE,GAAG,CAAC;CACvE,MAAM,SAAS,UAAU,OAAO,QAAQ,MAAM,CAAC,cAAc,IAAI,EAAE,GAAG,CAAC;AAKvE,QAAO;EAAE;EAAQ;EAAQ,QAJVP,eAAAA,wBACb,CAAC,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAIU,gCAAAA,mBAAmB,EAC9C,qBACD;EACgC;;;AAInC,SAAS,gBACP,MAC2C;AAC3C,QAAO;EAAE,IAAI,KAAK;EAAI,MAAM,KAAK;EAAM,MAAM,KAAK,MAAM,KAAK;EAAE;;;AAIjE,SAAS,sBACP,SACA,SACuB;AACvB,QAAO,SAAS,KAAK,MAAM;AACzB,MAAI,EAAE,OAAO,SAAS,OAAQ,QAAO;EAErC,MAAM,KAAK,EAAE,OAAO;EACpB,MAAM,SACJ,QAAQ,MAAM,OAAO,EAAE,cAAc,EAAE,QAAQ,GAAG,KAAA,GAAA,wBAAA,YACvC,cAAc,GAAG,mDAAmD;AAEjF,SAAO;GACL,GAAG;GACH,QAAQ;IACN,MAAM;IACN,IAAI,OAAO;IACZ;GACF;GACD;;;AAMJ,SAAS,qBACP,SACA,SAC0B;AAC1B,MAAA,GAAA,wBAAA,OAAU,QAAQ,CAAE,QAAO;CAE3B,MAAM,OACJ,kBACsC;EACtC,MAAM,UAAA,GAAA,gCAAA,WAAmC,cAAc;AACvD,MAAI,OAAO,SAAS,OAAQ,QAAO;EAEnC,MAAM,aAAa,OAAO;AAK1B,UAAA,GAAA,gCAAA,kBAAwC;GACtC,MAAM;GACN,KALA,QAAQ,MAAM,OAAO,EAAE,cAAc,EAAE,QAAQ,WAAW,KAAA,GAAA,wBAAA,YAC/C,cAAc,OAAO,GAAG,mDAAmD,EAI3E;GACZ,CAAC;;AAGJ,QAAOC,iBAAAA,mBAAmB,SAAS;EACjC,OAAO,SAAgC;AACrC,OAAI,KAAK,SAAS,KAAA,EAAW,QAAO;GACpC,MAAM,SAAS,EAAE,GAAG,MAAM;AAC1B,OAAI,YAAY,OAAQ,QAAO,SAAS,IAAI,OAAO,OAAO;AAC1D,OAAI,SAAS,OAAQ,QAAO,MAAM,IAAI,OAAO,IAAI;AACjD,UAAO;;EAET,MAAM,aAAoC;GAAE,MAAM;GAAO,SAAS;GAAS;EAC3E,KAAK,aAAoC;GAAE,MAAM;GAAM,SAAS;GAAS;EACzE,MAAM,YAAmC;GAAE,MAAM;GAAO,QAAQ;GAAQ;EACzE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createPlDataTableV3.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"mappings":";;;;;;;;;;;KA0CY,0BAAA;EAEN,qBAAA,EAAuB,4BAAA;AAAA;EAGvB,OAAA,EAAS,GAAA,GAAM,mBAAA,CAAoB,mBAAA;AAAA;EAGvC,OAAA,GAAU,kBAAA;EACV,OAAA,GAAU,aAAA;EACV,eAAA;EAEA,UAAA,GAAa,kBAAA;EACb,aAAA,GAAgB,mBAAA;EAChB,qBAAA,GAAwB,qBAAA;AAAA;;KAId,qBAAA;EACV,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,IAAA,GAAO,YAAA;EACP,OAAA;AAAA;AAAA,KAGU,qBAAA;EApBN,uFAsBJ,QAAA,GAAW,eAAA,IAtBQ;EAwBnB,UAAA,GAAa,oBAAA;AAAA;AAAA,KAGH,eAAA;EACV,KAAA,EAAO,aAAA,EAxBG;EA0BV,QAAA;AAAA;AAAA,KAGU,oBAAA;EACV,KAAA,EAAO,aAAA;EACP,UAAA;AAAA;AAAA,KAGU,aAAA,IAAiB,IAAA,EAAM,WAAA;AAAA,iBAInB,mBAAA,iBAAoC,eAAA,QAAuB,QAAA,CAAS,UAAA,EAAA,CAClF,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,CAAA,GACzB,OAAA,EAAS,0BAAA,GACR,gBAAA;;KA2HS,mBAAA,YAA+B,SAAA,GAAY,mBAAA,IAAuB,cAAA,CAAe,EAAA;EAAA,SAClF,SAAA;EAAA,SACA,UAAA,GAAa,SAAA;EAAA,SACb,UAAA,GAAa,WAAA;AAAA"}
1
+ {"version":3,"file":"createPlDataTableV3.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"mappings":";;;;;;;;;;;KA0CY,0BAAA;EAEN,qBAAA,EAAuB,4BAAA;AAAA;EAGvB,OAAA,EAAS,GAAA,GAAM,mBAAA,CAAoB,mBAAA;AAAA;EAGvC,OAAA,GAAU,kBAAA;EACV,OAAA,GAAU,aAAA;EACV,eAAA;EAEA,UAAA,GAAa,kBAAA;EACb,aAAA,GAAgB,mBAAA;EAChB,qBAAA,GAAwB,qBAAA;AAAA;;KAId,qBAAA;EACV,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,IAAA,GAAO,YAAA;EACP,OAAA;AAAA;AAAA,KAGU,qBAAA;EApBN,uFAsBJ,QAAA,GAAW,eAAA,IAtBQ;EAwBnB,UAAA,GAAa,oBAAA;AAAA;AAAA,KAGH,eAAA;EACV,KAAA,EAAO,aAAA,EAxBG;EA0BV,QAAA;AAAA;AAAA,KAGU,oBAAA;EACV,KAAA,EAAO,aAAA;EACP,UAAA;AAAA;AAAA,KAGU,aAAA,IAAiB,IAAA,EAAM,WAAA;AAAA,iBAInB,mBAAA,iBAAoC,eAAA,QAAuB,QAAA,CAAS,UAAA,EAAA,CAClF,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,CAAA,GACzB,OAAA,EAAS,0BAAA,GACR,gBAAA;;KA0HS,mBAAA,YAA+B,SAAA,GAAY,mBAAA,IAAuB,cAAA,CAAe,EAAA;EAAA,SAClF,SAAA;EAAA,SACA,UAAA,GAAa,SAAA;EAAA,SACb,UAAA,GAAa,WAAA;AAAA"}
@@ -27,19 +27,20 @@ function createPlDataTableV3(ctx, options) {
27
27
  ...options.labelsOptions
28
28
  }
29
29
  }), options.columnsDisplayOptions);
30
+ const primaryColumnIds = new Set(discovered.filter((dc) => dc.isPrimary).map((dc) => dc.id));
31
+ const primaryColumns = annotated.direct.filter((c) => primaryColumnIds.has(c.id));
32
+ const secondaryColumns = annotated.direct.filter((c) => !primaryColumnIds.has(c.id));
33
+ if (primaryColumns.length === 0) return void 0;
30
34
  const columnIsAvailable = createColumnValidationById([
31
35
  ...annotated.direct,
32
36
  ...annotated.linked.flatMap((lc) => [...annotated.linkers.get(lc.id) ?? [], lc]),
33
37
  ...annotated.labels
34
38
  ]);
35
- const filters = mergeFilters(state.pTableParams.filters, remapFilterColumnIds(options.filters, discovered));
39
+ const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);
40
+ const filters = concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters);
36
41
  validateFilters(filters, columnIsAvailable);
37
42
  const sorting = resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered));
38
43
  validateSorting(sorting, columnIsAvailable);
39
- const primaryColumnIds = new Set(discovered.filter((dc) => dc.isPrimary).map((dc) => dc.id));
40
- const primaryColumns = annotated.direct.filter((c) => primaryColumnIds.has(c.id));
41
- const secondaryColumns = annotated.direct.filter((c) => !primaryColumnIds.has(c.id));
42
- if (primaryColumns.length === 0) return void 0;
43
44
  const fullDef = createPTableDefV3({
44
45
  primaryJoinType,
45
46
  primaryColumns,
@@ -58,7 +59,6 @@ function createPlDataTableV3(ctx, options) {
58
59
  ...annotated.labels,
59
60
  ...uniqueBy([...annotated.linkers.values()].flat(), (c) => c.id)
60
61
  ]);
61
- if (!fullHandle || !pframeHandle) return void 0;
62
62
  const hiddenSpecs = state.pTableParams.hiddenColIds;
63
63
  const hiddenColumnIds = computeHiddenColumns([...annotated.direct, ...annotated.linked], sorting, filters, hiddenSpecs);
64
64
  const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);
@@ -76,12 +76,12 @@ function createPlDataTableV3(ctx, options) {
76
76
  sorting
77
77
  });
78
78
  const visibleHandle = ctx.createPTableV2(visibleDef);
79
- if (!visibleHandle) return void 0;
80
79
  return {
81
80
  sourceId: state.pTableParams.sourceId,
82
81
  fullTableHandle: fullHandle,
83
82
  fullPframeHandle: pframeHandle,
84
- visibleTableHandle: visibleHandle
83
+ visibleTableHandle: visibleHandle,
84
+ defaultFilters: remapedDefaultFilters
85
85
  };
86
86
  }
87
87
  /** Split discovered columns into direct (no linker path) and linked (with linker path). */
@@ -125,20 +125,21 @@ function createColumnValidationById(fullColumns) {
125
125
  return validIdSet.has(id);
126
126
  };
127
127
  }
128
- /** Merge filters from table state and options into a single filter spec. */
129
- function mergeFilters(stateFilters, optionsFilters) {
130
- const normalized = optionsFilters ?? null;
131
- return stateFilters !== null && normalized !== null ? {
132
- type: "and",
133
- filters: [stateFilters, normalized]
134
- } : stateFilters ?? normalized;
135
- }
136
128
  /** Validate that all column references in filters exist in the table. */
137
129
  function validateFilters(filters, isValidColumnId) {
138
130
  if (filters == null) return;
139
131
  const firstInvalid = collectFilterSpecColumns(filters).find((col) => !isValidColumnId(col));
140
132
  if (firstInvalid !== void 0) throw new Error(`Invalid filter column ${firstInvalid}: column reference does not match the table columns`);
141
133
  }
134
+ /** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */
135
+ function concatFilters(a, b) {
136
+ if (isNil(a)) return b;
137
+ if (isNil(b)) return a;
138
+ return {
139
+ ...a,
140
+ filters: [...a.filters, ...b.filters]
141
+ };
142
+ }
142
143
  /** Pick user sorting from state if non-empty, otherwise fall back to options default. */
143
144
  function resolveSorting(userSorting, defaultSorting) {
144
145
  return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];