@platforma-sdk/model 1.63.12 → 1.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/dist/columns/column_collection_builder.cjs +105 -92
  2. package/dist/columns/column_collection_builder.cjs.map +1 -1
  3. package/dist/columns/column_collection_builder.d.ts +13 -12
  4. package/dist/columns/column_collection_builder.d.ts.map +1 -1
  5. package/dist/columns/column_collection_builder.js +107 -94
  6. package/dist/columns/column_collection_builder.js.map +1 -1
  7. package/dist/columns/column_selector.cjs +8 -80
  8. package/dist/columns/column_selector.cjs.map +1 -1
  9. package/dist/columns/column_selector.d.ts +6 -14
  10. package/dist/columns/column_selector.d.ts.map +1 -1
  11. package/dist/columns/column_selector.js +6 -77
  12. package/dist/columns/column_selector.js.map +1 -1
  13. package/dist/columns/column_snapshot.cjs +3 -3
  14. package/dist/columns/column_snapshot.cjs.map +1 -1
  15. package/dist/columns/column_snapshot.d.ts +3 -3
  16. package/dist/columns/column_snapshot.d.ts.map +1 -1
  17. package/dist/columns/column_snapshot.js +3 -3
  18. package/dist/columns/column_snapshot.js.map +1 -1
  19. package/dist/columns/column_snapshot_provider.cjs +1 -1
  20. package/dist/columns/column_snapshot_provider.cjs.map +1 -1
  21. package/dist/columns/column_snapshot_provider.d.ts +8 -8
  22. package/dist/columns/column_snapshot_provider.d.ts.map +1 -1
  23. package/dist/columns/column_snapshot_provider.js +1 -1
  24. package/dist/columns/column_snapshot_provider.js.map +1 -1
  25. package/dist/columns/ctx_column_sources.cjs.map +1 -1
  26. package/dist/columns/ctx_column_sources.d.ts +2 -1
  27. package/dist/columns/ctx_column_sources.d.ts.map +1 -1
  28. package/dist/columns/ctx_column_sources.js.map +1 -1
  29. package/dist/columns/expand_by_partition.cjs +106 -0
  30. package/dist/columns/expand_by_partition.cjs.map +1 -0
  31. package/dist/columns/expand_by_partition.d.ts +33 -0
  32. package/dist/columns/expand_by_partition.d.ts.map +1 -0
  33. package/dist/columns/expand_by_partition.js +105 -0
  34. package/dist/columns/expand_by_partition.js.map +1 -0
  35. package/dist/columns/index.cjs +1 -0
  36. package/dist/columns/index.d.ts +4 -3
  37. package/dist/columns/index.js +1 -0
  38. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +26 -0
  39. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -0
  40. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +25 -0
  41. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -0
  42. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +68 -0
  43. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -0
  44. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +67 -0
  45. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -0
  46. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +27 -17
  47. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  48. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +4 -0
  49. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -1
  50. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +28 -18
  51. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  52. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +258 -175
  53. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  54. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +37 -21
  55. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
  56. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +261 -175
  57. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  58. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +64 -0
  59. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -0
  60. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -0
  61. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -0
  62. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +63 -0
  63. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -0
  64. package/dist/components/PlDataTable/createPlDataTable/index.cjs +2 -1
  65. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  66. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -1
  67. package/dist/components/PlDataTable/createPlDataTable/index.d.ts.map +1 -1
  68. package/dist/components/PlDataTable/createPlDataTable/index.js +2 -1
  69. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  70. package/dist/components/PlDataTable/createPlDataTable/utils.cjs +109 -0
  71. package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -0
  72. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +19 -0
  73. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -0
  74. package/dist/components/PlDataTable/createPlDataTable/utils.js +102 -0
  75. package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -0
  76. package/dist/components/PlDataTable/index.cjs +3 -1
  77. package/dist/components/PlDataTable/index.d.ts +5 -3
  78. package/dist/components/PlDataTable/index.js +3 -1
  79. package/dist/components/PlDataTable/labels.cjs +25 -11
  80. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  81. package/dist/components/PlDataTable/labels.js +25 -11
  82. package/dist/components/PlDataTable/labels.js.map +1 -1
  83. package/dist/components/PlDataTable/state-migration.cjs +8 -2
  84. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  85. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
  86. package/dist/components/PlDataTable/state-migration.js +8 -2
  87. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  88. package/dist/components/PlDataTable/typesV5.d.ts +23 -15
  89. package/dist/components/PlDataTable/typesV5.d.ts.map +1 -1
  90. package/dist/components/index.cjs +3 -1
  91. package/dist/components/index.d.ts +4 -2
  92. package/dist/components/index.js +3 -1
  93. package/dist/index.cjs +13 -9
  94. package/dist/index.d.ts +9 -7
  95. package/dist/index.js +6 -4
  96. package/dist/labels/derive_distinct_labels.cjs +39 -27
  97. package/dist/labels/derive_distinct_labels.cjs.map +1 -1
  98. package/dist/labels/derive_distinct_labels.d.ts +15 -15
  99. package/dist/labels/derive_distinct_labels.d.ts.map +1 -1
  100. package/dist/labels/derive_distinct_labels.js +39 -27
  101. package/dist/labels/derive_distinct_labels.js.map +1 -1
  102. package/dist/labels/index.cjs +0 -1
  103. package/dist/labels/index.d.ts +1 -2
  104. package/dist/labels/index.js +0 -1
  105. package/dist/package.cjs +1 -1
  106. package/dist/package.js +1 -1
  107. package/dist/render/api.cjs +10 -3
  108. package/dist/render/api.cjs.map +1 -1
  109. package/dist/render/api.d.ts +2 -2
  110. package/dist/render/api.d.ts.map +1 -1
  111. package/dist/render/api.js +10 -3
  112. package/dist/render/api.js.map +1 -1
  113. package/dist/render/util/column_collection.cjs +3 -3
  114. package/dist/render/util/column_collection.cjs.map +1 -1
  115. package/dist/render/util/column_collection.d.ts.map +1 -1
  116. package/dist/render/util/column_collection.js +3 -3
  117. package/dist/render/util/column_collection.js.map +1 -1
  118. package/dist/render/util/label.cjs +2 -2
  119. package/dist/render/util/label.cjs.map +1 -1
  120. package/dist/render/util/label.js +2 -2
  121. package/dist/render/util/label.js.map +1 -1
  122. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  123. package/dist/render/util/pcolumn_data.d.ts +2 -2
  124. package/dist/render/util/pcolumn_data.d.ts.map +1 -1
  125. package/dist/render/util/pcolumn_data.js.map +1 -1
  126. package/package.json +7 -7
  127. package/src/columns/column_collection_builder.test.ts +40 -27
  128. package/src/columns/column_collection_builder.ts +176 -131
  129. package/src/columns/column_selector.test.ts +17 -399
  130. package/src/columns/column_selector.ts +14 -127
  131. package/src/columns/column_snapshot.ts +5 -5
  132. package/src/columns/column_snapshot_provider.ts +11 -10
  133. package/src/columns/ctx_column_sources.ts +2 -2
  134. package/src/columns/expand_by_partition.test.ts +4 -4
  135. package/src/columns/expand_by_partition.ts +4 -3
  136. package/src/columns/index.ts +1 -0
  137. package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +42 -0
  138. package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +89 -0
  139. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +51 -19
  140. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +500 -313
  141. package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +122 -0
  142. package/src/components/PlDataTable/createPlDataTable/index.ts +4 -2
  143. package/src/components/PlDataTable/createPlDataTable/utils.test.ts +257 -0
  144. package/src/components/PlDataTable/createPlDataTable/utils.ts +160 -0
  145. package/src/components/PlDataTable/index.ts +15 -2
  146. package/src/components/PlDataTable/labels.ts +29 -18
  147. package/src/components/PlDataTable/state-migration.ts +6 -1
  148. package/src/components/PlDataTable/typesV5.ts +25 -12
  149. package/src/labels/derive_distinct_labels.test.ts +143 -45
  150. package/src/labels/derive_distinct_labels.ts +102 -49
  151. package/src/labels/index.ts +0 -1
  152. package/src/render/api.ts +15 -5
  153. package/src/render/util/column_collection.ts +4 -3
  154. package/src/render/util/label.ts +2 -2
  155. package/src/render/util/pcolumn_data.ts +5 -3
  156. package/dist/labels/write_labels_to_specs.cjs +0 -14
  157. package/dist/labels/write_labels_to_specs.cjs.map +0 -1
  158. package/dist/labels/write_labels_to_specs.d.ts +0 -7
  159. package/dist/labels/write_labels_to_specs.d.ts.map +0 -1
  160. package/dist/labels/write_labels_to_specs.js +0 -13
  161. package/dist/labels/write_labels_to_specs.js.map +0 -1
  162. package/src/labels/write_labels_to_specs.ts +0 -12
