@cosmicdrift/kumiko-renderer 0.388.0 → 0.390.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/dist/app/base-path-context.d.ts +9 -0
  2. package/dist/app/base-path-context.js +13 -0
  3. package/dist/app/base-path.d.ts +3 -0
  4. package/dist/app/base-path.js +27 -0
  5. package/dist/app/config-edit-body.d.ts +1 -1
  6. package/dist/app/config-edit-body.js +15 -6
  7. package/dist/app/config-edit-without-secret-fields.d.ts +2 -0
  8. package/dist/app/config-edit-without-secret-fields.js +28 -0
  9. package/dist/app/entity-list-facet-specs.d.ts +3 -0
  10. package/dist/app/entity-list-facet-specs.js +65 -0
  11. package/dist/app/entity-list-screen.js +74 -206
  12. package/dist/app/kumiko-screen.js +6 -14
  13. package/dist/app/list-bulk-actions.d.ts +18 -0
  14. package/dist/app/list-bulk-actions.js +54 -0
  15. package/dist/app/locked-screen-header.d.ts +9 -0
  16. package/dist/app/locked-screen-header.js +33 -0
  17. package/dist/app/projection-detail-body.js +59 -394
  18. package/dist/app/projection-detail-header-model.d.ts +11 -0
  19. package/dist/app/projection-detail-header-model.js +33 -0
  20. package/dist/app/projection-detail-header-region.d.ts +28 -0
  21. package/dist/app/projection-detail-header-region.js +81 -0
  22. package/dist/app/projection-detail-header.d.ts +29 -0
  23. package/dist/app/projection-detail-header.js +84 -0
  24. package/dist/app/projection-detail-navigation.d.ts +13 -0
  25. package/dist/app/projection-detail-navigation.js +91 -0
  26. package/dist/app/projection-detail-states.d.ts +22 -0
  27. package/dist/app/projection-detail-states.js +26 -0
  28. package/dist/app/projection-drawer-host.d.ts +12 -0
  29. package/dist/app/projection-drawer-host.js +10 -0
  30. package/dist/app/projection-list-body.d.ts +1 -1
  31. package/dist/app/projection-list-body.js +82 -197
  32. package/dist/app/projection-list-render-props.d.ts +56 -0
  33. package/dist/app/projection-list-render-props.js +47 -0
  34. package/dist/app/projection-list-render.d.ts +26 -0
  35. package/dist/app/projection-list-render.js +20 -0
  36. package/dist/app/projection-list-row-click.d.ts +12 -0
  37. package/dist/app/projection-list-row-click.js +14 -0
  38. package/dist/app/row-actions.d.ts +3 -0
  39. package/dist/app/row-actions.js +10 -5
  40. package/dist/app/screen-shared.js +9 -2
  41. package/dist/app/use-entity-range-facets.d.ts +24 -0
  42. package/dist/app/use-entity-range-facets.js +64 -0
  43. package/dist/app/use-projection-date-range.d.ts +12 -0
  44. package/dist/app/use-projection-date-range.js +21 -0
  45. package/dist/app/use-projection-detail-actions.d.ts +35 -0
  46. package/dist/app/use-projection-detail-actions.js +156 -0
  47. package/dist/app/use-projection-detail-data.d.ts +19 -0
  48. package/dist/app/use-projection-detail-data.js +47 -0
  49. package/dist/app/use-projection-detail-layout.d.ts +17 -0
  50. package/dist/app/use-projection-detail-layout.js +23 -0
  51. package/dist/app/use-projection-list-actions.d.ts +31 -0
  52. package/dist/app/use-projection-list-actions.js +73 -0
  53. package/dist/app/use-projection-list-data.d.ts +20 -0
  54. package/dist/app/use-projection-list-data.js +26 -0
  55. package/dist/app/use-projection-list-definitions.d.ts +11 -0
  56. package/dist/app/use-projection-list-definitions.js +20 -0
  57. package/dist/app/use-projection-list-query.d.ts +28 -0
  58. package/dist/app/use-projection-list-query.js +83 -0
  59. package/dist/app/use-screen-list-rows.d.ts +37 -0
  60. package/dist/app/use-screen-list-rows.js +104 -0
  61. package/dist/app/use-screen-list-table.d.ts +24 -0
  62. package/dist/app/use-screen-list-table.js +46 -0
  63. package/dist/components/list-group-page-bridges.d.ts +3 -0
  64. package/dist/components/list-group-page-bridges.js +31 -0
  65. package/dist/components/list-state-store.d.ts +16 -0
  66. package/dist/components/list-state-store.js +31 -0
  67. package/dist/components/related-list-section.js +37 -89
  68. package/dist/components/render-edit-banners.d.ts +12 -0
  69. package/dist/components/render-edit-banners.js +90 -0
  70. package/dist/components/render-edit-draft-save-helpers.d.ts +19 -0
  71. package/dist/components/render-edit-draft-save-helpers.js +42 -0
  72. package/dist/components/render-edit-field-grid.d.ts +4 -0
  73. package/dist/components/render-edit-field-grid.js +40 -0
  74. package/dist/components/render-edit-fields-section.d.ts +4 -0
  75. package/dist/components/render-edit-fields-section.js +76 -0
  76. package/dist/components/render-edit-form-actions.d.ts +4 -0
  77. package/dist/components/render-edit-form-actions.js +66 -0
  78. package/dist/components/render-edit-header-actions.d.ts +11 -0
  79. package/dist/components/render-edit-header-actions.js +120 -0
  80. package/dist/components/render-edit-layout-flags.d.ts +29 -0
  81. package/dist/components/render-edit-layout-flags.js +106 -0
  82. package/dist/components/render-edit-layout.d.ts +4 -0
  83. package/dist/components/render-edit-layout.js +79 -0
  84. package/dist/components/render-edit-render-model.d.ts +63 -0
  85. package/dist/components/render-edit-render-model.js +14 -0
  86. package/dist/components/render-edit-section-kinds.d.ts +4 -0
  87. package/dist/components/render-edit-section-kinds.js +115 -0
  88. package/dist/components/render-edit-submit-result.d.ts +8 -0
  89. package/dist/components/render-edit-submit-result.js +77 -0
  90. package/dist/components/render-edit-submit.d.ts +7 -0
  91. package/dist/components/render-edit-submit.js +113 -0
  92. package/dist/components/render-edit-titles.d.ts +17 -0
  93. package/dist/components/render-edit-titles.js +99 -0
  94. package/dist/components/render-edit-wizard-navigation.d.ts +11 -0
  95. package/dist/components/render-edit-wizard-navigation.js +115 -0
  96. package/dist/components/render-edit.d.ts +2 -2
  97. package/dist/components/render-edit.js +63 -1128
  98. package/dist/components/render-field-choice-inputs.d.ts +7 -0
  99. package/dist/components/render-field-choice-inputs.js +52 -0
  100. package/dist/components/render-field-control.d.ts +12 -0
  101. package/dist/components/render-field-control.js +93 -0
  102. package/dist/components/render-field-display-text.d.ts +4 -0
  103. package/dist/components/render-field-display-text.js +48 -0
  104. package/dist/components/render-field-fill-action.d.ts +13 -0
  105. package/dist/components/render-field-fill-action.js +63 -0
  106. package/dist/components/render-field-input-shared.d.ts +39 -0
  107. package/dist/components/render-field-input-shared.js +20 -0
  108. package/dist/components/render-field-input.d.ts +3 -0
  109. package/dist/components/render-field-input.js +34 -0
  110. package/dist/components/render-field-meta.d.ts +6 -0
  111. package/dist/components/render-field-meta.js +51 -0
  112. package/dist/components/render-field-read-only.d.ts +11 -0
  113. package/dist/components/render-field-read-only.js +75 -0
  114. package/dist/components/render-field-reference.d.ts +15 -0
  115. package/dist/components/render-field-reference.js +103 -0
  116. package/dist/components/render-field-scalar-inputs.d.ts +10 -0
  117. package/dist/components/render-field-scalar-inputs.js +35 -0
  118. package/dist/components/render-field-text-inputs.d.ts +3 -0
  119. package/dist/components/render-field-text-inputs.js +34 -0
  120. package/dist/components/render-field-values.d.ts +18 -0
  121. package/dist/components/render-field-values.js +111 -0
  122. package/dist/components/render-field-write-only.d.ts +9 -0
  123. package/dist/components/render-field-write-only.js +29 -0
  124. package/dist/components/render-field.d.ts +2 -2
  125. package/dist/components/render-field.js +39 -669
  126. package/dist/components/render-list-header-slot.d.ts +5 -0
  127. package/dist/components/render-list-header-slot.js +30 -0
  128. package/dist/components/render-list-reference-bridge.d.ts +3 -0
  129. package/dist/components/render-list-reference-bridge.js +25 -0
  130. package/dist/components/render-list-reference-columns.d.ts +25 -0
  131. package/dist/components/render-list-reference-columns.js +137 -0
  132. package/dist/components/render-list-table-props.d.ts +52 -0
  133. package/dist/components/render-list-table-props.js +53 -0
  134. package/dist/components/render-list-toolbar-action.d.ts +27 -0
  135. package/dist/components/render-list-toolbar-action.js +40 -0
  136. package/dist/components/render-list-toolbar-model.d.ts +42 -0
  137. package/dist/components/render-list-toolbar-model.js +82 -0
  138. package/dist/components/render-list-toolbar.d.ts +38 -0
  139. package/dist/components/render-list-toolbar.js +40 -0
  140. package/dist/components/render-list-types.d.ts +113 -0
  141. package/dist/components/render-list-types.js +1 -0
  142. package/dist/components/render-list.d.ts +5 -130
  143. package/dist/components/render-list.js +95 -319
  144. package/dist/components/use-reference-input-state.d.ts +20 -0
  145. package/dist/components/use-reference-input-state.js +85 -0
  146. package/dist/components/use-render-edit-controlled-sync.d.ts +3 -0
  147. package/dist/components/use-render-edit-controlled-sync.js +26 -0
  148. package/dist/components/use-render-edit-draft-save.d.ts +29 -0
  149. package/dist/components/use-render-edit-draft-save.js +141 -0
  150. package/dist/components/use-render-edit-form.d.ts +10 -0
  151. package/dist/components/use-render-edit-form.js +101 -0
  152. package/dist/components/use-render-edit-sections.d.ts +15 -0
  153. package/dist/components/use-render-edit-sections.js +100 -0
  154. package/dist/components/use-render-edit-state.d.ts +65 -0
  155. package/dist/components/use-render-edit-state.js +158 -0
  156. package/dist/components/use-render-edit-steps.d.ts +13 -0
  157. package/dist/components/use-render-edit-steps.js +52 -0
  158. package/dist/components/use-render-list-columns.d.ts +18 -0
  159. package/dist/components/use-render-list-columns.js +41 -0
  160. package/dist/components/use-render-list-search.d.ts +4 -0
  161. package/dist/components/use-render-list-search.js +50 -0
  162. package/dist/current-user.d.ts +2 -0
  163. package/dist/data-table-aggregate-types.d.ts +47 -0
  164. package/dist/data-table-aggregate-types.js +1 -0
  165. package/dist/data-table-bulk-types.d.ts +27 -0
  166. package/dist/data-table-bulk-types.js +1 -0
  167. package/dist/data-table-facet-types.d.ts +36 -0
  168. package/dist/data-table-facet-types.js +1 -0
  169. package/dist/data-table-view-types.d.ts +73 -0
  170. package/dist/data-table-view-types.js +1 -0
  171. package/dist/headless/view-model/edit.js +3 -1
  172. package/dist/headless/view-model/types.d.ts +4 -2
  173. package/dist/hooks/list-column-layout.d.ts +19 -0
  174. package/dist/hooks/list-column-layout.js +36 -0
  175. package/dist/hooks/list-group-pages.d.ts +26 -0
  176. package/dist/hooks/list-group-pages.js +37 -0
  177. package/dist/hooks/list-reset.d.ts +8 -0
  178. package/dist/hooks/list-reset.js +15 -0
  179. package/dist/hooks/list-server-groups.d.ts +39 -0
  180. package/dist/hooks/list-server-groups.js +84 -0
  181. package/dist/hooks/list-state-schema.d.ts +28 -0
  182. package/dist/hooks/list-state-schema.js +76 -0
  183. package/dist/hooks/use-bulk-run.d.ts +41 -0
  184. package/dist/hooks/use-bulk-run.js +65 -0
  185. package/dist/hooks/use-group-load-state.d.ts +11 -0
  186. package/dist/hooks/use-group-load-state.js +31 -0
  187. package/dist/hooks/use-list-aggregates.d.ts +38 -0
  188. package/dist/hooks/use-list-aggregates.js +107 -0
  189. package/dist/hooks/use-list-table.d.ts +38 -0
  190. package/dist/hooks/use-list-table.js +91 -0
  191. package/dist/hooks/use-list-view-state.d.ts +43 -0
  192. package/dist/hooks/use-list-view-state.js +161 -0
  193. package/dist/hooks/use-related-list-rows.d.ts +27 -0
  194. package/dist/hooks/use-related-list-rows.js +81 -0
  195. package/dist/hooks/use-related-list-state.d.ts +15 -0
  196. package/dist/hooks/use-related-list-state.js +31 -0
  197. package/dist/hooks/use-remembered-list-params.d.ts +13 -0
  198. package/dist/hooks/use-remembered-list-params.js +53 -0
  199. package/dist/hooks/use-remembered-local-list-state.d.ts +26 -0
  200. package/dist/hooks/use-remembered-local-list-state.js +63 -0
  201. package/dist/i18n-defaults.js +53 -0
  202. package/dist/index.d.ts +3 -1
  203. package/dist/index.js +2 -0
  204. package/dist/primitives.d.ts +11 -47
  205. package/dist/web/app/create-app.d.ts +5 -0
  206. package/dist/web/app/create-app.js +7 -4
  207. package/dist/web/app/dashboard-body.d.ts +1 -1
  208. package/dist/web/app/dashboard-body.js +42 -246
  209. package/dist/web/app/dashboard-header.d.ts +34 -0
  210. package/dist/web/app/dashboard-header.js +58 -0
  211. package/dist/web/app/dashboard-screen-controls.d.ts +11 -0
  212. package/dist/web/app/dashboard-screen-controls.js +42 -0
  213. package/dist/web/app/dashboard-screen-tiles.d.ts +8 -0
  214. package/dist/web/app/dashboard-screen-tiles.js +42 -0
  215. package/dist/web/app/dashboard-visibility.d.ts +42 -0
  216. package/dist/web/app/dashboard-visibility.js +102 -0
  217. package/dist/web/app/history-leave-guard.d.ts +6 -0
  218. package/dist/web/app/history-leave-guard.js +115 -0
  219. package/dist/web/app/list-state-store-boot.d.ts +6 -0
  220. package/dist/web/app/list-state-store-boot.js +15 -0
  221. package/dist/web/app/nav.js +7 -54
  222. package/dist/web/app/session-list-state-store.d.ts +15 -0
  223. package/dist/web/app/session-list-state-store.js +117 -0
  224. package/dist/web/app/use-dashboard-screen-state.d.ts +35 -0
  225. package/dist/web/app/use-dashboard-screen-state.js +69 -0
  226. package/dist/web/index.d.ts +1 -0
  227. package/dist/web/index.js +1 -0
  228. package/dist/web/lib/export-xlsx-request.d.ts +11 -0
  229. package/dist/web/lib/export-xlsx-request.js +46 -0
  230. package/dist/web/primitives/data-table/actions-column.d.ts +16 -0
  231. package/dist/web/primitives/data-table/actions-column.js +35 -0
  232. package/dist/web/primitives/data-table/bulk-selection-bar.d.ts +20 -0
  233. package/dist/web/primitives/data-table/bulk-selection-bar.js +37 -0
  234. package/dist/web/primitives/data-table/card-body.d.ts +6 -0
  235. package/dist/web/primitives/data-table/card-body.js +32 -0
  236. package/dist/web/primitives/data-table/card-row.d.ts +5 -0
  237. package/dist/web/primitives/data-table/card-row.js +31 -0
  238. package/dist/web/primitives/data-table/card-sort-select.d.ts +14 -0
  239. package/dist/web/primitives/data-table/card-sort-select.js +40 -0
  240. package/dist/web/primitives/data-table/card-view.d.ts +3 -0
  241. package/dist/web/primitives/data-table/card-view.js +13 -0
  242. package/dist/web/primitives/data-table/column-layout-mode.d.ts +5 -0
  243. package/dist/web/primitives/data-table/column-layout-mode.js +10 -0
  244. package/dist/web/primitives/data-table/column-picker-section.d.ts +7 -0
  245. package/dist/web/primitives/data-table/column-picker-section.js +35 -0
  246. package/dist/web/primitives/data-table/column-resize-handle.d.ts +14 -0
  247. package/dist/web/primitives/data-table/column-resize-handle.js +48 -0
  248. package/dist/web/primitives/data-table/data-cell-props.d.ts +7 -0
  249. package/dist/web/primitives/data-table/data-cell-props.js +8 -0
  250. package/dist/web/primitives/data-table/density.d.ts +14 -0
  251. package/dist/web/primitives/data-table/density.js +20 -0
  252. package/dist/web/primitives/data-table/export-button.d.ts +5 -0
  253. package/dist/web/primitives/data-table/export-button.js +37 -0
  254. package/dist/web/primitives/data-table/facet-cluster.d.ts +8 -0
  255. package/dist/web/primitives/data-table/facet-cluster.js +37 -0
  256. package/dist/web/primitives/data-table/group-band.d.ts +28 -0
  257. package/dist/web/primitives/data-table/group-band.js +53 -0
  258. package/dist/web/primitives/data-table/measure-value.d.ts +10 -0
  259. package/dist/web/primitives/data-table/measure-value.js +28 -0
  260. package/dist/web/primitives/data-table/pin-section.d.ts +8 -0
  261. package/dist/web/primitives/data-table/pin-section.js +20 -0
  262. package/dist/web/primitives/data-table/reset-all-button.d.ts +4 -0
  263. package/dist/web/primitives/data-table/reset-all-button.js +8 -0
  264. package/dist/web/primitives/data-table/row-render-parts.d.ts +8 -0
  265. package/dist/web/primitives/data-table/row-render-parts.js +35 -0
  266. package/dist/web/primitives/data-table/server-group-header.d.ts +11 -0
  267. package/dist/web/primitives/data-table/server-group-header.js +51 -0
  268. package/dist/web/primitives/data-table/sortable-header.d.ts +17 -0
  269. package/dist/web/primitives/data-table/sortable-header.js +41 -0
  270. package/dist/web/primitives/data-table/table-body.d.ts +3 -0
  271. package/dist/web/primitives/data-table/table-body.js +32 -0
  272. package/dist/web/primitives/data-table/table-chrome.d.ts +13 -0
  273. package/dist/web/primitives/data-table/table-chrome.js +30 -0
  274. package/dist/web/primitives/data-table/table-content.d.ts +3 -0
  275. package/dist/web/primitives/data-table/table-content.js +41 -0
  276. package/dist/web/primitives/data-table/table-data-cell.d.ts +4 -0
  277. package/dist/web/primitives/data-table/table-data-cell.js +25 -0
  278. package/dist/web/primitives/data-table/table-footer.d.ts +7 -0
  279. package/dist/web/primitives/data-table/table-footer.js +20 -0
  280. package/dist/web/primitives/data-table/table-header-row.d.ts +3 -0
  281. package/dist/web/primitives/data-table/table-header-row.js +21 -0
  282. package/dist/web/primitives/data-table/table-view.d.ts +3 -0
  283. package/dist/web/primitives/data-table/table-view.js +25 -0
  284. package/dist/web/primitives/data-table/toolbar-end-cluster.d.ts +10 -0
  285. package/dist/web/primitives/data-table/toolbar-end-cluster.js +13 -0
  286. package/dist/web/primitives/data-table/toolbar.d.ts +6 -0
  287. package/dist/web/primitives/data-table/toolbar.js +53 -0
  288. package/dist/web/primitives/data-table/totals-footer.d.ts +24 -0
  289. package/dist/web/primitives/data-table/totals-footer.js +48 -0
  290. package/dist/web/primitives/data-table/use-bulk-selection.d.ts +21 -0
  291. package/dist/web/primitives/data-table/use-bulk-selection.js +66 -0
  292. package/dist/web/primitives/data-table/use-column-pins.d.ts +32 -0
  293. package/dist/web/primitives/data-table/use-column-pins.js +117 -0
  294. package/dist/web/primitives/data-table/use-column-sizing.d.ts +22 -0
  295. package/dist/web/primitives/data-table/use-column-sizing.js +44 -0
  296. package/dist/web/primitives/data-table/use-data-table-state.d.ts +44 -0
  297. package/dist/web/primitives/data-table/use-data-table-state.js +123 -0
  298. package/dist/web/primitives/data-table/use-measured-column-widths.d.ts +15 -0
  299. package/dist/web/primitives/data-table/use-measured-column-widths.js +83 -0
  300. package/dist/web/primitives/data-table/use-row-keyboard-navigation.d.ts +22 -0
  301. package/dist/web/primitives/data-table/use-row-keyboard-navigation.js +65 -0
  302. package/dist/web/primitives/data-table/use-row-selection.d.ts +14 -0
  303. package/dist/web/primitives/data-table/use-row-selection.js +48 -0
  304. package/dist/web/primitives/data-table/use-view-columns.d.ts +6 -0
  305. package/dist/web/primitives/data-table/use-view-columns.js +17 -0
  306. package/dist/web/primitives/data-table/view-menu.d.ts +8 -0
  307. package/dist/web/primitives/data-table/view-menu.js +45 -0
  308. package/dist/web/primitives/data-table-cell.d.ts +0 -22
  309. package/dist/web/primitives/data-table-cell.js +1 -58
  310. package/dist/web/primitives/data-table.d.ts +3 -4
  311. package/dist/web/primitives/data-table.js +30 -272
  312. package/dist/web/primitives/file-value-list.d.ts +1 -1
  313. package/dist/web/primitives/file-value-list.js +5 -5
  314. package/dist/web/primitives/form-footer-parts.d.ts +25 -0
  315. package/dist/web/primitives/form-footer-parts.js +55 -0
  316. package/dist/web/primitives/form.js +33 -43
  317. package/dist/web/primitives/input-choice-kinds.d.ts +4 -0
  318. package/dist/web/primitives/input-choice-kinds.js +67 -0
  319. package/dist/web/primitives/input-file-kinds.d.ts +3 -0
  320. package/dist/web/primitives/input-file-kinds.js +6 -0
  321. package/dist/web/primitives/input-number-kinds.d.ts +4 -0
  322. package/dist/web/primitives/input-number-kinds.js +16 -0
  323. package/dist/web/primitives/input-optional-props.d.ts +20 -0
  324. package/dist/web/primitives/input-optional-props.js +24 -0
  325. package/dist/web/primitives/input-select-presentation.d.ts +13 -0
  326. package/dist/web/primitives/input-select-presentation.js +19 -0
  327. package/dist/web/primitives/input-shared.d.ts +22 -0
  328. package/dist/web/primitives/input-shared.js +10 -0
  329. package/dist/web/primitives/input-temporal-kinds.d.ts +5 -0
  330. package/dist/web/primitives/input-temporal-kinds.js +10 -0
  331. package/dist/web/primitives/input-text-kinds.d.ts +7 -0
  332. package/dist/web/primitives/input-text-kinds.js +33 -0
  333. package/dist/web/primitives/input.js +35 -161
  334. package/dist/web/primitives/number-range-facet.d.ts +7 -0
  335. package/dist/web/primitives/number-range-facet.js +33 -0
  336. package/dist/web/widgets/bounded-load-cache.d.ts +5 -1
  337. package/dist/web/widgets/bounded-load-cache.js +48 -26
  338. package/dist/web/widgets/chart-data.d.ts +35 -0
  339. package/dist/web/widgets/chart-data.js +37 -0
  340. package/dist/web/widgets/chart-markers.d.ts +26 -0
  341. package/dist/web/widgets/chart-markers.js +64 -0
  342. package/dist/web/widgets/chart-parts.d.ts +20 -0
  343. package/dist/web/widgets/chart-parts.js +15 -0
  344. package/dist/web/widgets/charts.d.ts +5 -78
  345. package/dist/web/widgets/charts.js +7 -485
  346. package/dist/web/widgets/drawer-panel-class.d.ts +3 -0
  347. package/dist/web/widgets/drawer-panel-class.js +40 -0
  348. package/dist/web/widgets/drawer-resize-controls.d.ts +11 -0
  349. package/dist/web/widgets/drawer-resize-controls.js +12 -0
  350. package/dist/web/widgets/drawer-sizing.d.ts +19 -0
  351. package/dist/web/widgets/drawer-sizing.js +60 -0
  352. package/dist/web/widgets/drawer.js +17 -116
  353. package/dist/web/widgets/pdf-preview.js +9 -4
  354. package/dist/web/widgets/stacked-area-brush.d.ts +13 -0
  355. package/dist/web/widgets/stacked-area-brush.js +91 -0
  356. package/dist/web/widgets/stacked-area-chart.d.ts +6 -0
  357. package/dist/web/widgets/stacked-area-chart.js +45 -0
  358. package/dist/web/widgets/stacked-area-chrome.d.ts +7 -0
  359. package/dist/web/widgets/stacked-area-chrome.js +77 -0
  360. package/dist/web/widgets/stacked-area-geometry.d.ts +54 -0
  361. package/dist/web/widgets/stacked-area-geometry.js +83 -0
  362. package/dist/web/widgets/stacked-area-model.d.ts +11 -0
  363. package/dist/web/widgets/stacked-area-model.js +1 -0
  364. package/dist/web/widgets/stacked-area-plot.d.ts +3 -0
  365. package/dist/web/widgets/stacked-area-plot.js +51 -0
  366. package/dist/web/widgets/stacked-area-props.d.ts +83 -0
  367. package/dist/web/widgets/stacked-area-props.js +16 -0
  368. package/dist/web/widgets/stacked-area-svg.d.ts +3 -0
  369. package/dist/web/widgets/stacked-area-svg.js +38 -0
  370. package/dist/web/widgets/stacked-area-tooltip.d.ts +3 -0
  371. package/dist/web/widgets/stacked-area-tooltip.js +86 -0
  372. package/dist/web/widgets/use-drawer-resize.d.ts +22 -0
  373. package/dist/web/widgets/use-drawer-resize.js +52 -0
  374. package/dist/web/widgets/use-stacked-area-tooltip.d.ts +9 -0
  375. package/dist/web/widgets/use-stacked-area-tooltip.js +34 -0
  376. package/dist/web/widgets/use-stacked-area-window.d.ts +20 -0
  377. package/dist/web/widgets/use-stacked-area-window.js +76 -0
  378. package/package.json +9 -9
  379. package/src/changes.json +163 -0
