@platforma-sdk/model 1.63.1 → 1.64.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 (399) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +12 -22
  2. package/dist/_virtual/_rolldown/runtime.js +6 -11
  3. package/dist/annotations/converter.cjs +4 -5
  4. package/dist/annotations/converter.cjs.map +1 -1
  5. package/dist/annotations/converter.d.ts.map +1 -0
  6. package/dist/annotations/converter.js +1 -2
  7. package/dist/annotations/converter.js.map +1 -1
  8. package/dist/annotations/index.cjs +1 -1
  9. package/dist/annotations/index.js +1 -1
  10. package/dist/annotations/types.d.ts +0 -1
  11. package/dist/annotations/types.d.ts.map +1 -0
  12. package/dist/bconfig/index.cjs +2 -2
  13. package/dist/bconfig/index.js +2 -2
  14. package/dist/bconfig/lambdas.d.ts +0 -1
  15. package/dist/bconfig/lambdas.d.ts.map +1 -0
  16. package/dist/bconfig/normalization.cjs +4 -5
  17. package/dist/bconfig/normalization.cjs.map +1 -1
  18. package/dist/bconfig/normalization.d.ts.map +1 -0
  19. package/dist/bconfig/normalization.js +1 -2
  20. package/dist/bconfig/normalization.js.map +1 -1
  21. package/dist/bconfig/types.cjs +1 -2
  22. package/dist/bconfig/types.cjs.map +1 -1
  23. package/dist/bconfig/types.d.ts +0 -1
  24. package/dist/bconfig/types.d.ts.map +1 -0
  25. package/dist/bconfig/types.js +1 -1
  26. package/dist/bconfig/util.d.ts.map +1 -0
  27. package/dist/bconfig/v3.d.ts.map +1 -0
  28. package/dist/block_api_v1.d.ts.map +1 -0
  29. package/dist/block_api_v2.d.ts.map +1 -0
  30. package/dist/block_api_v3.d.ts.map +1 -0
  31. package/dist/block_migrations.cjs +2 -3
  32. package/dist/block_migrations.cjs.map +1 -1
  33. package/dist/block_migrations.d.ts.map +1 -0
  34. package/dist/block_migrations.js +1 -2
  35. package/dist/block_migrations.js.map +1 -1
  36. package/dist/block_model.cjs +16 -17
  37. package/dist/block_model.cjs.map +1 -1
  38. package/dist/block_model.d.ts +0 -2
  39. package/dist/block_model.d.ts.map +1 -0
  40. package/dist/block_model.js +4 -5
  41. package/dist/block_model.js.map +1 -1
  42. package/dist/block_model_legacy.cjs +10 -11
  43. package/dist/block_model_legacy.cjs.map +1 -1
  44. package/dist/block_model_legacy.d.ts +0 -3
  45. package/dist/block_model_legacy.d.ts.map +1 -0
  46. package/dist/block_model_legacy.js +1 -2
  47. package/dist/block_model_legacy.js.map +1 -1
  48. package/dist/block_state_patch.d.ts.map +1 -0
  49. package/dist/block_state_util.cjs +1 -2
  50. package/dist/block_state_util.cjs.map +1 -1
  51. package/dist/block_state_util.d.ts.map +1 -0
  52. package/dist/block_state_util.js +1 -1
  53. package/dist/block_state_util.js.map +1 -1
  54. package/dist/block_storage.cjs +5 -12
  55. package/dist/block_storage.cjs.map +1 -1
  56. package/dist/block_storage.d.ts.map +1 -0
  57. package/dist/block_storage.js +5 -11
  58. package/dist/block_storage.js.map +1 -1
  59. package/dist/block_storage_callbacks.cjs +4 -5
  60. package/dist/block_storage_callbacks.cjs.map +1 -1
  61. package/dist/block_storage_callbacks.js +3 -4
  62. package/dist/block_storage_callbacks.js.map +1 -1
  63. package/dist/block_storage_facade.cjs +2 -3
  64. package/dist/block_storage_facade.cjs.map +1 -1
  65. package/dist/block_storage_facade.d.ts +0 -1
  66. package/dist/block_storage_facade.d.ts.map +1 -0
  67. package/dist/block_storage_facade.js +1 -2
  68. package/dist/block_storage_facade.js.map +1 -1
  69. package/dist/columns/column_collection_builder.cjs +111 -99
  70. package/dist/columns/column_collection_builder.cjs.map +1 -1
  71. package/dist/columns/column_collection_builder.d.ts +13 -12
  72. package/dist/columns/column_collection_builder.d.ts.map +1 -0
  73. package/dist/columns/column_collection_builder.js +108 -96
  74. package/dist/columns/column_collection_builder.js.map +1 -1
  75. package/dist/columns/column_selector.cjs +9 -82
  76. package/dist/columns/column_selector.cjs.map +1 -1
  77. package/dist/columns/column_selector.d.ts +6 -14
  78. package/dist/columns/column_selector.d.ts.map +1 -0
  79. package/dist/columns/column_selector.js +7 -78
  80. package/dist/columns/column_selector.js.map +1 -1
  81. package/dist/columns/column_snapshot.cjs +4 -5
  82. package/dist/columns/column_snapshot.cjs.map +1 -1
  83. package/dist/columns/column_snapshot.d.ts +3 -3
  84. package/dist/columns/column_snapshot.d.ts.map +1 -0
  85. package/dist/columns/column_snapshot.js +4 -4
  86. package/dist/columns/column_snapshot.js.map +1 -1
  87. package/dist/columns/column_snapshot_provider.cjs +2 -3
  88. package/dist/columns/column_snapshot_provider.cjs.map +1 -1
  89. package/dist/columns/column_snapshot_provider.d.ts +8 -8
  90. package/dist/columns/column_snapshot_provider.d.ts.map +1 -0
  91. package/dist/columns/column_snapshot_provider.js +2 -2
  92. package/dist/columns/column_snapshot_provider.js.map +1 -1
  93. package/dist/columns/ctx_column_sources.cjs +3 -4
  94. package/dist/columns/ctx_column_sources.cjs.map +1 -1
  95. package/dist/columns/ctx_column_sources.d.ts +2 -2
  96. package/dist/columns/ctx_column_sources.d.ts.map +1 -0
  97. package/dist/columns/ctx_column_sources.js +1 -2
  98. package/dist/columns/ctx_column_sources.js.map +1 -1
  99. package/dist/columns/expand_by_partition.cjs +106 -0
  100. package/dist/columns/expand_by_partition.cjs.map +1 -0
  101. package/dist/columns/expand_by_partition.d.ts +33 -0
  102. package/dist/columns/expand_by_partition.d.ts.map +1 -0
  103. package/dist/columns/expand_by_partition.js +105 -0
  104. package/dist/columns/expand_by_partition.js.map +1 -0
  105. package/dist/columns/index.cjs +6 -5
  106. package/dist/columns/index.d.ts +4 -3
  107. package/dist/columns/index.js +6 -5
  108. package/dist/components/PFrameForGraphs.cjs +4 -5
  109. package/dist/components/PFrameForGraphs.cjs.map +1 -1
  110. package/dist/components/PFrameForGraphs.d.ts +0 -1
  111. package/dist/components/PFrameForGraphs.d.ts.map +1 -0
  112. package/dist/components/PFrameForGraphs.js +2 -3
  113. package/dist/components/PFrameForGraphs.js.map +1 -1
  114. package/dist/components/PlAnnotations/filter.d.ts.map +1 -0
  115. package/dist/components/PlAnnotations/filters_ui.cjs +1 -2
  116. package/dist/components/PlAnnotations/filters_ui.cjs.map +1 -1
  117. package/dist/components/PlAnnotations/filters_ui.d.ts +0 -2
  118. package/dist/components/PlAnnotations/filters_ui.d.ts.map +1 -0
  119. package/dist/components/PlAnnotations/filters_ui.js +1 -1
  120. package/dist/components/PlAnnotations/filters_ui.js.map +1 -1
  121. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +26 -0
  122. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -0
  123. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +25 -0
  124. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -0
  125. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +68 -0
  126. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -0
  127. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +67 -0
  128. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -0
  129. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +28 -18
  130. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  131. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +4 -1
  132. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -0
  133. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +22 -12
  134. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  135. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +262 -181
  136. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  137. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +37 -23
  138. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -0
  139. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +261 -177
  140. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  141. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +64 -0
  142. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -0
  143. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -0
  144. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -0
  145. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +63 -0
  146. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -0
  147. package/dist/components/PlDataTable/createPlDataTable/index.cjs +4 -4
  148. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  149. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -2
  150. package/dist/components/PlDataTable/createPlDataTable/index.d.ts.map +1 -0
  151. package/dist/components/PlDataTable/createPlDataTable/index.js +3 -3
  152. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  153. package/dist/components/PlDataTable/createPlDataTable/utils.cjs +109 -0
  154. package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -0
  155. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +19 -0
  156. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -0
  157. package/dist/components/PlDataTable/createPlDataTable/utils.js +102 -0
  158. package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -0
  159. package/dist/components/PlDataTable/createPlDataTableSheet.cjs +1 -2
  160. package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
  161. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +0 -1
  162. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts.map +1 -0
  163. package/dist/components/PlDataTable/createPlDataTableSheet.js +1 -1
  164. package/dist/components/PlDataTable/index.cjs +7 -5
  165. package/dist/components/PlDataTable/index.d.ts +4 -2
  166. package/dist/components/PlDataTable/index.js +7 -5
  167. package/dist/components/PlDataTable/labels.cjs +27 -14
  168. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  169. package/dist/components/PlDataTable/labels.js +26 -13
  170. package/dist/components/PlDataTable/labels.js.map +1 -1
  171. package/dist/components/PlDataTable/state-migration.cjs +8 -6
  172. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  173. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -0
  174. package/dist/components/PlDataTable/state-migration.js +5 -3
  175. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  176. package/dist/components/PlDataTable/typesV4.d.ts.map +1 -0
  177. package/dist/components/PlDataTable/typesV5.d.ts +5 -5
  178. package/dist/components/PlDataTable/typesV5.d.ts.map +1 -0
  179. package/dist/components/PlMultiSequenceAlignment.cjs +2 -3
  180. package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
  181. package/dist/components/PlMultiSequenceAlignment.d.ts.map +1 -0
  182. package/dist/components/PlMultiSequenceAlignment.js +1 -2
  183. package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
  184. package/dist/components/PlSelectionModel.cjs +1 -2
  185. package/dist/components/PlSelectionModel.cjs.map +1 -1
  186. package/dist/components/PlSelectionModel.d.ts.map +1 -0
  187. package/dist/components/PlSelectionModel.js +1 -1
  188. package/dist/components/index.cjs +13 -11
  189. package/dist/components/index.d.ts +3 -3
  190. package/dist/components/index.js +12 -10
  191. package/dist/config/actions.cjs +1 -2
  192. package/dist/config/actions.cjs.map +1 -1
  193. package/dist/config/actions.d.ts.map +1 -0
  194. package/dist/config/actions.js +1 -1
  195. package/dist/config/actions_kinds.d.ts.map +1 -0
  196. package/dist/config/index.cjs +1 -1
  197. package/dist/config/index.js +1 -1
  198. package/dist/config/model.d.ts.map +1 -0
  199. package/dist/config/model_meta.d.ts.map +1 -0
  200. package/dist/config/type_engine.d.ts.map +1 -0
  201. package/dist/config/type_util.d.ts.map +1 -0
  202. package/dist/env_value.cjs +1 -2
  203. package/dist/env_value.cjs.map +1 -1
  204. package/dist/env_value.d.ts.map +1 -0
  205. package/dist/env_value.js +1 -1
  206. package/dist/env_value.js.map +1 -1
  207. package/dist/filters/converters/filterToQuery.cjs +3 -4
  208. package/dist/filters/converters/filterToQuery.cjs.map +1 -1
  209. package/dist/filters/converters/filterToQuery.d.ts.map +1 -0
  210. package/dist/filters/converters/filterToQuery.js +1 -2
  211. package/dist/filters/converters/filterToQuery.js.map +1 -1
  212. package/dist/filters/converters/filterUiToExpressionImpl.cjs +3 -4
  213. package/dist/filters/converters/filterUiToExpressionImpl.cjs.map +1 -1
  214. package/dist/filters/converters/filterUiToExpressionImpl.d.ts.map +1 -0
  215. package/dist/filters/converters/filterUiToExpressionImpl.js +1 -2
  216. package/dist/filters/converters/filterUiToExpressionImpl.js.map +1 -1
  217. package/dist/filters/converters/index.cjs +2 -2
  218. package/dist/filters/converters/index.js +2 -2
  219. package/dist/filters/distill.cjs +3 -4
  220. package/dist/filters/distill.cjs.map +1 -1
  221. package/dist/filters/distill.d.ts.map +1 -0
  222. package/dist/filters/distill.js +1 -2
  223. package/dist/filters/distill.js.map +1 -1
  224. package/dist/filters/index.cjs +4 -4
  225. package/dist/filters/index.d.ts +0 -1
  226. package/dist/filters/index.js +3 -3
  227. package/dist/filters/traverse.cjs +1 -2
  228. package/dist/filters/traverse.cjs.map +1 -1
  229. package/dist/filters/traverse.js +1 -1
  230. package/dist/filters/traverse.js.map +1 -1
  231. package/dist/filters/types.d.ts.map +1 -0
  232. package/dist/index.cjs +89 -83
  233. package/dist/index.d.ts +8 -15
  234. package/dist/index.js +8 -9
  235. package/dist/internal.cjs +1 -2
  236. package/dist/internal.cjs.map +1 -1
  237. package/dist/internal.js +1 -1
  238. package/dist/internal.js.map +1 -1
  239. package/dist/labels/derive_distinct_labels.cjs +41 -30
  240. package/dist/labels/derive_distinct_labels.cjs.map +1 -1
  241. package/dist/labels/derive_distinct_labels.d.ts +15 -15
  242. package/dist/labels/derive_distinct_labels.d.ts.map +1 -0
  243. package/dist/labels/derive_distinct_labels.js +40 -29
  244. package/dist/labels/derive_distinct_labels.js.map +1 -1
  245. package/dist/labels/index.cjs +1 -2
  246. package/dist/labels/index.d.ts +1 -2
  247. package/dist/labels/index.js +1 -2
  248. package/dist/package.cjs +7 -8
  249. package/dist/package.js +2 -2
  250. package/dist/pframe.cjs +2 -3
  251. package/dist/pframe.cjs.map +1 -1
  252. package/dist/pframe.d.ts.map +1 -0
  253. package/dist/pframe.js +1 -2
  254. package/dist/pframe.js.map +1 -1
  255. package/dist/pframe_utils/axes.cjs +2 -3
  256. package/dist/pframe_utils/axes.cjs.map +1 -1
  257. package/dist/pframe_utils/axes.d.ts +0 -1
  258. package/dist/pframe_utils/axes.d.ts.map +1 -0
  259. package/dist/pframe_utils/axes.js +1 -2
  260. package/dist/pframe_utils/axes.js.map +1 -1
  261. package/dist/pframe_utils/columns.cjs +5 -6
  262. package/dist/pframe_utils/columns.cjs.map +1 -1
  263. package/dist/pframe_utils/columns.d.ts +0 -1
  264. package/dist/pframe_utils/columns.d.ts.map +1 -0
  265. package/dist/pframe_utils/columns.js +1 -2
  266. package/dist/pframe_utils/columns.js.map +1 -1
  267. package/dist/pframe_utils/index.cjs +3 -4
  268. package/dist/pframe_utils/index.cjs.map +1 -1
  269. package/dist/pframe_utils/index.d.ts.map +1 -0
  270. package/dist/pframe_utils/index.js +2 -3
  271. package/dist/pframe_utils/index.js.map +1 -1
  272. package/dist/platforma.d.ts.map +1 -0
  273. package/dist/plugin_handle.cjs +1 -2
  274. package/dist/plugin_handle.cjs.map +1 -1
  275. package/dist/plugin_handle.d.ts.map +1 -0
  276. package/dist/plugin_handle.js +1 -1
  277. package/dist/plugin_model.cjs +3 -4
  278. package/dist/plugin_model.cjs.map +1 -1
  279. package/dist/plugin_model.d.ts +0 -1
  280. package/dist/plugin_model.d.ts.map +1 -0
  281. package/dist/plugin_model.js +1 -2
  282. package/dist/plugin_model.js.map +1 -1
  283. package/dist/raw_globals.cjs +3 -4
  284. package/dist/raw_globals.cjs.map +1 -1
  285. package/dist/raw_globals.d.ts.map +1 -0
  286. package/dist/raw_globals.js +1 -2
  287. package/dist/raw_globals.js.map +1 -1
  288. package/dist/ref_util.cjs +3 -4
  289. package/dist/ref_util.cjs.map +1 -1
  290. package/dist/ref_util.d.ts +0 -2
  291. package/dist/ref_util.d.ts.map +1 -0
  292. package/dist/ref_util.js +1 -2
  293. package/dist/ref_util.js.map +1 -1
  294. package/dist/render/accessor.cjs +4 -5
  295. package/dist/render/accessor.cjs.map +1 -1
  296. package/dist/render/accessor.d.ts.map +1 -0
  297. package/dist/render/accessor.js +1 -2
  298. package/dist/render/accessor.js.map +1 -1
  299. package/dist/render/api.cjs +20 -14
  300. package/dist/render/api.cjs.map +1 -1
  301. package/dist/render/api.d.ts +2 -3
  302. package/dist/render/api.d.ts.map +1 -0
  303. package/dist/render/api.js +11 -5
  304. package/dist/render/api.js.map +1 -1
  305. package/dist/render/future.cjs +2 -3
  306. package/dist/render/future.cjs.map +1 -1
  307. package/dist/render/future.d.ts.map +1 -0
  308. package/dist/render/future.js +1 -2
  309. package/dist/render/future.js.map +1 -1
  310. package/dist/render/index.cjs +8 -8
  311. package/dist/render/index.d.ts +1 -2
  312. package/dist/render/index.js +7 -7
  313. package/dist/render/internal.cjs +7 -9
  314. package/dist/render/internal.cjs.map +1 -1
  315. package/dist/render/internal.d.ts.map +1 -0
  316. package/dist/render/internal.js +1 -2
  317. package/dist/render/internal.js.map +1 -1
  318. package/dist/render/traversal_ops.d.ts.map +1 -0
  319. package/dist/render/util/axis_filtering.cjs +1 -2
  320. package/dist/render/util/axis_filtering.cjs.map +1 -1
  321. package/dist/render/util/axis_filtering.d.ts.map +1 -0
  322. package/dist/render/util/axis_filtering.js +1 -1
  323. package/dist/render/util/column_collection.cjs +8 -9
  324. package/dist/render/util/column_collection.cjs.map +1 -1
  325. package/dist/render/util/column_collection.d.ts +0 -1
  326. package/dist/render/util/column_collection.d.ts.map +1 -0
  327. package/dist/render/util/column_collection.js +4 -5
  328. package/dist/render/util/column_collection.js.map +1 -1
  329. package/dist/render/util/index.cjs +4 -4
  330. package/dist/render/util/index.js +4 -4
  331. package/dist/render/util/label.cjs +4 -5
  332. package/dist/render/util/label.cjs.map +1 -1
  333. package/dist/render/util/label.d.ts.map +1 -0
  334. package/dist/render/util/label.js +3 -4
  335. package/dist/render/util/label.js.map +1 -1
  336. package/dist/render/util/pcolumn_data.cjs +9 -10
  337. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  338. package/dist/render/util/pcolumn_data.d.ts +2 -2
  339. package/dist/render/util/pcolumn_data.d.ts.map +1 -0
  340. package/dist/render/util/pcolumn_data.js +7 -8
  341. package/dist/render/util/pcolumn_data.js.map +1 -1
  342. package/dist/render/util/pframe_upgraders.cjs +1 -2
  343. package/dist/render/util/pframe_upgraders.cjs.map +1 -1
  344. package/dist/render/util/pframe_upgraders.js +1 -1
  345. package/dist/render/util/split_selectors.d.ts.map +1 -0
  346. package/dist/services/block_services.cjs +2 -3
  347. package/dist/services/block_services.cjs.map +1 -1
  348. package/dist/services/block_services.d.ts +2 -2
  349. package/dist/services/block_services.d.ts.map +1 -0
  350. package/dist/services/block_services.js +1 -2
  351. package/dist/services/block_services.js.map +1 -1
  352. package/dist/services/index.cjs +2 -2
  353. package/dist/services/index.js +2 -2
  354. package/dist/services/service_bridge.cjs +1 -2
  355. package/dist/services/service_bridge.cjs.map +1 -1
  356. package/dist/services/service_bridge.d.ts.map +1 -0
  357. package/dist/services/service_bridge.js +1 -1
  358. package/dist/services/service_resolve.d.ts.map +1 -0
  359. package/dist/version.cjs +2 -4
  360. package/dist/version.cjs.map +1 -1
  361. package/dist/version.d.ts.map +1 -0
  362. package/dist/version.js +1 -2
  363. package/dist/version.js.map +1 -1
  364. package/package.json +13 -13
  365. package/src/columns/column_collection_builder.test.ts +40 -27
  366. package/src/columns/column_collection_builder.ts +176 -131
  367. package/src/columns/column_selector.test.ts +17 -399
  368. package/src/columns/column_selector.ts +14 -127
  369. package/src/columns/column_snapshot.ts +5 -5
  370. package/src/columns/column_snapshot_provider.ts +11 -10
  371. package/src/columns/ctx_column_sources.ts +2 -2
  372. package/src/columns/expand_by_partition.test.ts +4 -4
  373. package/src/columns/expand_by_partition.ts +4 -3
  374. package/src/columns/index.ts +1 -0
  375. package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +42 -0
  376. package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +89 -0
  377. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +39 -11
  378. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +502 -313
  379. package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +122 -0
  380. package/src/components/PlDataTable/createPlDataTable/index.ts +4 -2
  381. package/src/components/PlDataTable/createPlDataTable/utils.test.ts +257 -0
  382. package/src/components/PlDataTable/createPlDataTable/utils.ts +160 -0
  383. package/src/components/PlDataTable/index.ts +13 -2
  384. package/src/components/PlDataTable/labels.ts +29 -18
  385. package/src/components/PlDataTable/state-migration.ts +3 -1
  386. package/src/components/PlDataTable/typesV5.ts +4 -4
  387. package/src/labels/derive_distinct_labels.test.ts +143 -45
  388. package/src/labels/derive_distinct_labels.ts +102 -49
  389. package/src/labels/index.ts +0 -1
  390. package/src/render/api.ts +15 -5
  391. package/src/render/util/column_collection.ts +4 -3
  392. package/src/render/util/label.ts +2 -2
  393. package/src/render/util/pcolumn_data.ts +5 -3
  394. package/dist/labels/write_labels_to_specs.cjs +0 -15
  395. package/dist/labels/write_labels_to_specs.cjs.map +0 -1
  396. package/dist/labels/write_labels_to_specs.d.ts +0 -9
  397. package/dist/labels/write_labels_to_specs.js +0 -14
  398. package/dist/labels/write_labels_to_specs.js.map +0 -1
  399. package/src/labels/write_labels_to_specs.ts +0 -12