@@ -1,17 +1,20 @@
1
1
  import { deriveLabels } from "../../../render/util/label.js";
2
2
  import { allPColumnsReady } from "../../../render/util/pcolumn_data.js";
3
+ import { PColumnCollection } from "../../../render/util/column_collection.js";
3
4
  import "../../../render/index.js";
4
5
  import { collectFilterSpecColumns } from "../../../filters/traverse.js";
5
6
  import { upgradePlDataTableStateV2 } from "../state-migration.js";
6
- import { getAllLabelColumns, getMatchingLabelColumns } from "../labels.js";
7
- import { createPTableDef, isColumnOptional } from "./createPlDataTableV3.js";
8
- import { Annotation, canonicalizeJson, getAxisId, getColumnIdAndSpec, isLinkerColumn, parseJson, uniqueBy } from "@milaboratories/pl-model-common";
9
- import { isEmpty } from "es-toolkit/compat";
7
+ import { getMatchingLabelColumns } from "../labels.js";
8
+ import { createPTableDefV2 } from "./createPTableDefV2.js";
9
+ import { isColumnOptional } from "./utils.js";
10
+ import { Annotation, PColumnName, canonicalizeJson, getAxisId, getColumnIdAndSpec, isLinkerColumn, parseJson, uniqueBy } from "@milaboratories/pl-model-common";
10
11
  import { identity } from "es-toolkit";
12
+ import { isEmpty } from "es-toolkit/compat";
11
13
  //#region src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts
12
14
  /**
13
15
  * Create p-table spec and handle given ui table state
14
16
  *
17
+ * @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.
15
18
  * @param ctx context
16
19
  * @param columns column list
17
20
  * @param tableState table ui state
@@ -20,9 +23,8 @@ import { identity } from "es-toolkit";
20
23
  function createPlDataTableV2(ctx, columns, tableState, options) {
21
24
  if (columns.length === 0) return void 0;
22
25
  const tableStateNormalized = upgradePlDataTableStateV2(tableState);
23
- const allLabelColumns = getAllLabelColumns(ctx.resultPool);
24
- if (!allLabelColumns) return void 0;
25
- let fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);
26
+ const allLabelColumns = getAllLabelColumns(ctx.resultPool) ?? [];
27
+ let fullLabelColumns = getMatchingLabelColumns(columns, allLabelColumns);
26
28
  fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map((v) => {
27
29
  return {
28
30
  ...v.value,
@@ -45,20 +47,18 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
45
47
  }))];
46
48
  const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson(c)));
47
49
  const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
48
- const stateFilters = tableStateNormalized.pTableParams.filters;
49
- const opsFilters = options?.filters ?? null;
50
- const filters = stateFilters != null && opsFilters != null ? {
51
- type: "and",
52
- filters: [stateFilters, opsFilters]
53
- } : stateFilters ?? opsFilters;
54
- 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));
55
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`);
56
56
  const userSorting = tableStateNormalized.pTableParams.sorting;
57
57
  const sorting = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];
58
58
  const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId(canonicalizeJson(s.column)));
59
59
  if (firstInvalidSortingColumn) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`);
60
60
  const coreJoinType = options?.coreJoinType ?? "full";
61
- const fullDef = createPTableDef({
61
+ const fullDef = createPTableDefV2({
62
62
  columns,
63
63
  labelColumns: fullLabelColumns,
64
64
  coreJoinType,
@@ -72,7 +72,7 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
72
72
  const hiddenColumns = new Set((() => {
73
73
  if (coreJoinType === "inner") return [];
74
74
  const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;
75
- if (hiddenColIds) return hiddenColIds;
75
+ if (hiddenColIds !== null) return hiddenColIds.filter((s) => s.type === "column").map((s) => s.id);
76
76
  return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);
77
77
  })());
78
78
  columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
@@ -86,7 +86,7 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
86
86
  const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));
87
87
  const visibleLabelColumns = getMatchingLabelColumns(visibleColumns.map(getColumnIdAndSpec), allLabelColumns);
88
88
  if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return void 0;
89
- const visibleDef = createPTableDef({
89
+ const visibleDef = createPTableDefV2({
90
90
  columns: visibleColumns,
91
91
  labelColumns: visibleLabelColumns,
92
92
  coreJoinType,
@@ -100,9 +100,19 @@ function createPlDataTableV2(ctx, columns, tableState, options) {
100
100
  sourceId: tableStateNormalized.pTableParams.sourceId,
101
101
  fullTableHandle: fullHandle,
102
102
  fullPframeHandle: pframeHandle,
103
- visibleTableHandle: visibleHandle
103
+ visibleTableHandle: visibleHandle,
104
+ defaultFilters
104
105
  };
105
106
  }
107
+ function getAllLabelColumns(resultPool) {
108
+ return new PColumnCollection().addAxisLabelProvider(resultPool).addColumnProvider(resultPool).getColumns({
109
+ name: PColumnName.Label,
110
+ axes: [{}]
111
+ }, {
112
+ dontWaitAllData: true,
113
+ overrideLabelAnnotation: false
114
+ });
115
+ }
106
116
  //#endregion
107
117
  export { createPlDataTableV2 };
108
118
 
@@ -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} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal, RenderCtxBase } from \"../../../render\";\nimport { allPColumnsReady, deriveLabels } 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 { getAllLabelColumns, getMatchingLabelColumns } from \"../labels\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport { createPTableDef, isColumnOptional } from \"./createPlDataTableV3\";\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 * @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\n const allLabelColumns = getAllLabelColumns(ctx.resultPool);\n if (!allLabelColumns) return undefined;\n\n let fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), 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 = createPTableDef({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: options?.coreColumnPredicate,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n const pframeHandle = ctx.createPFrame(fullColumns);\n if (!fullHandle || !pframeHandle) return undefined;\n\n const hiddenColumns = new Set<PObjectId>(\n ((): PObjectId[] => {\n // Inner join works as a filter - all columns must be present\n if (coreJoinType === \"inner\") return [];\n\n const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;\n if (hiddenColIds) return hiddenColIds;\n\n return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n })(),\n );\n\n // Preserve linker columns\n columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve core columns as they change the shape of join.\n const coreColumnPredicate = options?.coreColumnPredicate;\n if (coreColumnPredicate) {\n const coreColumns = columns.flatMap((c) =>\n coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : [],\n );\n coreColumns.forEach((c) => hiddenColumns.delete(c));\n }\n\n // Preserve sorted columns from being hidden\n sorting\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .forEach((c) => hiddenColumns.delete(c.id));\n\n // Preserve filter columns from being hidden\n if (filters) {\n collectFilterSpecColumns(filters)\n .flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n .forEach((c) => hiddenColumns.delete(c));\n }\n\n 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 = createPTableDef({\n columns: visibleColumns,\n labelColumns: visibleLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n"],"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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"}
@@ -1,203 +1,286 @@
1
1
  require("../../../_virtual/_rolldown/runtime.cjs");
2
- const require_pcolumn_data = require("../../../render/util/pcolumn_data.cjs");
3
- require("../../../render/index.cjs");
4
2
  const require_traverse = require("../../../filters/traverse.cjs");
5
- const require_filterToQuery = require("../../../filters/converters/filterToQuery.cjs");
6
- const require_distill = require("../../../filters/distill.cjs");
7
- require("../../../filters/index.cjs");
8
3
  const require_state_migration = require("../state-migration.cjs");
9
4
  const require_labels = require("../labels.cjs");
10
- const require_column_snapshot_provider = require("../../../columns/column_snapshot_provider.cjs");
11
- const require_column_collection_builder = require("../../../columns/column_collection_builder.cjs");
12
- const require_ctx_column_sources = require("../../../columns/ctx_column_sources.cjs");
13
- require("../../../columns/index.cjs");
5
+ const require_createPTableDefV3 = require("./createPTableDefV3.cjs");
6
+ const require_utils = require("./utils.cjs");
7
+ const require_discoverColumns = require("./discoverColumns.cjs");
14
8
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
9
+ let _milaboratories_helpers = require("@milaboratories/helpers");
15
10
  let es_toolkit_compat = require("es-toolkit/compat");
16
- let es_toolkit = require("es-toolkit");
17
11
  //#region src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts
18
- /** Convert a PTableColumnId to a SpecQueryExpression reference. */
19
- function columnIdToExpr(col) {
20
- if (col.type === "axis") return {
21
- type: "axisRef",
22
- value: col.id
12
+ function createPlDataTableV3(ctx, options) {
13
+ const state = require_state_migration.upgradePlDataTableStateV2(options.tableState);
14
+ const primaryJoinType = options.primaryJoinType ?? "full";
15
+ const discovered = "discoverColumnOptions" in options ? require_discoverColumns.discoverTableColumnSnaphots(ctx, options.discoverColumnOptions) : options.columns;
16
+ if ((0, _milaboratories_helpers.isNil)(discovered) || discovered.length === 0) return void 0;
17
+ const resolved = resolveDiscoveredColumns(splitDiscoveredColumns(discovered), discovered);
18
+ const labelColumns = require_labels.getMatchingLabelColumns(resolved.all, require_labels.getAllLabelColumns(ctx));
19
+ const annotated = annotateColumnGroups(resolved, labelColumns, require_utils.deriveAllLabels({
20
+ columns: discovered.map((dc) => ({
21
+ id: dc.id,
22
+ spec: dc.spec,
23
+ linkerPath: dc.linkerPath?.map((lp) => ({ spec: lp.linker.spec }))
24
+ })),
25
+ labelColumns,
26
+ deriveLabelsOptions: {
27
+ includeNativeLabel: true,
28
+ ...options.labelsOptions
29
+ }
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;
35
+ const columnIsAvailable = createColumnValidationById([
36
+ ...annotated.direct,
37
+ ...annotated.linked.flatMap((lc) => [...annotated.linkers.get(lc.id) ?? [], lc]),
38
+ ...annotated.labels
39
+ ]);
40
+ const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);
41
+ const filters = concatFilters(state.pTableParams.filters, state.pTableParams.defaultFilters ?? remapedDefaultFilters);
42
+ validateFilters(filters, columnIsAvailable);
43
+ const sorting = resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered));
44
+ validateSorting(sorting, columnIsAvailable);
45
+ const fullDef = require_createPTableDefV3.createPTableDefV3({
46
+ primaryJoinType,
47
+ primaryColumns,
48
+ secondaryGroups: [
49
+ ...secondaryColumns.map((c) => [c]),
50
+ ...annotated.linked.map((lc) => [...annotated.linkers.get(lc.id) ?? [], lc]),
51
+ ...annotated.labels.map((c) => [c])
52
+ ],
53
+ filters,
54
+ sorting
55
+ });
56
+ const fullHandle = ctx.createPTableV2(fullDef);
57
+ const pframeHandle = ctx.createPFrame([
58
+ ...annotated.direct,
59
+ ...annotated.linked,
60
+ ...annotated.labels,
61
+ ...(0, _milaboratories_pl_model_common.uniqueBy)([...annotated.linkers.values()].flat(), (c) => c.id)
62
+ ]);
63
+ const hiddenSpecs = state.pTableParams.hiddenColIds;
64
+ const hiddenColumnIds = computeHiddenColumns([...annotated.direct, ...annotated.linked], sorting, filters, hiddenSpecs);
65
+ const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);
66
+ const visibleNonCoreDirect = secondaryColumns.filter((c) => !hiddenColumnIds.has(c.id));
67
+ const visibleLinkedGroups = buildVisibleLinkedGroups(visible.direct, visible.linked, annotated.linkers, hiddenSpecs);
68
+ const visibleDef = require_createPTableDefV3.createPTableDefV3({
69
+ primaryJoinType,
70
+ primaryColumns,
71
+ secondaryGroups: [
72
+ ...visibleNonCoreDirect.map((c) => [c]),
73
+ ...visibleLinkedGroups,
74
+ ...visible.labels.map((c) => [c])
75
+ ],
76
+ filters,
77
+ sorting
78
+ });
79
+ const visibleHandle = ctx.createPTableV2(visibleDef);
80
+ return {
81
+ sourceId: state.pTableParams.sourceId,
82
+ fullTableHandle: fullHandle,
83
+ fullPframeHandle: pframeHandle,
84
+ visibleTableHandle: visibleHandle,
85
+ defaultFilters: remapedDefaultFilters
23
86
  };
87
+ }
88
+ /** Split discovered columns into direct (no linker path) and linked (with linker path). */
89
+ function splitDiscoveredColumns(columns) {
24
90
  return {
25
- type: "columnRef",
26
- value: col.id
91
+ direct: columns.filter((dc) => (0, _milaboratories_helpers.isNil)(dc.linkerPath) || dc.linkerPath.length === 0),
92
+ linked: columns.filter((dc) => !(0, _milaboratories_helpers.isNil)(dc.linkerPath) && dc.linkerPath.length > 0)
27
93
  };
28
94
  }
29
- /** Wrap a SpecQuery as a SpecQueryJoinEntry with empty qualifications. */
30
- function joinEntry(input) {
95
+ /** Resolve DiscoveredColumn snapshots into PColumn objects with lazily-evaluated data. */
96
+ function resolveDiscoveredColumns(split, allDiscovered) {
97
+ const linked = split.linked.map(resolveSnapshot);
98
+ const linkers = new Map(split.linked.filter((dc) => !(0, _milaboratories_helpers.isNil)(dc.linkerPath)).map((dc, i) => [linked[i].id, dc.linkerPath.map((s) => resolveSnapshot(s.linker))]));
31
99
  return {
32
- entry: input,
33
- qualifications: []
100
+ all: allDiscovered.map(resolveSnapshot),
101
+ direct: split.direct.map(resolveSnapshot),
102
+ linked,
103
+ linkers
34
104
  };
35
105
  }
36
- function createPTableDef(params) {
37
- let coreColumns = params.columns;
38
- const secondaryColumns = [];
39
- if ((0, es_toolkit.isFunction)(params.coreColumnPredicate)) {
40
- coreColumns = [];
41
- for (const c of params.columns) if (params.coreColumnPredicate((0, _milaboratories_pl_model_common.getColumnIdAndSpec)(c))) coreColumns.push(c);
42
- else secondaryColumns.push(c);
43
- }
44
- secondaryColumns.push(...params.labelColumns);
45
- let query = {
46
- type: "outerJoin",
47
- primary: joinEntry({
48
- type: params.coreJoinType === "inner" ? "innerJoin" : "fullJoin",
49
- entries: coreColumns.map((c) => joinEntry({
50
- type: "column",
51
- column: c
52
- }))
53
- }),
54
- secondary: secondaryColumns.map((c) => joinEntry({
55
- type: "column",
56
- column: c
57
- }))
106
+ /** Annotate all column groups with derived labels and display options. */
107
+ function annotateColumnGroups(resolved, labelColumns, derivedLabels, displayOptions) {
108
+ return {
109
+ direct: require_utils.withTableVisualAnnotations(displayOptions, require_utils.withLabelAnnotations(derivedLabels, resolved.direct)),
110
+ linked: require_utils.withTableVisualAnnotations(displayOptions, require_utils.withLabelAnnotations(derivedLabels, resolved.linked)),
111
+ linkers: new Map([...resolved.linkers].map(([id, cols]) => [id, require_utils.withLabelAnnotations(derivedLabels, cols)])),
112
+ labels: require_utils.withLabelAnnotations(derivedLabels, labelColumns)
58
113
  };
59
- if (params.filters !== null) {
60
- const nonEmpty = require_distill.distillFilterSpec(params.filters);
61
- if (!(0, es_toolkit.isNil)(nonEmpty)) {
62
- const pridicate = require_filterToQuery.filterSpecToSpecQueryExpr(nonEmpty);
63
- if (!(0, _milaboratories_pl_model_common.isBooleanExpression)(pridicate)) throw new Error(`Filter conversion produced a non-boolean expression (got type "${pridicate.type}"), expected a boolean predicate for query filtering`);
64
- query = {
65
- type: "filter",
66
- input: query,
67
- predicate: pridicate
68
- };
69
- }
70
- }
71
- if (params.sorting.length > 0) query = {
72
- type: "sort",
73
- input: query,
74
- sortBy: params.sorting.map((s) => ({
75
- expression: columnIdToExpr(s.column),
76
- ascending: s.ascending,
77
- nullsFirst: !s.naAndAbsentAreLeastValues
78
- }))
114
+ }
115
+ /** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */
116
+ function createColumnValidationById(fullColumns) {
117
+ const allIds = [...(0, _milaboratories_pl_model_common.uniqueBy)(fullColumns.flatMap((c) => c.spec.axesSpec.map(_milaboratories_pl_model_common.getAxisId)), (a) => (0, _milaboratories_pl_model_common.canonicalizeJson)(a)).map((a) => ({
118
+ type: "axis",
119
+ id: a
120
+ })), ...fullColumns.map((c) => ({
121
+ type: "column",
122
+ id: c.id
123
+ }))];
124
+ const validIdSet = new Set(allIds.map((c) => (0, _milaboratories_pl_model_common.canonicalizeJson)(c)));
125
+ return (id) => {
126
+ return validIdSet.has(id);
127
+ };
128
+ }
129
+ /** Validate that all column references in filters exist in the table. */
130
+ function validateFilters(filters, isValidColumnId) {
131
+ if (filters == null) return;
132
+ const firstInvalid = require_traverse.collectFilterSpecColumns(filters).find((col) => !isValidColumnId(col));
133
+ if (firstInvalid !== void 0) throw new Error(`Invalid filter column ${firstInvalid}: column reference does not match the table columns`);
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]
79
142
  };
80
- return { query };
81
143
  }
82
- /** Check if column should be omitted from the table */
83
- function isColumnHidden(spec) {
84
- return (0, _milaboratories_pl_model_common.readAnnotation)(spec, _milaboratories_pl_model_common.Annotation.Table.Visibility) === "hidden";
144
+ /** Pick user sorting from state if non-empty, otherwise fall back to options default. */
145
+ function resolveSorting(userSorting, defaultSorting) {
146
+ return ((0, es_toolkit_compat.isEmpty)(userSorting) ? defaultSorting : userSorting) ?? [];
85
147
  }
86
- /** Check if column is hidden by default */
87
- function isColumnOptional(spec) {
88
- return (0, _milaboratories_pl_model_common.readAnnotation)(spec, _milaboratories_pl_model_common.Annotation.Table.Visibility) === "optional";
148
+ /** Validate that all column references in sorting exist in the table. */
149
+ function validateSorting(sorting, isValidColumnId) {
150
+ const firstInvalid = sorting.find((s) => !isValidColumnId((0, _milaboratories_pl_model_common.canonicalizeJson)(s.column)));
151
+ if (firstInvalid !== void 0) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`);
89
152
  }
90
- function createPlDataTableV3(ctx, options) {
91
- const providers = options.source ? normalizeSourceList(options.source).filter(require_column_snapshot_provider.isColumnSnapshotProvider) : require_ctx_column_sources.collectCtxColumnSnapshotProviders(ctx);
92
- if (providers.length === 0) return void 0;
93
- const builder = new require_column_collection_builder.ColumnCollectionBuilder(ctx.services.pframeSpec).addSources(providers);
94
- const anchors = options.columns.anchors;
95
- const collection = (0, es_toolkit.isNil)(anchors) ? builder.build() : builder.build({ anchors });
96
- if (!collection) return void 0;
97
- try {
98
- const findOptions = options.columns ? {
99
- include: options.columns.include,
100
- exclude: options.columns.exclude,
101
- mode: options.columns.mode,
102
- maxHops: options.columns.maxHops
103
- } : void 0;
104
- const dataSnapshots = collection.findColumns(findOptions).map((v) => "column" in v ? v.column : v).filter((s) => !isColumnHidden(s.spec));
105
- if (dataSnapshots.length === 0) return void 0;
106
- const columns = [];
107
- for (const snap of dataSnapshots) {
108
- if (!snap.data) return void 0;
109
- const data = snap.data.get();
110
- if (data === void 0) return void 0;
111
- columns.push({
112
- id: snap.id,
113
- spec: snap.spec,
114
- data
115
- });
153
+ /** Determine which columns should be hidden based on state or optional-column defaults. */
154
+ function computeHiddenColumns(columns, sorting, filters, hiddenSpecs) {
155
+ const alwaysHidden = columns.filter((c) => require_utils.isColumnHidden(c.spec)).map((c) => c.id);
156
+ const optionalHidden = !(0, _milaboratories_helpers.isNil)(hiddenSpecs) ? hiddenSpecs.filter((s) => s.type === "column").map((s) => s.id) : columns.filter((c) => require_utils.isColumnOptional(c.spec)).map((c) => c.id);
157
+ const initial = [...alwaysHidden, ...optionalHidden];
158
+ const preserved = collectPreservedColumnIds(sorting, filters);
159
+ return new Set(initial.filter((id) => !preserved.has(id)));
160
+ }
161
+ /**
162
+ * Build visible linked column groups. Non-hidden groups are included fully;
163
+ * hidden groups are trimmed to only the prefix that brings axes not yet
164
+ * covered by earlier groups (visible or previously trimmed).
165
+ */
166
+ function buildVisibleLinkedGroups(direct, linked, linkers, hiddenSpecs) {
167
+ const result = [];
168
+ const coveredAxisIds = /* @__PURE__ */ new Set();
169
+ const collectAxes = (group) => {
170
+ for (const col of group) for (const as of col.spec.axesSpec) coveredAxisIds.add((0, _milaboratories_pl_model_common.canonicalizeJson)((0, _milaboratories_pl_model_common.getAxisId)(as)));
171
+ };
172
+ collectAxes(direct);
173
+ for (const lc of linked) {
174
+ const group = [...linkers.get(lc.id) ?? [], lc];
175
+ result.push(group);
176
+ collectAxes(group);
177
+ }
178
+ for (const group of linkers.values()) {
179
+ const trimmed = trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds);
180
+ if (trimmed.length > 0) {
181
+ result.push(trimmed);
182
+ collectAxes(trimmed);
116
183
  }
117
- const tableStateNormalized = require_state_migration.upgradePlDataTableStateV2(options.state);
118
- const allLabelColumns = require_labels.getAllLabelColumns(ctx.resultPool);
119
- if (!allLabelColumns) return void 0;
120
- const fullLabelColumns = require_labels.getMatchingLabelColumns(columns.map(_milaboratories_pl_model_common.getColumnIdAndSpec), allLabelColumns);
121
- const fullColumns = [...columns, ...fullLabelColumns];
122
- const fullColumnsIds = [...(0, _milaboratories_pl_model_common.uniqueBy)(fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => (0, _milaboratories_pl_model_common.getAxisId)(a))), (a) => (0, _milaboratories_pl_model_common.canonicalizeJson)(a)).map((a) => ({
123
- type: "axis",
124
- id: a
125
- })), ...fullColumns.map((c) => ({
126
- type: "column",
127
- id: c.id
128
- }))];
129
- const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => (0, _milaboratories_pl_model_common.canonicalizeJson)(c)));
130
- const isValidColumnId = (id) => fullColumnsIdsSet.has(id);
131
- const stateFilters = tableStateNormalized.pTableParams.filters;
132
- const opsFilters = options?.filters ?? null;
133
- const filters = stateFilters != null && opsFilters != null ? {
134
- type: "and",
135
- filters: [stateFilters, opsFilters]
136
- } : stateFilters ?? opsFilters;
137
- const firstInvalidFilterColumn = (filters ? require_traverse.collectFilterSpecColumns(filters) : []).find((col) => !isValidColumnId(col));
138
- if (firstInvalidFilterColumn) throw new Error(`Invalid filter column ${firstInvalidFilterColumn}: column reference does not match the table columns`);
139
- const userSorting = tableStateNormalized.pTableParams.sorting;
140
- const sorting = ((0, es_toolkit_compat.isEmpty)(userSorting) ? options?.sorting : userSorting) ?? [];
141
- const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId((0, _milaboratories_pl_model_common.canonicalizeJson)(s.column)));
142
- if (firstInvalidSortingColumn) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalidSortingColumn.column)}: column reference does not match the table columns`);
143
- const coreJoinType = options?.coreJoinType ?? "full";
144
- const fullDef = createPTableDef({
145
- columns,
146
- labelColumns: fullLabelColumns,
147
- coreJoinType,
148
- filters,
149
- sorting,
150
- coreColumnPredicate: options?.coreColumnPredicate
151
- });
152
- const fullHandle = ctx.createPTableV2(fullDef);
153
- const pframeHandle = ctx.createPFrame(fullColumns);
154
- if (!fullHandle || !pframeHandle) return void 0;
155
- const hiddenColumns = new Set((() => {
156
- if (coreJoinType === "inner") return [];
157
- const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;
158
- if (hiddenColIds) return hiddenColIds;
159
- return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);
160
- })());
161
- columns.filter((c) => (0, _milaboratories_pl_model_common.isLinkerColumn)(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
162
- const coreColumnPredicate = options?.coreColumnPredicate;
163
- if (coreColumnPredicate) columns.flatMap((c) => coreColumnPredicate((0, _milaboratories_pl_model_common.getColumnIdAndSpec)(c)) ? [c.id] : []).forEach((c) => hiddenColumns.delete(c));
164
- sorting.map((s) => s.column).filter((c) => c.type === "column").forEach((c) => hiddenColumns.delete(c.id));
165
- if (filters) require_traverse.collectFilterSpecColumns(filters).flatMap((c) => {
166
- const obj = (0, _milaboratories_pl_model_common.parseJson)(c);
167
- return obj.type === "column" ? [obj.id] : [];
168
- }).forEach((c) => hiddenColumns.delete(c));
169
- const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));
170
- const visibleLabelColumns = require_labels.getMatchingLabelColumns(visibleColumns.map(_milaboratories_pl_model_common.getColumnIdAndSpec), allLabelColumns);
171
- if (!require_pcolumn_data.allPColumnsReady([...visibleColumns, ...visibleLabelColumns])) return void 0;
172
- const visibleDef = createPTableDef({
173
- columns: visibleColumns,
174
- labelColumns: visibleLabelColumns,
175
- coreJoinType,
176
- filters,
177
- sorting,
178
- coreColumnPredicate
179
- });
180
- const visibleHandle = ctx.createPTableV2(visibleDef);
181
- if (!visibleHandle) return void 0;
184
+ }
185
+ return result;
186
+ }
187
+ /**
188
+ * For a linked column group [linker1, ..., linkerN, column], find the rightmost
189
+ * element that has at least one non-hidden and not-yet-covered axis.
190
+ * Return the prefix up to and including that element.
191
+ * If no element has such an axis, return empty array.
192
+ */
193
+ function trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds) {
194
+ if (hiddenSpecs === null) return group;
195
+ const hiddenAxisIds = new Set(hiddenSpecs.filter((s) => s.type === "axis").map((s) => (0, _milaboratories_pl_model_common.canonicalizeJson)(s.id)));
196
+ const uncoveredAxisIds = new Set(group.flatMap((c) => c.spec.axesSpec.map((as) => (0, _milaboratories_pl_model_common.canonicalizeJson)((0, _milaboratories_pl_model_common.getAxisId)(as)))).filter((id) => !hiddenAxisIds.has(id) && !coveredAxisIds.has(id)));
197
+ let lastNeeded = -1;
198
+ for (let i = 0; i < group.length; i++) {
199
+ const newAxes = group[i].spec.axesSpec.map((as) => (0, _milaboratories_pl_model_common.canonicalizeJson)((0, _milaboratories_pl_model_common.getAxisId)(as))).filter((id) => uncoveredAxisIds.has(id));
200
+ if (newAxes.length > 0) {
201
+ for (const id of newAxes) uncoveredAxisIds.delete(id);
202
+ lastNeeded = i;
203
+ }
204
+ }
205
+ return lastNeeded === -1 ? [] : group.slice(0, lastNeeded + 1);
206
+ }
207
+ /** Collect IDs of columns that must remain visible (sorted, filtered). */
208
+ function collectPreservedColumnIds(sorting, filters) {
209
+ const sortedIds = (sorting ?? []).map((s) => s.column).filter((c) => c.type === "column").map((c) => c.id);
210
+ const filterIds = !(0, _milaboratories_helpers.isNil)(filters) ? require_traverse.collectFilterSpecColumns(filters).flatMap((c) => {
211
+ const obj = (0, _milaboratories_pl_model_common.parseJson)(c);
212
+ return obj.type === "column" ? [obj.id] : [];
213
+ }) : [];
214
+ return new Set([...sortedIds, ...filterIds]);
215
+ }
216
+ /** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */
217
+ function buildVisibleColumns(annotated, hiddenColumns, originalLabelColumns) {
218
+ const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.id));
219
+ const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.id));
220
+ return {
221
+ direct,
222
+ linked,
223
+ labels: require_labels.getMatchingLabelColumns([...direct, ...linked].map(_milaboratories_pl_model_common.getColumnIdAndSpec), originalLabelColumns)
224
+ };
225
+ }
226
+ /** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */
227
+ function resolveSnapshot(snap) {
228
+ return {
229
+ id: snap.id,
230
+ spec: snap.spec,
231
+ data: snap.data?.get()
232
+ };
233
+ }
234
+ /** Remap column references in sorting entries. */
235
+ function remapSortingColumnIds(sorting, columns) {
236
+ return sorting?.map((s) => {
237
+ if (s.column.type === "axis") return s;
238
+ const id = s.column.id;
239
+ const column = columns.find((c) => (c.originalId ?? c.id) === id) ?? (0, _milaboratories_helpers.throwError)(`Column ID "${id}" in sorting does not match any discovered column`);
182
240
  return {
183
- sourceId: tableStateNormalized.pTableParams.sourceId,
184
- fullTableHandle: fullHandle,
185
- fullPframeHandle: pframeHandle,
186
- visibleTableHandle: visibleHandle
241
+ ...s,
242
+ column: {
243
+ type: "column",
244
+ id: column.id
245
+ }
187
246
  };
188
- } finally {
189
- collection.dispose();
190
- }
247
+ });
191
248
  }