@@ -0,0 +1,64 @@
1
+ import { propertyOf } from "@cosmicdrift/kumiko-types/type-guards";
2
+ import { useCallback, useMemo } from "react";
3
+ import { fieldLabelKey } from "../headless/index.js";
4
+ const RANGE_FIELD_TYPES = new Set(["number", "decimal", "money", "bigInt"]);
5
+ // Money is stored and filtered in minor units; the user types the major amount.
6
+ const MONEY_MINOR_UNITS = 100;
7
+ // The bounds live in the facet URL namespace (`<screenId>.f.<field>.min`), so
8
+ // page reset and clearFilters cover them; buildFilterPayload skips the dotted key.
9
+ function rangeUrlField(field, bound) {
10
+ return `${field}.${bound}`;
11
+ }
12
+ function literalCurrencyOf(def) {
13
+ const currency = propertyOf(def, "currency");
14
+ const code = propertyOf(currency, "code");
15
+ return propertyOf(currency, "kind") === "literal" && typeof code === "string" ? code : undefined;
16
+ }
17
+ function resolveRangeSpecs(fields, facets, featureName, entityName, translate) {
18
+ return Object.entries(facets ?? {}).flatMap(([field, config]) => {
19
+ if (config === false || config.display !== "range")
20
+ return [];
21
+ const def = fields[field];
22
+ const type = propertyOf(def, "type");
23
+ if (typeof type !== "string" || !RANGE_FIELD_TYPES.has(type))
24
+ return [];
25
+ const unit = type === "money" ? literalCurrencyOf(def) : undefined;
26
+ return [
27
+ {
28
+ field,
29
+ label: translate(fieldLabelKey(featureName, entityName, field)),
30
+ money: type === "money",
31
+ ...(unit !== undefined && { unit }),
32
+ },
33
+ ];
34
+ });
35
+ }
36
+ function boundOf(urlFilters, field, bound) {
37
+ return urlFilters[rangeUrlField(field, bound)]?.[0] ?? "";
38
+ }
39
+ function rangeFiltersOf(specs, urlFilters) {
40
+ return specs.flatMap((spec) => ["min", "max"].flatMap((bound) => {
41
+ const typed = boundOf(urlFilters, spec.field, bound);
42
+ const amount = Number(typed);
43
+ if (typed === "" || !Number.isFinite(amount))
44
+ return [];
45
+ const value = spec.money ? Math.round(amount * MONEY_MINOR_UNITS) : amount;
46
+ return [{ field: spec.field, op: bound === "min" ? "gte" : "lte", value }];
47
+ }));
48
+ }
49
+ /** `display: "range"` facets of an entityList: from/to inputs sent as `gte`/`lte`. */
50
+ export function useEntityRangeFacets({ fields, screen, featureName, translate, urlState, }) {
51
+ const { filters: urlFilters, setFilter } = urlState;
52
+ const specs = useMemo(() => resolveRangeSpecs(fields, screen.facets, featureName, screen.entity, translate), [fields, screen.facets, featureName, screen.entity, translate]);
53
+ const rangeFacets = useMemo(() => specs.map((spec) => ({
54
+ field: spec.field,
55
+ label: spec.label,
56
+ min: boundOf(urlFilters, spec.field, "min"),
57
+ max: boundOf(urlFilters, spec.field, "max"),
58
+ ...(spec.unit !== undefined && { unit: spec.unit }),
59
+ })), [specs, urlFilters]);
60
+ const rangeFilters = useMemo(() => rangeFiltersOf(specs, urlFilters), [specs, urlFilters]);
61
+ const rangeFields = useMemo(() => specs.map((spec) => spec.field), [specs]);
62
+ const onRangeChange = useCallback((field, bound, value) => setFilter(rangeUrlField(field, bound), value === "" ? [] : [value]), [setFilter]);
63
+ return { rangeFacets, rangeFilters, rangeFields, onRangeChange };
64
+ }
@@ -0,0 +1,12 @@
1
+ import type { ProjectionListScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { Translate } from "../headless/index.ts";
3
+ import type { ListUrlStateApi } from "../hooks/use-list-url-state.ts";
4
+ import type { DataTableDateRangeFacet } from "../primitives.tsx";
5
+ /** dateRange facets bypass `filters` entirely: their two bounds become the
6
+ * top-level query params the facet declares, resolved from a calendar date
7
+ * to an instant in the viewer's zone. */
8
+ export declare function useProjectionDateRange(facets: ProjectionListScreenDefinition["facets"], translate: Translate, urlState: ListUrlStateApi): {
9
+ dateRangePayload: Record<string, string>;
10
+ dateRangeFacets: DataTableDateRangeFacet[];
11
+ handleDateRangeChange: (field: string, bound: "from" | "to", value: string) => void;
12
+ };
@@ -0,0 +1,21 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { useOptionalTimeZone } from "../i18n.js";
3
+ import { buildDateRangePayload, clampDateRange, readDateRange, resolveDateRangeFacets, } from "./list-facets.js";
4
+ /** dateRange facets bypass `filters` entirely: their two bounds become the
5
+ * top-level query params the facet declares, resolved from a calendar date
6
+ * to an instant in the viewer's zone. */
7
+ export function useProjectionDateRange(facets, translate, urlState) {
8
+ const timeZone = useOptionalTimeZone();
9
+ const dateRangeSpecs = useMemo(() => resolveDateRangeFacets(facets, translate), [facets, translate]);
10
+ const dateRangePayload = useMemo(() => buildDateRangePayload(dateRangeSpecs, urlState.filters, timeZone), [dateRangeSpecs, urlState.filters, timeZone]);
11
+ const dateRangeFacets = useMemo(() => dateRangeSpecs.map((spec) => ({
12
+ field: spec.field,
13
+ label: spec.label,
14
+ ...readDateRange(urlState.filters, spec.field),
15
+ })), [dateRangeSpecs, urlState.filters]);
16
+ const { setDateRange, filters } = urlState;
17
+ const handleDateRangeChange = useCallback((field, bound, value) => {
18
+ setDateRange(field, clampDateRange(readDateRange(filters, field), bound, value));
19
+ }, [setDateRange, filters]);
20
+ return { dateRangePayload, dateRangeFacets, handleDateRangeChange };
21
+ }
@@ -0,0 +1,35 @@
1
+ import type { ProjectionDetailScreenDefinition, RowAction } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { RenderEditAction } from "../components/render-edit.tsx";
3
+ import type { useOptionalDispatcher } from "../context/dispatcher-context.tsx";
4
+ import type { useUserRoles } from "../context/user-roles-context.tsx";
5
+ import type { Translate } from "../headless/index.ts";
6
+ import type { useDrawerAction } from "./action-form-body.tsx";
7
+ import type { useAppFeatures } from "./app-features-context.tsx";
8
+ import type { useClientActionRuntime } from "./client-actions.tsx";
9
+ import type { FeatureSchema } from "./feature-schema.ts";
10
+ import type { NavApi } from "./nav.tsx";
11
+ import { type useReturnHost, type useReturnTarget } from "./return-to.tsx";
12
+ import type { useProjectionDetailData } from "./use-projection-detail-data.ts";
13
+ type DetailActionsInput = {
14
+ readonly schema: FeatureSchema;
15
+ readonly screen: ProjectionDetailScreenDefinition & {
16
+ readonly detailFor?: string;
17
+ };
18
+ readonly effectiveTranslate: Translate;
19
+ readonly effectiveEntityId: string | undefined;
20
+ readonly nav: NavApi;
21
+ readonly host: ReturnType<typeof useReturnHost>;
22
+ readonly dispatcher: ReturnType<typeof useOptionalDispatcher>;
23
+ readonly clientActions: ReturnType<typeof useClientActionRuntime>;
24
+ readonly appFeatures: ReturnType<typeof useAppFeatures>;
25
+ readonly userRoles: ReturnType<typeof useUserRoles>;
26
+ readonly returnTarget: ReturnType<typeof useReturnTarget> | undefined;
27
+ readonly openDrawer: ReturnType<typeof useDrawerAction>["openDrawer"];
28
+ readonly detailQuery: ReturnType<typeof useProjectionDetailData>["detailQuery"];
29
+ readonly reloadDetail: ReturnType<typeof useProjectionDetailData>["reloadDetail"];
30
+ };
31
+ export declare function useProjectionDetailActions(input: DetailActionsInput): {
32
+ buildSectionActions: (actions: readonly RowAction[]) => readonly RenderEditAction[] | undefined;
33
+ headerActions: readonly RenderEditAction[] | undefined;
34
+ };
35
+ export {};
@@ -0,0 +1,156 @@
1
+ import { resolveActionIcon } from "@cosmicdrift/kumiko-types/action-icon";
2
+ import { useCallback, useMemo } from "react";
3
+ import { lastSegment } from "./qn.js";
4
+ import { navigateToReturnOr, navigateWithReturnTo, } from "./return-to.js";
5
+ import { buildRecordActions } from "./row-actions.js";
6
+ import { findEditScreenFor } from "./screen-access.js";
7
+ import { findEntityListScreen, navigateAfterRedirect } from "./screen-shared.js";
8
+ export function useProjectionDetailActions(input) {
9
+ const { schema, screen, effectiveTranslate, effectiveEntityId, nav, host, dispatcher, clientActions, appFeatures, userRoles, returnTarget, openDrawer, detailQuery, reloadDetail, } = input;
10
+ const handleRecordLeft = useCallback((action, resultData, deletedShownRecord) => {
11
+ const record = detailQuery.data ?? {};
12
+ // Never return onto the just-deleted record.
13
+ const target = deletedShownRecord && returnTarget?.entityId === effectiveEntityId
14
+ ? undefined
15
+ : returnTarget;
16
+ if (action.redirect !== undefined) {
17
+ navigateAfterRedirect({
18
+ nav,
19
+ schema,
20
+ appFeatures,
21
+ returnTarget: target,
22
+ redirect: action.redirect,
23
+ resultData,
24
+ record,
25
+ });
26
+ // skip: the redirect already navigated
27
+ return;
28
+ }
29
+ navigateToReturnOr(nav, target, () => {
30
+ const listScreen = screen.listScreenId ??
31
+ (screen.detailFor !== undefined
32
+ ? findEntityListScreen(schema, screen.detailFor)?.id
33
+ : undefined);
34
+ if (listScreen !== undefined)
35
+ nav.navigate({ screenId: lastSegment(listScreen) });
36
+ else
37
+ void detailQuery.refetch();
38
+ });
39
+ }, [
40
+ detailQuery.data,
41
+ detailQuery.refetch,
42
+ nav,
43
+ schema,
44
+ appFeatures,
45
+ returnTarget,
46
+ effectiveEntityId,
47
+ screen.listScreenId,
48
+ screen.detailFor,
49
+ ]);
50
+ // Default edit action: resolved cross-feature over ALL mounted
51
+ // features, not just this feature's own schema — detailFor itself is
52
+ // resolved cross-feature by the boot-validator (detail-screens.ts), and
53
+ // the motivating case is a projectionDetail whose query belongs to one
54
+ // feature while the entity's entityEdit screen lives in another. Unlike
55
+ // useNavigateToCreateFor this must NOT filter on allowCreate/singleton —
56
+ // those gate create-targets, we're resolving an update-target by a
57
+ // known id.
58
+ const editScreen = useMemo(() => {
59
+ const detailFor = screen.detailFor;
60
+ // skip: no detailFor means there is no edit screen to resolve
61
+ if (detailFor === undefined)
62
+ return undefined;
63
+ return findEditScreenFor(detailFor, appFeatures, userRoles);
64
+ }, [appFeatures, screen.detailFor, userRoles]);
65
+ const defaultEditAction = useMemo(() => {
66
+ // skip: no edit screen for this entity, so no default edit action
67
+ if (editScreen === undefined)
68
+ return undefined;
69
+ // editScreen.id is registry-qualified ("feature:screen:contact-edit");
70
+ // nav.navigate expects the short form (see useNavigateToCreateFor).
71
+ const targetScreenId = lastSegment(editScreen.id);
72
+ return {
73
+ id: "edit",
74
+ label: effectiveTranslate("kumiko.actions.edit"),
75
+ icon: resolveActionIcon("edit"),
76
+ onPress: () => {
77
+ const target = {
78
+ screenId: targetScreenId,
79
+ ...(effectiveEntityId !== undefined && { entityId: effectiveEntityId }),
80
+ };
81
+ navigateWithReturnTo(nav, target, host);
82
+ },
83
+ };
84
+ }, [editScreen, effectiveTranslate, nav, effectiveEntityId, host]);
85
+ // a navigate-screen action targeting an entityEdit screen for the
86
+ // SAME entity this projectionDetail shows (screen.detailFor) defaults its
87
+ // entityId to the shown record's own id — without this fallback the target
88
+ // opens an empty create-form instead of the shown record, silently.
89
+ // Searched cross-feature, consistent with editScreen above.
90
+ const sameEntityScreenId = useCallback((targetScreen) => {
91
+ const record = detailQuery.data ?? {};
92
+ const targetIsEntityEditSameEntity = screen.detailFor !== undefined &&
93
+ appFeatures.some((feature) => feature.screens.some((s) => s.type === "entityEdit" &&
94
+ s.entity === screen.detailFor &&
95
+ lastSegment(s.id) === targetScreen));
96
+ return targetIsEntityEditSameEntity ? String(record["id"] ?? "") : undefined;
97
+ }, [detailQuery.data, screen.detailFor, appFeatures]);
98
+ const buildSectionActions = useCallback((actions) => buildRecordActions({
99
+ actions,
100
+ record: detailQuery.data ?? {},
101
+ translate: effectiveTranslate,
102
+ nav,
103
+ host,
104
+ dispatcher,
105
+ openDrawer,
106
+ onWriteSuccess: reloadDetail,
107
+ onRecordLeft: handleRecordLeft,
108
+ sameEntityScreenId,
109
+ clientActions,
110
+ }), [
111
+ detailQuery.data,
112
+ reloadDetail,
113
+ effectiveTranslate,
114
+ nav,
115
+ host,
116
+ dispatcher,
117
+ clientActions,
118
+ openDrawer,
119
+ handleRecordLeft,
120
+ sameEntityScreenId,
121
+ ]);
122
+ const headerActions = useMemo(() => {
123
+ const declaredHasEdit = screen.actions?.some((a) => a.id === "edit") === true;
124
+ const resolved = buildRecordActions({
125
+ actions: screen.actions ?? [],
126
+ record: detailQuery.data ?? {},
127
+ translate: effectiveTranslate,
128
+ nav,
129
+ host,
130
+ dispatcher,
131
+ openDrawer,
132
+ onWriteSuccess: reloadDetail,
133
+ onRecordLeft: handleRecordLeft,
134
+ sameEntityScreenId,
135
+ clientActions,
136
+ });
137
+ // skip: a declared or unavailable edit action leaves the resolved list untouched
138
+ if (defaultEditAction === undefined || declaredHasEdit)
139
+ return resolved;
140
+ return [defaultEditAction, ...(resolved ?? [])];
141
+ }, [
142
+ screen.actions,
143
+ defaultEditAction,
144
+ effectiveTranslate,
145
+ nav,
146
+ host,
147
+ dispatcher,
148
+ clientActions,
149
+ detailQuery.data,
150
+ reloadDetail,
151
+ openDrawer,
152
+ handleRecordLeft,
153
+ sameEntityScreenId,
154
+ ]);
155
+ return { buildSectionActions, headerActions };
156
+ }
@@ -0,0 +1,19 @@
1
+ import type { ProjectionDetailScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { usePrimitives } from "../primitives.tsx";
3
+ import type { NavApi } from "./nav.tsx";
4
+ type DetailDataInput = {
5
+ readonly screen: ProjectionDetailScreenDefinition;
6
+ readonly Tabs: ReturnType<typeof usePrimitives>["Tabs"];
7
+ readonly nav: NavApi;
8
+ readonly effectiveEntityId: string | undefined;
9
+ };
10
+ export declare function useProjectionDetailData(input: DetailDataInput): {
11
+ activeSection: import("@cosmicdrift/kumiko-framework/ui-types").EditSectionSpec | undefined;
12
+ hasTabs: boolean;
13
+ entity: Pick<import("@cosmicdrift/kumiko-types/fields").EntityDefinition, "fields">;
14
+ detailScreen: import("@cosmicdrift/kumiko-framework/ui-types").EntityEditScreenDefinition;
15
+ detailQuery: import("../hooks/use-query.ts").UseQueryResult<Readonly<Record<string, unknown>>>;
16
+ reloadNonce: number;
17
+ reloadDetail: () => Promise<void>;
18
+ };
19
+ export {};
@@ -0,0 +1,47 @@
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
+ import { rendererWarn } from "../dev-console.js";
3
+ import { useQuery } from "../hooks/use-query.js";
4
+ import { synthesizeProjectionDetailEntity, synthesizeProjectionDetailScreen, } from "./projection-detail-shim.js";
5
+ import { refetchAfterWrite } from "./row-actions.js";
6
+ export function useProjectionDetailData(input) {
7
+ const { screen, Tabs, nav, effectiveEntityId } = input;
8
+ const idParam = screen.idParam ?? "id";
9
+ const isTabsMode = screen.layout.mode === "tabs";
10
+ const activeSection = useMemo(() => {
11
+ // skip: only tabs mode with a registered Tabs primitive has an active section
12
+ if (!isTabsMode || Tabs === undefined)
13
+ return undefined;
14
+ const tabParam = nav.searchParams["tab"];
15
+ return (screen.layout.sections.find((section) => section.id === tabParam) ?? screen.layout.sections[0]);
16
+ }, [isTabsMode, Tabs, screen.layout.sections, nav.searchParams]);
17
+ const hasTabs = isTabsMode && Tabs !== undefined && activeSection !== undefined;
18
+ // Tabs is an optional Core-Primitive: without it the screen falls back to
19
+ // the stacked all-sections layout instead of silently truncating to section 1.
20
+ useEffect(() => {
21
+ if (isTabsMode && Tabs === undefined) {
22
+ rendererWarn(`[kumiko] screen "${screen.id}" uses layout.mode: "tabs", but no <Tabs> primitive is registered — the tab strip will not render. createKumikoApp() from kumiko-renderer-web wires it automatically.`);
23
+ }
24
+ }, [isTabsMode, Tabs, screen.id]);
25
+ const entity = useMemo(() => synthesizeProjectionDetailEntity(screen.layout), [screen.layout]);
26
+ const detailScreen = useMemo(() => {
27
+ const source = activeSection !== undefined
28
+ ? { ...screen, layout: { ...screen.layout, sections: [activeSection] } }
29
+ : screen;
30
+ return synthesizeProjectionDetailScreen(source);
31
+ }, [screen, activeSection]);
32
+ const detailQuery = useQuery(screen.query, effectiveEntityId !== undefined ? { [idParam]: effectiveEntityId } : {});
33
+ // A writeForm section's handler creates a new record (see EditWriteFormSection's
34
+ // doc) — both the outer record (header/metrics/other sections) and a sibling
35
+ // relatedList section's own independently-fetched rows must reflect it. A
36
+ // query refetch alone only refreshes `record` below; bumping this as
37
+ // <RenderEdit>'s refreshToken makes RelatedListSection's own useQuery
38
+ // re-run too (it has no `live` subscription of its own). Refetch instead of
39
+ // remount (a `key`) so unsaved input in the other writeForm sections and
40
+ // the related lists' local state survive.
41
+ const [reloadNonce, setReloadNonce] = useState(0);
42
+ const reloadDetail = useCallback(async () => {
43
+ await refetchAfterWrite(detailQuery.refetch);
44
+ setReloadNonce((n) => n + 1);
45
+ }, [detailQuery.refetch]);
46
+ return { activeSection, hasTabs, entity, detailScreen, detailQuery, reloadNonce, reloadDetail };
47
+ }
@@ -0,0 +1,17 @@
1
+ import type { ProjectionDetailScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { RenderEditAction } from "../components/render-edit.tsx";
3
+ import type { useProjectionDetailData } from "./use-projection-detail-data.ts";
4
+ type DetailLayoutInput = {
5
+ readonly screen: ProjectionDetailScreenDefinition;
6
+ readonly headerActions: readonly RenderEditAction[] | undefined;
7
+ readonly hasTabs: boolean;
8
+ readonly detailScreen: ReturnType<typeof useProjectionDetailData>["detailScreen"];
9
+ };
10
+ export declare function useProjectionDetailLayout(input: DetailLayoutInput): {
11
+ hasMetrics: boolean;
12
+ headerActionsList: readonly RenderEditAction[];
13
+ hasHeaderActions: boolean;
14
+ hasHeaderCard: boolean;
15
+ renderedDetailScreen: import("@cosmicdrift/kumiko-framework/ui-types").EntityEditScreenDefinition;
16
+ };
17
+ export {};
@@ -0,0 +1,23 @@
1
+ import { useMemo } from "react";
2
+ import { screenFillsHeight } from "../screen-fills-height.js";
3
+ const HEADER_CARD_DEFAULT_WIDTH = "4xl";
4
+ export function useProjectionDetailLayout(input) {
5
+ const { screen, headerActions, hasTabs, detailScreen } = input;
6
+ const hasHeader = screen.header !== undefined;
7
+ const hasMetrics = screen.metrics !== undefined && screen.metrics.length > 0;
8
+ // ?? [] rather than threading `headerActions !== undefined` through every
9
+ // use below — an empty array is a safe no-op for .map/.length.
10
+ const headerActionsList = headerActions ?? [];
11
+ const hasHeaderActions = headerActionsList.length > 0;
12
+ const hasHeaderCard = hasHeader || hasMetrics || hasHeaderActions;
13
+ // A header card (metric band, status, actions) needs more room than the
14
+ // 640px form column; screens with only a record title keep the narrow one.
15
+ const widensScreenFormColumn = hasHeaderCard &&
16
+ !hasTabs &&
17
+ screenFillsHeight(screen) &&
18
+ detailScreen.layout.width === undefined;
19
+ const renderedDetailScreen = useMemo(() => widensScreenFormColumn
20
+ ? { ...detailScreen, layout: { ...detailScreen.layout, width: HEADER_CARD_DEFAULT_WIDTH } }
21
+ : detailScreen, [detailScreen, widensScreenFormColumn]);
22
+ return { hasMetrics, headerActionsList, hasHeaderActions, hasHeaderCard, renderedDetailScreen };
23
+ }
@@ -0,0 +1,31 @@
1
+ import type { ProjectionListScreenDefinition, RowActionNavigate } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { useOptionalDispatcher } from "../context/dispatcher-context.tsx";
3
+ import type { useUserRoles } from "../context/user-roles-context.tsx";
4
+ import type { ListRowViewModel, Translate } from "../headless/index.ts";
5
+ import type { useDrawerAction } from "./action-form-body.tsx";
6
+ import type { useAppFeatures } from "./app-features-context.tsx";
7
+ import type { useClientActionRuntime } from "./client-actions.tsx";
8
+ import type { useNav } from "./nav.tsx";
9
+ import type { useReturnHost } from "./return-to.tsx";
10
+ import type { useProjectionListDefinitions } from "./use-projection-list-definitions.ts";
11
+ type ProjectionListActionsInput = {
12
+ readonly screen: ProjectionListScreenDefinition;
13
+ readonly effectiveTranslate: Translate;
14
+ readonly dispatcher: ReturnType<typeof useOptionalDispatcher>;
15
+ readonly clientActions: ReturnType<typeof useClientActionRuntime>;
16
+ readonly nav: ReturnType<typeof useNav>;
17
+ readonly host: ReturnType<typeof useReturnHost>;
18
+ readonly refreshRows: () => Promise<void>;
19
+ readonly openDrawer: ReturnType<typeof useDrawerAction>["openDrawer"];
20
+ readonly appFeatures: ReturnType<typeof useAppFeatures>;
21
+ readonly userRoles: ReturnType<typeof useUserRoles>;
22
+ readonly defaultEditScreen: ReturnType<typeof useProjectionListDefinitions>["defaultEditScreen"];
23
+ };
24
+ export declare function useProjectionListActions(input: ProjectionListActionsInput): {
25
+ runNavigate: (action: RowActionNavigate, row: ListRowViewModel) => void;
26
+ rowActions: readonly import("../primitives.tsx").DataTableRowAction[] | undefined;
27
+ toolbarActions: readonly import("../components/render-list-toolbar-action.tsx").ToolbarActionButton[] | undefined;
28
+ bulk: import("../data-table-bulk-types.ts").DataTableBulk | undefined;
29
+ emptyContent: import("../components/list-empty-state.tsx").ListEmptyStateContent | undefined;
30
+ };
31
+ export {};
@@ -0,0 +1,73 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { useListBulk } from "./list-bulk-actions.js";
3
+ import { useListEmptyContent } from "./list-empty-content.js";
4
+ import { buildDefaultEditRowAction, buildProjectionRowActions, buildProjectionToolbarActions, runProjectionRowNavigate, } from "./row-actions.js";
5
+ export function useProjectionListActions(input) {
6
+ const { screen, effectiveTranslate, dispatcher, clientActions, nav, host, refreshRows, openDrawer, appFeatures, userRoles, defaultEditScreen, } = input;
7
+ // Entity targets: see EntityListBody.runNavigate for why the resolution happens
8
+ // in the NavApi impl. Unlike there: NO row["id"]
9
+ // fallback — projectionList rows come from an arbitrary query projection
10
+ // with no guaranteed "id" field. The boot validator therefore enforces an
11
+ // explicit entityId for projectionList entity targets. Same helper
12
+ // relatedList's rowActions reuse (related-list-section.tsx) — a
13
+ // projectionDetail relatedList row has the identical "no guaranteed id"
14
+ // shape.
15
+ const runNavigate = useCallback((action, row) => runProjectionRowNavigate(nav, action, row, host), [nav, host]);
16
+ const defaultEditRowAction = useMemo(() => buildDefaultEditRowAction(defaultEditScreen), [defaultEditScreen]);
17
+ const rowActions = useMemo(() => buildProjectionRowActions({
18
+ rowActions: screen.rowActions,
19
+ translate: effectiveTranslate,
20
+ dispatcher,
21
+ nav,
22
+ refetch: refreshRows,
23
+ openDrawer,
24
+ defaultEditRowAction,
25
+ host,
26
+ clientActions,
27
+ }), [
28
+ screen.rowActions,
29
+ effectiveTranslate,
30
+ dispatcher,
31
+ clientActions,
32
+ nav,
33
+ refreshRows,
34
+ openDrawer,
35
+ defaultEditRowAction,
36
+ host,
37
+ ]);
38
+ const toolbarActions = useMemo(() => buildProjectionToolbarActions({
39
+ toolbarActions: screen.toolbarActions,
40
+ translate: effectiveTranslate,
41
+ dispatcher,
42
+ nav,
43
+ refetch: refreshRows,
44
+ openDrawer,
45
+ host,
46
+ access: { appFeatures, userRoles },
47
+ }), [
48
+ screen.toolbarActions,
49
+ effectiveTranslate,
50
+ nav,
51
+ host,
52
+ dispatcher,
53
+ refreshRows,
54
+ openDrawer,
55
+ appFeatures,
56
+ userRoles,
57
+ ]);
58
+ const bulk = useListBulk({
59
+ bulkActions: screen.bulkActions,
60
+ rowActions: screen.rowActions,
61
+ translate: effectiveTranslate,
62
+ dispatcher,
63
+ reload: refreshRows,
64
+ });
65
+ const emptyContent = useListEmptyContent(screen.emptyState, effectiveTranslate, {
66
+ nav,
67
+ host,
68
+ dispatcher,
69
+ openDrawer,
70
+ onWriteSuccess: refreshRows,
71
+ });
72
+ return { runNavigate, rowActions, toolbarActions, bulk, emptyContent };
73
+ }
@@ -0,0 +1,20 @@
1
+ import type { ProjectionListScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { Translate } from "../headless/index.ts";
3
+ import type { DataTableFacet } from "../primitives.tsx";
4
+ import { type ResolvedFacetSpec } from "./list-facets.ts";
5
+ import { useScreenListRows } from "./use-screen-list-rows.ts";
6
+ type ProjectionListDataInput = {
7
+ readonly screen: ProjectionListScreenDefinition;
8
+ readonly featureName: string;
9
+ readonly queryPayload: Parameters<typeof useScreenListRows>[0]["payload"];
10
+ readonly limit: number;
11
+ readonly usePager: boolean;
12
+ readonly effectiveTranslate: Translate;
13
+ readonly resolvedFacetSpecs: readonly ResolvedFacetSpec[];
14
+ };
15
+ export declare function useProjectionListData(input: ProjectionListDataInput): {
16
+ listTable: import("./use-screen-list-table.ts").ScreenListTable;
17
+ listRows: import("./use-screen-list-rows.ts").ScreenListRows;
18
+ filterFacets: DataTableFacet[];
19
+ };
20
+ export {};
@@ -0,0 +1,26 @@
1
+ import { useMemo } from "react";
2
+ import { buildFilterFacets } from "./list-facets.js";
3
+ import { useScreenListRows } from "./use-screen-list-rows.js";
4
+ import { useScreenListTable } from "./use-screen-list-table.js";
5
+ export function useProjectionListData(input) {
6
+ const { screen, featureName, queryPayload, limit, usePager, effectiveTranslate, resolvedFacetSpecs, } = input;
7
+ const facetFilterFields = useMemo(() => (screen.facets ?? []).map((facet) => facet.field), [screen.facets]);
8
+ const listTable = useScreenListTable({
9
+ screen,
10
+ featureName,
11
+ payload: queryPayload,
12
+ filterFields: facetFilterFields,
13
+ queryType: screen.query,
14
+ pageSize: limit,
15
+ paging: usePager ? "offset" : "cursor",
16
+ translate: effectiveTranslate,
17
+ });
18
+ const listRows = useScreenListRows({
19
+ queryType: screen.query,
20
+ payload: queryPayload,
21
+ infinite: false,
22
+ aggregates: listTable.aggregates,
23
+ });
24
+ const filterFacets = useMemo(() => buildFilterFacets(resolvedFacetSpecs), [resolvedFacetSpecs]);
25
+ return { listTable, listRows, filterFacets };
26
+ }
@@ -0,0 +1,11 @@
1
+ import type { ProjectionListScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { useUserRoles } from "../context/user-roles-context.tsx";
3
+ import type { useAppFeatures } from "./app-features-context.tsx";
4
+ export declare function useProjectionListDefinitions(screen: ProjectionListScreenDefinition, appFeatures: ReturnType<typeof useAppFeatures>, userRoles: ReturnType<typeof useUserRoles>): {
5
+ defaultEditScreen: import("@cosmicdrift/kumiko-framework/ui-types").EntityEditScreenDefinition | undefined;
6
+ searchable: boolean;
7
+ sortable: boolean;
8
+ paginated: boolean;
9
+ entity: Pick<import("@cosmicdrift/kumiko-types/fields").EntityDefinition, "fields">;
10
+ listScreen: import("@cosmicdrift/kumiko-framework/ui-types").EntityListScreenDefinition;
11
+ };
@@ -0,0 +1,20 @@
1
+ import { useMemo } from "react";
2
+ import { synthesizeProjectionEntity, synthesizeProjectionScreen } from "./projection-list-shim.js";
3
+ import { findEditScreenFor } from "./screen-access.js";
4
+ export function useProjectionListDefinitions(screen, appFeatures, userRoles) {
5
+ const defaultEditScreen = useMemo(() => {
6
+ const detailFor = screen.detailFor;
7
+ // skip: no detail screen declared, so rows get no default edit action
8
+ if (detailFor === undefined)
9
+ return undefined;
10
+ return findEditScreenFor(detailFor, appFeatures, userRoles);
11
+ }, [appFeatures, screen.detailFor, userRoles]);
12
+ // searchable/sortable/paginated are derived at buildAppSchema time from the
13
+ // query handler's Zod schema — not authored on the screen.
14
+ const searchable = screen.searchable ?? false;
15
+ const sortable = screen.sortable ?? false;
16
+ const paginated = screen.paginated ?? false;
17
+ const entity = useMemo(() => synthesizeProjectionEntity(screen.columns, sortable), [screen.columns, sortable]);
18
+ const listScreen = useMemo(() => synthesizeProjectionScreen(screen), [screen]);
19
+ return { defaultEditScreen, searchable, sortable, paginated, entity, listScreen };
20
+ }
@@ -0,0 +1,28 @@
1
+ import type { ProjectionListScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
2
+ import type { Translate } from "../headless/index.ts";
3
+ import { type ListUrlStateApi } from "../hooks/use-list-url-state.ts";
4
+ import type { synthesizeProjectionEntity } from "./projection-list-shim.ts";
5
+ import type { ReferenceFacetOption } from "./reference-facet-bridge.tsx";
6
+ type ProjectionListQueryInput = {
7
+ readonly screen: ProjectionListScreenDefinition;
8
+ readonly featureName: string;
9
+ readonly effectiveTranslate: Translate;
10
+ readonly entity: ReturnType<typeof synthesizeProjectionEntity>;
11
+ readonly searchable: boolean;
12
+ readonly sortable: boolean;
13
+ readonly paginated: boolean;
14
+ };
15
+ export declare function useProjectionListQuery(input: ProjectionListQueryInput): {
16
+ urlState: ListUrlStateApi;
17
+ activeSearch: string;
18
+ activeSort: import("../primitives.tsx").DataTableSort | null;
19
+ limit: number;
20
+ usePager: boolean;
21
+ facetSpecs: import("./list-facets.ts").ResolvedFacetSpec[];
22
+ handleProjectionFacetOptions: (field: string, options: readonly ReferenceFacetOption[]) => void;
23
+ resolvedFacetSpecs: import("./list-facets.ts").ResolvedFacetSpec[];
24
+ dateRangeFacets: import("../data-table-facet-types.ts").DataTableDateRangeFacet[];
25
+ handleDateRangeChange: (field: string, bound: "from" | "to", value: string) => void;
26
+ queryPayload: Record<string, unknown>;
27
+ };
28
+ export {};