@platforma-sdk/model 1.53.15 → 1.54.8

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 (135) hide show
  1. package/dist/annotations/converter.cjs +8 -32
  2. package/dist/annotations/converter.cjs.map +1 -1
  3. package/dist/annotations/converter.d.ts.map +1 -1
  4. package/dist/annotations/converter.js +7 -31
  5. package/dist/annotations/converter.js.map +1 -1
  6. package/dist/block_model.cjs +1 -0
  7. package/dist/block_model.cjs.map +1 -1
  8. package/dist/block_model.d.ts.map +1 -1
  9. package/dist/block_model.js +1 -0
  10. package/dist/block_model.js.map +1 -1
  11. package/dist/builder.cjs +1 -0
  12. package/dist/builder.cjs.map +1 -1
  13. package/dist/builder.d.ts.map +1 -1
  14. package/dist/builder.js +1 -0
  15. package/dist/builder.js.map +1 -1
  16. package/dist/components/PlDataTable/index.d.ts +5 -0
  17. package/dist/components/PlDataTable/index.d.ts.map +1 -0
  18. package/dist/components/PlDataTable/labels.cjs +91 -0
  19. package/dist/components/PlDataTable/labels.cjs.map +1 -0
  20. package/dist/components/PlDataTable/labels.d.ts +7 -0
  21. package/dist/components/PlDataTable/labels.d.ts.map +1 -0
  22. package/dist/components/PlDataTable/labels.js +88 -0
  23. package/dist/components/PlDataTable/labels.js.map +1 -0
  24. package/dist/components/PlDataTable/state-migration.cjs +162 -0
  25. package/dist/components/PlDataTable/state-migration.cjs.map +1 -0
  26. package/dist/components/PlDataTable/state-migration.d.ts +94 -0
  27. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -0
  28. package/dist/components/PlDataTable/state-migration.js +158 -0
  29. package/dist/components/PlDataTable/state-migration.js.map +1 -0
  30. package/dist/components/PlDataTable/table.cjs +187 -0
  31. package/dist/components/PlDataTable/table.cjs.map +1 -0
  32. package/dist/components/PlDataTable/table.d.ts +26 -0
  33. package/dist/components/PlDataTable/table.d.ts.map +1 -0
  34. package/dist/components/PlDataTable/table.js +183 -0
  35. package/dist/components/PlDataTable/table.js.map +1 -0
  36. package/dist/components/PlDataTable/v4.d.ts +157 -0
  37. package/dist/components/PlDataTable/v4.d.ts.map +1 -0
  38. package/dist/components/PlDataTable/v5.d.ts +114 -0
  39. package/dist/components/PlDataTable/v5.d.ts.map +1 -0
  40. package/dist/filters/converters/filterToQuery.cjs +244 -0
  41. package/dist/filters/converters/filterToQuery.cjs.map +1 -0
  42. package/dist/filters/converters/filterToQuery.d.ts +4 -0
  43. package/dist/filters/converters/filterToQuery.d.ts.map +1 -0
  44. package/dist/filters/converters/filterToQuery.js +242 -0
  45. package/dist/filters/converters/filterToQuery.js.map +1 -0
  46. package/dist/filters/{converter.cjs → converters/filterUiToExpressionImpl.cjs} +3 -2
  47. package/dist/filters/converters/filterUiToExpressionImpl.cjs.map +1 -0
  48. package/dist/filters/{converter.d.ts → converters/filterUiToExpressionImpl.d.ts} +2 -2
  49. package/dist/filters/converters/filterUiToExpressionImpl.d.ts.map +1 -0
  50. package/dist/filters/{converter.js → converters/filterUiToExpressionImpl.js} +3 -2
  51. package/dist/filters/converters/filterUiToExpressionImpl.js.map +1 -0
  52. package/dist/filters/converters/index.d.ts +3 -0
  53. package/dist/filters/converters/index.d.ts.map +1 -0
  54. package/dist/filters/distill.cjs +61 -0
  55. package/dist/filters/distill.cjs.map +1 -0
  56. package/dist/filters/distill.d.ts +7 -0
  57. package/dist/filters/distill.d.ts.map +1 -0
  58. package/dist/filters/distill.js +59 -0
  59. package/dist/filters/distill.js.map +1 -0
  60. package/dist/filters/index.d.ts +2 -1
  61. package/dist/filters/index.d.ts.map +1 -1
  62. package/dist/filters/types.d.ts +1 -117
  63. package/dist/filters/types.d.ts.map +1 -1
  64. package/dist/index.cjs +17 -15
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.js +5 -2
  67. package/dist/index.js.map +1 -1
  68. package/dist/package.json.cjs +1 -1
  69. package/dist/package.json.js +1 -1
  70. package/dist/pframe_utils/columns.cjs +2 -0
  71. package/dist/pframe_utils/columns.cjs.map +1 -1
  72. package/dist/pframe_utils/columns.js +2 -0
  73. package/dist/pframe_utils/columns.js.map +1 -1
  74. package/dist/pframe_utils/index.cjs +2 -0
  75. package/dist/pframe_utils/index.cjs.map +1 -1
  76. package/dist/pframe_utils/index.js +2 -0
  77. package/dist/pframe_utils/index.js.map +1 -1
  78. package/dist/pframe_utils/querySpec.d.ts +2 -0
  79. package/dist/pframe_utils/querySpec.d.ts.map +1 -0
  80. package/dist/render/api.cjs +7 -0
  81. package/dist/render/api.cjs.map +1 -1
  82. package/dist/render/api.d.ts +3 -2
  83. package/dist/render/api.d.ts.map +1 -1
  84. package/dist/render/api.js +8 -1
  85. package/dist/render/api.js.map +1 -1
  86. package/dist/render/future.d.ts +1 -1
  87. package/dist/render/index.d.ts +2 -1
  88. package/dist/render/index.d.ts.map +1 -1
  89. package/dist/render/internal.cjs.map +1 -1
  90. package/dist/render/internal.d.ts +4 -1
  91. package/dist/render/internal.d.ts.map +1 -1
  92. package/dist/render/internal.js.map +1 -1
  93. package/dist/render/util/column_collection.cjs.map +1 -1
  94. package/dist/render/util/column_collection.d.ts +1 -1
  95. package/dist/render/util/column_collection.d.ts.map +1 -1
  96. package/dist/render/util/column_collection.js.map +1 -1
  97. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  98. package/dist/render/util/pcolumn_data.d.ts +1 -1
  99. package/dist/render/util/pcolumn_data.d.ts.map +1 -1
  100. package/dist/render/util/pcolumn_data.js.map +1 -1
  101. package/package.json +8 -6
  102. package/src/annotations/converter.ts +12 -40
  103. package/src/block_model.ts +1 -0
  104. package/src/builder.ts +1 -0
  105. package/src/components/PlDataTable/index.ts +24 -0
  106. package/src/components/PlDataTable/labels.ts +101 -0
  107. package/src/components/PlDataTable/state-migration.ts +285 -0
  108. package/src/components/PlDataTable/table.ts +278 -0
  109. package/src/components/PlDataTable/v4.ts +193 -0
  110. package/src/components/PlDataTable/v5.ts +140 -0
  111. package/src/filters/converters/filterToQuery.test.ts +417 -0
  112. package/src/filters/converters/filterToQuery.ts +258 -0
  113. package/src/filters/{converter.test.ts → converters/filterUiToExpressionImpl.test.ts} +2 -2
  114. package/src/filters/{converter.ts → converters/filterUiToExpressionImpl.ts} +3 -2
  115. package/src/filters/converters/index.ts +2 -0
  116. package/src/filters/distill.test.ts +191 -0
  117. package/src/filters/distill.ts +67 -0
  118. package/src/filters/index.ts +2 -1
  119. package/src/filters/types.ts +7 -48
  120. package/src/pframe_utils/querySpec.ts +1 -0
  121. package/src/render/api.ts +13 -6
  122. package/src/render/index.ts +2 -1
  123. package/src/render/internal.ts +11 -0
  124. package/src/render/util/column_collection.ts +1 -1
  125. package/src/render/util/pcolumn_data.ts +1 -1
  126. package/dist/components/PlDataTable.cjs +0 -307
  127. package/dist/components/PlDataTable.cjs.map +0 -1
  128. package/dist/components/PlDataTable.d.ts +0 -366
  129. package/dist/components/PlDataTable.d.ts.map +0 -1
  130. package/dist/components/PlDataTable.js +0 -297
  131. package/dist/components/PlDataTable.js.map +0 -1
  132. package/dist/filters/converter.cjs.map +0 -1
  133. package/dist/filters/converter.d.ts.map +0 -1
  134. package/dist/filters/converter.js.map +0 -1
  135. package/src/components/PlDataTable.ts +0 -794