192
- /** Normalize raw ColumnSource | ColumnSource[] into a flat list of sources. */
193
- function normalizeSourceList(source) {
194
- if (Array.isArray(source) && source.length > 0 && (Array.isArray(source[0]) || require_column_snapshot_provider.isColumnSnapshotProvider(source[0]))) return source;
195
- return [source];
249
+ /** Remap column references in a filter tree. */
250
+ function remapFilterColumnIds(filters, columns) {
251
+ if ((0, _milaboratories_helpers.isNil)(filters)) return filters;
252
+ const map = (tableColumnId) => {
253
+ const parsed = (0, _milaboratories_pl_model_common.parseJson)(tableColumnId);
254
+ if (parsed.type === "axis") return tableColumnId;
255
+ const originalId = parsed.id;
256
+ return (0, _milaboratories_pl_model_common.canonicalizeJson)({
257
+ type: "column",
258
+ id: (columns.find((c) => (c.originalId ?? c.id) === originalId) ?? (0, _milaboratories_helpers.throwError)(`Column ID "${parsed.id}" in filters does not match any discovered column`)).id
259
+ });
260
+ };
261
+ return require_traverse.traverseFilterSpec(filters, {
262
+ leaf: (leaf) => {
263
+ if (leaf.type === void 0) return leaf;
264
+ const result = { ...leaf };
265
+ if ("column" in result) result.column = map(result.column);
266
+ if ("rhs" in result) result.rhs = map(result.rhs);
267
+ return result;
268
+ },
269
+ and: (results) => ({
270
+ type: "and",
271
+ filters: results
272
+ }),
273
+ or: (results) => ({
274
+ type: "or",
275
+ filters: results
276
+ }),
277
+ not: (result) => ({
278
+ type: "not",
279
+ filter: result
280
+ })
281
+ });
196
282
  }
197
283
  //#endregion
198
- exports.createPTableDef = createPTableDef;
199
284
  exports.createPlDataTableV3 = createPlDataTableV3;
200
- exports.isColumnHidden = isColumnHidden;
201
- exports.isColumnOptional = isColumnOptional;
202
285
 
203
286
  //# sourceMappingURL=createPlDataTableV3.cjs.map