@platforma-sdk/model 1.79.27 → 1.80.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/dist/block_model.d.ts +2 -0
  2. package/dist/block_model.d.ts.map +1 -1
  3. package/dist/columns/column.cjs +28 -0
  4. package/dist/columns/column.cjs.map +1 -0
  5. package/dist/columns/column.d.ts +30 -0
  6. package/dist/columns/column.d.ts.map +1 -0
  7. package/dist/columns/column.js +27 -0
  8. package/dist/columns/column.js.map +1 -0
  9. package/dist/columns/column_lazy.cjs +248 -0
  10. package/dist/columns/column_lazy.cjs.map +1 -0
  11. package/dist/columns/column_lazy.d.ts +137 -0
  12. package/dist/columns/column_lazy.d.ts.map +1 -0
  13. package/dist/columns/column_lazy.js +245 -0
  14. package/dist/columns/column_lazy.js.map +1 -0
  15. package/dist/columns/column_providers/index.cjs +62 -0
  16. package/dist/columns/column_providers/index.cjs.map +1 -0
  17. package/dist/columns/column_providers/index.d.ts +30 -0
  18. package/dist/columns/column_providers/index.d.ts.map +1 -0
  19. package/dist/columns/column_providers/index.js +53 -0
  20. package/dist/columns/column_providers/index.js.map +1 -0
  21. package/dist/columns/column_providers/providers.cjs +123 -0
  22. package/dist/columns/column_providers/providers.cjs.map +1 -0
  23. package/dist/columns/column_providers/providers.d.ts +75 -0
  24. package/dist/columns/column_providers/providers.d.ts.map +1 -0
  25. package/dist/columns/column_providers/providers.js +118 -0
  26. package/dist/columns/column_providers/providers.js.map +1 -0
  27. package/dist/columns/column_providers/types.d.ts +23 -0
  28. package/dist/columns/column_providers/types.d.ts.map +1 -0
  29. package/dist/columns/column_recipes/column_discovered_recipe.cjs +180 -0
  30. package/dist/columns/column_recipes/column_discovered_recipe.cjs.map +1 -0
  31. package/dist/columns/column_recipes/column_discovered_recipe.d.ts +120 -0
  32. package/dist/columns/column_recipes/column_discovered_recipe.d.ts.map +1 -0
  33. package/dist/columns/column_recipes/column_discovered_recipe.js +180 -0
  34. package/dist/columns/column_recipes/column_discovered_recipe.js.map +1 -0
  35. package/dist/columns/column_recipes/column_filtered_recipe.cjs +133 -0
  36. package/dist/columns/column_recipes/column_filtered_recipe.cjs.map +1 -0
  37. package/dist/columns/column_recipes/column_filtered_recipe.d.ts +75 -0
  38. package/dist/columns/column_recipes/column_filtered_recipe.d.ts.map +1 -0
  39. package/dist/columns/column_recipes/column_filtered_recipe.js +133 -0
  40. package/dist/columns/column_recipes/column_filtered_recipe.js.map +1 -0
  41. package/dist/columns/column_recipes/column_overrided_recipe.cjs +101 -0
  42. package/dist/columns/column_recipes/column_overrided_recipe.cjs.map +1 -0
  43. package/dist/columns/column_recipes/column_overrided_recipe.d.ts +73 -0
  44. package/dist/columns/column_recipes/column_overrided_recipe.d.ts.map +1 -0
  45. package/dist/columns/column_recipes/column_overrided_recipe.js +101 -0
  46. package/dist/columns/column_recipes/column_overrided_recipe.js.map +1 -0
  47. package/dist/columns/column_recipes/index.cjs +72 -0
  48. package/dist/columns/column_recipes/index.cjs.map +1 -0
  49. package/dist/columns/column_recipes/index.d.ts +52 -0
  50. package/dist/columns/column_recipes/index.d.ts.map +1 -0
  51. package/dist/columns/column_recipes/index.js +68 -0
  52. package/dist/columns/column_recipes/index.js.map +1 -0
  53. package/dist/columns/column_recipes/leaf_rebrand.cjs +22 -0
  54. package/dist/columns/column_recipes/leaf_rebrand.cjs.map +1 -0
  55. package/dist/columns/column_recipes/leaf_rebrand.js +22 -0
  56. package/dist/columns/column_recipes/leaf_rebrand.js.map +1 -0
  57. package/dist/columns/column_recipes/types.d.ts +101 -0
  58. package/dist/columns/column_recipes/types.d.ts.map +1 -0
  59. package/dist/columns/columns_collection.cjs +124 -0
  60. package/dist/columns/columns_collection.cjs.map +1 -0
  61. package/dist/columns/columns_collection.d.ts +64 -0
  62. package/dist/columns/columns_collection.d.ts.map +1 -0
  63. package/dist/columns/columns_collection.js +122 -0
  64. package/dist/columns/columns_collection.js.map +1 -0
  65. package/dist/columns/derive_axis_values_labels.cjs +76 -0
  66. package/dist/columns/derive_axis_values_labels.cjs.map +1 -0
  67. package/dist/columns/derive_axis_values_labels.d.ts +30 -0
  68. package/dist/columns/derive_axis_values_labels.d.ts.map +1 -0
  69. package/dist/columns/derive_axis_values_labels.js +76 -0
  70. package/dist/columns/derive_axis_values_labels.js.map +1 -0
  71. package/dist/columns/expand_by_partition.cjs +53 -56
  72. package/dist/columns/expand_by_partition.cjs.map +1 -1
  73. package/dist/columns/expand_by_partition.d.ts +22 -18
  74. package/dist/columns/expand_by_partition.d.ts.map +1 -1
  75. package/dist/columns/expand_by_partition.js +55 -58
  76. package/dist/columns/expand_by_partition.js.map +1 -1
  77. package/dist/columns/index.cjs +44 -18
  78. package/dist/columns/index.d.ts +15 -7
  79. package/dist/columns/index.js +12 -6
  80. package/dist/columns/utils.cjs +186 -0
  81. package/dist/columns/utils.cjs.map +1 -0
  82. package/dist/columns/utils.d.ts +96 -0
  83. package/dist/columns/utils.d.ts.map +1 -0
  84. package/dist/columns/utils.js +179 -0
  85. package/dist/columns/utils.js.map +1 -0
  86. package/dist/components/PFrameForGraphs.cjs +1 -0
  87. package/dist/components/PFrameForGraphs.cjs.map +1 -1
  88. package/dist/components/PFrameForGraphs.d.ts +1 -1
  89. package/dist/components/PFrameForGraphs.d.ts.map +1 -1
  90. package/dist/components/PFrameForGraphs.js +1 -0
  91. package/dist/components/PFrameForGraphs.js.map +1 -1
  92. package/dist/components/PlDataTable/columnResolver.cjs +28 -0
  93. package/dist/components/PlDataTable/columnResolver.cjs.map +1 -0
  94. package/dist/components/PlDataTable/columnResolver.js +28 -0
  95. package/dist/components/PlDataTable/columnResolver.js.map +1 -0
  96. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs +4 -2
  97. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
  98. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js +4 -2
  99. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
  100. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs +20 -25
  101. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
  102. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js +20 -25
  103. package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
  104. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs +58 -26
  105. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
  106. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +1 -1
  107. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts.map +1 -1
  108. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js +60 -28
  109. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
  110. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs +224 -194
  111. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
  112. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +13 -16
  113. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts.map +1 -1
  114. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js +228 -198
  115. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
  116. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs +40 -98
  117. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.cjs.map +1 -1
  118. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +17 -8
  119. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts.map +1 -1
  120. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js +40 -98
  121. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.js.map +1 -1
  122. package/dist/components/PlDataTable/createPlDataTable/index.cjs +1 -1
  123. package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
  124. package/dist/components/PlDataTable/createPlDataTable/index.d.ts +2 -2
  125. package/dist/components/PlDataTable/createPlDataTable/index.js +2 -2
  126. package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
  127. package/dist/components/PlDataTable/createPlDataTable/utils.cjs +51 -169
  128. package/dist/components/PlDataTable/createPlDataTable/utils.cjs.map +1 -1
  129. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts +1 -1
  130. package/dist/components/PlDataTable/createPlDataTable/utils.d.ts.map +1 -1
  131. package/dist/components/PlDataTable/createPlDataTable/utils.js +52 -166
  132. package/dist/components/PlDataTable/createPlDataTable/utils.js.map +1 -1
  133. package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
  134. package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +1 -1
  135. package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -1
  136. package/dist/components/PlDataTable/index.cjs +1 -1
  137. package/dist/components/PlDataTable/index.d.ts +4 -4
  138. package/dist/components/PlDataTable/index.js +2 -2
  139. package/dist/components/PlDataTable/labels.cjs +0 -1
  140. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  141. package/dist/components/PlDataTable/labels.js +0 -1
  142. package/dist/components/PlDataTable/labels.js.map +1 -1
  143. package/dist/components/PlDataTable/state-migration.cjs +107 -10
  144. package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
  145. package/dist/components/PlDataTable/state-migration.d.ts +5 -4
  146. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
  147. package/dist/components/PlDataTable/state-migration.js +107 -10
  148. package/dist/components/PlDataTable/state-migration.js.map +1 -1
  149. package/dist/components/PlDataTable/typesV7.d.ts +1 -36
  150. package/dist/components/PlDataTable/typesV7.d.ts.map +1 -1
  151. package/dist/components/PlDataTable/typesV8.d.ts +123 -0
  152. package/dist/components/PlDataTable/typesV8.d.ts.map +1 -0
  153. package/dist/components/PlDatasetSelector/build_dataset_options.cjs +27 -34
  154. package/dist/components/PlDatasetSelector/build_dataset_options.cjs.map +1 -1
  155. package/dist/components/PlDatasetSelector/build_dataset_options.d.ts.map +1 -1
  156. package/dist/components/PlDatasetSelector/build_dataset_options.js +27 -34
  157. package/dist/components/PlDatasetSelector/build_dataset_options.js.map +1 -1
  158. package/dist/components/PlDatasetSelector/enrichment_discovery.cjs +28 -33
  159. package/dist/components/PlDatasetSelector/enrichment_discovery.cjs.map +1 -1
  160. package/dist/components/PlDatasetSelector/enrichment_discovery.js +29 -34
  161. package/dist/components/PlDatasetSelector/enrichment_discovery.js.map +1 -1
  162. package/dist/components/PlDatasetSelector/filter_discovery.cjs +27 -17
  163. package/dist/components/PlDatasetSelector/filter_discovery.cjs.map +1 -1
  164. package/dist/components/PlDatasetSelector/filter_discovery.d.ts +24 -10
  165. package/dist/components/PlDatasetSelector/filter_discovery.d.ts.map +1 -1
  166. package/dist/components/PlDatasetSelector/filter_discovery.js +28 -18
  167. package/dist/components/PlDatasetSelector/filter_discovery.js.map +1 -1
  168. package/dist/components/PlDatasetSelector/index.d.ts +2 -2
  169. package/dist/components/index.cjs +1 -1
  170. package/dist/components/index.d.ts +5 -5
  171. package/dist/components/index.js +2 -2
  172. package/dist/filters/converters/filterToQuery.cjs +5 -6
  173. package/dist/filters/converters/filterToQuery.cjs.map +1 -1
  174. package/dist/filters/converters/filterToQuery.d.ts +12 -3
  175. package/dist/filters/converters/filterToQuery.d.ts.map +1 -1
  176. package/dist/filters/converters/filterToQuery.js +5 -6
  177. package/dist/filters/converters/filterToQuery.js.map +1 -1
  178. package/dist/filters/converters/index.d.ts +2 -2
  179. package/dist/filters/index.d.ts +2 -2
  180. package/dist/index.cjs +64 -35
  181. package/dist/index.d.ts +23 -15
  182. package/dist/index.js +15 -9
  183. package/dist/labels/derive_distinct_labels.cjs.map +1 -1
  184. package/dist/labels/derive_distinct_labels.d.ts +1 -2
  185. package/dist/labels/derive_distinct_labels.d.ts.map +1 -1
  186. package/dist/labels/derive_distinct_labels.js.map +1 -1
  187. package/dist/labels/derive_distinct_tooltips.cjs +1 -1
  188. package/dist/labels/derive_distinct_tooltips.cjs.map +1 -1
  189. package/dist/labels/derive_distinct_tooltips.d.ts +6 -3
  190. package/dist/labels/derive_distinct_tooltips.d.ts.map +1 -1
  191. package/dist/labels/derive_distinct_tooltips.js +1 -1
  192. package/dist/labels/derive_distinct_tooltips.js.map +1 -1
  193. package/dist/package.cjs +1 -1
  194. package/dist/package.js +1 -1
  195. package/dist/pframe_utils/axes.cjs.map +1 -1
  196. package/dist/pframe_utils/axes.d.ts +2 -2
  197. package/dist/pframe_utils/axes.d.ts.map +1 -1
  198. package/dist/pframe_utils/axes.js.map +1 -1
  199. package/dist/pframe_utils/columns.cjs +6 -10
  200. package/dist/pframe_utils/columns.cjs.map +1 -1
  201. package/dist/pframe_utils/columns.d.ts +4 -4
  202. package/dist/pframe_utils/columns.d.ts.map +1 -1
  203. package/dist/pframe_utils/columns.js +7 -11
  204. package/dist/pframe_utils/columns.js.map +1 -1
  205. package/dist/pframe_utils/index.cjs.map +1 -1
  206. package/dist/pframe_utils/index.d.ts +1 -1
  207. package/dist/pframe_utils/index.d.ts.map +1 -1
  208. package/dist/pframe_utils/index.js.map +1 -1
  209. package/dist/render/accessor.cjs +15 -16
  210. package/dist/render/accessor.cjs.map +1 -1
  211. package/dist/render/accessor.d.ts +7 -10
  212. package/dist/render/accessor.d.ts.map +1 -1
  213. package/dist/render/accessor.js +15 -16
  214. package/dist/render/accessor.js.map +1 -1
  215. package/dist/render/api.cjs +34 -36
  216. package/dist/render/api.cjs.map +1 -1
  217. package/dist/render/api.d.ts +30 -20
  218. package/dist/render/api.d.ts.map +1 -1
  219. package/dist/render/api.js +35 -38
  220. package/dist/render/api.js.map +1 -1
  221. package/dist/render/index.cjs +4 -0
  222. package/dist/render/index.d.ts +4 -4
  223. package/dist/render/index.js +3 -2
  224. package/dist/render/internal.cjs +3 -2
  225. package/dist/render/internal.cjs.map +1 -1
  226. package/dist/render/internal.d.ts +17 -9
  227. package/dist/render/internal.d.ts.map +1 -1
  228. package/dist/render/internal.js +3 -2
  229. package/dist/render/internal.js.map +1 -1
  230. package/dist/render/util/axis_filtering.cjs.map +1 -1
  231. package/dist/render/util/axis_filtering.js.map +1 -1
  232. package/dist/render/util/column_collection.cjs +6 -4
  233. package/dist/render/util/column_collection.cjs.map +1 -1
  234. package/dist/render/util/column_collection.d.ts +9 -9
  235. package/dist/render/util/column_collection.d.ts.map +1 -1
  236. package/dist/render/util/column_collection.js +6 -4
  237. package/dist/render/util/column_collection.js.map +1 -1
  238. package/dist/render/util/index.d.ts +2 -2
  239. package/dist/render/util/pcolumn_data.cjs +1 -1
  240. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  241. package/dist/render/util/pcolumn_data.d.ts +3 -3
  242. package/dist/render/util/pcolumn_data.d.ts.map +1 -1
  243. package/dist/render/util/pcolumn_data.js +1 -1
  244. package/dist/render/util/pcolumn_data.js.map +1 -1
  245. package/dist/services/block_services.cjs +2 -1
  246. package/dist/services/block_services.cjs.map +1 -1
  247. package/dist/services/block_services.d.ts +1 -0
  248. package/dist/services/block_services.d.ts.map +1 -1
  249. package/dist/services/block_services.js +2 -1
  250. package/dist/services/block_services.js.map +1 -1
  251. package/dist/services/get_services.cjs +2 -2
  252. package/dist/services/get_services.cjs.map +1 -1
  253. package/dist/services/get_services.d.ts +4 -1
  254. package/dist/services/get_services.d.ts.map +1 -1
  255. package/dist/services/get_services.js +2 -2
  256. package/dist/services/get_services.js.map +1 -1
  257. package/package.json +10 -8
  258. package/src/columns/__test_helpers__/collection_driver.ts +197 -0
  259. package/src/columns/__test_helpers__/stub_registry.ts +134 -0
  260. package/src/columns/column.ts +46 -0
  261. package/src/columns/column_lazy.test.ts +201 -0
  262. package/src/columns/column_lazy.ts +311 -0
  263. package/src/columns/column_providers/index.ts +78 -0
  264. package/src/columns/column_providers/providers.ts +193 -0
  265. package/src/columns/column_providers/types.ts +24 -0
  266. package/src/columns/column_recipes/column_discovered_recipe.ts +231 -0
  267. package/src/columns/column_recipes/column_filtered_recipe.ts +184 -0
  268. package/src/columns/column_recipes/column_overrided_recipe.ts +146 -0
  269. package/src/columns/column_recipes/column_recipes.test.ts +681 -0
  270. package/src/columns/column_recipes/index.ts +127 -0
  271. package/src/columns/column_recipes/leaf_rebrand.ts +28 -0
  272. package/src/columns/column_recipes/types.ts +113 -0
  273. package/src/columns/columns_collection.test.ts +164 -0
  274. package/src/columns/columns_collection.ts +170 -0
  275. package/src/columns/derive_axis_values_labels.ts +98 -0
  276. package/src/columns/expand_by_partition.test.ts +146 -110
  277. package/src/columns/expand_by_partition.ts +72 -84
  278. package/src/columns/index.ts +7 -5
  279. package/src/columns/utils.test.ts +249 -0
  280. package/src/columns/utils.ts +226 -0
  281. package/src/components/PFrameForGraphs.ts +3 -1
  282. package/src/components/PlAnnotations/filters_ui.test.ts +46 -47
  283. package/src/components/PlDataTable/columnResolver.test.ts +122 -0
  284. package/src/components/PlDataTable/columnResolver.ts +57 -0
  285. package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +9 -9
  286. package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +31 -63
  287. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +85 -58
  288. package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +316 -354
  289. package/src/components/PlDataTable/createPlDataTable/discoverColumns.ts +48 -144
  290. package/src/components/PlDataTable/createPlDataTable/index.ts +2 -2
  291. package/src/components/PlDataTable/createPlDataTable/utils.test.ts +60 -69
  292. package/src/components/PlDataTable/createPlDataTable/utils.ts +65 -173
  293. package/src/components/PlDataTable/createPlDataTableSheet.ts +1 -1
  294. package/src/components/PlDataTable/index.ts +4 -2
  295. package/src/components/PlDataTable/labels.ts +4 -33
  296. package/src/components/PlDataTable/state-migration.ts +151 -22
  297. package/src/components/PlDataTable/typesV8.ts +188 -0
  298. package/src/components/PlDatasetSelector/build_dataset_options.ts +35 -60
  299. package/src/components/PlDatasetSelector/enrichment_discovery.ts +65 -61
  300. package/src/components/PlDatasetSelector/filter_discovery.test.ts +110 -72
  301. package/src/components/PlDatasetSelector/filter_discovery.ts +51 -31
  302. package/src/filters/converters/filterToQuery.test.ts +15 -8
  303. package/src/filters/converters/filterToQuery.ts +22 -9
  304. package/src/filters/converters/filterUiToExpressionImpl.test.ts +35 -36
  305. package/src/labels/derive_distinct_labels.ts +1 -1
  306. package/src/labels/derive_distinct_tooltips.test.ts +7 -4
  307. package/src/labels/derive_distinct_tooltips.ts +3 -3
  308. package/src/pframe_utils/axes.ts +2 -2
  309. package/src/pframe_utils/columns.ts +14 -23
  310. package/src/pframe_utils/index.ts +1 -1
  311. package/src/render/accessor.ts +35 -38
  312. package/src/render/api.ts +45 -61
  313. package/src/render/index.ts +2 -1
  314. package/src/render/internal.ts +43 -10
  315. package/src/render/util/axis_filtering.ts +0 -1
  316. package/src/render/util/column_collection.ts +17 -17
  317. package/src/render/util/pcolumn_data.ts +5 -9
  318. package/src/services/block_services.ts +1 -0
  319. package/src/services/get_services.ts +5 -2
  320. package/dist/columns/column_collection_builder.cjs +0 -241
  321. package/dist/columns/column_collection_builder.cjs.map +0 -1
  322. package/dist/columns/column_collection_builder.d.ts +0 -119
  323. package/dist/columns/column_collection_builder.d.ts.map +0 -1
  324. package/dist/columns/column_collection_builder.js +0 -241
  325. package/dist/columns/column_collection_builder.js.map +0 -1
  326. package/dist/columns/column_selector.cjs +0 -49
  327. package/dist/columns/column_selector.cjs.map +0 -1
  328. package/dist/columns/column_selector.d.ts +0 -33
  329. package/dist/columns/column_selector.d.ts.map +0 -1
  330. package/dist/columns/column_selector.js +0 -47
  331. package/dist/columns/column_selector.js.map +0 -1
  332. package/dist/columns/column_snapshot.cjs +0 -19
  333. package/dist/columns/column_snapshot.cjs.map +0 -1
  334. package/dist/columns/column_snapshot.d.ts +0 -39
  335. package/dist/columns/column_snapshot.d.ts.map +0 -1
  336. package/dist/columns/column_snapshot.js +0 -18
  337. package/dist/columns/column_snapshot.js.map +0 -1
  338. package/dist/columns/column_snapshot_provider.cjs +0 -137
  339. package/dist/columns/column_snapshot_provider.cjs.map +0 -1
  340. package/dist/columns/column_snapshot_provider.d.ts +0 -74
  341. package/dist/columns/column_snapshot_provider.d.ts.map +0 -1
  342. package/dist/columns/column_snapshot_provider.js +0 -133
  343. package/dist/columns/column_snapshot_provider.js.map +0 -1
  344. package/dist/columns/ctx_column_sources.cjs +0 -80
  345. package/dist/columns/ctx_column_sources.cjs.map +0 -1
  346. package/dist/columns/ctx_column_sources.d.ts +0 -30
  347. package/dist/columns/ctx_column_sources.d.ts.map +0 -1
  348. package/dist/columns/ctx_column_sources.js +0 -79
  349. package/dist/columns/ctx_column_sources.js.map +0 -1
  350. package/src/columns/column_collection_builder.test.ts +0 -484
  351. package/src/columns/column_collection_builder.ts +0 -485
  352. package/src/columns/column_selector.test.ts +0 -90
  353. package/src/columns/column_selector.ts +0 -100
  354. package/src/columns/column_snapshot.ts +0 -58
  355. package/src/columns/column_snapshot_provider.ts +0 -194
  356. package/src/columns/ctx_column_sources.ts +0 -99