@@ -1,39 +1,53 @@
1
+ import { DeriveLabelsOptions } from "../../../labels/derive_distinct_labels.js";
1
2
  import { RenderCtxBase } from "../../../render/api.js";
2
- import "../../../render/index.js";
3
3
  import { PlDataTableFilters, PlDataTableModel } from "../typesV5.js";
4
4
  import { PlDataTableStateV2 } from "../state-migration.js";
5
- import { ColumnSource } from "../../../columns/column_snapshot_provider.js";
6
- import { MatchingMode } from "../../../columns/column_collection_builder.js";
7
- import "../../../columns/index.js";
8
- import { Annotation, DataInfo, MultiColumnSelector, PColumn, PColumnIdAndSpec, PColumnSpec, PColumnValues, PObjectId, PTableColumnId, PTableDefV2, PTableSorting, PlRef, RequireServices, Services, SpecQueryExpression } from "@milaboratories/pl-model-common";
5
+ import { ColumnSnapshot } from "../../../columns/column_snapshot.js";
6
+ import { ColumnMatch, MatchingMode } from "../../../columns/column_collection_builder.js";
7
+ import { DiscoveredTableColumnOptions } from "./discoverColumns.js";
8
+ import { MultiColumnSelector, PColumnSpec, PObjectId, PTableSorting, RequireServices, SUniversalPColumnId, Services } from "@milaboratories/pl-model-common";
9
+ import { Nil } from "@milaboratories/helpers";
9
10
 