@@ -0,0 +1,158 @@
1
+ import { canonicalizeJson } from '@milaboratories/pl-model-common';
2
+ import '@milaboratories/ptabler-expression-js';
3
+ import { distillFilterSpec } from '../../filters/distill.js';
4
+
5
+ /** Upgrade PlDataTableStateV2 to the latest version */
6
+ function upgradePlDataTableStateV2(state) {
7
+ // Block just added, had no state, model started earlier than the UI
8
+ if (!state) {
9
+ return createPlDataTableStateV2();
10
+ }
11
+ // v1 -> v2
12
+ if (!("version" in state)) {
13
+ // Non upgradeable as sourceId calculation algorithm has changed, resetting state to default
14
+ state = createPlDataTableStateV2();
15
+ }
16
+ // v2 -> v3
17
+ if (state.version === 2) {
18
+ state = {
19
+ version: 3,
20
+ stateCache: state.stateCache.map((entry) => ({
21
+ ...entry,
22
+ filtersState: [],
23
+ })),
24
+ pTableParams: createDefaultPTableParams(),
25
+ };
26
+ }
27
+ // v3 -> v4
28
+ if (state.version === 3) {
29
+ // Non upgradeable as column ids calculation algorithm has changed, resetting state to default
30
+ state = createPlDataTableStateV2();
31
+ }
32
+ // v4 -> v5: migrate per-column filters to tree-based format
33
+ if (state.version === 4) {
34
+ state = migrateV4toV5(state);
35
+ }
36
+ return state;
37
+ }
38
+ /** Migrate v4 state to v5: convert per-column filters to tree-based format */
39
+ function migrateV4toV5(state) {
40
+ let idCounter = 0;
41
+ const nextId = () => ++idCounter;
42
+ const migratedCache = state.stateCache.map((entry) => {
43
+ const leaves = [];
44
+ for (const f of entry.filtersState) {
45
+ if (f.filter !== null && !f.filter.disabled) {
46
+ const column = canonicalizeJson(f.id);
47
+ leaves.push(migrateTableFilter(column, f.filter.value, nextId));
48
+ }
49
+ }
50
+ const filtersState = leaves.length > 0 ? { id: nextId(), type: "and", filters: leaves } : null;
51
+ return {
52
+ sourceId: entry.sourceId,
53
+ gridState: entry.gridState,
54
+ sheetsState: entry.sheetsState,
55
+ filtersState,
56
+ };
57
+ });
58
+ const oldSourceId = state.pTableParams.sourceId;
59
+ const currentCache = oldSourceId
60
+ ? migratedCache.find((e) => e.sourceId === oldSourceId)
61
+ : undefined;
62
+ return {
63
+ version: 5,
64
+ stateCache: migratedCache,
65
+ pTableParams: currentCache && oldSourceId
66
+ ? {
67
+ sourceId: oldSourceId,
68
+ hiddenColIds: state.pTableParams.hiddenColIds,
69
+ filters: distillFilterSpec(currentCache.filtersState),
70
+ sorting: state.pTableParams.sorting,
71
+ }
72
+ : createDefaultPTableParams(),
73
+ };
74
+ }
75
+ /** Migrate a single per-column PlTableFilter to a tree-based FilterSpec node */
76
+ function migrateTableFilter(column, filter, nextId) {
77
+ const id = nextId();
78
+ switch (filter.type) {
79
+ case "isNA":
80
+ return { id, type: "isNA", column };
81
+ case "isNotNA":
82
+ return { id, type: "isNotNA", column };
83
+ case "number_equals":
84
+ return { id, type: "equal", column, x: filter.reference };
85
+ case "number_notEquals":
86
+ return { id, type: "notEqual", column, x: filter.reference };
87
+ case "number_greaterThan":
88
+ return { id, type: "greaterThan", column, x: filter.reference };
89
+ case "number_greaterThanOrEqualTo":
90
+ return { id, type: "greaterThanOrEqual", column, x: filter.reference };
91
+ case "number_lessThan":
92
+ return { id, type: "lessThan", column, x: filter.reference };
93
+ case "number_lessThanOrEqualTo":
94
+ return { id, type: "lessThanOrEqual", column, x: filter.reference };
95
+ case "number_between":
96
+ return {
97
+ id,
98
+ type: "and",
99
+ filters: [
100
+ filter.includeLowerBound
101
+ ? { id: nextId(), type: "greaterThanOrEqual", column, x: filter.lowerBound }
102
+ : { id: nextId(), type: "greaterThan", column, x: filter.lowerBound },
103
+ filter.includeUpperBound
104
+ ? { id: nextId(), type: "lessThanOrEqual", column, x: filter.upperBound }
105
+ : { id: nextId(), type: "lessThan", column, x: filter.upperBound },
106
+ ],
107
+ };
108
+ case "string_equals":
109
+ return { id, type: "patternEquals", column, value: filter.reference };
110
+ case "string_notEquals":
111
+ return { id, type: "patternNotEquals", column, value: filter.reference };
112
+ case "string_contains":
113
+ return { id, type: "patternContainSubsequence", column, value: filter.reference };
114
+ case "string_doesNotContain":
115
+ return { id, type: "patternNotContainSubsequence", column, value: filter.reference };
116
+ case "string_matches":
117
+ return { id, type: "patternMatchesRegularExpression", column, value: filter.reference };
118
+ case "string_doesNotMatch":
119
+ return {
120
+ id,
121
+ type: "not",
122
+ filter: {
123
+ id: nextId(),
124
+ type: "patternMatchesRegularExpression",
125
+ column,
126
+ value: filter.reference,
127
+ },
128
+ };
129
+ case "string_containsFuzzyMatch":
130
+ return {
131
+ id,
132
+ type: "patternFuzzyContainSubsequence",
133
+ column,
134
+ value: filter.reference,
135
+ maxEdits: filter.maxEdits,
136
+ substitutionsOnly: filter.substitutionsOnly,
137
+ ...(filter.wildcard !== undefined ? { wildcard: filter.wildcard } : {}),
138
+ };
139
+ }
140
+ }
141
+ function createDefaultPTableParams() {
142
+ return {
143
+ sourceId: null,
144
+ hiddenColIds: null,
145
+ filters: null,
146
+ sorting: [],
147
+ };
148
+ }
149
+ function createPlDataTableStateV2() {
150
+ return {
151
+ version: 5,
152
+ stateCache: [],
153
+ pTableParams: createDefaultPTableParams(),
154
+ };
155
+ }
156
+
157
+ export { createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 };
158
+ //# sourceMappingURL=state-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-migration.js","sources":["../../../src/components/PlDataTable/state-migration.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n PObjectId,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n PTableSorting,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson } from \"@milaboratories/pl-model-common\";\nimport { distillFilterSpec } from \"../../filters\";\nimport type { PlDataTableFilterState, PlTableFilter } from \"./v4\";\nimport type {\n PlDataTableFiltersWithMeta,\n PlDataTableGridStateCore,\n PlDataTableSheetState,\n PlDataTableStateV2CacheEntry,\n PlDataTableStateV2Normalized,\n PTableParamsV2,\n} from \"./v5\";\n\n/**\n * PlDataTableV2 persisted state\n */\nexport type PlDataTableStateV2 =\n // Old versions of the state\n | {\n // no version\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sourceId?: string;\n sheets?: Record<CanonicalizedJson<AxisId>, string | number>;\n };\n pTableParams?: {\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n };\n }\n | {\n version: 2;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n }[];\n pTableParams: {\n hiddenColIds: PObjectId[] | null;\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n }\n | {\n version: 3;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n pTableParams: PTableParamsV2;\n }\n | {\n version: 4;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateCore;\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n /** Old format; only fields used in migration are typed */\n pTableParams: {\n sourceId: string | null;\n hiddenColIds: PObjectId[] | null;\n sorting: PTableSorting[];\n };\n }\n // Normalized state\n | PlDataTableStateV2Normalized;\n\n/** Upgrade PlDataTableStateV2 to the latest version */\nexport function upgradePlDataTableStateV2(\n state: PlDataTableStateV2 | undefined,\n): PlDataTableStateV2Normalized {\n // Block just added, had no state, model started earlier than the UI\n if (!state) {\n return createPlDataTableStateV2();\n }\n // v1 -> v2\n if (!(\"version\" in state)) {\n // Non upgradeable as sourceId calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v2 -> v3\n if (state.version === 2) {\n state = {\n version: 3,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n filtersState: [],\n })),\n pTableParams: createDefaultPTableParams(),\n };\n }\n // v3 -> v4\n if (state.version === 3) {\n // Non upgradeable as column ids calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v4 -> v5: migrate per-column filters to tree-based format\n if (state.version === 4) {\n state = migrateV4toV5(state);\n }\n return state;\n}\n\n/** Migrate v4 state to v5: convert per-column filters to tree-based format */\nfunction migrateV4toV5(\n state: Extract<PlDataTableStateV2, { version: 4 }>,\n): PlDataTableStateV2Normalized {\n let idCounter = 0;\n const nextId = () => ++idCounter;\n\n const migratedCache: PlDataTableStateV2CacheEntry[] = state.stateCache.map((entry) => {\n const leaves: PlDataTableFiltersWithMeta[] = [];\n for (const f of entry.filtersState) {\n if (f.filter !== null && !f.filter.disabled) {\n const column = canonicalizeJson<PTableColumnId>(f.id);\n leaves.push(migrateTableFilter(column, f.filter.value, nextId));\n }\n }\n const filtersState: PlDataTableFiltersWithMeta | null =\n leaves.length > 0 ? { id: nextId(), type: \"and\", filters: leaves } : null;\n\n return {\n sourceId: entry.sourceId,\n gridState: entry.gridState,\n sheetsState: entry.sheetsState,\n filtersState,\n };\n });\n\n const oldSourceId = state.pTableParams.sourceId;\n const currentCache = oldSourceId\n ? migratedCache.find((e) => e.sourceId === oldSourceId)\n : undefined;\n\n return {\n version: 5,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds: state.pTableParams.hiddenColIds,\n filters: distillFilterSpec(currentCache.filtersState),\n sorting: state.pTableParams.sorting,\n }\n : createDefaultPTableParams(),\n };\n}\n\n/** Migrate a single per-column PlTableFilter to a tree-based FilterSpec node */\nfunction migrateTableFilter(\n column: string,\n filter: PlTableFilter,\n nextId: () => number,\n): PlDataTableFiltersWithMeta {\n const id = nextId();\n switch (filter.type) {\n case \"isNA\":\n return { id, type: \"isNA\", column };\n case \"isNotNA\":\n return { id, type: \"isNotNA\", column };\n case \"number_equals\":\n return { id, type: \"equal\", column, x: filter.reference };\n case \"number_notEquals\":\n return { id, type: \"notEqual\", column, x: filter.reference };\n case \"number_greaterThan\":\n return { id, type: \"greaterThan\", column, x: filter.reference };\n case \"number_greaterThanOrEqualTo\":\n return { id, type: \"greaterThanOrEqual\", column, x: filter.reference };\n case \"number_lessThan\":\n return { id, type: \"lessThan\", column, x: filter.reference };\n case \"number_lessThanOrEqualTo\":\n return { id, type: \"lessThanOrEqual\", column, x: filter.reference };\n case \"number_between\":\n return {\n id,\n type: \"and\",\n filters: [\n filter.includeLowerBound\n ? { id: nextId(), type: \"greaterThanOrEqual\" as const, column, x: filter.lowerBound }\n : { id: nextId(), type: \"greaterThan\" as const, column, x: filter.lowerBound },\n filter.includeUpperBound\n ? { id: nextId(), type: \"lessThanOrEqual\" as const, column, x: filter.upperBound }\n : { id: nextId(), type: \"lessThan\" as const, column, x: filter.upperBound },\n ],\n };\n case \"string_equals\":\n return { id, type: \"patternEquals\", column, value: filter.reference };\n case \"string_notEquals\":\n return { id, type: \"patternNotEquals\", column, value: filter.reference };\n case \"string_contains\":\n return { id, type: \"patternContainSubsequence\", column, value: filter.reference };\n case \"string_doesNotContain\":\n return { id, type: \"patternNotContainSubsequence\", column, value: filter.reference };\n case \"string_matches\":\n return { id, type: \"patternMatchesRegularExpression\", column, value: filter.reference };\n case \"string_doesNotMatch\":\n return {\n id,\n type: \"not\",\n filter: {\n id: nextId(),\n type: \"patternMatchesRegularExpression\",\n column,\n value: filter.reference,\n },\n };\n case \"string_containsFuzzyMatch\":\n return {\n id,\n type: \"patternFuzzyContainSubsequence\",\n column,\n value: filter.reference,\n maxEdits: filter.maxEdits,\n substitutionsOnly: filter.substitutionsOnly,\n ...(filter.wildcard !== undefined ? { wildcard: filter.wildcard } : {}),\n };\n }\n}\n\nexport function createDefaultPTableParams(): PTableParamsV2 {\n return {\n sourceId: null,\n hiddenColIds: null,\n filters: null,\n sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 5,\n stateCache: [],\n pTableParams: createDefaultPTableParams(),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ 'use strict';
2
+
3
+ var plModelCommon = require('@milaboratories/pl-model-common');
4
+ var filterToQuery = require('../../filters/converters/filterToQuery.cjs');
5
+ require('@milaboratories/ptabler-expression-js');
6
+ var distill = require('../../filters/distill.cjs');
7
+ require('canonicalize');
8
+ var label = require('../../render/util/label.cjs');
9
+ var pcolumn_data = require('../../render/util/pcolumn_data.cjs');
10
+ var esToolkit = require('es-toolkit');
11
+ var stateMigration = require('./state-migration.cjs');
12
+ var labels = require('./labels.cjs');
13
+
14
+ /** Convert a PTableColumnId to a SpecQueryExpression reference. */
15
+ function columnIdToExpr(col) {
16
+ if (col.type === "axis") {
17
+ return { type: "axisRef", value: col.id };
18
+ }
19
+ return { type: "columnRef", value: col.id };
20
+ }
21
+ /** Wrap a SpecQuery as a SpecQueryJoinEntry with empty qualifications. */
22
+ function joinEntry(input) {
23
+ return { entry: input, qualifications: [] };
24
+ }
25
+ function createPTableDef(params) {
26
+ let coreColumns = params.columns;
27
+ const secondaryColumns = [];
28
+ if (esToolkit.isFunction(params.coreColumnPredicate)) {
29
+ coreColumns = [];
30
+ for (const c of params.columns)
31
+ if (params.coreColumnPredicate(plModelCommon.getColumnIdAndSpec(c)))
32
+ coreColumns.push(c);
33
+ else
34
+ secondaryColumns.push(c);
35
+ }
36
+ secondaryColumns.push(...params.labelColumns);
37
+ // Build SpecQuery directly from columns
38
+ const coreJoinQuery = {
39
+ type: params.coreJoinType === "inner" ? "innerJoin" : "fullJoin",
40
+ entries: coreColumns.map((c) => joinEntry({ type: "column", column: c })),
41
+ };
42
+ let query = {
43
+ type: "outerJoin",
44
+ primary: joinEntry(coreJoinQuery),
45
+ secondary: secondaryColumns.map((c) => joinEntry({ type: "column", column: c })),
46
+ };
47
+ // Apply filters
48
+ if (params.filters !== null) {
49
+ const nonEmpty = distill.distillFilterSpec(params.filters);
50
+ if (!esToolkit.isNil(nonEmpty)) {
51
+ const pridicate = filterToQuery.filterSpecToSpecQueryExpr(nonEmpty);
52
+ if (!plModelCommon.isBooleanExpression(pridicate)) {
53
+ throw new Error(`Filter conversion produced a non-boolean expression (got type "${pridicate.type}"), expected a boolean predicate for query filtering`);
54
+ }
55
+ query = {
56
+ type: "filter",
57
+ input: query,
58
+ predicate: pridicate,
59
+ };
60
+ }
61
+ }
62
+ // Apply sorting
63
+ if (params.sorting.length > 0) {
64
+ query = {
65
+ type: "sort",
66
+ input: query,
67
+ sortBy: params.sorting.map((s) => ({
68
+ expression: columnIdToExpr(s.column),
69
+ ascending: s.ascending,
70
+ nullsFirst: s.ascending === s.naAndAbsentAreLeastValues,
71
+ })),
72
+ };
73
+ }
74
+ return { query };
75
+ }
76
+ /** Check if column should be omitted from the table */
77
+ function isColumnHidden(spec) {
78
+ return plModelCommon.readAnnotation(spec, plModelCommon.Annotation.Table.Visibility) === "hidden";
79
+ }
80
+ /** Check if column is hidden by default */
81
+ function isColumnOptional(spec) {
82
+ return plModelCommon.readAnnotation(spec, plModelCommon.Annotation.Table.Visibility) === "optional";
83
+ }
84
+ /**
85
+ * Create p-table spec and handle given ui table state
86
+ *
87
+ * @param ctx context
88
+ * @param columns column list
89
+ * @param tableState table ui state
90
+ * @returns PlAgDataTableV2 table source
91
+ */
92
+ function createPlDataTableV2(ctx, columns, tableState, ops) {
93
+ if (columns.length === 0)
94
+ return undefined;
95
+ const tableStateNormalized = stateMigration.upgradePlDataTableStateV2(tableState);
96
+ const allLabelColumns = labels.getAllLabelColumns(ctx.resultPool);
97
+ if (!allLabelColumns)
98
+ return undefined;
99
+ let fullLabelColumns = labels.getMatchingLabelColumns(columns.map(plModelCommon.getColumnIdAndSpec), allLabelColumns);
100
+ fullLabelColumns = label.deriveLabels(fullLabelColumns, esToolkit.identity, { includeNativeLabel: true }).map((v) => {
101
+ return {
102
+ ...v.value,
103
+ spec: {
104
+ ...v.value.spec,
105
+ annotations: {
106
+ ...v.value.spec.annotations,
107
+ [plModelCommon.Annotation.Label]: v.label,
108
+ },
109
+ },
110
+ };
111
+ });
112
+ const fullColumns = [...columns, ...fullLabelColumns];
113
+ const fullColumnsAxes = plModelCommon.uniqueBy(fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => plModelCommon.getAxisId(a))), (a) => plModelCommon.canonicalizeJson(a));
114
+ const fullColumnsIds = [
115
+ ...fullColumnsAxes.map((a) => ({ type: "axis", id: a })),
116
+ ...fullColumns.map((c) => ({ type: "column", id: c.id })),
117
+ ];
118
+ const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => plModelCommon.canonicalizeJson(c)));
119
+ const isValidColumnId = (id) => fullColumnsIdsSet.has(plModelCommon.canonicalizeJson(id));
120
+ const coreJoinType = ops?.coreJoinType ?? "full";
121
+ const filters = tableStateNormalized.pTableParams.filters;
122
+ const sorting = plModelCommon.uniqueBy([...tableStateNormalized.pTableParams.sorting, ...(ops?.sorting ?? [])], (s) => plModelCommon.canonicalizeJson(s.column)).filter((s) => {
123
+ const valid = isValidColumnId(s.column);
124
+ if (!valid)
125
+ ctx.logWarn(`Sorting ${JSON.stringify(s)} does not match provided columns, skipping`);
126
+ return valid;
127
+ });
128
+ const fullDef = createPTableDef({
129
+ columns,
130
+ labelColumns: fullLabelColumns,
131
+ coreJoinType,
132
+ filters,
133
+ sorting,
134
+ coreColumnPredicate: ops?.coreColumnPredicate,
135
+ });
136
+ const fullHandle = ctx.createPTableV2(fullDef);
137
+ if (!fullHandle)
138
+ return undefined;
139
+ const hiddenColumns = new Set((() => {
140
+ // Inner join works as a filter - all columns must be present
141
+ if (coreJoinType === "inner")
142
+ return [];
143
+ const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;
144
+ if (hiddenColIds)
145
+ return hiddenColIds;
146
+ return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);
147
+ })());
148
+ // Preserve linker columns
149
+ columns.filter((c) => plModelCommon.isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
150
+ // Preserve core columns as they change the shape of join.
151
+ const coreColumnPredicate = ops?.coreColumnPredicate;
152
+ if (coreColumnPredicate) {
153
+ const coreColumns = columns.flatMap((c) => coreColumnPredicate(plModelCommon.getColumnIdAndSpec(c)) ? [c.id] : []);
154
+ coreColumns.forEach((c) => hiddenColumns.delete(c));
155
+ }
156
+ // Sorting changes the order of result rows — preserve sorted columns from being hidden
157
+ sorting
158
+ .map((s) => s.column)
159
+ .filter((c) => c.type === "column")
160
+ .forEach((c) => hiddenColumns.delete(c.id));
161
+ const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));
162
+ const visibleLabelColumns = labels.getMatchingLabelColumns(visibleColumns.map(plModelCommon.getColumnIdAndSpec), allLabelColumns);
163
+ // if at least one column is not yet computed, we can't show the table
164
+ if (!pcolumn_data.allPColumnsReady([...visibleColumns, ...visibleLabelColumns]))
165
+ return undefined;
166
+ const visibleDef = createPTableDef({
167
+ columns: visibleColumns,
168
+ labelColumns: visibleLabelColumns,
169
+ coreJoinType,
170
+ filters,
171
+ sorting,
172
+ coreColumnPredicate,
173
+ });
174
+ const visibleHandle = ctx.createPTableV2(visibleDef);
175
+ if (!visibleHandle)
176
+ return undefined;
177
+ return {
178
+ sourceId: tableStateNormalized.pTableParams.sourceId,
179
+ fullTableHandle: fullHandle,
180
+ visibleTableHandle: visibleHandle,
181
+ };
182
+ }
183
+
184
+ exports.createPlDataTableV2 = createPlDataTableV2;
185
+ exports.isColumnHidden = isColumnHidden;
186
+ exports.isColumnOptional = isColumnOptional;
187
+ //# sourceMappingURL=table.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.cjs","sources":["../../../src/components/PlDataTable/table.ts"],"sourcesContent":["import type {\n AxisId,\n AxisSpec,\n DataInfo,\n PColumn,\n PColumnIdAndSpec,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableDefV2,\n PTableSorting,\n SpecQuery,\n SingleAxisSelector,\n SpecQueryExpression,\n SpecQueryJoinEntry,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n isLinkerColumn,\n readAnnotation,\n uniqueBy,\n isBooleanExpression,\n} from \"@milaboratories/pl-model-common\";\nimport { filterSpecToSpecQueryExpr } from \"../../filters\";\nimport type { RenderCtxBase, TreeNodeAccessor, PColumnDataUniversal } from \"../../render\";\nimport { allPColumnsReady, deriveLabels } from \"../../render\";\nimport { identity, isFunction, isNil } from \"es-toolkit\";\nimport { distillFilterSpec } from \"../../filters/distill\";\nimport type { CreatePlDataTableOps, PlDataTableFilters, PlDataTableModel } from \"./v5\";\nimport { upgradePlDataTableStateV2 } from \"./state-migration\";\nimport type { PlDataTableStateV2 } from \"./state-migration\";\nimport type { PlDataTableSheet } from \"./v5\";\nimport { getAllLabelColumns, getMatchingLabelColumns } from \"./labels\";\n\n/** Convert a PTableColumnId to a SpecQueryExpression reference. */\nfunction columnIdToExpr(col: PTableColumnId): SpecQueryExpression {\n if (col.type === \"axis\") {\n return { type: \"axisRef\", value: col.id as SingleAxisSelector };\n }\n return { type: \"columnRef\", value: col.id };\n}\n\n/** Wrap a SpecQuery as a SpecQueryJoinEntry with empty qualifications. */\nfunction joinEntry<C>(input: SpecQuery<C>): SpecQueryJoinEntry<C> {\n return { entry: input, qualifications: [] };\n}\n\nfunction createPTableDef(params: {\n columns: PColumn<PColumnDataUniversal>[];\n labelColumns: PColumn<PColumnDataUniversal>[];\n coreJoinType: \"inner\" | \"full\";\n filters: null | PlDataTableFilters;\n sorting: PTableSorting[];\n coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;\n}): PTableDefV2<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> {\n let coreColumns = params.columns;\n const secondaryColumns: typeof params.columns = [];\n\n if (isFunction(params.coreColumnPredicate)) {\n coreColumns = [];\n for (const c of params.columns)\n if (params.coreColumnPredicate(getColumnIdAndSpec(c))) coreColumns.push(c);\n else secondaryColumns.push(c);\n }\n\n secondaryColumns.push(...params.labelColumns);\n\n // Build SpecQuery directly from columns\n const coreJoinQuery: SpecQuery<\n PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>\n > = {\n type: params.coreJoinType === \"inner\" ? \"innerJoin\" : \"fullJoin\",\n entries: coreColumns.map((c) => joinEntry({ type: \"column\", column: c })),\n };\n\n let query: SpecQuery<PColumn<TreeNodeAccessor | PColumnValues | DataInfo<TreeNodeAccessor>>> = {\n type: \"outerJoin\",\n primary: joinEntry(coreJoinQuery),\n secondary: secondaryColumns.map((c) => joinEntry({ type: \"column\", column: c })),\n };\n\n // Apply filters\n if (params.filters !== null) {\n const nonEmpty = distillFilterSpec(params.filters);\n\n if (!isNil(nonEmpty)) {\n const pridicate = filterSpecToSpecQueryExpr(nonEmpty);\n if (!isBooleanExpression(pridicate)) {\n throw new Error(\n `Filter conversion produced a non-boolean expression (got type \"${pridicate.type}\"), expected a boolean predicate for query filtering`,\n );\n }\n query = {\n type: \"filter\",\n input: query,\n predicate: pridicate,\n };\n }\n }\n\n // Apply sorting\n if (params.sorting.length > 0) {\n query = {\n type: \"sort\",\n input: query,\n sortBy: params.sorting.map((s) => ({\n expression: columnIdToExpr(s.column),\n ascending: s.ascending,\n nullsFirst: s.ascending === s.naAndAbsentAreLeastValues,\n })),\n };\n }\n\n return { query };\n}\n\n/** Check if column should be omitted from the table */\nexport function isColumnHidden(spec: { annotations?: Annotation }): boolean {\n return readAnnotation(spec, Annotation.Table.Visibility) === \"hidden\";\n}\n\n/** Check if column is hidden by default */\nexport function isColumnOptional(spec: { annotations?: Annotation }): boolean {\n return readAnnotation(spec, Annotation.Table.Visibility) === \"optional\";\n}\n\n/**\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: PColumn<PColumnDataUniversal>[],\n tableState: PlDataTableStateV2 | undefined,\n ops?: CreatePlDataTableOps,\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: PTableColumnId): boolean =>\n fullColumnsIdsSet.has(canonicalizeJson<PTableColumnId>(id));\n\n const coreJoinType = ops?.coreJoinType ?? \"full\";\n const filters = tableStateNormalized.pTableParams.filters;\n const sorting: PTableSorting[] = uniqueBy(\n [...tableStateNormalized.pTableParams.sorting, ...(ops?.sorting ?? [])],\n (s) => canonicalizeJson<PTableColumnId>(s.column),\n ).filter((s) => {\n const valid = isValidColumnId(s.column);\n if (!valid)\n ctx.logWarn(`Sorting ${JSON.stringify(s)} does not match provided columns, skipping`);\n return valid;\n });\n\n const fullDef = createPTableDef({\n columns,\n labelColumns: fullLabelColumns,\n coreJoinType,\n filters,\n sorting,\n coreColumnPredicate: ops?.coreColumnPredicate,\n });\n const fullHandle = ctx.createPTableV2(fullDef);\n if (!fullHandle) 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 = ops?.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 // Sorting changes the order of result rows — 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 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 if (!visibleHandle) return undefined;\n\n return {\n sourceId: tableStateNormalized.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n visibleTableHandle: visibleHandle,\n } satisfies PlDataTableModel;\n}\n\n/** Create sheet entries for PlDataTable */\nexport function createPlDataTableSheet<A, U>(\n ctx: RenderCtxBase<A, U>,\n axis: AxisSpec,\n values: (string | number)[],\n): PlDataTableSheet {\n const labels = ctx.resultPool.findLabels(axis);\n return {\n axis,\n options: values.map((v) => ({\n value: v,\n label: labels?.[v] ?? v.toString(),\n })),\n defaultValue: values[0],\n };\n}\n"],"names":["isFunction","getColumnIdAndSpec","distillFilterSpec","isNil","filterSpecToSpecQueryExpr","isBooleanExpression","readAnnotation","Annotation","upgradePlDataTableStateV2","getAllLabelColumns","getMatchingLabelColumns","deriveLabels","identity","uniqueBy","getAxisId","canonicalizeJson","isLinkerColumn","allPColumnsReady"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { AxisSpec, PColumn } from "@milaboratories/pl-model-common";
2
+ import { Annotation } from "@milaboratories/pl-model-common";
3
+ import type { RenderCtxBase, PColumnDataUniversal } from "../../render";
4
+ import type { CreatePlDataTableOps, PlDataTableModel } from "./v5";
5
+ import type { PlDataTableStateV2 } from "./state-migration";
6
+ import type { PlDataTableSheet } from "./v5";
7
+ /** Check if column should be omitted from the table */
8
+ export declare function isColumnHidden(spec: {
9
+ annotations?: Annotation;
10
+ }): boolean;
11
+ /** Check if column is hidden by default */
12
+ export declare function isColumnOptional(spec: {
13
+ annotations?: Annotation;
14
+ }): boolean;
15
+ /**
16
+ * Create p-table spec and handle given ui table state
17
+ *
18
+ * @param ctx context
19
+ * @param columns column list
20
+ * @param tableState table ui state
21
+ * @returns PlAgDataTableV2 table source
22
+ */
23
+ export declare function createPlDataTableV2<A, U>(ctx: RenderCtxBase<A, U>, columns: PColumn<PColumnDataUniversal>[], tableState: PlDataTableStateV2 | undefined, ops?: CreatePlDataTableOps): PlDataTableModel | undefined;
24
+ /** Create sheet entries for PlDataTable */
25
+ export declare function createPlDataTableSheet<A, U>(ctx: RenderCtxBase<A, U>, axis: AxisSpec, values: (string | number)[]): PlDataTableSheet;
26
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/components/PlDataTable/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,QAAQ,EAER,OAAO,EAaR,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,UAAU,EAQX,MAAM,iCAAiC,CAAC;AAEzC,OAAO,KAAK,EAAE,aAAa,EAAoB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAI1F,OAAO,KAAK,EAAE,oBAAoB,EAAsB,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAEvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAqF7C,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAE1E;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACtC,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EACxB,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,EAAE,EACxC,UAAU,EAAE,kBAAkB,GAAG,SAAS,EAC1C,GAAG,CAAC,EAAE,oBAAoB,GACzB,gBAAgB,GAAG,SAAS,CAoH9B;AAED,2CAA2C;AAC3C,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,CAAC,EACzC,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EACxB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAC1B,gBAAgB,CAUlB"}
@@ -0,0 +1,183 @@
1
+ import { readAnnotation, Annotation, getColumnIdAndSpec, uniqueBy, getAxisId, canonicalizeJson, isLinkerColumn, isBooleanExpression } from '@milaboratories/pl-model-common';
2
+ import { filterSpecToSpecQueryExpr } from '../../filters/converters/filterToQuery.js';
3
+ import '@milaboratories/ptabler-expression-js';
4
+ import { distillFilterSpec } from '../../filters/distill.js';
5
+ import 'canonicalize';
6
+ import { deriveLabels } from '../../render/util/label.js';
7
+ import { allPColumnsReady } from '../../render/util/pcolumn_data.js';
8
+ import { isFunction, isNil, identity } from 'es-toolkit';
9
+ import { upgradePlDataTableStateV2 } from './state-migration.js';
10
+ import { getAllLabelColumns, getMatchingLabelColumns } from './labels.js';
11
+
12
+ /** Convert a PTableColumnId to a SpecQueryExpression reference. */
13
+ function columnIdToExpr(col) {
14
+ if (col.type === "axis") {
15
+ return { type: "axisRef", value: col.id };
16
+ }
17
+ return { type: "columnRef", value: col.id };
18
+ }
19
+ /** Wrap a SpecQuery as a SpecQueryJoinEntry with empty qualifications. */
20
+ function joinEntry(input) {
21
+ return { entry: input, qualifications: [] };
22
+ }
23
+ function createPTableDef(params) {
24
+ let coreColumns = params.columns;
25
+ const secondaryColumns = [];
26
+ if (isFunction(params.coreColumnPredicate)) {
27
+ coreColumns = [];
28
+ for (const c of params.columns)
29
+ if (params.coreColumnPredicate(getColumnIdAndSpec(c)))
30
+ coreColumns.push(c);
31
+ else
32
+ secondaryColumns.push(c);
33
+ }
34
+ secondaryColumns.push(...params.labelColumns);
35
+ // Build SpecQuery directly from columns
36
+ const coreJoinQuery = {
37
+ type: params.coreJoinType === "inner" ? "innerJoin" : "fullJoin",
38
+ entries: coreColumns.map((c) => joinEntry({ type: "column", column: c })),
39
+ };
40
+ let query = {
41
+ type: "outerJoin",
42
+ primary: joinEntry(coreJoinQuery),
43
+ secondary: secondaryColumns.map((c) => joinEntry({ type: "column", column: c })),
44
+ };
45
+ // Apply filters
46
+ if (params.filters !== null) {
47
+ const nonEmpty = distillFilterSpec(params.filters);
48
+ if (!isNil(nonEmpty)) {
49
+ const pridicate = filterSpecToSpecQueryExpr(nonEmpty);
50
+ if (!isBooleanExpression(pridicate)) {
51
+ throw new Error(`Filter conversion produced a non-boolean expression (got type "${pridicate.type}"), expected a boolean predicate for query filtering`);
52
+ }
53
+ query = {
54
+ type: "filter",
55
+ input: query,
56
+ predicate: pridicate,
57
+ };
58
+ }
59
+ }
60
+ // Apply sorting
61
+ if (params.sorting.length > 0) {
62
+ query = {
63
+ type: "sort",
64
+ input: query,
65
+ sortBy: params.sorting.map((s) => ({
66
+ expression: columnIdToExpr(s.column),
67
+ ascending: s.ascending,
68
+ nullsFirst: s.ascending === s.naAndAbsentAreLeastValues,
69
+ })),
70
+ };
71
+ }
72
+ return { query };
73
+ }
74
+ /** Check if column should be omitted from the table */
75
+ function isColumnHidden(spec) {
76
+ return readAnnotation(spec, Annotation.Table.Visibility) === "hidden";
77
+ }
78
+ /** Check if column is hidden by default */
79
+ function isColumnOptional(spec) {
80
+ return readAnnotation(spec, Annotation.Table.Visibility) === "optional";
81
+ }
82
+ /**
83
+ * Create p-table spec and handle given ui table state
84
+ *
85
+ * @param ctx context
86
+ * @param columns column list
87
+ * @param tableState table ui state
88
+ * @returns PlAgDataTableV2 table source
89
+ */
90
+ function createPlDataTableV2(ctx, columns, tableState, ops) {
91
+ if (columns.length === 0)
92
+ return undefined;
93
+ const tableStateNormalized = upgradePlDataTableStateV2(tableState);
94
+ const allLabelColumns = getAllLabelColumns(ctx.resultPool);
95
+ if (!allLabelColumns)
96
+ return undefined;
97
+ let fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);
98
+ fullLabelColumns = deriveLabels(fullLabelColumns, identity, { includeNativeLabel: true }).map((v) => {
99
+ return {
100
+ ...v.value,
101
+ spec: {
102
+ ...v.value.spec,
103
+ annotations: {
104
+ ...v.value.spec.annotations,
105
+ [Annotation.Label]: v.label,
106
+ },
107
+ },
108
+ };
109
+ });
110
+ const fullColumns = [...columns, ...fullLabelColumns];
111
+ const fullColumnsAxes = uniqueBy(fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))), (a) => canonicalizeJson(a));
112
+ const fullColumnsIds = [
113
+ ...fullColumnsAxes.map((a) => ({ type: "axis", id: a })),
114
+ ...fullColumns.map((c) => ({ type: "column", id: c.id })),
115
+ ];
116
+ const fullColumnsIdsSet = new Set(fullColumnsIds.map((c) => canonicalizeJson(c)));
117
+ const isValidColumnId = (id) => fullColumnsIdsSet.has(canonicalizeJson(id));
118
+ const coreJoinType = ops?.coreJoinType ?? "full";
119
+ const filters = tableStateNormalized.pTableParams.filters;
120
+ const sorting = uniqueBy([...tableStateNormalized.pTableParams.sorting, ...(ops?.sorting ?? [])], (s) => canonicalizeJson(s.column)).filter((s) => {
121
+ const valid = isValidColumnId(s.column);
122
+ if (!valid)
123
+ ctx.logWarn(`Sorting ${JSON.stringify(s)} does not match provided columns, skipping`);
124
+ return valid;
125
+ });
126
+ const fullDef = createPTableDef({
127
+ columns,
128
+ labelColumns: fullLabelColumns,
129
+ coreJoinType,
130
+ filters,
131
+ sorting,
132
+ coreColumnPredicate: ops?.coreColumnPredicate,
133
+ });
134
+ const fullHandle = ctx.createPTableV2(fullDef);
135
+ if (!fullHandle)
136
+ return undefined;
137
+ const hiddenColumns = new Set((() => {
138
+ // Inner join works as a filter - all columns must be present
139
+ if (coreJoinType === "inner")
140
+ return [];
141
+ const hiddenColIds = tableStateNormalized.pTableParams.hiddenColIds;
142
+ if (hiddenColIds)
143
+ return hiddenColIds;
144
+ return columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);
145
+ })());
146
+ // Preserve linker columns
147
+ columns.filter((c) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
148
+ // Preserve core columns as they change the shape of join.
149
+ const coreColumnPredicate = ops?.coreColumnPredicate;
150
+ if (coreColumnPredicate) {
151
+ const coreColumns = columns.flatMap((c) => coreColumnPredicate(getColumnIdAndSpec(c)) ? [c.id] : []);
152
+ coreColumns.forEach((c) => hiddenColumns.delete(c));
153
+ }
154
+ // Sorting changes the order of result rows — preserve sorted columns from being hidden
155
+ sorting
156
+ .map((s) => s.column)
157
+ .filter((c) => c.type === "column")
158
+ .forEach((c) => hiddenColumns.delete(c.id));
159
+ const visibleColumns = columns.filter((c) => !hiddenColumns.has(c.id));
160
+ const visibleLabelColumns = getMatchingLabelColumns(visibleColumns.map(getColumnIdAndSpec), allLabelColumns);
161
+ // if at least one column is not yet computed, we can't show the table
162
+ if (!allPColumnsReady([...visibleColumns, ...visibleLabelColumns]))
163
+ return undefined;
164
+ const visibleDef = createPTableDef({
165
+ columns: visibleColumns,
166
+ labelColumns: visibleLabelColumns,
167
+ coreJoinType,
168
+ filters,
169
+ sorting,
170
+ coreColumnPredicate,
171
+ });
172
+ const visibleHandle = ctx.createPTableV2(visibleDef);
173
+ if (!visibleHandle)
174
+ return undefined;
175
+ return {
176
+ sourceId: tableStateNormalized.pTableParams.sourceId,
177
+ fullTableHandle: fullHandle,
178
+ visibleTableHandle: visibleHandle,
179
+ };
180
+ }
181
+
182
+ export { createPlDataTableV2, isColumnHidden, isColumnOptional };
183
+ //# sourceMappingURL=table.js.map