@@ -1 +1 @@
1
- {"version":3,"file":"createPlDataTableV3.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n FilterSpecNode,\n PColumn,\n PObjectId,\n PTableColumnId,\n PTableColumnIdAxis,\n PTableColumnIdColumn,\n PTableSorting,\n PColumnSpec,\n MultiColumnSelector,\n PFrameSpecDriver,\n DiscoveredPColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, getAxisId, parseJson, uniqueBy } from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns, traverseFilterSpec } from \"../../../filters/traverse\";\nimport type { RenderCtxBase, PColumnDataUniversal } from \"../../../render\";\nimport { isEmpty } from \"es-toolkit/compat\";\nimport type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from \"../typesV7\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { ColumnSelector, ColumnSnapshot, ColumnVariant, MatchingMode } from \"../../../columns\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n deriveAllTooltips,\n evaluateRules,\n isColumnHidden,\n isColumnOptional,\n withHidenAxesAnnotations,\n withLabelAnnotations,\n withTableVisualAnnotations,\n withInfoAnnotations,\n withDataStatusAnnotations,\n} from \"./utils\";\nimport type { PrimaryEntry, SecondaryGroup } from \"./createPTableDefV3\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport {\n discoverLabelColumnVariants,\n discoverTableColumnSnaphots,\n type DiscoverTableColumnOptions,\n} from \"./discoverColumns\";\nimport { getField, isNil, isPlainObject, throwError, type Nil } from \"@milaboratories/helpers\";\nimport { flow } from \"es-toolkit\";\n\nexport type createPlDataTableOptionsV3 = {\n tableState?: PlDataTableStateV2;\n\n columns: Nil | DiscoverTableColumnOptions | TableColumnVariant[];\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnMatcher | ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnMatcher | ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport type ColumnMatcher = (spec: PColumnSpec) => boolean;\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const pframeSpec = ctx.getService(\"pframeSpec\");\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const discovered = isPlainObject(options.columns)\n ? discoverTableColumnSnaphots(ctx, options.columns)\n : isNil(options.columns)\n ? options.columns\n : uniqueBy(\n [...options.columns, ...discoverLabelColumnVariants(ctx, options.columns)],\n (c) => c.column.id,\n );\n if (isNil(discovered) || discovered.length === 0) return undefined;\n\n const splited = splitDiscoveredColumns(discovered);\n\n const derivedLabels = deriveAllLabels({\n columns: discovered\n .map((dc) => ({\n id: dc.column.id,\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n }))\n .filter((v) => !isColumnHidden(v.spec)),\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n const derivedTooltips = deriveAllTooltips({\n columns: discovered.map((dc) => ({\n id: dc.column.id,\n originalId: getField(dc, \"originalId\"),\n spec: dc.column.spec,\n linkerPath: dc.path,\n qualifications: dc.qualifications,\n })),\n });\n\n const annotated = annotateColumnGroups({\n pframeSpec,\n ...splited,\n derivedLabels,\n derivedTooltips,\n displayOptions: options.displayOptions,\n });\n\n const primarySnapshots = annotated.direct.filter((c) => c.isPrimary);\n const secondarySnapshots = annotated.direct.filter((c) => !c.isPrimary);\n\n if (primarySnapshots.length === 0) return undefined;\n\n const columnIsAvailable = createColumnValidationById([\n ...annotated.direct.map((v) => v.column),\n ...annotated.linked.flatMap((lc) => [...(lc.path ?? []).map((s) => s.linker), lc.column]),\n ]);\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, discovered);\n const filters = filterFilters(\n concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n ),\n columnIsAvailable,\n );\n\n const sorting = filterSorting(\n resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, discovered)),\n columnIsAvailable,\n );\n\n const primaryEntries: PrimaryEntry<undefined | PColumnDataUniversal>[] = primarySnapshots.map(\n (v) => ({ column: resolveSnapshot(v.column) }),\n );\n const secondaryGroups: SecondaryGroup<undefined | PColumnDataUniversal>[] = buildSecondaryGroups(\n secondarySnapshots,\n annotated.linked,\n );\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: secondaryGroups,\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable\n const pframeHandle = ctx.createPFrame([\n ...annotated.direct.map((v) => resolveSnapshot(v.column)),\n ...annotated.linked.map((v) => resolveSnapshot(v.column)),\n ...collectLinkerSnapshots(annotated.linked).map(resolveSnapshot),\n ]);\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns(\n [...annotated.direct, ...annotated.linked].map((v) => v.column),\n sorting,\n filters,\n hiddenSpecs,\n );\n\n const visible = buildVisibleColumns(annotated, hiddenColumnIds);\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary: primaryEntries,\n secondary: buildSecondaryGroups(\n visible.direct.filter((c) => !c.isPrimary),\n visible.linked,\n ),\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n } satisfies PlDataTableModel;\n}\n\nexport type TableColumnVariant = (\n | ColumnVariant<PObjectId>\n | (ColumnVariant<DiscoveredPColumnId> & { readonly originalId: PObjectId })\n) & {\n readonly isPrimary?: boolean;\n};\n\ntype SplitDiscoveredColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype AnnotatedColumnGroups = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\ntype VisibleColumns = {\n readonly direct: TableColumnVariant[];\n readonly linked: TableColumnVariant[];\n};\n\n/** Split discovered columns into direct (no linker path) and linked (with linker path). */\nfunction splitDiscoveredColumns(columns: TableColumnVariant[]): SplitDiscoveredColumns {\n const direct = columns.filter((dc) => (dc.path?.length ?? 0) === 0);\n const linked = columns.filter((dc) => (dc.path?.length ?? 0) > 0);\n return { direct, linked };\n}\n\n/** All linker snapshots across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: TableColumnVariant[]): ColumnSnapshot<PObjectId>[] {\n return uniqueBy(\n linked.flatMap((lc) => (lc.path ?? []).map((s) => s.linker)),\n (c) => c.id,\n );\n}\n\n/**\n * Annotate all column groups with derived labels and display-rule annotations.\n * Evaluates `displayOptions` rules against all discovered columns (direct,\n * linked, labels, linkers) and writes the winning visibility/priority into\n * column annotations via `withTableVisualAnnotations`.\n */\nfunction annotateColumnGroups(params: {\n direct: TableColumnVariant[];\n linked: TableColumnVariant[];\n derivedLabels: Record<string, string>;\n derivedTooltips: Record<string, string>;\n displayOptions?: ColumnsDisplayOptions;\n pframeSpec: PFrameSpecDriver;\n}): AnnotatedColumnGroups {\n const { direct, linked, derivedLabels, derivedTooltips, displayOptions, pframeSpec } = params;\n\n const allColumnsForRules = [\n ...direct.map((v) => v.column),\n ...linked.map((v) => v.column),\n ...collectLinkerSnapshots(linked),\n ];\n const visibilityByColId = evaluateRules(\n displayOptions?.visibility ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n const orderByColId = evaluateRules(\n displayOptions?.ordering ?? [],\n allColumnsForRules,\n pframeSpec,\n );\n\n const directAnnotated = liftToVariantColumns(\n direct,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n );\n\n const linkedAnnotated = liftToVariantColumns(\n linked,\n flow(\n (cols) => withDataStatusAnnotations(cols),\n (cols) => withHidenAxesAnnotations(cols),\n (cols) => withLabelAnnotations(derivedLabels, cols),\n (cols) => withInfoAnnotations(derivedTooltips, cols),\n (cols) => withTableVisualAnnotations(visibilityByColId, orderByColId, cols),\n ),\n ).map((lc) => ({ ...lc, path: annotateLinkerPath(derivedLabels, lc.path) }));\n\n return {\n direct: directAnnotated,\n linked: linkedAnnotated,\n };\n}\n\n/** Lift a snapshot-array transform so it runs on the inner `column` of each variant. */\nfunction liftToVariantColumns<\n V extends { readonly column: ColumnSnapshot<PObjectId | DiscoveredPColumnId> },\n>(\n variants: V[],\n fn: (\n cols: ColumnSnapshot<PObjectId | DiscoveredPColumnId>[],\n ) => ColumnSnapshot<PObjectId | DiscoveredPColumnId>[],\n): V[] {\n const cols = fn(variants.map((v) => v.column));\n if (cols.length !== variants.length)\n throw new Error(\n `liftToVariantColumns: fn must preserve array length (got ${cols.length}, expected ${variants.length})`,\n );\n return variants.map((v, i) => ({ ...v, column: cols[i] }));\n}\n\nfunction annotateLinkerPath(\n derivedLabels: Record<string, string>,\n path: TableColumnVariant[\"path\"],\n): TableColumnVariant[\"path\"] {\n if (isNil(path) || path.length === 0) return path;\n const annotatedLinkers = withHidenAxesAnnotations(\n withLabelAnnotations(\n derivedLabels,\n path.map((s) => s.linker),\n ),\n );\n return path.map((s, i) => ({ ...s, linker: annotatedLinkers[i] }));\n}\n\n/** Build an index of all valid column IDs (axes + columns) for filter/sorting validation. */\nfunction createColumnValidationById(\n fullColumns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n) {\n const axisIds = uniqueBy(\n fullColumns.flatMap((c) => c.spec.axesSpec.map(getAxisId)),\n (a) => canonicalizeJson<AxisId>(a),\n );\n\n const allIds: PTableColumnId[] = [\n ...axisIds.map((a) => ({ type: \"axis\", id: a }) satisfies PTableColumnIdAxis),\n ...fullColumns.map((c) => ({ type: \"column\", id: c.id }) satisfies PTableColumnIdColumn),\n ];\n\n const validIdSet = new Set(allIds.map((c) => canonicalizeJson<PTableColumnId>(c)));\n\n return (id: string): boolean => {\n return validIdSet.has(id as CanonicalizedJson<PTableColumnId>);\n };\n}\n\n/** Drop filter leaves whose column references are not available in the table. */\nfunction filterFilters(\n filters: Nil | PlDataTableFilters,\n isValidColumnId: (id: string) => boolean,\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const isLeafValid = (leaf: PlDataTableFilterSpecLeaf): boolean => {\n if (leaf.type === undefined) return true;\n if (\"column\" in leaf && !isValidColumnId(leaf.column)) return false;\n if (\"rhs\" in leaf && !isValidColumnId(leaf.rhs)) return false;\n return true;\n };\n\n const prune = (node: PlDataTableFilterNode): Nil | PlDataTableFilterNode => {\n if (node.type === \"and\" || node.type === \"or\") {\n const kept = node.filters\n .map((f) => prune(f))\n .filter((f): f is PlDataTableFilterNode => !isNil(f));\n return { type: node.type, filters: kept };\n }\n if (node.type === \"not\") {\n const inner = prune(node.filter);\n return isNil(inner) ? undefined : { type: \"not\", filter: inner };\n }\n return isLeafValid(node) ? node : undefined;\n };\n\n return prune(filters) as Nil | PlDataTableFilters;\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if non-empty, otherwise fall back to options default. */\nfunction resolveSorting(\n userSorting: PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isEmpty(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Drop sorting entries whose column is not available in the table. */\nfunction filterSorting(\n sorting: PTableSorting[],\n isValidColumnId: (id: string) => boolean,\n): PTableSorting[] {\n return sorting.filter((s) => isValidColumnId(canonicalizeJson<PTableColumnId>(s.column)));\n}\n\nfunction buildSecondaryGroups(\n direct: TableColumnVariant[],\n linked: TableColumnVariant[],\n): SecondaryGroup<undefined | PColumnDataUniversal>[] {\n return [\n ...direct.map(\n (c): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [{ column: resolveSnapshot(c.column), qualifications: c.qualifications?.forHit }],\n primaryQualifications: c.qualifications?.forQueries,\n }),\n ),\n ...linked.map(\n (lc): SecondaryGroup<undefined | PColumnDataUniversal> => ({\n entries: [\n {\n column: resolveSnapshot(lc.column),\n linkers: lc.path?.map((s) => resolveSnapshot(s.linker)),\n qualifications: lc.qualifications?.forHit,\n },\n ],\n primaryQualifications: lc.qualifications?.forQueries,\n }),\n ),\n ];\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults. */\nfunction computeHiddenColumns(\n columns: { readonly id: PObjectId; readonly spec: PColumnSpec }[],\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n hiddenSpecs: Nil | PTableColumnId[],\n): Set<PObjectId> {\n const alwaysHidden = columns.filter((c) => isColumnHidden(c.spec)).map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => isColumnOptional(c.spec)).map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<PObjectId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => {\n const obj = parseJson(c);\n return obj.type === \"column\" ? [obj.id] : [];\n })\n : [];\n\n return new Set<PObjectId>([...sortedIds, ...filterIds]);\n}\n\n/** Filter annotated columns to only visible ones, re-matching label columns for the visible subset. */\nfunction buildVisibleColumns(\n annotated: AnnotatedColumnGroups,\n hiddenColumns: Set<PObjectId>,\n): VisibleColumns {\n const direct = annotated.direct.filter((c) => !hiddenColumns.has(c.column.id));\n const linked = annotated.linked.filter((c) => !hiddenColumns.has(c.column.id));\n return { direct, linked };\n}\n\n/** Resolve a ColumnSnapshot to a PColumn with lazily-evaluated data. */\nfunction resolveSnapshot(\n snap: ColumnSnapshot<PObjectId>,\n): PColumn<undefined | PColumnDataUniversal> {\n return { id: snap.id, spec: snap.spec, data: snap.data?.get() };\n}\n\n/** Remap column references in sorting entries. */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n columns: TableColumnVariant[],\n): Nil | PTableSorting[] {\n return sorting?.flatMap((s) => {\n if (s.column.type === \"axis\") return [s]; // Axis references are unaffected by column ID remapping\n\n const id = s.column.id;\n const column = columns.find((c) => (getField(c, \"originalId\") ?? c.column.id) === id);\n if (column === undefined) return [];\n\n return [\n {\n ...s,\n column: {\n type: \"column\" as const,\n id: column.column.id,\n },\n },\n ];\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n columns: TableColumnVariant[],\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const map = (\n tableColumnId: CanonicalizedJson<PTableColumnId>,\n ): CanonicalizedJson<PTableColumnId> => {\n const parsed = parseJson<PTableColumnId>(tableColumnId);\n if (parsed.type === \"axis\") return tableColumnId; // Axis references are unaffected by column ID remapping\n\n const originalId = parsed.id;\n const column =\n columns.find((c) => (getField(c, \"originalId\") ?? c.column.id) === originalId) ??\n throwError(`Column ID \"${parsed.id}\" in filters does not match any discovered column`);\n\n return canonicalizeJson<PTableColumnId>({\n type: \"column\",\n id: column.column.id,\n });\n };\n\n return traverseFilterSpec(filters, {\n leaf: (leaf): PlDataTableFilterNode => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) result.column = map(result.column);\n if (\"rhs\" in result) result.rhs = map(result.rhs);\n return result;\n },\n and: (results): PlDataTableFilterNode => ({ type: \"and\", filters: results }),\n or: (results): PlDataTableFilterNode => ({ type: \"or\", filters: results }),\n not: (result): PlDataTableFilterNode => ({ type: \"not\", filter: result }),\n }) as PlDataTableFilters;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"createPlDataTableV3.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts"],"sourcesContent":["import type {\n ColumnUniversalId,\n FilterSpecNode,\n PObjectId,\n PTableColumnId,\n PTableColumnIdColumn,\n PTableSorting,\n MultiColumnSelector,\n ColumnSelector,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeAxisId,\n dedupColumns,\n extractPObjectId,\n uniqueBy,\n} from \"@milaboratories/pl-model-common\";\nimport { collectFilterSpecColumns } from \"../../../filters/traverse\";\nimport { createColumnResolver, type ColumnResolver } from \"../columnResolver\";\nimport type { RenderCtxBase } from \"../../../render\";\nimport type {\n PlDataTableColumnsMeta,\n PlDataTableFilters,\n PlDataTableFilterSpecLeaf,\n PlDataTableModel,\n} from \"../typesV8\";\nimport { upgradePlDataTableStateV2 } from \"../state-migration\";\nimport type { PlDataTableStateV2 } from \"../state-migration\";\nimport type { MatchingMode } from \"@milaboratories/pl-model-common\";\nimport {\n isLeafColumn,\n hitQualifications,\n collectLinkerColumns,\n queriesQualifications,\n type ColumnRecipe,\n} from \"../../../columns\";\nimport type { DeriveLabelsOptions } from \"../../../labels/derive_distinct_labels\";\nimport {\n deriveAllLabels,\n evaluateRules,\n getEffectiveVisibility,\n getOrderPriority,\n isColumnHidden,\n buildDataStatusMap,\n toRuleColumn,\n} from \"./utils\";\nimport { createPTableDefV3 } from \"./createPTableDefV3\";\nimport {\n discoverLabelColumns,\n discoverTableColumns,\n type DiscoverTableColumnOptions,\n} from \"./discoverColumns\";\nimport { isNil, isPlainObject, type Nil } from \"@milaboratories/helpers\";\nimport { uniq } from \"es-toolkit\";\n\nexport type createPlDataTableOptionsV3 = (\n | {\n columns: Nil | DiscoverTableColumnOptions;\n }\n | {\n primaryColumns: ColumnRecipe[];\n columns: Nil | ColumnRecipe[];\n }\n) & {\n tableState?: PlDataTableStateV2;\n\n filters?: PlDataTableFilters;\n sorting?: PTableSorting[];\n primaryJoinType?: \"inner\" | \"full\";\n\n labelsOptions?: DeriveLabelsOptions;\n displayOptions?: ColumnsDisplayOptions;\n};\n\n/** Structured source config — selectors/anchors instead of raw ColumnsSource. */\nexport type ColumnsSelectorConfig = {\n include?: MultiColumnSelector | MultiColumnSelector[];\n exclude?: MultiColumnSelector | MultiColumnSelector[];\n mode?: MatchingMode;\n maxHops?: number;\n};\n\nexport type ColumnsDisplayOptions = {\n /** Column ordering rules. Higher priority = further left. First matching rule wins. */\n ordering?: ColumnOrderRule[];\n /** Column visibility rules. First matching rule wins. Unmatched columns use default visibility. */\n visibility?: ColumnVisibilityRule[];\n};\n\nexport type ColumnOrderRule = {\n match: ColumnSelector;\n /** Higher number = further left in table */\n priority: number;\n};\n\nexport type ColumnVisibilityRule = {\n match: ColumnSelector;\n visibility: \"default\" | \"optional\" | \"hidden\";\n};\n\nexport function createPlDataTableV3<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): PlDataTableModel | undefined {\n const state = upgradePlDataTableStateV2(options.tableState);\n const primaryJoinType = options.primaryJoinType ?? \"full\";\n\n const resolved = resolveInputColumns(ctx, options);\n if (resolved === undefined) return undefined;\n const { primary, secondary } = resolved;\n if (primary.length === 0) return undefined;\n\n const { direct, linked } = splitByTopology(secondary);\n\n const allColumns = [...primary, ...secondary];\n const derivedLabels = deriveAllLabels({\n // Skip hidden columns when deriving labels — they don't appear in the\n // table, so they shouldn't influence label disambiguation (#1623).\n columns: allColumns.filter((c) => !isColumnHidden(c.getSpec())).map(toLabelableColumn),\n deriveLabelsOptions: {\n includeNativeLabel: true,\n ...options.labelsOptions,\n },\n });\n\n // Rule-based visibility/order maps (keyed by bare PObjectId). Computed once\n // here: `computeHiddenColumns` needs visibility to decide the visible set,\n // and `buildColumnsMeta` (below, once the visible set is known) reuses both.\n const allColumnsForRules = [...primary, ...direct, ...linked, ...collectLinkerSnapshots(linked)];\n const visibilityByColId = evaluateRules(\n options.displayOptions?.visibility ?? [],\n allColumnsForRules,\n );\n const orderByColId = evaluateRules(options.displayOptions?.ordering ?? [], allColumnsForRules);\n\n const resolver = createColumnResolver(\n [...primary, ...direct, ...linked.flatMap((lc) => [...collectLinkerColumns(lc), lc])],\n { warn: ctx.logWarn.bind(ctx) },\n );\n\n const remapedDefaultFilters = remapFilterColumnIds(options.filters, resolver);\n const filters = filterFilters(\n concatFilters(\n state.pTableParams.filters,\n state.pTableParams.defaultFilters ?? remapedDefaultFilters,\n ),\n resolver,\n );\n\n const sorting = filterSorting(\n resolveSorting(state.pTableParams.sorting, remapSortingColumnIds(options.sorting, resolver)),\n resolver,\n );\n\n const fullDef = createPTableDefV3({\n primaryJoinType,\n primary,\n secondary: [...direct, ...linked],\n filters,\n sorting,\n });\n\n const fullHandle = ctx.createPTableV2(fullDef);\n // TODO: is workaround for dropdown suggestions.\n // Pframe have not equivalent data for columns relativly to Ptable.\n // PFrame is the physical column registry — one entry per bare PObjectId,\n // so strip the rich recipe ids down to their physical leaf id and dedupe:\n // multiple discovered variants of the same hit collapse to the same bare id.\n const pframeHandle = ctx.createPFrame(\n uniq([\n ...primary.map((v) => extractPObjectId(v.id)),\n ...direct.map((v) => extractPObjectId(v.id)),\n ...linked.map((v) => extractPObjectId(v.id)),\n ]),\n );\n\n const hiddenSpecs = state.pTableParams.hiddenColIds;\n const hiddenColumnIds = computeHiddenColumns({\n columns: [...primary, ...direct, ...linked],\n visibilityByColId,\n sorting,\n filters,\n hiddenSpecs,\n });\n\n const visible = {\n primary,\n direct: direct.filter((c) => !hiddenColumnIds.has(c.id)),\n linked: linked.filter((c) => !hiddenColumnIds.has(c.id)),\n };\n const visibleDef = createPTableDefV3({\n primaryJoinType,\n primary,\n secondary: [...visible.direct, ...visible.linked],\n filters,\n sorting,\n });\n const visibleHandle = ctx.createPTableV2(visibleDef);\n\n // Built here, where the visible set is known: per-column data status is\n // computed for visible columns only (the probe is meaningful only for what\n // the user sees), while label/visibility/order/axes cover all columns.\n const columnsMeta = buildColumnsMeta({\n fullColumns: [...primary, ...direct, ...linked],\n visibleColumns: [...visible.primary, ...visible.direct, ...visible.linked],\n primaryColumns: primary,\n derivedLabels,\n visibilityByColId,\n orderByColId,\n });\n\n return {\n sourceId: state.pTableParams.sourceId,\n fullTableHandle: fullHandle,\n fullPframeHandle: pframeHandle,\n visibleTableHandle: visibleHandle,\n defaultFilters: remapedDefaultFilters,\n columnsMeta,\n } satisfies PlDataTableModel;\n}\n\ntype ResolvedColumns = {\n readonly primary: ColumnRecipe[];\n readonly secondary: ColumnRecipe[];\n};\n\n/** Normalize either option branch into a {primary, secondary} pair of recipes. */\nfunction resolveInputColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: createPlDataTableOptionsV3,\n): ResolvedColumns | undefined {\n if (\"primaryColumns\" in options) {\n const primary = options.primaryColumns;\n const secondary = options.columns ?? [];\n const labels = discoverLabelColumns(ctx, primary, [...primary, ...secondary]);\n // Exclude from secondary anything already present in primary: a label\n // column the block hands in as primary can be re-discovered here as a\n // label for that same axis, landing in the table twice with the same id.\n const primaryIds = new Set(primary.map((c) => c.id));\n return {\n primary,\n secondary: dedupColumns(\n [...secondary, ...labels].filter((c) => !primaryIds.has(c.id)),\n (c) => c.id,\n (c) => c.getSpec(),\n ),\n };\n }\n\n if (isPlainObject(options.columns)) {\n return discoverTableColumns(ctx, options.columns);\n }\n\n return undefined;\n}\n\n/** Split secondary recipes by query topology: leaves (no linker chain) vs joined. */\nfunction splitByTopology(columns: ColumnRecipe[]): {\n direct: ColumnRecipe[];\n linked: ColumnRecipe[];\n} {\n const direct: ColumnRecipe[] = [];\n const linked: ColumnRecipe[] = [];\n for (const c of columns) {\n if (isLeafColumn(c)) direct.push(c);\n else linked.push(c);\n }\n return { direct, linked };\n}\n\n/** All linker recipes across the given linked columns, deduped by id. */\nfunction collectLinkerSnapshots(linked: ColumnRecipe[]): ColumnRecipe[] {\n return uniqueBy(\n linked.flatMap((c) => collectLinkerColumns(c)),\n (c) => c.id,\n );\n}\n\nfunction toLabelableColumn(col: ColumnRecipe) {\n return {\n id: col.id,\n spec: col.getSpec(),\n linkerPath: collectLinkerColumns(col).map((linker) => ({\n linker: { spec: linker.getSpec() },\n })),\n qualifications: {\n forHit: [...hitQualifications(col)],\n forQueries: queriesQualifications(col),\n },\n };\n}\n\n/**\n * Compute display metadata as a sidecar keyed by each emitted column's\n * `ColumnUniversalId` (and axis `AxisId`), instead of baking it into the specs\n * via `withSpecs`. Spec overrides change a recipe's id, so the same physical\n * column reached two ways would diverge into two ids and render twice; keeping\n * meta out of the spec preserves identity and lets dedup collapse such cases.\n * The UI overlays this onto the engine-emitted specs at render time.\n */\nfunction buildColumnsMeta(params: {\n /** Every column in the table (primary + secondary) — drives `columns` and `axes`. */\n fullColumns: ColumnRecipe[];\n /** The visible subset — `status` is probed for these only. */\n visibleColumns: ColumnRecipe[];\n /** The primary join columns — their axes are the visible index; all other axes are hidden. */\n primaryColumns: ColumnRecipe[];\n derivedLabels: Record<string, string>;\n visibilityByColId: Map<PObjectId, ColumnVisibilityRule>;\n orderByColId: Map<PObjectId, ColumnOrderRule>;\n}): PlDataTableColumnsMeta {\n const { fullColumns, visibleColumns, primaryColumns, derivedLabels } = params;\n const { visibilityByColId, orderByColId } = params;\n // Status only for visible columns — the probe is meaningful only for what the\n // user actually sees; non-visible columns get no `status`.\n const visibleStatus = buildDataStatusMap(visibleColumns);\n\n const columns = fullColumns.reduce<PlDataTableColumnsMeta[\"columns\"]>((acc, c) => {\n const rc = toRuleColumn(c);\n acc[c.id] = {\n label: derivedLabels[c.id],\n visibility: getEffectiveVisibility(rc, visibilityByColId),\n order: getOrderPriority(rc, orderByColId),\n status: visibleStatus[c.id],\n };\n return acc;\n }, {});\n\n // Only primary columns declare the table's visible axes. Any axis introduced\n // solely by a secondary column (a linker-bridge axis, or a distinct-domain\n // copy) is flagged hidden — otherwise it renders as a second index axis.\n const primaryAxisKeys = new Set(\n primaryColumns.flatMap((c) => c.getSpec().axesSpec.map((a) => canonicalizeAxisId(a))),\n );\n const axes = fullColumns.reduce<PlDataTableColumnsMeta[\"axes\"]>(\n (acc, c) =>\n c.getSpec().axesSpec.reduce((inner, ax) => {\n const key = canonicalizeAxisId(ax);\n if (inner[key] === undefined) inner[key] = { hidden: !primaryAxisKeys.has(key) };\n return inner;\n }, acc),\n {},\n );\n\n return { columns, axes };\n}\n\n/** Drop filter leaves whose column references cannot be resolved; rewrite the\n * resolvable ones through the resolver. Prune empty and/or/not groups. */\nfunction filterFilters(\n filters: Nil | PlDataTableFilters,\n resolver: ColumnResolver,\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const rewriteLeaf = (leaf: PlDataTableFilterSpecLeaf): Nil | PlDataTableFilterSpecLeaf => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) {\n const c = resolver(result.column);\n if (isNil(c)) return undefined;\n result.column = c;\n }\n if (\"rhs\" in result) {\n const c = resolver(result.rhs);\n if (isNil(c)) return undefined;\n result.rhs = c;\n }\n return result;\n };\n\n const prune = (node: PlDataTableFilterNode): Nil | PlDataTableFilterNode => {\n if (node.type === \"and\" || node.type === \"or\") {\n const kept = node.filters\n .map((f) => prune(f))\n .filter((f): f is PlDataTableFilterNode => !isNil(f));\n if (kept.length === 0) return undefined;\n return { type: node.type, filters: kept };\n }\n if (node.type === \"not\") {\n const inner = prune(node.filter);\n return isNil(inner) ? undefined : { type: \"not\", filter: inner };\n }\n return rewriteLeaf(node);\n };\n\n return prune(filters) as Nil | PlDataTableFilters;\n}\n\n/** Merge two filter trees into one AND-combined tree. Returns the non-nil one if the other is nil. */\nfunction concatFilters(\n a: Nil | PlDataTableFilters,\n b: Nil | PlDataTableFilters,\n): Nil | PlDataTableFilters {\n if (isNil(a)) return b;\n if (isNil(b)) return a;\n return { ...a, filters: [...a.filters, ...b.filters] };\n}\n\n/** Pick user sorting from state if set, otherwise fall back to options default.\n * null = user has not touched sorting → use default;\n * [] = user has explicitly cleared sorting → no sorting (default ignored). */\nfunction resolveSorting(\n userSorting: Nil | PTableSorting[],\n defaultSorting: Nil | PTableSorting[],\n): PTableSorting[] {\n return (isNil(userSorting) ? defaultSorting : userSorting) ?? [];\n}\n\n/** Rewrite sorting entries through the resolver; drop those that fail to resolve. */\nfunction filterSorting(sorting: PTableSorting[], resolver: ColumnResolver): PTableSorting[] {\n return sorting.flatMap((s) => {\n const col = resolver(s.column);\n return isNil(col) ? [] : [{ ...s, column: col }];\n });\n}\n\n/** Determine which columns should be hidden based on state or optional-column defaults.\n * Keyed by the recipe's logical {@link ColumnUniversalId} (rich) — variants of\n * the same physical column are independently visible/hidden. */\nfunction computeHiddenColumns(params: {\n columns: ColumnRecipe[];\n visibilityByColId: Map<PObjectId, ColumnVisibilityRule>;\n sorting: Nil | PTableSorting[];\n filters: Nil | PlDataTableFilters;\n hiddenSpecs: Nil | PTableColumnId[];\n}): Set<ColumnUniversalId> {\n const { columns, visibilityByColId, sorting, filters, hiddenSpecs } = params;\n const visibilityOf = (c: ColumnRecipe) =>\n getEffectiveVisibility(toRuleColumn(c), visibilityByColId);\n const alwaysHidden = columns.filter((c) => visibilityOf(c) === \"hidden\").map((c) => c.id);\n const optionalHidden = !isNil(hiddenSpecs)\n ? hiddenSpecs.filter((s): s is PTableColumnIdColumn => s.type === \"column\").map((s) => s.id)\n : columns.filter((c) => visibilityOf(c) === \"optional\").map((c) => c.id);\n const initial = [...alwaysHidden, ...optionalHidden];\n const preserved = collectPreservedColumnIds(sorting, filters);\n\n return new Set(initial.filter((id) => !preserved.has(id)));\n}\n\n/** Collect IDs of columns that must remain visible (sorted, filtered). */\nfunction collectPreservedColumnIds(\n sorting: Nil | PTableSorting[],\n filters: Nil | PlDataTableFilters,\n): Set<ColumnUniversalId> {\n const sortedIds = (sorting ?? [])\n .map((s) => s.column)\n .filter((c): c is PTableColumnIdColumn => c.type === \"column\")\n .map((c) => c.id);\n\n const filterIds = !isNil(filters)\n ? collectFilterSpecColumns(filters).flatMap((c) => (c.type === \"column\" ? [c.id] : []))\n : [];\n\n return new Set<ColumnUniversalId>([...sortedIds, ...filterIds]);\n}\n\n/** Remap column references in sorting entries through the resolver.\n * Unresolved entries are dropped with a warning (best-effort contract). */\nfunction remapSortingColumnIds(\n sorting: Nil | PTableSorting[],\n resolver: ColumnResolver,\n): Nil | PTableSorting[] {\n return sorting?.flatMap((s) => {\n const col = resolver(s.column);\n if (isNil(col)) {\n console.warn(\n `Sorting column ${JSON.stringify(s.column)} does not match any discovered column — dropped.`,\n );\n return [];\n }\n return [{ ...s, column: col }];\n });\n}\n\ntype PlDataTableFilterNode = FilterSpecNode<PlDataTableFilterSpecLeaf>;\n\n/** Remap column references in a filter tree through the resolver.\n * Unresolved leaves are dropped with a warning; empty groups are pruned. */\nfunction remapFilterColumnIds(\n filters: Nil | PlDataTableFilters,\n resolver: ColumnResolver,\n): Nil | PlDataTableFilters {\n if (isNil(filters)) return filters;\n\n const mapLeaf = (leaf: PlDataTableFilterSpecLeaf): Nil | PlDataTableFilterSpecLeaf => {\n if (leaf.type === undefined) return leaf;\n const result = { ...leaf };\n if (\"column\" in result) {\n const c = resolver(result.column);\n if (isNil(c)) {\n console.warn(\n `Filter column ${JSON.stringify(result.column)} does not match any discovered column — dropped.`,\n );\n return undefined;\n }\n result.column = c;\n }\n if (\"rhs\" in result) {\n const c = resolver(result.rhs);\n if (isNil(c)) {\n console.warn(\n `Filter rhs ${JSON.stringify(result.rhs)} does not match any discovered column — dropped.`,\n );\n return undefined;\n }\n result.rhs = c;\n }\n return result;\n };\n\n const prune = (node: PlDataTableFilterNode): Nil | PlDataTableFilterNode => {\n if (node.type === \"and\" || node.type === \"or\") {\n const kept = node.filters\n .map((f) => prune(f))\n .filter((f): f is PlDataTableFilterNode => !isNil(f));\n if (kept.length === 0) return undefined;\n return { type: node.type, filters: kept };\n }\n if (node.type === \"not\") {\n const inner = prune(node.filter);\n return isNil(inner) ? undefined : { type: \"not\", filter: inner };\n }\n return mapLeaf(node);\n };\n\n return prune(filters) as Nil | PlDataTableFilters;\n}\n"],"mappings":"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"}
@@ -1,112 +1,54 @@
1
- const require_column_snapshot_provider = require("../../../columns/column_snapshot_provider.cjs");
2
- const require_column_collection_builder = require("../../../columns/column_collection_builder.cjs");
3
- const require_ctx_column_sources = require("../../../columns/ctx_column_sources.cjs");
1
+ const require_columns_collection = require("../../../columns/columns_collection.cjs");
2
+ const require_utils = require("../../../columns/utils.cjs");
4
3
  require("../../../columns/index.cjs");