10
11
  //#region src/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts
11
- /** Check if column should be omitted from the table */
12
- declare function isColumnHidden(spec: {
13
- annotations?: Annotation;
14
- }): boolean;
15
- /** Check if column is hidden by default */
16
- declare function isColumnOptional(spec: {
17
- annotations?: Annotation;
18
- }): boolean;
12
+ type createPlDataTableOptionsV3 = ({
13
+ discoverColumnOptions: DiscoveredTableColumnOptions;
14
+ } | {
15
+ columns: Nil | TableColumnSnapshot<SUniversalPColumnId>[];
16
+ }) & {
17
+ filters?: PlDataTableFilters;
18
+ sorting?: PTableSorting[];
19
+ primaryJoinType?: "inner" | "full";
20
+ tableState?: PlDataTableStateV2;
21
+ labelsOptions?: DeriveLabelsOptions;
22
+ columnsDisplayOptions?: ColumnsDisplayOptions;
23
+ };
19
24
  /** Structured source config — selectors/anchors instead of raw ColumnSource. */
20
25
  type ColumnsSelectorConfig = {
21
26
  include?: MultiColumnSelector | MultiColumnSelector[];
22
27
  exclude?: MultiColumnSelector | MultiColumnSelector[];
23
- anchors?: Record<string, PlRef | PObjectId | PColumnSpec>;
24
28
  mode?: MatchingMode;
25
29
  maxHops?: number;
26
30
  };