5
4
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
6
- let _milaboratories_helpers = require("@milaboratories/helpers");
7
5
  //#region src/components/PlDataTable/createPlDataTable/discoverColumns.ts
8
- /** Discover columns from sources/anchors and normalize into a flat TableColumnVariant list. */
9
- function discoverTableColumnSnaphots(ctx, options) {
10
- const resolvedOptions = {
11
- ...options,
12
- anchors: resolveAnchors(ctx, options.anchors)
6
+ /**
7
+ * Discover columns from sources/anchors and split them into primary
8
+ * (direct anchor hits — zero-hop, query is a bare column) and secondary
9
+ * (reached via a linker chain, query carries a join).
10
+ */
11
+ function discoverTableColumns(ctx, options) {
12
+ const discoveredColumns = require_columns_collection.ColumnsCollection(options.sources, { ctx: ctx.ctx }).discover({
13
+ ...options.selector,
14
+ anchors: options.anchors
15
+ }).getColumns();
16
+ const primary = [];
17
+ const secondary = [];
18
+ for (const col of discoveredColumns) if (require_utils.isLeafColumn(col)) primary.push(col);
19
+ else secondary.push(col);
20
+ return {
21
+ primary,
22
+ secondary
13
23
  };
14
- const providers = resolveProviders(ctx, resolvedOptions.sources);
15
- if (providers.length === 0) return void 0;
16
- const collection = new require_column_collection_builder.ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSources(providers).build(resolvedOptions);
17
- if (collection === void 0) return void 0;
18
- try {
19
- return mapToTableColumnVariants(collection.findColumnVariants(resolvedOptions.selector), collection.getAnchors());
20
- } finally {
21
- collection.dispose();
22
- }
23
24
  }
24
25
  /**
25
26
  * Discover label columns matching the axes of the given value columns from
26
- * ctx providers. Returns label snapshots wrapped as direct TableColumnVariants
27
- * (path: [], empty qualifications, isPrimary: false).
27
+ * ctx providers. Returns a list of label {@link ColumnRecipe}s.
28
+ *
29
+ * Primary columns are used as anchors for axis-aware label discovery.
30
+ * `maxHops` is taken from the longest linker chain present in `columns`.
28
31
  */
29
- function discoverLabelColumnVariants(ctx, columns) {
32
+ function discoverLabelColumns(ctx, primary, columns) {
30
33
  if (columns.length === 0) return [];
31
- const collection = new require_column_collection_builder.ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSources(require_ctx_column_sources.collectCtxColumnSnapshotProviders(ctx)).addSource(columns.map((c) => c.column)).build({
32
- allowPartialColumnList: true,
33
- anchors: Object.fromEntries(columns.filter((col) => (col.path?.length ?? 0) === 0 && col.isPrimary).map((col, i) => [`anchor_${i}`, col.column.spec]))
34
- });
35
- try {
36
- const axes = columns.flatMap((col) => col.column.spec.axesSpec);
37
- return collection.findColumnVariants({
38
- include: axes.map((a) => ({
39
- name: {
40
- type: "exact",
41
- value: _milaboratories_pl_model_common.PColumnName.Label
42
- },
43
- axes: [{ name: {
44
- type: "exact",
45
- value: a.name
46
- } }]
47
- })),
48
- maxHops: columns.reduce((acc, c) => Math.max(acc, c.path?.length ?? 0), 0)
49
- }).map((variant) => ({
50
- ...variant,
51
- column: {
52
- ...variant.column,
53
- id: (0, _milaboratories_pl_model_common.createDiscoveredPColumnId)({
54
- column: variant.column.id,
55
- path: variant.path?.map((p) => ({
56
- type: "linker",
57
- column: p.linker.id
58
- })),
59
- columnQualifications: variant.qualifications?.forHit,
60
- queriesQualifications: variant.qualifications?.forQueries
61
- }),
62
- originalId: variant.column.id
63
- }
64
- }));
65
- } finally {
66
- collection.dispose();
67
- }
68
- }
69
- /** Resolve PlRef values in anchors to PColumnSpec via the result pool. */
70
- function resolveAnchors(ctx, anchors) {
71
- const result = {};
72
- for (const [key, value] of Object.entries(anchors)) if ((0, _milaboratories_pl_model_common.isPlRef)(value)) result[key] = ctx.resultPool.getPColumnSpecByRef(value) ?? (0, _milaboratories_helpers.throwError)(`Anchor ${key} with ref ${JSON.stringify(value)} could not be resolved to a PColumnSpec`);
73
- else result[key] = value;
74
- return result;
75
- }
76
- /** Resolve column snapshot providers from explicit sources or context. */
77
- function resolveProviders(ctx, sources) {
78
- return sources !== void 0 ? sources.map(require_column_snapshot_provider.toColumnSnapshotProvider) : require_ctx_column_sources.collectCtxColumnSnapshotProviders(ctx);
79
- }
80
- /** Map column variants into TableColumnVariant list with anchor-derived isPrimary flag. */
81
- function mapToTableColumnVariants(variants, anchors) {
82
- const columnIdToAnchorName = new Map(Array.from(anchors.entries(), ([key, { id }]) => [id, key]));
83
- return variants.map((variant) => {
84
- const snap = variant.column;
85
- const isPrimary = columnIdToAnchorName.get(snap.id) !== void 0;
86
- return {
87
- column: {
88
- id: (0, _milaboratories_pl_model_common.createDiscoveredPColumnId)({
89
- column: snap.id,
90
- path: variant.path?.map((p) => ({
91
- type: "linker",
92
- column: p.linker.id
93
- })),
94
- columnQualifications: variant.qualifications?.forHit,
95
- queriesQualifications: variant.qualifications?.forQueries
96
- }),
97
- spec: snap.spec,
98
- data: snap.data,
99
- dataStatus: snap.dataStatus
34
+ const axes = columns.flatMap((col) => col.getSpec().axesSpec);
35
+ return require_columns_collection.ColumnsCollection(void 0, { ctx: ctx.ctx }).discover({
36
+ include: axes.map((a) => ({
37
+ name: {
38
+ type: "exact",
39
+ value: _milaboratories_pl_model_common.PColumnName.Label
100
40
  },
101
- path: variant.path,
102
- qualifications: variant.qualifications,
103
- originalId: snap.id,
104
- isPrimary
105
- };
106
- });
41
+ axes: [{ name: {
42
+ type: "exact",
43
+ value: a.name
44
+ } }]
45
+ })),
46
+ anchors: Object.fromEntries(primary.map((col, i) => [`anchor_${i}`, col.getSpec()])),
47
+ maxHops: columns.reduce((acc, c) => Math.max(acc, require_utils.collectLinkerIds(c).length), 0)
48
+ }).getColumns();
107
49
  }
108
50
  //#endregion
109
- exports.discoverLabelColumnVariants = discoverLabelColumnVariants;
110
- exports.discoverTableColumnSnaphots = discoverTableColumnSnaphots;
51
+ exports.discoverLabelColumns = discoverLabelColumns;
52
+ exports.discoverTableColumns = discoverTableColumns;
111
53
 
112
54
  //# sourceMappingURL=discoverColumns.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"discoverColumns.cjs","names":["ColumnCollectionBuilder","collectCtxColumnSnapshotProviders","PColumnName","toColumnSnapshotProvider"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"sourcesContent":["import type { PColumnSpec, PlRef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { createDiscoveredPColumnId, isPlRef, PColumnName } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../../render\";\nimport type {\n ColumnSource,\n ColumnVariant,\n RelaxedColumnSelector,\n ColumnSnapshotProvider,\n ColumnSnapshot,\n} from \"../../../columns\";\nimport { ColumnCollectionBuilder } from \"../../../columns\";\nimport { toColumnSnapshotProvider } from \"../../../columns/column_snapshot_provider\";\nimport { collectCtxColumnSnapshotProviders } from \"../../../columns/ctx_column_sources\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport type { ColumnsSelectorConfig, TableColumnVariant } from \"./createPlDataTableV3\";\n\nexport type DiscoverTableColumnOptions = {\n sources?: ColumnSource[];\n anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>;\n selector: ColumnsSelectorConfig;\n};\n\n/** Discover columns from sources/anchors and normalize into a flat TableColumnVariant list. */\nexport function discoverTableColumnSnaphots(\n ctx: RenderCtxBase,\n options: DiscoverTableColumnOptions,\n): TableColumnVariant[] | undefined {\n // Resolve PlRef anchors to PColumnSpec\n const resolvedOptions = {\n ...options,\n anchors: resolveAnchors(ctx, options.anchors),\n };\n\n // Resolve providers\n const providers = resolveProviders(ctx, resolvedOptions.sources);\n if (providers.length === 0) return undefined;\n\n // Build collection (anchored or plain)\n const collection = new ColumnCollectionBuilder(ctx.getService(\"pframeSpec\"))\n .addSources(providers)\n .build(resolvedOptions);\n if (collection === undefined) return undefined;\n\n try {\n const variants = collection.findColumnVariants(resolvedOptions.selector);\n const anchors = collection.getAnchors();\n return mapToTableColumnVariants(variants, anchors);\n } finally {\n collection.dispose();\n }\n}\n\n/**\n * Discover label columns matching the axes of the given value columns from\n * ctx providers. Returns label snapshots wrapped as direct TableColumnVariants\n * (path: [], empty qualifications, isPrimary: false).\n */\nexport function discoverLabelColumnVariants<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: TableColumnVariant[],\n): TableColumnVariant[] {\n if (columns.length === 0) return [];\n const collection = new ColumnCollectionBuilder(ctx.getService(\"pframeSpec\"))\n .addSources(collectCtxColumnSnapshotProviders(ctx))\n .addSource(columns.map((c) => c.column))\n .build({\n allowPartialColumnList: true,\n anchors: Object.fromEntries(\n columns\n .filter((col) => (col.path?.length ?? 0) === 0 && col.isPrimary)\n .map((col, i) => [`anchor_${i}`, col.column.spec]),\n ),\n });\n\n try {\n const axes = columns.flatMap((col) => col.column.spec.axesSpec);\n return collection\n .findColumnVariants({\n include: axes.map((a) => ({\n name: { type: \"exact\", value: PColumnName.Label },\n axes: [{ name: { type: \"exact\", value: a.name } }],\n })),\n maxHops: columns.reduce((acc, c) => Math.max(acc, c.path?.length ?? 0), 0),\n })\n .map((variant) => ({\n ...variant,\n column: {\n ...variant.column,\n id: createDiscoveredPColumnId({\n column: variant.column.id,\n path: variant.path?.map((p) => ({\n type: \"linker\",\n column: p.linker.id,\n })),\n columnQualifications: variant.qualifications?.forHit,\n queriesQualifications: variant.qualifications?.forQueries,\n }),\n originalId: variant.column.id,\n },\n }));\n } finally {\n collection.dispose();\n }\n}\n\n/** Resolve PlRef values in anchors to PColumnSpec via the result pool. */\nfunction resolveAnchors(\n ctx: RenderCtxBase,\n anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>,\n): Record<string, PObjectId | PColumnSpec | RelaxedColumnSelector> {\n const result: Record<string, PObjectId | PColumnSpec | RelaxedColumnSelector> = {};\n for (const [key, value] of Object.entries(anchors)) {\n if (isPlRef(value)) {\n result[key] =\n ctx.resultPool.getPColumnSpecByRef(value) ??\n throwError(\n `Anchor ${key} with ref ${JSON.stringify(value)} could not be resolved to a PColumnSpec`,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/** Resolve column snapshot providers from explicit sources or context. */\nfunction resolveProviders(\n ctx: RenderCtxBase,\n sources: undefined | ColumnSource[],\n): ColumnSnapshotProvider[] {\n return sources !== undefined\n ? sources.map(toColumnSnapshotProvider)\n : collectCtxColumnSnapshotProviders(ctx);\n}\n\n/** Map column variants into TableColumnVariant list with anchor-derived isPrimary flag. */\nfunction mapToTableColumnVariants(\n variants: readonly ColumnVariant[],\n anchors: Map<string, ColumnSnapshot<PObjectId>>,\n): TableColumnVariant[] {\n const columnIdToAnchorName = new Map<PObjectId, string>(\n Array.from(anchors.entries(), ([key, { id }]) => [id, key] as const),\n );\n\n return variants.map((variant): TableColumnVariant => {\n const snap = variant.column;\n const isPrimary = columnIdToAnchorName.get(snap.id) !== undefined;\n\n const discoveredId = createDiscoveredPColumnId({\n column: snap.id,\n path: variant.path?.map((p) => ({\n type: \"linker\",\n column: p.linker.id,\n })),\n columnQualifications: variant.qualifications?.forHit,\n queriesQualifications: variant.qualifications?.forQueries,\n });\n return {\n column: {\n id: discoveredId,\n spec: snap.spec,\n data: snap.data,\n dataStatus: snap.dataStatus,\n },\n path: variant.path,\n qualifications: variant.qualifications,\n originalId: snap.id,\n isPrimary,\n };\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"discoverColumns.cjs","names":["ColumnsCollection","isLeafColumn","PColumnName","collectLinkerIds"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"sourcesContent":["import type {\n PColumnSpec,\n PlRef,\n PObjectId,\n RelaxedColumnSelector,\n} from \"@milaboratories/pl-model-common\";\nimport { PColumnName } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../../render\";\nimport type { ColumnRecipe, ColumnsSource } from \"../../../columns\";\nimport { ColumnsCollection, collectLinkerIds, isLeafColumn } from \"../../../columns\";\nimport type { ColumnsSelectorConfig } from \"./createPlDataTableV3\";\n\nexport type DiscoverTableColumnOptions = {\n sources?: ColumnsSource[];\n anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>;\n selector: ColumnsSelectorConfig;\n};\n\n/** Split of discovered columns into anchor-matching (primary) and the rest. */\nexport type DiscoveredTableColumns = {\n readonly primary: ColumnRecipe[];\n readonly secondary: ColumnRecipe[];\n};\n\n/**\n * Discover columns from sources/anchors and split them into primary\n * (direct anchor hits — zero-hop, query is a bare column) and secondary\n * (reached via a linker chain, query carries a join).\n */\nexport function discoverTableColumns(\n ctx: RenderCtxBase,\n options: DiscoverTableColumnOptions,\n): undefined | DiscoveredTableColumns {\n const discoveredColumns = ColumnsCollection(options.sources, { ctx: ctx.ctx })\n .discover({ ...options.selector, anchors: options.anchors })\n .getColumns();\n\n const primary: ColumnRecipe[] = [];\n const secondary: ColumnRecipe[] = [];\n for (const col of discoveredColumns) {\n if (isLeafColumn(col)) primary.push(col);\n else secondary.push(col);\n }\n return { primary, secondary };\n}\n\n/**\n * Discover label columns matching the axes of the given value columns from\n * ctx providers. Returns a list of label {@link ColumnRecipe}s.\n *\n * Primary columns are used as anchors for axis-aware label discovery.\n * `maxHops` is taken from the longest linker chain present in `columns`.\n */\nexport function discoverLabelColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n primary: ColumnRecipe[],\n columns: ColumnRecipe[],\n): ColumnRecipe[] {\n if (columns.length === 0) return [];\n\n const axes = columns.flatMap((col) => col.getSpec().axesSpec);\n return (\n ColumnsCollection(undefined, { ctx: ctx.ctx })\n // .addSource({ columns, isFinal: true })\n .discover({\n include: axes.map((a) => ({\n name: { type: \"exact\", value: PColumnName.Label },\n axes: [{ name: { type: \"exact\", value: a.name } }],\n })),\n anchors: Object.fromEntries(primary.map((col, i) => [`anchor_${i}`, col.getSpec()])),\n maxHops: columns.reduce((acc, c) => Math.max(acc, collectLinkerIds(c).length), 0),\n })\n .getColumns()\n );\n}\n"],"mappings":";;;;;;;;;;AA6BA,SAAgB,qBACd,KACA,SACoC;CACpC,MAAM,oBAAoBA,2BAAAA,kBAAkB,QAAQ,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAC3E,SAAS;EAAE,GAAG,QAAQ;EAAU,SAAS,QAAQ;CAAQ,CAAC,CAAC,CAC3D,WAAW;CAEd,MAAM,UAA0B,CAAC;CACjC,MAAM,YAA4B,CAAC;CACnC,KAAK,MAAM,OAAO,mBAChB,IAAIC,cAAAA,aAAa,GAAG,GAAG,QAAQ,KAAK,GAAG;MAClC,UAAU,KAAK,GAAG;CAEzB,OAAO;EAAE;EAAS;CAAU;AAC9B;;;;;;;;AASA,SAAgB,qBACd,KACA,SACA,SACgB;CAChB,IAAI,QAAQ,WAAW,GAAG,OAAO,CAAC;CAElC,MAAM,OAAO,QAAQ,SAAS,QAAQ,IAAI,QAAQ,CAAC,CAAC,QAAQ;CAC5D,OACED,2BAAAA,kBAAkB,KAAA,GAAW,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAE3C,SAAS;EACR,SAAS,KAAK,KAAK,OAAO;GACxB,MAAM;IAAE,MAAM;IAAS,OAAOE,gCAAAA,YAAY;GAAM;GAChD,MAAM,CAAC,EAAE,MAAM;IAAE,MAAM;IAAS,OAAO,EAAE;GAAK,EAAE,CAAC;EACnD,EAAE;EACF,SAAS,OAAO,YAAY,QAAQ,KAAK,KAAK,MAAM,CAAC,UAAU,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC;EACnF,SAAS,QAAQ,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAKC,cAAAA,iBAAiB,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;CAClF,CAAC,CAAC,CACD,WAAW;AAElB"}
@@ -1,17 +1,26 @@
1
- import { RelaxedColumnSelector } from "../../../columns/column_selector.js";
2
- import { ColumnSource } from "../../../columns/column_snapshot_provider.js";
3
1
  import { RenderCtxBase } from "../../../render/api.js";
4
- import { ColumnsSelectorConfig, TableColumnVariant } from "./createPlDataTableV3.js";
5
- import { PColumnSpec, PObjectId, PlRef } from "@milaboratories/pl-model-common";
2
+ import { ColumnRecipe } from "../../../columns/column_recipes/index.js";
3
+ import { ColumnsSource } from "../../../columns/column_providers/types.js";
4
+ import { ColumnsSelectorConfig } from "./createPlDataTableV3.js";
5
+ import { PColumnSpec, PObjectId, PlRef, RelaxedColumnSelector } from "@milaboratories/pl-model-common";
6
6
 
7
7
  //#region src/components/PlDataTable/createPlDataTable/discoverColumns.d.ts
8
8
  type DiscoverTableColumnOptions = {
9
- sources?: ColumnSource[];
9
+ sources?: ColumnsSource[];
10
10
  anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>;
11
11
  selector: ColumnsSelectorConfig;
12
12
  };
13
- /** Discover columns from sources/anchors and normalize into a flat TableColumnVariant list. */
14
- declare function discoverTableColumnSnaphots(ctx: RenderCtxBase, options: DiscoverTableColumnOptions): TableColumnVariant[] | undefined;
13
+ /** Split of discovered columns into anchor-matching (primary) and the rest. */
14
+ type DiscoveredTableColumns = {
15
+ readonly primary: ColumnRecipe[];
16
+ readonly secondary: ColumnRecipe[];
17
+ };
18
+ /**
19
+ * Discover columns from sources/anchors and split them into primary
20
+ * (direct anchor hits — zero-hop, query is a bare column) and secondary
21
+ * (reached via a linker chain, query carries a join).
22
+ */
23
+ declare function discoverTableColumns(ctx: RenderCtxBase, options: DiscoverTableColumnOptions): undefined | DiscoveredTableColumns;
15
24
  //#endregion
16
- export { DiscoverTableColumnOptions, discoverTableColumnSnaphots };
25
+ export { DiscoverTableColumnOptions, DiscoveredTableColumns, discoverTableColumns };
17
26
  //# sourceMappingURL=discoverColumns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discoverColumns.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"mappings":";;;;;;;KAgBY,0BAAA;EACV,OAAA,GAAU,YAAA;EACV,OAAA,EAAS,MAAA,SAAe,KAAA,GAAQ,SAAA,GAAY,WAAA,GAAc,qBAAA;EAC1D,QAAA,EAAU,qBAAA;AAAA;AAHZ;AAAA,iBAOgB,2BAAA,CACd,GAAA,EAAK,aAAA,EACL,OAAA,EAAS,0BAAA,GACR,kBAAA"}
1
+ {"version":3,"file":"discoverColumns.d.ts","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"mappings":";;;;;;;KAYY,0BAAA;EACV,OAAA,GAAU,aAAA;EACV,OAAA,EAAS,MAAA,SAAe,KAAA,GAAQ,SAAA,GAAY,WAAA,GAAc,qBAAA;EAC1D,QAAA,EAAU,qBAAA;AAAA;AAHZ;AAAA,KAOY,sBAAA;EAAA,SACD,OAAA,EAAS,YAAA;EAAA,SACT,SAAA,EAAW,YAAY;AAAA;;;;;;iBAQlB,oBAAA,CACd,GAAA,EAAK,aAAA,EACL,OAAA,EAAS,0BAAA,eACI,sBAAA"}
@@ -1,111 +1,53 @@
1
- import { toColumnSnapshotProvider } from "../../../columns/column_snapshot_provider.js";
2
- import { ColumnCollectionBuilder } from "../../../columns/column_collection_builder.js";
3
- import { collectCtxColumnSnapshotProviders } from "../../../columns/ctx_column_sources.js";
1
+ import { ColumnsCollection } from "../../../columns/columns_collection.js";
2
+ import { collectLinkerIds, isLeafColumn } from "../../../columns/utils.js";
4
3
  import "../../../columns/index.js";
5
- import { PColumnName, createDiscoveredPColumnId, isPlRef } from "@milaboratories/pl-model-common";
6
- import { throwError } from "@milaboratories/helpers";
4
+ import { PColumnName } from "@milaboratories/pl-model-common";
7
5
  //#region src/components/PlDataTable/createPlDataTable/discoverColumns.ts
8
- /** Discover columns from sources/anchors and normalize into a flat TableColumnVariant list. */
9
- function discoverTableColumnSnaphots(ctx, options) {
10
- const resolvedOptions = {
11
- ...options,
12
- anchors: resolveAnchors$1(ctx, options.anchors)
6
+ /**
7
+ * Discover columns from sources/anchors and split them into primary
8
+ * (direct anchor hits — zero-hop, query is a bare column) and secondary
9
+ * (reached via a linker chain, query carries a join).
10
+ */
11
+ function discoverTableColumns(ctx, options) {
12
+ const discoveredColumns = ColumnsCollection(options.sources, { ctx: ctx.ctx }).discover({
13
+ ...options.selector,
14
+ anchors: options.anchors
15
+ }).getColumns();
16
+ const primary = [];
17
+ const secondary = [];
18
+ for (const col of discoveredColumns) if (isLeafColumn(col)) primary.push(col);
19
+ else secondary.push(col);
20
+ return {
21
+ primary,
22
+ secondary
13
23
  };
14
- const providers = resolveProviders(ctx, resolvedOptions.sources);
15
- if (providers.length === 0) return void 0;
16
- const collection = new ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSources(providers).build(resolvedOptions);
17
- if (collection === void 0) return void 0;
18
- try {
19
- return mapToTableColumnVariants(collection.findColumnVariants(resolvedOptions.selector), collection.getAnchors());
20
- } finally {
21
- collection.dispose();
22
- }
23
24
  }
24
25
  /**
25
26
  * Discover label columns matching the axes of the given value columns from
26
- * ctx providers. Returns label snapshots wrapped as direct TableColumnVariants
27
- * (path: [], empty qualifications, isPrimary: false).
27
+ * ctx providers. Returns a list of label {@link ColumnRecipe}s.
28
+ *
29
+ * Primary columns are used as anchors for axis-aware label discovery.
30
+ * `maxHops` is taken from the longest linker chain present in `columns`.
28
31
  */
29
- function discoverLabelColumnVariants(ctx, columns) {
32
+ function discoverLabelColumns(ctx, primary, columns) {
30
33
  if (columns.length === 0) return [];
31
- const collection = new ColumnCollectionBuilder(ctx.getService("pframeSpec")).addSources(collectCtxColumnSnapshotProviders(ctx)).addSource(columns.map((c) => c.column)).build({
32
- allowPartialColumnList: true,
33
- anchors: Object.fromEntries(columns.filter((col) => (col.path?.length ?? 0) === 0 && col.isPrimary).map((col, i) => [`anchor_${i}`, col.column.spec]))
34
- });
35
- try {
36
- const axes = columns.flatMap((col) => col.column.spec.axesSpec);
37
- return collection.findColumnVariants({
38
- include: axes.map((a) => ({
39
- name: {
40
- type: "exact",
41
- value: PColumnName.Label
42
- },
43
- axes: [{ name: {
44
- type: "exact",
45
- value: a.name
46
- } }]
47
- })),
48
- maxHops: columns.reduce((acc, c) => Math.max(acc, c.path?.length ?? 0), 0)
49
- }).map((variant) => ({
50
- ...variant,
51
- column: {
52
- ...variant.column,
53
- id: createDiscoveredPColumnId({
54
- column: variant.column.id,
55
- path: variant.path?.map((p) => ({
56
- type: "linker",
57
- column: p.linker.id
58
- })),
59
- columnQualifications: variant.qualifications?.forHit,
60
- queriesQualifications: variant.qualifications?.forQueries
61
- }),
62
- originalId: variant.column.id
63
- }
64
- }));
65
- } finally {
66
- collection.dispose();
67
- }
68
- }
69
- /** Resolve PlRef values in anchors to PColumnSpec via the result pool. */
70
- function resolveAnchors$1(ctx, anchors) {
71
- const result = {};
72
- for (const [key, value] of Object.entries(anchors)) if (isPlRef(value)) result[key] = ctx.resultPool.getPColumnSpecByRef(value) ?? throwError(`Anchor ${key} with ref ${JSON.stringify(value)} could not be resolved to a PColumnSpec`);
73
- else result[key] = value;
74
- return result;
75
- }
76
- /** Resolve column snapshot providers from explicit sources or context. */
77
- function resolveProviders(ctx, sources) {
78
- return sources !== void 0 ? sources.map(toColumnSnapshotProvider) : collectCtxColumnSnapshotProviders(ctx);
79
- }
80
- /** Map column variants into TableColumnVariant list with anchor-derived isPrimary flag. */
81
- function mapToTableColumnVariants(variants, anchors) {
82
- const columnIdToAnchorName = new Map(Array.from(anchors.entries(), ([key, { id }]) => [id, key]));
83
- return variants.map((variant) => {
84
- const snap = variant.column;
85
- const isPrimary = columnIdToAnchorName.get(snap.id) !== void 0;
86
- return {
87
- column: {
88
- id: createDiscoveredPColumnId({
89
- column: snap.id,
90
- path: variant.path?.map((p) => ({
91
- type: "linker",
92
- column: p.linker.id
93
- })),
94
- columnQualifications: variant.qualifications?.forHit,
95
- queriesQualifications: variant.qualifications?.forQueries
96
- }),
97
- spec: snap.spec,
98
- data: snap.data,
99
- dataStatus: snap.dataStatus
34
+ const axes = columns.flatMap((col) => col.getSpec().axesSpec);
35
+ return ColumnsCollection(void 0, { ctx: ctx.ctx }).discover({
36
+ include: axes.map((a) => ({
37
+ name: {
38
+ type: "exact",
39
+ value: PColumnName.Label
100
40
  },
101
- path: variant.path,
102
- qualifications: variant.qualifications,
103
- originalId: snap.id,
104
- isPrimary
105
- };
106
- });
41
+ axes: [{ name: {
42
+ type: "exact",
43
+ value: a.name
44
+ } }]
45
+ })),
46
+ anchors: Object.fromEntries(primary.map((col, i) => [`anchor_${i}`, col.getSpec()])),
47
+ maxHops: columns.reduce((acc, c) => Math.max(acc, collectLinkerIds(c).length), 0)
48
+ }).getColumns();
107
49
  }
108
50
  //#endregion
109
- export { discoverLabelColumnVariants, discoverTableColumnSnaphots };
51
+ export { discoverLabelColumns, discoverTableColumns };
110
52
 
111
53
  //# sourceMappingURL=discoverColumns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discoverColumns.js","names":["resolveAnchors"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"sourcesContent":["import type { PColumnSpec, PlRef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { createDiscoveredPColumnId, isPlRef, PColumnName } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../../render\";\nimport type {\n ColumnSource,\n ColumnVariant,\n RelaxedColumnSelector,\n ColumnSnapshotProvider,\n ColumnSnapshot,\n} from \"../../../columns\";\nimport { ColumnCollectionBuilder } from \"../../../columns\";\nimport { toColumnSnapshotProvider } from \"../../../columns/column_snapshot_provider\";\nimport { collectCtxColumnSnapshotProviders } from \"../../../columns/ctx_column_sources\";\nimport { throwError } from \"@milaboratories/helpers\";\nimport type { ColumnsSelectorConfig, TableColumnVariant } from \"./createPlDataTableV3\";\n\nexport type DiscoverTableColumnOptions = {\n sources?: ColumnSource[];\n anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>;\n selector: ColumnsSelectorConfig;\n};\n\n/** Discover columns from sources/anchors and normalize into a flat TableColumnVariant list. */\nexport function discoverTableColumnSnaphots(\n ctx: RenderCtxBase,\n options: DiscoverTableColumnOptions,\n): TableColumnVariant[] | undefined {\n // Resolve PlRef anchors to PColumnSpec\n const resolvedOptions = {\n ...options,\n anchors: resolveAnchors(ctx, options.anchors),\n };\n\n // Resolve providers\n const providers = resolveProviders(ctx, resolvedOptions.sources);\n if (providers.length === 0) return undefined;\n\n // Build collection (anchored or plain)\n const collection = new ColumnCollectionBuilder(ctx.getService(\"pframeSpec\"))\n .addSources(providers)\n .build(resolvedOptions);\n if (collection === undefined) return undefined;\n\n try {\n const variants = collection.findColumnVariants(resolvedOptions.selector);\n const anchors = collection.getAnchors();\n return mapToTableColumnVariants(variants, anchors);\n } finally {\n collection.dispose();\n }\n}\n\n/**\n * Discover label columns matching the axes of the given value columns from\n * ctx providers. Returns label snapshots wrapped as direct TableColumnVariants\n * (path: [], empty qualifications, isPrimary: false).\n */\nexport function discoverLabelColumnVariants<A, U>(\n ctx: RenderCtxBase<A, U>,\n columns: TableColumnVariant[],\n): TableColumnVariant[] {\n if (columns.length === 0) return [];\n const collection = new ColumnCollectionBuilder(ctx.getService(\"pframeSpec\"))\n .addSources(collectCtxColumnSnapshotProviders(ctx))\n .addSource(columns.map((c) => c.column))\n .build({\n allowPartialColumnList: true,\n anchors: Object.fromEntries(\n columns\n .filter((col) => (col.path?.length ?? 0) === 0 && col.isPrimary)\n .map((col, i) => [`anchor_${i}`, col.column.spec]),\n ),\n });\n\n try {\n const axes = columns.flatMap((col) => col.column.spec.axesSpec);\n return collection\n .findColumnVariants({\n include: axes.map((a) => ({\n name: { type: \"exact\", value: PColumnName.Label },\n axes: [{ name: { type: \"exact\", value: a.name } }],\n })),\n maxHops: columns.reduce((acc, c) => Math.max(acc, c.path?.length ?? 0), 0),\n })\n .map((variant) => ({\n ...variant,\n column: {\n ...variant.column,\n id: createDiscoveredPColumnId({\n column: variant.column.id,\n path: variant.path?.map((p) => ({\n type: \"linker\",\n column: p.linker.id,\n })),\n columnQualifications: variant.qualifications?.forHit,\n queriesQualifications: variant.qualifications?.forQueries,\n }),\n originalId: variant.column.id,\n },\n }));\n } finally {\n collection.dispose();\n }\n}\n\n/** Resolve PlRef values in anchors to PColumnSpec via the result pool. */\nfunction resolveAnchors(\n ctx: RenderCtxBase,\n anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>,\n): Record<string, PObjectId | PColumnSpec | RelaxedColumnSelector> {\n const result: Record<string, PObjectId | PColumnSpec | RelaxedColumnSelector> = {};\n for (const [key, value] of Object.entries(anchors)) {\n if (isPlRef(value)) {\n result[key] =\n ctx.resultPool.getPColumnSpecByRef(value) ??\n throwError(\n `Anchor ${key} with ref ${JSON.stringify(value)} could not be resolved to a PColumnSpec`,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/** Resolve column snapshot providers from explicit sources or context. */\nfunction resolveProviders(\n ctx: RenderCtxBase,\n sources: undefined | ColumnSource[],\n): ColumnSnapshotProvider[] {\n return sources !== undefined\n ? sources.map(toColumnSnapshotProvider)\n : collectCtxColumnSnapshotProviders(ctx);\n}\n\n/** Map column variants into TableColumnVariant list with anchor-derived isPrimary flag. */\nfunction mapToTableColumnVariants(\n variants: readonly ColumnVariant[],\n anchors: Map<string, ColumnSnapshot<PObjectId>>,\n): TableColumnVariant[] {\n const columnIdToAnchorName = new Map<PObjectId, string>(\n Array.from(anchors.entries(), ([key, { id }]) => [id, key] as const),\n );\n\n return variants.map((variant): TableColumnVariant => {\n const snap = variant.column;\n const isPrimary = columnIdToAnchorName.get(snap.id) !== undefined;\n\n const discoveredId = createDiscoveredPColumnId({\n column: snap.id,\n path: variant.path?.map((p) => ({\n type: \"linker\",\n column: p.linker.id,\n })),\n columnQualifications: variant.qualifications?.forHit,\n queriesQualifications: variant.qualifications?.forQueries,\n });\n return {\n column: {\n id: discoveredId,\n spec: snap.spec,\n data: snap.data,\n dataStatus: snap.dataStatus,\n },\n path: variant.path,\n qualifications: variant.qualifications,\n originalId: snap.id,\n isPrimary,\n };\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"discoverColumns.js","names":[],"sources":["../../../../src/components/PlDataTable/createPlDataTable/discoverColumns.ts"],"sourcesContent":["import type {\n PColumnSpec,\n PlRef,\n PObjectId,\n RelaxedColumnSelector,\n} from \"@milaboratories/pl-model-common\";\nimport { PColumnName } from \"@milaboratories/pl-model-common\";\nimport type { RenderCtxBase } from \"../../../render\";\nimport type { ColumnRecipe, ColumnsSource } from \"../../../columns\";\nimport { ColumnsCollection, collectLinkerIds, isLeafColumn } from \"../../../columns\";\nimport type { ColumnsSelectorConfig } from \"./createPlDataTableV3\";\n\nexport type DiscoverTableColumnOptions = {\n sources?: ColumnsSource[];\n anchors: Record<string, PlRef | PObjectId | PColumnSpec | RelaxedColumnSelector>;\n selector: ColumnsSelectorConfig;\n};\n\n/** Split of discovered columns into anchor-matching (primary) and the rest. */\nexport type DiscoveredTableColumns = {\n readonly primary: ColumnRecipe[];\n readonly secondary: ColumnRecipe[];\n};\n\n/**\n * Discover columns from sources/anchors and split them into primary\n * (direct anchor hits — zero-hop, query is a bare column) and secondary\n * (reached via a linker chain, query carries a join).\n */\nexport function discoverTableColumns(\n ctx: RenderCtxBase,\n options: DiscoverTableColumnOptions,\n): undefined | DiscoveredTableColumns {\n const discoveredColumns = ColumnsCollection(options.sources, { ctx: ctx.ctx })\n .discover({ ...options.selector, anchors: options.anchors })\n .getColumns();\n\n const primary: ColumnRecipe[] = [];\n const secondary: ColumnRecipe[] = [];\n for (const col of discoveredColumns) {\n if (isLeafColumn(col)) primary.push(col);\n else secondary.push(col);\n }\n return { primary, secondary };\n}\n\n/**\n * Discover label columns matching the axes of the given value columns from\n * ctx providers. Returns a list of label {@link ColumnRecipe}s.\n *\n * Primary columns are used as anchors for axis-aware label discovery.\n * `maxHops` is taken from the longest linker chain present in `columns`.\n */\nexport function discoverLabelColumns<A, U>(\n ctx: RenderCtxBase<A, U>,\n primary: ColumnRecipe[],\n columns: ColumnRecipe[],\n): ColumnRecipe[] {\n if (columns.length === 0) return [];\n\n const axes = columns.flatMap((col) => col.getSpec().axesSpec);\n return (\n ColumnsCollection(undefined, { ctx: ctx.ctx })\n // .addSource({ columns, isFinal: true })\n .discover({\n include: axes.map((a) => ({\n name: { type: \"exact\", value: PColumnName.Label },\n axes: [{ name: { type: \"exact\", value: a.name } }],\n })),\n anchors: Object.fromEntries(primary.map((col, i) => [`anchor_${i}`, col.getSpec()])),\n maxHops: columns.reduce((acc, c) => Math.max(acc, collectLinkerIds(c).length), 0),\n })\n .getColumns()\n );\n}\n"],"mappings":";;;;;;;;;;AA6BA,SAAgB,qBACd,KACA,SACoC;CACpC,MAAM,oBAAoB,kBAAkB,QAAQ,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAC3E,SAAS;EAAE,GAAG,QAAQ;EAAU,SAAS,QAAQ;CAAQ,CAAC,CAAC,CAC3D,WAAW;CAEd,MAAM,UAA0B,CAAC;CACjC,MAAM,YAA4B,CAAC;CACnC,KAAK,MAAM,OAAO,mBAChB,IAAI,aAAa,GAAG,GAAG,QAAQ,KAAK,GAAG;MAClC,UAAU,KAAK,GAAG;CAEzB,OAAO;EAAE;EAAS;CAAU;AAC9B;;;;;;;;AASA,SAAgB,qBACd,KACA,SACA,SACgB;CAChB,IAAI,QAAQ,WAAW,GAAG,OAAO,CAAC;CAElC,MAAM,OAAO,QAAQ,SAAS,QAAQ,IAAI,QAAQ,CAAC,CAAC,QAAQ;CAC5D,OACE,kBAAkB,KAAA,GAAW,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAE3C,SAAS;EACR,SAAS,KAAK,KAAK,OAAO;GACxB,MAAM;IAAE,MAAM;IAAS,OAAO,YAAY;GAAM;GAChD,MAAM,CAAC,EAAE,MAAM;IAAE,MAAM;IAAS,OAAO,EAAE;GAAK,EAAE,CAAC;EACnD,EAAE;EACF,SAAS,OAAO,YAAY,QAAQ,KAAK,KAAK,MAAM,CAAC,UAAU,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC;EACnF,SAAS,QAAQ,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;CAClF,CAAC,CAAC,CACD,WAAW;AAElB"}
@@ -8,6 +8,6 @@ function createPlDataTable(ctx, options) {
8
8
  }
9
9
  //#endregion
10
10
  exports.createPlDataTable = createPlDataTable;
11
- exports.discoverTableColumnSnaphots = require_discoverColumns.discoverTableColumnSnaphots;
11
+ exports.discoverTableColumnSnaphots = require_discoverColumns.discoverTableColumns;
12
12
 
13
13
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["createPlDataTableV2","createPlDataTableV3"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/index.ts"],"sourcesContent":["import type { RenderCtxBase } from \"../../../render\";\nimport type { PlDataTableModel } from \"../typesV7\";\nimport { createPlDataTableOptionsV2, createPlDataTableV2 } from \"./createPlDataTableV2\";\nimport { createPlDataTableV3 } from \"./createPlDataTableV3\";\nimport type { createPlDataTableOptionsV3 } from \"./createPlDataTableV3\";\n\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version: \"v2\" } & createPlDataTableOptionsV2,\n): ReturnType<typeof createPlDataTableV2>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version?: \"v3\" } & createPlDataTableOptionsV3,\n): ReturnType<typeof createPlDataTableV3>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options:\n | ({ version: \"v2\" } & createPlDataTableOptionsV2)\n | ({ version?: \"v3\" } & createPlDataTableOptionsV3),\n): PlDataTableModel | undefined {\n if (options.version === \"v2\") {\n return createPlDataTableV2(ctx, options.columns, options.tableState, options.options);\n } else {\n // default version is last (v3 at the moment)\n return createPlDataTableV3(ctx, options);\n }\n}\n\nexport { discoverTableColumnSnaphots } from \"./discoverColumns\";\n"],"mappings":";;;;AAcA,SAAgB,kBACd,KACA,SAG8B;CAC9B,IAAI,QAAQ,YAAY,MACtB,OAAOA,4BAAAA,oBAAoB,KAAK,QAAQ,SAAS,QAAQ,YAAY,QAAQ,OAAO;MAGpF,OAAOC,4BAAAA,oBAAoB,KAAK,OAAO;AAE3C"}
1
+ {"version":3,"file":"index.cjs","names":["createPlDataTableV2","createPlDataTableV3"],"sources":["../../../../src/components/PlDataTable/createPlDataTable/index.ts"],"sourcesContent":["import type { RenderCtxBase } from \"../../../render\";\nimport type { PlDataTableModel } from \"../typesV8\";\nimport { createPlDataTableOptionsV2, createPlDataTableV2 } from \"./createPlDataTableV2\";\nimport { createPlDataTableV3 } from \"./createPlDataTableV3\";\nimport type { createPlDataTableOptionsV3 } from \"./createPlDataTableV3\";\n\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version: \"v2\" } & createPlDataTableOptionsV2,\n): ReturnType<typeof createPlDataTableV2>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options: { version?: \"v3\" } & createPlDataTableOptionsV3,\n): ReturnType<typeof createPlDataTableV3>;\nexport function createPlDataTable<A, U>(\n ctx: RenderCtxBase<A, U>,\n options:\n | ({ version: \"v2\" } & createPlDataTableOptionsV2)\n | ({ version?: \"v3\" } & createPlDataTableOptionsV3),\n): PlDataTableModel | undefined {\n if (options.version === \"v2\") {\n return createPlDataTableV2(ctx, options.columns, options.tableState, options.options);\n } else {\n // default version is last (v3 at the moment)\n return createPlDataTableV3(ctx, options);\n }\n}\n\nexport { discoverTableColumns as discoverTableColumnSnaphots } from \"./discoverColumns\";\n"],"mappings":";;;;AAcA,SAAgB,kBACd,KACA,SAG8B;CAC9B,IAAI,QAAQ,YAAY,MACtB,OAAOA,4BAAAA,oBAAoB,KAAK,QAAQ,SAAS,QAAQ,YAAY,QAAQ,OAAO;MAGpF,OAAOC,4BAAAA,oBAAoB,KAAK,OAAO;AAE3C"}
@@ -1,6 +1,6 @@
1
1
  import { RenderCtxBase } from "../../../render/api.js";
2
2
  import { createPlDataTableOptionsV2, createPlDataTableV2 } from "./createPlDataTableV2.js";
3
- import { discoverTableColumnSnaphots } from "./discoverColumns.js";
3
+ import { discoverTableColumns } from "./discoverColumns.js";
4
4
  import { createPlDataTableOptionsV3, createPlDataTableV3 } from "./createPlDataTableV3.js";
5
5
 
6
6
  //#region src/components/PlDataTable/createPlDataTable/index.d.ts
@@ -11,5 +11,5 @@ declare function createPlDataTable<A, U>(ctx: RenderCtxBase<A, U>, options: {
11
11
  version?: "v3";
12
12
  } & createPlDataTableOptionsV3): ReturnType<typeof createPlDataTableV3>;
13
13
  //#endregion
14
- export { createPlDataTable, discoverTableColumnSnaphots };
14
+ export { createPlDataTable, discoverTableColumns as discoverTableColumnSnaphots };
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { createPlDataTableV2 } from "./createPlDataTableV2.js";
2
- import { discoverTableColumnSnaphots } from "./discoverColumns.js";
2
+ import { discoverTableColumns } from "./discoverColumns.js";
3
3
  import { createPlDataTableV3 } from "./createPlDataTableV3.js";
4
4
  //#region src/components/PlDataTable/createPlDataTable/index.ts
5
5
  function createPlDataTable(ctx, options) {
@@ -7,6 +7,6 @@ function createPlDataTable(ctx, options) {
7
7
  else return createPlDataTableV3(ctx, options);
8
8
  }
9
9
  //#endregion
10
- export { createPlDataTable, discoverTableColumnSnaphots };
10
+ export { createPlDataTable, discoverTableColumns as discoverTableColumnSnaphots };
11
11
 
12
12
  //# sourceMappingURL=index.js.map