27
- type createPlDataTableOptionsV3 = {
28
- source?: ColumnSource | ColumnSource[];
29
- columns: ColumnsSelectorConfig;
30
- filters?: PlDataTableFilters;
31
- sorting?: PTableSorting[];
32
- coreJoinType?: "inner" | "full";
33
- coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;
34
- state?: PlDataTableStateV2;
31
+ type ColumnsDisplayOptions = {
32
+ /** Column ordering rules. Higher priority = further left. First matching rule wins. */ordering?: ColumnOrderRule[]; /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */
33
+ visibility?: ColumnVisibilityRule[];
34
+ };
35
+ type ColumnOrderRule = {
36
+ match: ColumnMatcher; /** Higher number = further left in table */
37
+ priority: number;
35
38
  };
39
+ type ColumnVisibilityRule = {
40
+ match: ColumnMatcher;
41
+ visibility: "default" | "optional" | "hidden";
42
+ };
43
+ type ColumnMatcher = (spec: PColumnSpec) => boolean;
36
44
  declare function createPlDataTableV3<A, U, S extends RequireServices<typeof Services.PFrameSpec>>(ctx: RenderCtxBase<A, U, S>, options: createPlDataTableOptionsV3): PlDataTableModel | undefined;
45
+ /** A single column discovered from sources — normalized from raw ColumnSnapshot/ColumnMatch. */
46
+ type TableColumnSnapshot<Id extends PObjectId | SUniversalPColumnId> = ColumnSnapshot<Id> & {
47
+ readonly isPrimary?: boolean;
48
+ readonly originalId?: PObjectId;
49
+ readonly linkerPath?: ColumnMatch["path"];
50
+ };
37
51
  //#endregion
38
- export { createPlDataTableOptionsV3, createPlDataTableV3, isColumnHidden, isColumnOptional };
52
+ export { ColumnMatcher, ColumnOrderRule, ColumnVisibilityRule, ColumnsDisplayOptions, ColumnsSelectorConfig, TableColumnSnapshot, createPlDataTableOptionsV3, createPlDataTableV3 };
39
53
  //# sourceMappingURL=createPlDataTableV3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPlDataTableV3.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"mappings":";;;;;;;;;;;KA0CY,0BAAA;EAEN,qBAAA,EAAuB,4BAAA;AAAA;EAGvB,OAAA,EAAS,GAAA,GAAM,mBAAA,CAAoB,mBAAA;AAAA;EAGvC,OAAA,GAAU,kBAAA;EACV,OAAA,GAAU,aAAA;EACV,eAAA;EAEA,UAAA,GAAa,kBAAA;EACb,aAAA,GAAgB,mBAAA;EAChB,qBAAA,GAAwB,qBAAA;AAAA;;KAId,qBAAA;EACV,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,OAAA,GAAU,mBAAA,GAAsB,mBAAA;EAChC,IAAA,GAAO,YAAA;EACP,OAAA;AAAA;AAAA,KAGU,qBAAA;EApBN,uFAsBJ,QAAA,GAAW,eAAA,IAtBQ;EAwBnB,UAAA,GAAa,oBAAA;AAAA;AAAA,KAGH,eAAA;EACV,KAAA,EAAO,aAAA,EAxBG;EA0BV,QAAA;AAAA;AAAA,KAGU,oBAAA;EACV,KAAA,EAAO,aAAA;EACP,UAAA;AAAA;AAAA,KAGU,aAAA,IAAiB,IAAA,EAAM,WAAA;AAAA,iBAInB,mBAAA,iBAAoC,eAAA,QAAuB,QAAA,CAAS,UAAA,EAAA,CAClF,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,CAAA,GACzB,OAAA,EAAS,0BAAA,GACR,gBAAA;;KA2HS,mBAAA,YAA+B,SAAA,GAAY,mBAAA,IAAuB,cAAA,CAAe,EAAA;EAAA,SAClF,SAAA;EAAA,SACA,UAAA,GAAa,SAAA;EAAA,SACb,UAAA,GAAa,WAAA;AAAA"}
@@ -1,200 +1,284 @@
1
- import { allPColumnsReady } from "../../../render/util/pcolumn_data.js";
2
- import "../../../render/index.js";
3
- import { collectFilterSpecColumns } from "../../../filters/traverse.js";
4
- import { filterSpecToSpecQueryExpr } from "../../../filters/converters/filterToQuery.js";
5
- import { distillFilterSpec } from "../../../filters/distill.js";
6
- import "../../../filters/index.js";
1
+ import { collectFilterSpecColumns, traverseFilterSpec } from "../../../filters/traverse.js";
7
2
  import { upgradePlDataTableStateV2 } from "../state-migration.js";
8
3
  import { getAllLabelColumns, getMatchingLabelColumns } from "../labels.js";
9
- import { isColumnSnapshotProvider } from "../../../columns/column_snapshot_provider.js";
10
- import { ColumnCollectionBuilder } from "../../../columns/column_collection_builder.js";
11
- import { collectCtxColumnSnapshotProviders } from "../../../columns/ctx_column_sources.js";
12
- import "../../../columns/index.js";
13
- import { Annotation, canonicalizeJson, getAxisId, getColumnIdAndSpec, isBooleanExpression, isLinkerColumn, parseJson, readAnnotation, uniqueBy } from "@milaboratories/pl-model-common";
4
+ import { createPTableDefV3 } from "./createPTableDefV3.js";
5
+ import { deriveAllLabels, isColumnHidden, isColumnOptional, withLabelAnnotations, withTableVisualAnnotations } from "./utils.js";
6
+ import { discoverTableColumnSnaphots } from "./discoverColumns.js";
7
+ import { canonicalizeJson, getAxisId, getColumnIdAndSpec, parseJson, uniqueBy } from "@milaboratories/pl-model-common";
8
+ import { isNil, throwError } from "@milaboratories/helpers";
14
9
  import { isEmpty } from "es-toolkit/compat";
15
- import { isFunction, isNil } from "es-toolkit";
16
-
17
10
  //#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
11
+ function createPlDataTableV3(ctx, options) {
12
+ const state = upgradePlDataTableStateV2(options.tableState);
13
+ const primaryJoinType = options.primaryJoinType ?? "full";
14
+ const discovered = "discoverColumnOptions" in options ? discoverTableColumnSnaphots(ctx, options.discoverColumnOptions) : options.columns;
15
+ if (isNil(discovered) || discovered.length === 0) return void 0;
16
+ const resolved = resolveDiscoveredColumns(splitDiscoveredColumns(discovered), discovered);
17
+ const labelColumns = getMatchingLabelColumns(resolved.all, getAllLabelColumns(ctx));
18
+ const annotated = annotateColumnGroups(resolved, labelColumns, deriveAllLabels({
19
+ columns: discovered.map((dc) => ({
20
+ id: dc.id,
21
+ spec: dc.spec,
22
+ linkerPath: dc.linkerPath?.map((lp) => ({ spec: lp.linker.spec }))
23
+ })),
24
+ labelColumns,
25
+ deriveLabelsOptions: {
26
+ includeNativeLabel: true,
27
+ ...options.labelsOptions
28
+ }
29
+ }), options.columnsDisplayOptions);
30
+ const columnIsAvailable = createColumnValidationById([
31
+ ...annotated.direct,
32
+ ...annotated.linked.flatMap((lc) => [...annotated.linkers.get(lc.id) ?? [], lc]),
33
+ ...annotated.labels
34
+ ]);
35
+ const filters = mergeFilters(state.pTableParams.filters, remapFilterColumnIds(options.filters, discovered));
36
+ validateFilters(filters, columnIsAvailable);
37
+ const sorting = resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered));
38
+ validateSorting(sorting, columnIsAvailable);
39
+ const primaryColumnIds = new Set(discovered.filter((dc) => dc.isPrimary).map((dc) => dc.id));
40
+ const primaryColumns = annotated.direct.filter((c) => primaryColumnIds.has(c.id));
41
+ const secondaryColumns = annotated.direct.filter((c) => !primaryColumnIds.has(c.id));
42
+ if (primaryColumns.length === 0) return void 0;
43
+ const fullDef = createPTableDefV3({
44
+ primaryJoinType,
45
+ primaryColumns,
46
+ secondaryGroups: [
47
+ ...secondaryColumns.map((c) => [c]),
48
+ ...annotated.linked.map((lc) => [...annotated.linkers.get(lc.id) ?? [], lc]),
49
+ ...annotated.labels.map((c) => [c])
50
+ ],
51
+ filters,
52
+ sorting
53
+ });
54
+ const fullHandle = ctx.createPTableV2(fullDef);
55
+ const pframeHandle = ctx.createPFrame([
56
+ ...annotated.direct,
57
+ ...annotated.linked,
58
+ ...annotated.labels,
59
+ ...uniqueBy([...annotated.linkers.values()].flat(), (c) => c.id)
60
+ ]);
61
+ if (!fullHandle || !pframeHandle) return void 0;
62
+ const hiddenSpecs = state.pTableParams.hiddenColIds;
63
+ const hiddenColumnIds = computeHiddenColumns([...annotated.direct, ...annotated.linked], sorting, filters, hiddenSpecs);
64
+ const visible = buildVisibleColumns(annotated, hiddenColumnIds, labelColumns);
65
+ const visibleNonCoreDirect = secondaryColumns.filter((c) => !hiddenColumnIds.has(c.id));
66
+ const visibleLinkedGroups = buildVisibleLinkedGroups(visible.direct, visible.linked, annotated.linkers, hiddenSpecs);
67
+ const visibleDef = createPTableDefV3({
68
+ primaryJoinType,
69
+ primaryColumns,
70
+ secondaryGroups: [
71
+ ...visibleNonCoreDirect.map((c) => [c]),
72
+ ...visibleLinkedGroups,
73
+ ...visible.labels.map((c) => [c])
74
+ ],
75
+ filters,
76
+ sorting
77
+ });
78
+ const visibleHandle = ctx.createPTableV2(visibleDef);
79
+ if (!visibleHandle) return void 0;
80
+ return {
81
+ sourceId: state.pTableParams.sourceId,
82
+ fullTableHandle: fullHandle,
83
+ fullPframeHandle: pframeHandle,
84
+ visibleTableHandle: visibleHandle
23
85
  };
86
+ }
87
+ /** Split discovered columns into direct (no linker path) and linked (with linker path). */
88
+ function splitDiscoveredColumns(columns) {
24
89
  return {
25
- type: "columnRef",
26
- value: col.id
90
+ direct: columns.filter((dc) => isNil(dc.linkerPath) || dc.linkerPath.length === 0),
91
+ linked: columns.filter((dc) => !isNil(dc.linkerPath) && dc.linkerPath.length > 0)
27
92
  };
28
93
  }
29
- /** Wrap a SpecQuery as a SpecQueryJoinEntry with empty qualifications. */
30
- function joinEntry(input) {
94
+ /** Resolve DiscoveredColumn snapshots into PColumn objects with lazily-evaluated data. */
95
+ function resolveDiscoveredColumns(split, allDiscovered) {
96
+ const linked = split.linked.map(resolveSnapshot);
97
+ const linkers = new Map(split.linked.filter((dc) => !isNil(dc.linkerPath)).map((dc, i) => [linked[i].id, dc.linkerPath.map((s) => resolveSnapshot(s.linker))]));
31
98
  return {
32
- entry: input,
33
- qualifications: []
99
+ all: allDiscovered.map(resolveSnapshot),
100
+ direct: split.direct.map(resolveSnapshot),
101
+ linked,
102
+ linkers
34
103
  };
35
104
  }
36
- function createPTableDef(params) {
37
- let coreColumns = params.columns;
38
- const secondaryColumns = [];
39
- if (isFunction(params.coreColumnPredicate)) {
40
- coreColumns = [];
41
- for (const c of params.columns) if (params.coreColumnPredicate(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
- }))
105
+ /** Annotate all column groups with derived labels and display options. */
106
+ function annotateColumnGroups(resolved, labelColumns, derivedLabels, displayOptions) {
107
+ return {
108
+ direct: withTableVisualAnnotations(displayOptions, withLabelAnnotations(derivedLabels, resolved.direct)),
109
+ linked: withTableVisualAnnotations(displayOptions, withLabelAnnotations(derivedLabels, resolved.linked)),
110
+ linkers: new Map([...resolved.linkers].map(([id, cols]) => [id, withLabelAnnotations(derivedLabels, cols)])),
111
+ labels: withLabelAnnotations(derivedLabels, labelColumns)
58
112
  };
59
- if (params.filters !== null) {
60
- const nonEmpty = distillFilterSpec(params.filters);
61
- if (!isNil(nonEmpty)) {
62
- const pridicate = filterSpecToSpecQueryExpr(nonEmpty);
63
- if (!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
- }))
113
+ }
114
+ /** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */
115
+ function createColumnValidationById(fullColumns) {
116
+ const allIds = [...uniqueBy(fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)), (a) => canonicalizeJson(a)).map((a) => ({
117
+ type: "axis",
118
+ id: a
119
+ })), ...fullColumns.map((c) => ({
120
+ type: "column",
121
+ id: c.id
122
+ }))];
123
+ const validIdSet = new Set(allIds.map((c) => canonicalizeJson(c)));
124
+ return (id) => {
125
+ return validIdSet.has(id);
79
126
  };
80
- return { query };
81
127
  }
82
- /** Check if column should be omitted from the table */
83
- function isColumnHidden(spec) {
84
- return readAnnotation(spec, Annotation.Table.Visibility) === "hidden";
128
+ /** Merge filters from table state and options into a single filter spec. */
129
+ function mergeFilters(stateFilters, optionsFilters) {
130
+ const normalized = optionsFilters ?? null;
131
+ return stateFilters !== null && normalized !== null ? {
132
+ type: "and",
133
+ filters: [stateFilters, normalized]
134
+ } : stateFilters ?? normalized;
85
135
  }
86
- /** Check if column is hidden by default */
87
- function isColumnOptional(spec) {
88
- return readAnnotation(spec, Annotation.Table.Visibility) === "optional";
136
+ /** Validate that all column references in filters exist in the table. */
137
+ function validateFilters(filters, isValidColumnId) {
138
+ if (filters == null) return;
139
+ const firstInvalid = collectFilterSpecColumns(filters).find((col) => !isValidColumnId(col));
140
+ if (firstInvalid !== void 0) throw new Error(`Invalid filter column ${firstInvalid}: column reference does not match the table columns`);
89
141
  }
90
- function createPlDataTableV3(ctx, options) {
91
- const providers = options.source ? normalizeSourceList(options.source).filter(isColumnSnapshotProvider) : collectCtxColumnSnapshotProviders(ctx);
92
- if (providers.length === 0) return void 0;
93
- const builder = new ColumnCollectionBuilder(ctx.services.pframeSpec).addSources(providers);
94
- const anchors = options.columns.anchors;
95
- const collection = isNil(anchors) ? builder.build() : builder.build({ anchors });
96
- if (!collection) return void 0;
97
- 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
- });
142
+ /** Pick user sorting from state if non-empty, otherwise fall back to options default. */
143
+ function resolveSorting(userSorting, defaultSorting) {
144
+ return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];
145
+ }
146
+ /** Validate that all column references in sorting exist in the table. */
147
+ function validateSorting(sorting, isValidColumnId) {
148
+ const firstInvalid = sorting.find((s) => !isValidColumnId(canonicalizeJson(s.column)));
149
+ if (firstInvalid !== void 0) throw new Error(`Invalid sorting column ${JSON.stringify(firstInvalid.column)}: column reference does not match the table columns`);
150
+ }
151
+ /** Determine which columns should be hidden based on state or optional-column defaults. */
152
+ function computeHiddenColumns(columns, sorting, filters, hiddenSpecs) {
153
+ const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);
154
+ const optionalHidden = !isNil(hiddenSpecs) ? hiddenSpecs.filter((s) => s.type === "column").map((s) => s.id) : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);
155
+ const initial = [...alwaysHidden, ...optionalHidden];
156
+ const preserved = collectPreservedColumnIds(sorting, filters);
157
+ return new Set(initial.filter((id) => !preserved.has(id)));
158
+ }
159
+ /**
160
+ * Build visible linked column groups. Non-hidden groups are included fully;
161
+ * hidden groups are trimmed to only the prefix that brings axes not yet
162
+ * covered by earlier groups (visible or previously trimmed).
163
+ */
164
+ function buildVisibleLinkedGroups(direct, linked, linkers, hiddenSpecs) {
165
+ const result = [];
166
+ const coveredAxisIds = /* @__PURE__ */ new Set();
167
+ const collectAxes = (group) => {
168
+ for (const col of group) for (const as of col.spec.axesSpec) coveredAxisIds.add(canonicalizeJson(getAxisId(as)));
169
+ };
170
+ collectAxes(direct);
171
+ for (const lc of linked) {
172
+ const group = [...linkers.get(lc.id) ?? [], lc];
173
+ result.push(group);
174
+ collectAxes(group);
175
+ }
176
+ for (const group of linkers.values()) {
177
+ const trimmed = trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds);
178
+ if (trimmed.length > 0) {
179
+ result.push(trimmed);
180
+ collectAxes(trimmed);
116
181
  }
117
- const tableStateNormalized = upgradePlDataTableStateV2(options.state);
118
- const allLabelColumns = getAllLabelColumns(ctx.resultPool);
119
- if (!allLabelColumns) return void 0;
120
- const fullLabelColumns = getMatchingLabelColumns(columns.map(getColumnIdAndSpec), allLabelColumns);
121
- const fullColumns = [...columns, ...fullLabelColumns];
122
- const fullColumnsIds = [...uniqueBy(fullColumns.flatMap((c) => c.spec.axesSpec.map((a) => getAxisId(a))), (a) => 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) => 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 ? 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 = (isEmpty(userSorting) ? options?.sorting : userSorting) ?? [];
141
- const firstInvalidSortingColumn = sorting.find((s) => !isValidColumnId(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) => isLinkerColumn(c.spec)).forEach((c) => hiddenColumns.delete(c.id));
162
- const coreColumnPredicate = options?.coreColumnPredicate;
163
- if (coreColumnPredicate) columns.flatMap((c) => coreColumnPredicate(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) collectFilterSpecColumns(filters).flatMap((c) => {
166
- const obj = 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 = getMatchingLabelColumns(visibleColumns.map(getColumnIdAndSpec), allLabelColumns);
171
- if (!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;
182
+ }
183
+ return result;
184
+ }
185
+ /**
186
+ * For a linked column group [linker1, ..., linkerN, column], find the rightmost
187
+ * element that has at least one non-hidden and not-yet-covered axis.
188
+ * Return the prefix up to and including that element.
189
+ * If no element has such an axis, return empty array.
190
+ */
191
+ function trimGroupByVisibleAxes(group, hiddenSpecs, coveredAxisIds) {
192
+ if (hiddenSpecs === null) return group;
193
+ const hiddenAxisIds = new Set(hiddenSpecs.filter((s) => s.type === "axis").map((s) => canonicalizeJson(s.id)));
194
+ const uncoveredAxisIds = new Set(group.flatMap((c) => c.spec.axesSpec.map((as) => canonicalizeJson(getAxisId(as)))).filter((id) => !hiddenAxisIds.has(id) && !coveredAxisIds.has(id)));
195
+ let lastNeeded = -1;
196
+ for (let i = 0; i < group.length; i++) {
197
+ const newAxes = group[i].spec.axesSpec.map((as) => canonicalizeJson(getAxisId(as))).filter((id) => uncoveredAxisIds.has(id));
198
+ if (newAxes.length > 0) {
199
+ for (const id of newAxes) uncoveredAxisIds.delete(id);
200
+ lastNeeded = i;
201
+ }
202
+ }
203
+ return lastNeeded === -1 ? [] : group.slice(0, lastNeeded + 1);
204
+ }
205
+ /** Collect IDs of columns that must remain visible (sorted, filtered). */
206
+ function collectPreservedColumnIds(sorting, filters) {
207
+ const sortedIds = (sorting ?? []).map((s) => s.column).filter((c) => c.type === "column").map((c) => c.id);
208
+ const filterIds = !isNil(filters) ? collectFilterSpecColumns(filters).flatMap((c) => {
209
+ const obj = parseJson(c);
210
+ return obj.type === "column" ? [obj.id] : [];
211
+ }) : [];
212
+ return new Set([...sortedIds, ...filterIds]);
213
+ }
214
+ /** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */
215
+ function buildVisibleColumns(annotated, hiddenColumns, originalLabelColumns) {
216
+ const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.id));
217
+ const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.id));
218
+ return {
219
+ direct,
220
+ linked,
221
+ labels: getMatchingLabelColumns([...direct, ...linked].map(getColumnIdAndSpec), originalLabelColumns)
222
+ };
223
+ }
224
+ /** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */
225
+ function resolveSnapshot(snap) {
226
+ return {
227
+ id: snap.id,
228
+ spec: snap.spec,
229
+ data: snap.data?.get()
230
+ };
231
+ }
232
+ /** Remap column references in sorting entries. */
233
+ function remapSortingColumnIds(sorting, columns) {
234
+ return sorting?.map((s) => {
235
+ if (s.column.type === "axis") return s;
236
+ const id = s.column.id;
237
+ const column = columns.find((c) => (c.originalId ?? c.id) === id) ?? throwError(`Column ID "${id}" in sorting does not match any discovered column`);
182
238
  return {
183
- sourceId: tableStateNormalized.pTableParams.sourceId,
184
- fullTableHandle: fullHandle,
185
- fullPframeHandle: pframeHandle,
186
- visibleTableHandle: visibleHandle
239
+ ...s,
240
+ column: {
241
+ type: "column",
242
+ id: column.id
243
+ }
187
244
  };
188
- } finally {
189
- collection.dispose();
190
- }
245
+ });
191
246
  }
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]) || isColumnSnapshotProvider(source[0]))) return source;
195
- return [source];
247
+ /** Remap column references in a filter tree. */
248
+ function remapFilterColumnIds(filters, columns) {
249
+ if (isNil(filters)) return filters;
250
+ const map = (tableColumnId) => {
251
+ const parsed = parseJson(tableColumnId);
252
+ if (parsed.type === "axis") return tableColumnId;
253
+ const originalId = parsed.id;
254
+ return canonicalizeJson({
255
+ type: "column",
256
+ id: (columns.find((c) => (c.originalId ?? c.id) === originalId) ?? throwError(`Column ID "${parsed.id}" in filters does not match any discovered column`)).id
257
+ });
258
+ };
259
+ return traverseFilterSpec(filters, {
260
+ leaf: (leaf) => {
261
+ if (leaf.type === void 0) return leaf;
262
+ const result = { ...leaf };
263
+ if ("column" in result) result.column = map(result.column);
264
+ if ("rhs" in result) result.rhs = map(result.rhs);
265
+ return result;
266
+ },
267
+ and: (results) => ({
268
+ type: "and",
269
+ filters: results
270
+ }),
271
+ or: (results) => ({
272
+ type: "or",
273
+ filters: results
274
+ }),
275
+ not: (result) => ({
276
+ type: "not",
277
+ filter: result
278
+ })
279
+ });
196
280
  }
197
-
198
281
  //#endregion
199
- export { createPTableDef, createPlDataTableV3, isColumnHidden, isColumnOptional };
282
+ export { createPlDataTableV3 };
283
+
200
284
  //# sourceMappingURL=createPlDataTableV3.js.map