@pilotiq/pilotiq 0.7.2 → 0.8.1

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 (371) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/CHANGELOG.md +208 -0
  3. package/CLAUDE.md +59 -3
  4. package/dist/Pilotiq.d.ts +83 -0
  5. package/dist/Pilotiq.d.ts.map +1 -1
  6. package/dist/Pilotiq.js +39 -0
  7. package/dist/Pilotiq.js.map +1 -1
  8. package/dist/actions/Action.d.ts +27 -99
  9. package/dist/actions/Action.d.ts.map +1 -1
  10. package/dist/actions/Action.js +52 -754
  11. package/dist/actions/Action.js.map +1 -1
  12. package/dist/actions/bulkFactories.d.ts +46 -0
  13. package/dist/actions/bulkFactories.d.ts.map +1 -0
  14. package/dist/actions/bulkFactories.js +144 -0
  15. package/dist/actions/bulkFactories.js.map +1 -0
  16. package/dist/actions/crudFactories.d.ts +94 -0
  17. package/dist/actions/crudFactories.d.ts.map +1 -0
  18. package/dist/actions/crudFactories.js +209 -0
  19. package/dist/actions/crudFactories.js.map +1 -0
  20. package/dist/actions/factoryHelpers.d.ts +108 -0
  21. package/dist/actions/factoryHelpers.d.ts.map +1 -0
  22. package/dist/actions/factoryHelpers.js +138 -0
  23. package/dist/actions/factoryHelpers.js.map +1 -0
  24. package/dist/actions/m2mFactories.d.ts +47 -0
  25. package/dist/actions/m2mFactories.d.ts.map +1 -0
  26. package/dist/actions/m2mFactories.js +173 -0
  27. package/dist/actions/m2mFactories.js.map +1 -0
  28. package/dist/actions/relationFactories.d.ts +93 -0
  29. package/dist/actions/relationFactories.d.ts.map +1 -0
  30. package/dist/actions/relationFactories.js +321 -0
  31. package/dist/actions/relationFactories.js.map +1 -0
  32. package/dist/elements/dispatchForm.js +1 -1
  33. package/dist/elements/dispatchForm.js.map +1 -1
  34. package/dist/elements/dispatchTable.js +1 -1
  35. package/dist/elements/dispatchTable.js.map +1 -1
  36. package/dist/fields/Field.d.ts +31 -0
  37. package/dist/fields/Field.d.ts.map +1 -1
  38. package/dist/fields/Field.js +25 -0
  39. package/dist/fields/Field.js.map +1 -1
  40. package/dist/pageData/breadcrumbs.d.ts +42 -0
  41. package/dist/pageData/breadcrumbs.d.ts.map +1 -0
  42. package/dist/pageData/breadcrumbs.js +172 -0
  43. package/dist/pageData/breadcrumbs.js.map +1 -0
  44. package/dist/pageData/forms.d.ts +137 -0
  45. package/dist/pageData/forms.d.ts.map +1 -0
  46. package/dist/pageData/forms.js +427 -0
  47. package/dist/pageData/forms.js.map +1 -0
  48. package/dist/pageData/helpers.d.ts +239 -0
  49. package/dist/pageData/helpers.d.ts.map +1 -0
  50. package/dist/pageData/helpers.js +703 -0
  51. package/dist/pageData/helpers.js.map +1 -0
  52. package/dist/pageData/misc.d.ts +76 -0
  53. package/dist/pageData/misc.d.ts.map +1 -0
  54. package/dist/pageData/misc.js +263 -0
  55. package/dist/pageData/misc.js.map +1 -0
  56. package/dist/pageData/navigation.d.ts +292 -0
  57. package/dist/pageData/navigation.d.ts.map +1 -0
  58. package/dist/pageData/navigation.js +591 -0
  59. package/dist/pageData/navigation.js.map +1 -0
  60. package/dist/pageData/relationPages.d.ts +172 -0
  61. package/dist/pageData/relationPages.d.ts.map +1 -0
  62. package/dist/pageData/relationPages.js +867 -0
  63. package/dist/pageData/relationPages.js.map +1 -0
  64. package/dist/pageData/relationTabs.d.ts +65 -0
  65. package/dist/pageData/relationTabs.d.ts.map +1 -0
  66. package/dist/pageData/relationTabs.js +258 -0
  67. package/dist/pageData/relationTabs.js.map +1 -0
  68. package/dist/pageData/resourcePages.d.ts +48 -0
  69. package/dist/pageData/resourcePages.d.ts.map +1 -0
  70. package/dist/pageData/resourcePages.js +504 -0
  71. package/dist/pageData/resourcePages.js.map +1 -0
  72. package/dist/pageData.d.ts +12 -792
  73. package/dist/pageData.d.ts.map +1 -1
  74. package/dist/pageData.js +24 -3797
  75. package/dist/pageData.js.map +1 -1
  76. package/dist/react/AppShell.d.ts +8 -0
  77. package/dist/react/AppShell.d.ts.map +1 -1
  78. package/dist/react/AppShell.js +11 -1
  79. package/dist/react/AppShell.js.map +1 -1
  80. package/dist/react/CollabExtensionFactoryRegistry.d.ts +47 -0
  81. package/dist/react/CollabExtensionFactoryRegistry.d.ts.map +1 -0
  82. package/dist/react/CollabExtensionFactoryRegistry.js +14 -0
  83. package/dist/react/CollabExtensionFactoryRegistry.js.map +1 -0
  84. package/dist/react/CollabRoomContext.d.ts +37 -0
  85. package/dist/react/CollabRoomContext.d.ts.map +1 -0
  86. package/dist/react/CollabRoomContext.js +12 -0
  87. package/dist/react/CollabRoomContext.js.map +1 -0
  88. package/dist/react/FormCollabBindingRegistry.d.ts +62 -0
  89. package/dist/react/FormCollabBindingRegistry.d.ts.map +1 -0
  90. package/dist/react/FormCollabBindingRegistry.js +14 -0
  91. package/dist/react/FormCollabBindingRegistry.js.map +1 -0
  92. package/dist/react/FormStateContext.d.ts.map +1 -1
  93. package/dist/react/FormStateContext.js +87 -0
  94. package/dist/react/FormStateContext.js.map +1 -1
  95. package/dist/react/RecordWrapperGate.d.ts +25 -0
  96. package/dist/react/RecordWrapperGate.d.ts.map +1 -0
  97. package/dist/react/RecordWrapperGate.js +30 -0
  98. package/dist/react/RecordWrapperGate.js.map +1 -0
  99. package/dist/react/RecordWrapperRegistry.d.ts +31 -0
  100. package/dist/react/RecordWrapperRegistry.d.ts.map +1 -0
  101. package/dist/react/RecordWrapperRegistry.js +15 -0
  102. package/dist/react/RecordWrapperRegistry.js.map +1 -0
  103. package/dist/react/SchemaRenderer.d.ts +17 -23
  104. package/dist/react/SchemaRenderer.d.ts.map +1 -1
  105. package/dist/react/SchemaRenderer.js +71 -3647
  106. package/dist/react/SchemaRenderer.js.map +1 -1
  107. package/dist/react/component-slots.d.ts +103 -0
  108. package/dist/react/component-slots.d.ts.map +1 -0
  109. package/dist/react/component-slots.js +18 -0
  110. package/dist/react/component-slots.js.map +1 -0
  111. package/dist/react/fields/BuilderInput.d.ts.map +1 -1
  112. package/dist/react/fields/BuilderInput.js +21 -117
  113. package/dist/react/fields/BuilderInput.js.map +1 -1
  114. package/dist/react/fields/MarkdownInput.d.ts.map +1 -1
  115. package/dist/react/fields/MarkdownInput.js +1 -3
  116. package/dist/react/fields/MarkdownInput.js.map +1 -1
  117. package/dist/react/fields/RepeaterInput.d.ts.map +1 -1
  118. package/dist/react/fields/RepeaterInput.js +22 -127
  119. package/dist/react/fields/RepeaterInput.js.map +1 -1
  120. package/dist/react/fields/rowState.d.ts +40 -0
  121. package/dist/react/fields/rowState.d.ts.map +1 -0
  122. package/dist/react/fields/rowState.js +60 -0
  123. package/dist/react/fields/rowState.js.map +1 -0
  124. package/dist/react/fields/useRowReorderDnd.d.ts +28 -0
  125. package/dist/react/fields/useRowReorderDnd.d.ts.map +1 -0
  126. package/dist/react/fields/useRowReorderDnd.js +51 -0
  127. package/dist/react/fields/useRowReorderDnd.js.map +1 -0
  128. package/dist/react/index.d.ts +9 -0
  129. package/dist/react/index.d.ts.map +1 -1
  130. package/dist/react/index.js +8 -0
  131. package/dist/react/index.js.map +1 -1
  132. package/dist/react/layouts/SidebarLayout.d.ts +1 -1
  133. package/dist/react/layouts/SidebarLayout.d.ts.map +1 -1
  134. package/dist/react/layouts/SidebarLayout.js +10 -2
  135. package/dist/react/layouts/SidebarLayout.js.map +1 -1
  136. package/dist/react/layouts/TopbarLayout.d.ts +1 -1
  137. package/dist/react/layouts/TopbarLayout.d.ts.map +1 -1
  138. package/dist/react/layouts/TopbarLayout.js +19 -11
  139. package/dist/react/layouts/TopbarLayout.js.map +1 -1
  140. package/dist/react/parseRecordEditUrl.d.ts +29 -0
  141. package/dist/react/parseRecordEditUrl.d.ts.map +1 -0
  142. package/dist/react/parseRecordEditUrl.js +25 -0
  143. package/dist/react/parseRecordEditUrl.js.map +1 -0
  144. package/dist/react/persistedState.d.ts +19 -0
  145. package/dist/react/persistedState.d.ts.map +1 -0
  146. package/dist/react/persistedState.js +51 -0
  147. package/dist/react/persistedState.js.map +1 -0
  148. package/dist/react/schemaRenderer/AlertRenderer.d.ts +12 -0
  149. package/dist/react/schemaRenderer/AlertRenderer.d.ts.map +1 -0
  150. package/dist/react/schemaRenderer/AlertRenderer.js +61 -0
  151. package/dist/react/schemaRenderer/AlertRenderer.js.map +1 -0
  152. package/dist/react/schemaRenderer/EntryRenderer.d.ts +13 -0
  153. package/dist/react/schemaRenderer/EntryRenderer.d.ts.map +1 -0
  154. package/dist/react/schemaRenderer/EntryRenderer.js +277 -0
  155. package/dist/react/schemaRenderer/EntryRenderer.js.map +1 -0
  156. package/dist/react/schemaRenderer/SectionRenderer.d.ts +16 -0
  157. package/dist/react/schemaRenderer/SectionRenderer.d.ts.map +1 -0
  158. package/dist/react/schemaRenderer/SectionRenderer.js +62 -0
  159. package/dist/react/schemaRenderer/SectionRenderer.js.map +1 -0
  160. package/dist/react/schemaRenderer/SimpleElements.d.ts +25 -0
  161. package/dist/react/schemaRenderer/SimpleElements.d.ts.map +1 -0
  162. package/dist/react/schemaRenderer/SimpleElements.js +147 -0
  163. package/dist/react/schemaRenderer/SimpleElements.js.map +1 -0
  164. package/dist/react/schemaRenderer/TabsRenderer.d.ts +17 -0
  165. package/dist/react/schemaRenderer/TabsRenderer.d.ts.map +1 -0
  166. package/dist/react/schemaRenderer/TabsRenderer.js +31 -0
  167. package/dist/react/schemaRenderer/TabsRenderer.js.map +1 -0
  168. package/dist/react/schemaRenderer/WizardRenderer.d.ts +34 -0
  169. package/dist/react/schemaRenderer/WizardRenderer.d.ts.map +1 -0
  170. package/dist/react/schemaRenderer/WizardRenderer.js +208 -0
  171. package/dist/react/schemaRenderer/WizardRenderer.js.map +1 -0
  172. package/dist/react/schemaRenderer/action/ActionGroupTrigger.d.ts +21 -0
  173. package/dist/react/schemaRenderer/action/ActionGroupTrigger.d.ts.map +1 -0
  174. package/dist/react/schemaRenderer/action/ActionGroupTrigger.js +82 -0
  175. package/dist/react/schemaRenderer/action/ActionGroupTrigger.js.map +1 -0
  176. package/dist/react/schemaRenderer/action/ActionModalDialog.d.ts +30 -0
  177. package/dist/react/schemaRenderer/action/ActionModalDialog.d.ts.map +1 -0
  178. package/dist/react/schemaRenderer/action/ActionModalDialog.js +182 -0
  179. package/dist/react/schemaRenderer/action/ActionModalDialog.js.map +1 -0
  180. package/dist/react/schemaRenderer/action/ConfirmActionDialog.d.ts +17 -0
  181. package/dist/react/schemaRenderer/action/ConfirmActionDialog.d.ts.map +1 -0
  182. package/dist/react/schemaRenderer/action/ConfirmActionDialog.js +19 -0
  183. package/dist/react/schemaRenderer/action/ConfirmActionDialog.js.map +1 -0
  184. package/dist/react/schemaRenderer/action/HandlerActionButton.d.ts +16 -0
  185. package/dist/react/schemaRenderer/action/HandlerActionButton.d.ts.map +1 -0
  186. package/dist/react/schemaRenderer/action/HandlerActionButton.js +16 -0
  187. package/dist/react/schemaRenderer/action/HandlerActionButton.js.map +1 -0
  188. package/dist/react/schemaRenderer/action/MethodActionButton.d.ts +22 -0
  189. package/dist/react/schemaRenderer/action/MethodActionButton.d.ts.map +1 -0
  190. package/dist/react/schemaRenderer/action/MethodActionButton.js +26 -0
  191. package/dist/react/schemaRenderer/action/MethodActionButton.js.map +1 -0
  192. package/dist/react/schemaRenderer/action/buttons.d.ts +18 -0
  193. package/dist/react/schemaRenderer/action/buttons.d.ts.map +1 -0
  194. package/dist/react/schemaRenderer/action/buttons.js +74 -0
  195. package/dist/react/schemaRenderer/action/buttons.js.map +1 -0
  196. package/dist/react/schemaRenderer/action/helpers.d.ts +26 -0
  197. package/dist/react/schemaRenderer/action/helpers.d.ts.map +1 -0
  198. package/dist/react/schemaRenderer/action/helpers.js +126 -0
  199. package/dist/react/schemaRenderer/action/helpers.js.map +1 -0
  200. package/dist/react/schemaRenderer/action/renderAction.d.ts +21 -0
  201. package/dist/react/schemaRenderer/action/renderAction.d.ts.map +1 -0
  202. package/dist/react/schemaRenderer/action/renderAction.js +102 -0
  203. package/dist/react/schemaRenderer/action/renderAction.js.map +1 -0
  204. package/dist/react/schemaRenderer/columnFormat.d.ts +10 -0
  205. package/dist/react/schemaRenderer/columnFormat.d.ts.map +1 -0
  206. package/dist/react/schemaRenderer/columnFormat.js +76 -0
  207. package/dist/react/schemaRenderer/columnFormat.js.map +1 -0
  208. package/dist/react/schemaRenderer/constants.d.ts +8 -0
  209. package/dist/react/schemaRenderer/constants.d.ts.map +1 -0
  210. package/dist/react/schemaRenderer/constants.js +45 -0
  211. package/dist/react/schemaRenderer/constants.js.map +1 -0
  212. package/dist/react/schemaRenderer/form/FormRenderer.d.ts +29 -0
  213. package/dist/react/schemaRenderer/form/FormRenderer.d.ts.map +1 -0
  214. package/dist/react/schemaRenderer/form/FormRenderer.js +163 -0
  215. package/dist/react/schemaRenderer/form/FormRenderer.js.map +1 -0
  216. package/dist/react/schemaRenderer/form/renderField.d.ts +6 -0
  217. package/dist/react/schemaRenderer/form/renderField.d.ts.map +1 -0
  218. package/dist/react/schemaRenderer/form/renderField.js +239 -0
  219. package/dist/react/schemaRenderer/form/renderField.js.map +1 -0
  220. package/dist/react/schemaRenderer/helpers.d.ts +32 -0
  221. package/dist/react/schemaRenderer/helpers.d.ts.map +1 -0
  222. package/dist/react/schemaRenderer/helpers.js +52 -0
  223. package/dist/react/schemaRenderer/helpers.js.map +1 -0
  224. package/dist/react/schemaRenderer/table/CardsLayoutBody.d.ts +60 -0
  225. package/dist/react/schemaRenderer/table/CardsLayoutBody.d.ts.map +1 -0
  226. package/dist/react/schemaRenderer/table/CardsLayoutBody.js +189 -0
  227. package/dist/react/schemaRenderer/table/CardsLayoutBody.js.map +1 -0
  228. package/dist/react/schemaRenderer/table/TableRenderer.d.ts +29 -0
  229. package/dist/react/schemaRenderer/table/TableRenderer.d.ts.map +1 -0
  230. package/dist/react/schemaRenderer/table/TableRenderer.js +85 -0
  231. package/dist/react/schemaRenderer/table/TableRenderer.js.map +1 -0
  232. package/dist/react/schemaRenderer/table/TableRendererBody.d.ts +18 -0
  233. package/dist/react/schemaRenderer/table/TableRendererBody.d.ts.map +1 -0
  234. package/dist/react/schemaRenderer/table/TableRendererBody.js +555 -0
  235. package/dist/react/schemaRenderer/table/TableRendererBody.js.map +1 -0
  236. package/dist/react/schemaRenderer/table/filters.d.ts +263 -0
  237. package/dist/react/schemaRenderer/table/filters.d.ts.map +1 -0
  238. package/dist/react/schemaRenderer/table/filters.js +497 -0
  239. package/dist/react/schemaRenderer/table/filters.js.map +1 -0
  240. package/dist/react/schemaRenderer/table/formatCell.d.ts +11 -0
  241. package/dist/react/schemaRenderer/table/formatCell.d.ts.map +1 -0
  242. package/dist/react/schemaRenderer/table/formatCell.js +172 -0
  243. package/dist/react/schemaRenderer/table/formatCell.js.map +1 -0
  244. package/dist/react/schemaRenderer/table/links.d.ts +42 -0
  245. package/dist/react/schemaRenderer/table/links.d.ts.map +1 -0
  246. package/dist/react/schemaRenderer/table/links.js +55 -0
  247. package/dist/react/schemaRenderer/table/links.js.map +1 -0
  248. package/dist/react/schemaRenderer/table/renderRowActions.d.ts +13 -0
  249. package/dist/react/schemaRenderer/table/renderRowActions.d.ts.map +1 -0
  250. package/dist/react/schemaRenderer/table/renderRowActions.js +25 -0
  251. package/dist/react/schemaRenderer/table/renderRowActions.js.map +1 -0
  252. package/dist/react/schemaRenderer/table/url.d.ts +41 -0
  253. package/dist/react/schemaRenderer/table/url.d.ts.map +1 -0
  254. package/dist/react/schemaRenderer/table/url.js +114 -0
  255. package/dist/react/schemaRenderer/table/url.js.map +1 -0
  256. package/dist/routes/globals.d.ts +13 -0
  257. package/dist/routes/globals.d.ts.map +1 -0
  258. package/dist/routes/globals.js +131 -0
  259. package/dist/routes/globals.js.map +1 -0
  260. package/dist/routes/helpers.d.ts +217 -0
  261. package/dist/routes/helpers.d.ts.map +1 -0
  262. package/dist/routes/helpers.js +498 -0
  263. package/dist/routes/helpers.js.map +1 -0
  264. package/dist/routes/pages.d.ts +15 -0
  265. package/dist/routes/pages.d.ts.map +1 -0
  266. package/dist/routes/pages.js +145 -0
  267. package/dist/routes/pages.js.map +1 -0
  268. package/dist/routes/panel.d.ts +19 -0
  269. package/dist/routes/panel.d.ts.map +1 -0
  270. package/dist/routes/panel.js +191 -0
  271. package/dist/routes/panel.js.map +1 -0
  272. package/dist/routes/relations.d.ts +21 -0
  273. package/dist/routes/relations.d.ts.map +1 -0
  274. package/dist/routes/relations.js +1239 -0
  275. package/dist/routes/relations.js.map +1 -0
  276. package/dist/routes/resources.d.ts +28 -0
  277. package/dist/routes/resources.d.ts.map +1 -0
  278. package/dist/routes/resources.js +741 -0
  279. package/dist/routes/resources.js.map +1 -0
  280. package/dist/routes/theme.d.ts +12 -0
  281. package/dist/routes/theme.d.ts.map +1 -0
  282. package/dist/routes/theme.js +82 -0
  283. package/dist/routes/theme.js.map +1 -0
  284. package/dist/routes.d.ts.map +1 -1
  285. package/dist/routes.js +64 -3078
  286. package/dist/routes.js.map +1 -1
  287. package/dist/vite.d.ts +1 -0
  288. package/dist/vite.d.ts.map +1 -1
  289. package/dist/vite.js +26 -5
  290. package/dist/vite.js.map +1 -1
  291. package/package.json +2 -1
  292. package/src/Pilotiq.ts +95 -0
  293. package/src/actions/Action.ts +79 -723
  294. package/src/actions/bulkFactories.ts +168 -0
  295. package/src/actions/crudFactories.ts +220 -0
  296. package/src/actions/factoryHelpers.ts +177 -0
  297. package/src/actions/m2mFactories.ts +193 -0
  298. package/src/actions/relationFactories.ts +372 -0
  299. package/src/elements/dispatchForm.ts +1 -1
  300. package/src/elements/dispatchTable.ts +1 -1
  301. package/src/fields/Field.ts +39 -0
  302. package/src/pageData/breadcrumbs.ts +288 -0
  303. package/src/pageData/forms.ts +578 -0
  304. package/src/pageData/helpers.ts +764 -0
  305. package/src/pageData/misc.ts +347 -0
  306. package/src/pageData/navigation.ts +779 -0
  307. package/src/pageData/relationPages.ts +1246 -0
  308. package/src/pageData/relationTabs.ts +286 -0
  309. package/src/pageData/resourcePages.ts +593 -0
  310. package/src/pageData.ts +122 -4731
  311. package/src/react/AppShell.tsx +27 -1
  312. package/src/react/CollabExtensionFactoryRegistry.ts +55 -0
  313. package/src/react/CollabRoomContext.ts +42 -0
  314. package/src/react/FormCollabBindingRegistry.ts +72 -0
  315. package/src/react/FormStateContext.tsx +91 -0
  316. package/src/react/RecordWrapperGate.tsx +40 -0
  317. package/src/react/RecordWrapperRegistry.ts +39 -0
  318. package/src/react/SchemaRenderer.tsx +230 -6479
  319. package/src/react/component-slots.test.ts +103 -0
  320. package/src/react/component-slots.ts +116 -0
  321. package/src/react/fields/BuilderInput.tsx +29 -117
  322. package/src/react/fields/MarkdownInput.tsx +0 -1
  323. package/src/react/fields/RepeaterInput.tsx +29 -130
  324. package/src/react/fields/rowState.ts +106 -0
  325. package/src/react/fields/useRowReorderDnd.ts +78 -0
  326. package/src/react/index.ts +38 -0
  327. package/src/react/layouts/SidebarLayout.tsx +39 -28
  328. package/src/react/layouts/TopbarLayout.tsx +70 -57
  329. package/src/react/parseRecordEditUrl.test.ts +75 -0
  330. package/src/react/parseRecordEditUrl.ts +55 -0
  331. package/src/react/persistedState.ts +40 -0
  332. package/src/react/schemaRenderer/AlertRenderer.tsx +112 -0
  333. package/src/react/schemaRenderer/EntryRenderer.tsx +501 -0
  334. package/src/react/schemaRenderer/SectionRenderer.tsx +120 -0
  335. package/src/react/schemaRenderer/SimpleElements.tsx +306 -0
  336. package/src/react/schemaRenderer/TabsRenderer.tsx +62 -0
  337. package/src/react/schemaRenderer/WizardRenderer.tsx +338 -0
  338. package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +177 -0
  339. package/src/react/schemaRenderer/action/ActionModalDialog.tsx +273 -0
  340. package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +61 -0
  341. package/src/react/schemaRenderer/action/HandlerActionButton.tsx +43 -0
  342. package/src/react/schemaRenderer/action/MethodActionButton.tsx +64 -0
  343. package/src/react/schemaRenderer/action/buttons.tsx +99 -0
  344. package/src/react/schemaRenderer/action/helpers.ts +140 -0
  345. package/src/react/schemaRenderer/action/renderAction.tsx +245 -0
  346. package/src/react/schemaRenderer/columnFormat.ts +65 -0
  347. package/src/react/schemaRenderer/constants.ts +50 -0
  348. package/src/react/schemaRenderer/form/FormRenderer.tsx +245 -0
  349. package/src/react/schemaRenderer/form/renderField.tsx +511 -0
  350. package/src/react/schemaRenderer/helpers.tsx +81 -0
  351. package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +308 -0
  352. package/src/react/schemaRenderer/table/TableRenderer.tsx +123 -0
  353. package/src/react/schemaRenderer/table/TableRendererBody.tsx +974 -0
  354. package/src/react/schemaRenderer/table/filters.tsx +1233 -0
  355. package/src/react/schemaRenderer/table/formatCell.tsx +264 -0
  356. package/src/react/schemaRenderer/table/links.tsx +112 -0
  357. package/src/react/schemaRenderer/table/renderRowActions.tsx +52 -0
  358. package/src/react/schemaRenderer/table/url.tsx +143 -0
  359. package/src/routes/globals.ts +154 -0
  360. package/src/routes/helpers.ts +668 -0
  361. package/src/routes/pages.ts +173 -0
  362. package/src/routes/panel.ts +204 -0
  363. package/src/routes/relations.ts +1219 -0
  364. package/src/routes/resources.ts +786 -0
  365. package/src/routes/theme.ts +109 -0
  366. package/src/routes.test.ts +1 -1
  367. package/src/routes.ts +64 -3176
  368. package/src/schema/TableWidget.test.ts +2 -2
  369. package/src/theme/migrate.test.ts +178 -0
  370. package/src/vite.test.ts +184 -0
  371. package/src/vite.ts +26 -4
@@ -0,0 +1,591 @@
1
+ import { resourceBasePath, globalBasePath, pageBasePath } from '../clusterPaths.js';
2
+ import { resolveTheme } from '../theme/resolve.js';
3
+ import { serializeIcon } from '../icons/types.js';
4
+ import { RIGHT_PANEL_DEFAULT_WIDTH, RIGHT_PANEL_MIN_WIDTH, RIGHT_PANEL_MAX_WIDTH, } from '../RightPanel.js';
5
+ import { resolveRenderHooks, CHROME_HOOK_NAMES, } from '../RenderHook.js';
6
+ import { applyPageHooks, pageHooksFor } from '../applyPageHooks.js';
7
+ import { notificationChannel, NOTIFICATION_CREATED_EVENT, } from '../notifications/broadcast.js';
8
+ import { safeBool } from './helpers.js';
9
+ export async function panelInfo(pilotiq, req, route = {}) {
10
+ const cfg = pilotiq.getConfig();
11
+ const merged = pilotiq.getMergedTheme();
12
+ const theme = merged ? resolveTheme(merged) : undefined;
13
+ const user = await pilotiq.resolveUser(req);
14
+ const [navigation, userMenu, renderHooks, rightSidebar] = await Promise.all([
15
+ buildNavigation(pilotiq, user),
16
+ buildUserMenu(pilotiq, user),
17
+ resolveChromeHooks(pilotiq, user, route),
18
+ buildRightSidebarMeta(cfg, user),
19
+ ]);
20
+ const databaseNotifications = buildDatabaseNotificationsMeta(cfg, user);
21
+ // AI suggestion mode — sparse: omit when 'auto' (the default) so the
22
+ // wire shape stays minimal for panels that don't opt into review mode.
23
+ // Plugin clients (e.g. @pilotiq-pro/ai's `AiClientToolBindings`) read
24
+ // this to decide whether to apply writes immediately or stage them as
25
+ // PendingSuggestions for user approval.
26
+ const aiSuggestionsMode = pilotiq.getAiSuggestionsMode();
27
+ return {
28
+ name: cfg.name,
29
+ branding: cfg.branding,
30
+ navigation,
31
+ theme,
32
+ themeEditor: cfg.themeEditor ?? false,
33
+ ...(userMenu ? { userMenu } : {}),
34
+ ...(databaseNotifications ? { databaseNotifications } : {}),
35
+ ...(rightSidebar ? { rightSidebar } : {}),
36
+ ...(Object.keys(renderHooks).length > 0 ? { renderHooks } : {}),
37
+ ...(aiSuggestionsMode !== 'auto' ? { aiSuggestionsMode } : {}),
38
+ };
39
+ }
40
+ /**
41
+ * Build the bell-icon meta. Returns `null` when:
42
+ * - `Pilotiq.databaseNotifications()` was never called, OR
43
+ * - no user resolves (no inbox to surface).
44
+ *
45
+ * Defaults follow Filament: 30s polling, 25 rows per page, primary
46
+ * badge color, topbar position.
47
+ */
48
+ export function buildDatabaseNotificationsMeta(cfg, user) {
49
+ if (!cfg.databaseNotifications?.enabled)
50
+ return null;
51
+ if (user === null || user === undefined)
52
+ return null;
53
+ const dn = cfg.databaseNotifications;
54
+ const base = cfg.path;
55
+ const meta = {
56
+ position: dn.position ?? 'topbar',
57
+ polling: dn.polling === null ? null : (dn.polling ?? 30),
58
+ pageSize: dn.pageSize ?? 25,
59
+ badgeColor: dn.badgeColor ?? 'primary',
60
+ listUrl: `${base}/_notifications`,
61
+ readAllUrl: `${base}/_notifications/read-all`,
62
+ readUrl: `${base}/_notifications/:id/read`,
63
+ unreadUrl: `${base}/_notifications/:id/unread`,
64
+ actionUrl: `${base}/_notifications/:id/_action/:actionName`,
65
+ };
66
+ if (dn.trigger)
67
+ meta.trigger = { ...dn.trigger };
68
+ // Phase 2 broadcast hint — only ship when broadcast is enabled AND the
69
+ // resolved user has an `id` to scope the channel to. The client uses
70
+ // `wsUrl` for the WebSocket connection and `channel` for the subscribe
71
+ // call (the private- prefix is already baked in).
72
+ if (dn.broadcast) {
73
+ const userId = user?.id;
74
+ if (userId !== undefined && userId !== null) {
75
+ const wsUrl = typeof dn.broadcast === 'object' && dn.broadcast.wsUrl
76
+ ? dn.broadcast.wsUrl
77
+ : ''; // empty = client falls back to same-origin /ws
78
+ meta.broadcast = {
79
+ wsUrl,
80
+ channel: notificationChannel(String(userId)),
81
+ event: NOTIFICATION_CREATED_EVENT,
82
+ };
83
+ }
84
+ }
85
+ return meta;
86
+ }
87
+ /**
88
+ * Build the right-sidebar meta from registered contributions. Returns
89
+ * `null` when:
90
+ *
91
+ * - no contributions were registered, OR
92
+ * - every contribution failed `canAccess(user)` (or its predicate
93
+ * threw — fail-closed), OR
94
+ * - every passing contribution is `hidden: true` (no tab-strip
95
+ * surface to mount; programmatic-open consumers should ship at
96
+ * least one visible tab).
97
+ *
98
+ * Visible contributions are sorted by `sort` ascending (default 100),
99
+ * with registration order as a stable tiebreaker. Each entry's icon is
100
+ * serialized through `serializeIcon` keyed on the contribution `id`
101
+ * (Phase B's Vite plugin extends `_components.ts` to round-trip
102
+ * component-typed icons under that key). `defaultWidth` rolls up:
103
+ * panel-level baseline is `RIGHT_PANEL_DEFAULT_WIDTH`; per-contribution
104
+ * overrides ride on `RightPanelMeta.defaultWidth`.
105
+ *
106
+ * Errors thrown by `canAccess` are swallowed (the contribution is
107
+ * dropped + a single console warn is emitted) so a flaky predicate on
108
+ * one pane never blanks the whole sidebar.
109
+ */
110
+ export async function buildRightSidebarMeta(cfg, user) {
111
+ const list = cfg.rightPanels ?? [];
112
+ if (list.length === 0)
113
+ return null;
114
+ const indexed = list.map((c, idx) => ({ c, idx }));
115
+ const gated = await Promise.all(indexed.map(async ({ c, idx }) => {
116
+ if (c.canAccess) {
117
+ try {
118
+ const ok = await c.canAccess(user);
119
+ if (!ok)
120
+ return null;
121
+ }
122
+ catch (err) {
123
+ // eslint-disable-next-line no-console
124
+ console.warn(`[Pilotiq] rightPanel "${c.id}" canAccess threw — dropping`, err);
125
+ return null;
126
+ }
127
+ }
128
+ return { c, idx };
129
+ }));
130
+ const visible = gated
131
+ .filter((x) => x !== null)
132
+ .filter((x) => !x.c.hidden)
133
+ .sort((a, b) => {
134
+ const sa = a.c.sort ?? 100;
135
+ const sb = b.c.sort ?? 100;
136
+ if (sa !== sb)
137
+ return sa - sb;
138
+ return a.idx - b.idx;
139
+ });
140
+ if (visible.length === 0)
141
+ return null;
142
+ const panels = visible.map(({ c }) => {
143
+ const meta = {
144
+ id: c.id,
145
+ label: c.label ?? c.id,
146
+ defaultWidth: c.defaultWidth ?? RIGHT_PANEL_DEFAULT_WIDTH,
147
+ };
148
+ if (c.icon !== undefined) {
149
+ meta.icon = serializeIcon(c.icon, c.id);
150
+ }
151
+ return meta;
152
+ });
153
+ return {
154
+ panels,
155
+ defaultWidth: panels[0]?.defaultWidth ?? RIGHT_PANEL_DEFAULT_WIDTH,
156
+ minWidth: RIGHT_PANEL_MIN_WIDTH,
157
+ maxWidth: RIGHT_PANEL_MAX_WIDTH,
158
+ };
159
+ }
160
+ /**
161
+ * Resolve every chrome render hook (body / topbar / sidebar / user-menu
162
+ * / footer / head). Returns a sparse map — slots with no matching
163
+ * registered entries are omitted so the wire payload stays minimal on
164
+ * panels that don't use render hooks at all.
165
+ */
166
+ export async function resolveChromeHooks(pilotiq, user, route) {
167
+ const cfg = pilotiq.getConfig();
168
+ const entries = cfg.renderHooks ?? [];
169
+ if (entries.length === 0)
170
+ return {};
171
+ const ctx = {
172
+ user,
173
+ basePath: cfg.path,
174
+ url: route.url ?? cfg.path,
175
+ };
176
+ if (route.resource !== undefined)
177
+ ctx.resource = route.resource;
178
+ if (route.page !== undefined)
179
+ ctx.page = route.page;
180
+ if (route.global !== undefined)
181
+ ctx.global = route.global;
182
+ if (route.recordId !== undefined)
183
+ ctx.recordId = route.recordId;
184
+ return resolveRenderHooks(entries, CHROME_HOOK_NAMES, ctx);
185
+ }
186
+ /**
187
+ * Resolve a subset of page-role render hooks (e.g. `panels::page.start`
188
+ * + the list-records / create-record / view-record / edit-record /
189
+ * global-search slot families). Per-page-role data builders call this
190
+ * after schema resolution and stamp the result on `viewProps.renderHooks`.
191
+ *
192
+ * `names` lets each builder declare exactly which slots it serves so a
193
+ * list-page builder doesn't ship slots that only fire on the edit page.
194
+ */
195
+ /**
196
+ * Per-builder one-shot — resolve the role's slot set + splice the
197
+ * results into the resolved schema. Wraps the two steps a per-builder
198
+ * data fn always does in lockstep:
199
+ *
200
+ * 1. `resolvePageHooks(pilotiq, user, pageHooksFor(role), route)`
201
+ * 2. `applyPageHooks(schemaData, hooks, role)`
202
+ *
203
+ * Returns the wrapped `ElementMeta[]`. No-op when the panel has no
204
+ * registered hooks. Pass through what you'd pass to `panelInfo()`'s
205
+ * route arg — same shape.
206
+ */
207
+ export async function applyRoleHooks(pilotiq, user, role, schemaData, route = {}) {
208
+ const cfg = pilotiq.getConfig();
209
+ if (!cfg.renderHooks || cfg.renderHooks.length === 0)
210
+ return schemaData;
211
+ const hooks = await resolvePageHooks(pilotiq, user, pageHooksFor(role), route);
212
+ return applyPageHooks(schemaData, hooks, role);
213
+ }
214
+ export async function resolvePageHooks(pilotiq, user, names, route) {
215
+ const cfg = pilotiq.getConfig();
216
+ const entries = cfg.renderHooks ?? [];
217
+ if (entries.length === 0 || names.length === 0)
218
+ return {};
219
+ const ctx = {
220
+ user,
221
+ basePath: cfg.path,
222
+ url: route.url ?? cfg.path,
223
+ };
224
+ if (route.resource !== undefined)
225
+ ctx.resource = route.resource;
226
+ if (route.page !== undefined)
227
+ ctx.page = route.page;
228
+ if (route.global !== undefined)
229
+ ctx.global = route.global;
230
+ if (route.recordId !== undefined)
231
+ ctx.recordId = route.recordId;
232
+ return resolveRenderHooks(entries, names, ctx);
233
+ }
234
+ /**
235
+ * Build the top-right user-menu meta. Returns `null` when:
236
+ * - `Pilotiq.user()` isn't configured, or
237
+ * - the resolver returned `null` (anonymous request), or
238
+ * - the user object has no extractable identity AND the panel
239
+ * configured no items / no sign-out (nothing to render).
240
+ *
241
+ * Items resolve in parallel with their visibility predicates
242
+ * (`UserMenuItem.visible`). Throwing predicates fail closed (item
243
+ * dropped). Sort by `.sort(n)` ascending → registration order.
244
+ */
245
+ export async function buildUserMenu(pilotiq, user) {
246
+ if (user === null || user === undefined)
247
+ return null;
248
+ const cfg = pilotiq.getConfig();
249
+ const items = cfg.userMenuItems ?? [];
250
+ const ctx = { user };
251
+ // Resolve every item in parallel. `null` returns mean "filtered by
252
+ // visibility predicate" — drop them. Indexed pre-sort so stable ties
253
+ // resolve to registration order.
254
+ const resolved = await Promise.all(items.map(async (item, idx) => {
255
+ try {
256
+ const meta = await item.resolve(ctx);
257
+ return meta ? { meta, idx, sort: item.getSort() } : null;
258
+ }
259
+ catch {
260
+ return null;
261
+ }
262
+ }));
263
+ const visibleItems = resolved
264
+ .filter((x) => x !== null)
265
+ .sort((a, b) => {
266
+ const aHas = a.sort !== undefined, bHas = b.sort !== undefined;
267
+ if (aHas && bHas)
268
+ return a.sort - b.sort || a.idx - b.idx;
269
+ if (aHas)
270
+ return -1;
271
+ if (bHas)
272
+ return 1;
273
+ return a.idx - b.idx;
274
+ })
275
+ .map(x => x.meta);
276
+ // Auto-inject the profile entry from `cfg.profilePage` when set.
277
+ // Prepended (Filament-style) so it always sits at the top of the
278
+ // dropdown regardless of user-authored item ordering. Falls through
279
+ // its own `canAccess(user)` so per-user gating works without the
280
+ // user repeating the predicate at the menu level.
281
+ const profileItem = await buildProfileMenuItem(cfg, user);
282
+ const finalItems = profileItem ? [profileItem, ...visibleItems] : visibleItems;
283
+ const meta = {
284
+ user: extractUserIdentity(user),
285
+ items: finalItems,
286
+ };
287
+ if (cfg.signOut) {
288
+ meta.signOut = {
289
+ url: cfg.signOut.url,
290
+ label: cfg.signOut.label ?? 'Sign out',
291
+ method: cfg.signOut.method ?? 'POST',
292
+ };
293
+ }
294
+ return meta;
295
+ }
296
+ /** Build the auto-injected profile entry from `cfg.profilePage`. The
297
+ * Page's `static label` / `static icon` win; defaults `'Edit profile'`
298
+ * + `'user-circle'` (registry-resolved). Returns `null` when no
299
+ * profile page is configured or `Page.canAccess(user)` denies. */
300
+ export async function buildProfileMenuItem(cfg, user) {
301
+ const P = cfg.profilePage;
302
+ if (!P)
303
+ return null;
304
+ if (!(await safeBool(() => P.canAccess(user))))
305
+ return null;
306
+ const url = pageBasePath(cfg.path, P);
307
+ const icon = serializeIcon(P.icon ?? 'user-circle', P.name);
308
+ const meta = {
309
+ name: '__profile',
310
+ label: P.label ?? 'Edit profile',
311
+ url,
312
+ };
313
+ if (icon !== undefined)
314
+ meta.icon = icon;
315
+ return meta;
316
+ }
317
+ /** Duck-type the user object for display fields. We never throw — a
318
+ * user resolver might return literally anything (a primitive, a class
319
+ * instance with getters, a plain object) and the dropdown should
320
+ * degrade gracefully (initials fallback to '?' when no name found). */
321
+ export function extractUserIdentity(user) {
322
+ if (user === null || user === undefined)
323
+ return {};
324
+ if (typeof user !== 'object')
325
+ return { name: String(user) };
326
+ const obj = user;
327
+ const out = {};
328
+ const name = obj.name ?? obj.fullName ?? obj.displayName ?? obj.username;
329
+ if (typeof name === 'string' && name)
330
+ out.name = name;
331
+ if (typeof obj.email === 'string' && obj.email)
332
+ out.email = obj.email;
333
+ const avatar = obj.avatar ?? obj.avatarUrl ?? obj.image;
334
+ if (typeof avatar === 'string' && avatar)
335
+ out.avatar = avatar;
336
+ return out;
337
+ }
338
+ /** Plan #10 — stamp the resolved user onto a SchemaContext so action
339
+ * visibility predicates can see it during `resolveSchema`. The `user`
340
+ * field is opaque (whatever `Pilotiq.user(req => …)` returns); skipped
341
+ * when null/undefined to keep ctx tidy. */
342
+ export async function buildNavigation(pilotiq, user) {
343
+ const cfg = pilotiq.getConfig();
344
+ const base = cfg.path;
345
+ // Flatten + resolve badges in parallel. We build the raw list first so
346
+ // every entry has its identity (`name`) and parent set; badges resolve
347
+ // alongside.
348
+ const raw = [];
349
+ let idx = 0;
350
+ const pushBadge = [];
351
+ // Plan #10 — pre-evaluate canAccess for every owner in parallel so we
352
+ // can drop forbidden items before flattening. Failed predicates fail
353
+ // closed (treated as `false`) so a thrown auth check doesn't accidentally
354
+ // expose nav items. Clusters compose: a child gated through its
355
+ // cluster's `canAccess` returning false drops the child even when the
356
+ // child's own predicate would have passed.
357
+ const [resourceAccess, globalAccess, pageAccess, clusterAccess] = await Promise.all([
358
+ Promise.all(cfg.resources.map(R => safeBool(() => R.canAccess(user)))),
359
+ Promise.all(cfg.globals.map(G => safeBool(() => G.canAccess(user)))),
360
+ Promise.all(cfg.pages.map(P => safeBool(() => P.canAccess(user)))),
361
+ Promise.all(cfg.clusters.map(C => safeBool(() => C.canAccess(user)))),
362
+ ]);
363
+ // Identity-keyed so two clusters that happen to share a `.name`
364
+ // (minifier collisions, hot-reload duplicate imports) don't clobber.
365
+ const clusterAccessByClass = new Map();
366
+ cfg.clusters.forEach((C, i) => clusterAccessByClass.set(C, !!clusterAccess[i]));
367
+ const firstChildUrlByCluster = new Map();
368
+ const recordChildUrl = (cluster, url) => {
369
+ if (!firstChildUrlByCluster.has(cluster))
370
+ firstChildUrlByCluster.set(cluster, url);
371
+ };
372
+ for (let i = 0; i < cfg.resources.length; i++) {
373
+ const R = cfg.resources[i];
374
+ if (!resourceAccess[i])
375
+ continue;
376
+ if (R.cluster && !clusterAccessByClass.get(R.cluster))
377
+ continue;
378
+ const url = resourceBasePath(base, R);
379
+ if (R.cluster)
380
+ recordChildUrl(R.cluster, url);
381
+ const item = {
382
+ name: R.name,
383
+ label: R.getNavigationLabel(),
384
+ url,
385
+ icon: serializeIcon(R.getNavigationIcon(), R.name),
386
+ _idx: idx++,
387
+ };
388
+ if (R.navigationGroup !== undefined)
389
+ item.group = R.navigationGroup;
390
+ if (R.navigationSort !== undefined)
391
+ item.sort = R.navigationSort;
392
+ // Cluster nesting wins over `navigationParentItem`. Both being set
393
+ // is a misconfiguration; cluster placement is the structural one.
394
+ if (R.cluster)
395
+ item.parent = R.cluster.name;
396
+ else if (R.navigationParentItem !== undefined)
397
+ item.parent = R.navigationParentItem;
398
+ if (R.navigationBadgeColor !== 'default')
399
+ item.badgeColor = R.navigationBadgeColor;
400
+ if (R.navigationBadge)
401
+ pushBadge.push({ item, handler: R.navigationBadge });
402
+ raw.push(item);
403
+ }
404
+ for (let i = 0; i < cfg.globals.length; i++) {
405
+ if (!globalAccess[i])
406
+ continue;
407
+ const G = cfg.globals[i];
408
+ if (G.cluster && !clusterAccessByClass.get(G.cluster))
409
+ continue;
410
+ // Globals default `navigationGroup` to `'Settings'`. Allow `null` as
411
+ // an explicit opt-out → render at top level.
412
+ const group = G.navigationGroup === null ? undefined : G.navigationGroup;
413
+ const url = globalBasePath(base, G);
414
+ if (G.cluster)
415
+ recordChildUrl(G.cluster, url);
416
+ const item = {
417
+ name: G.name,
418
+ label: G.getNavigationLabel(),
419
+ url,
420
+ icon: serializeIcon(G.getNavigationIcon(), G.name),
421
+ _idx: idx++,
422
+ };
423
+ if (group !== undefined)
424
+ item.group = group;
425
+ if (G.navigationSort !== undefined)
426
+ item.sort = G.navigationSort;
427
+ if (G.cluster)
428
+ item.parent = G.cluster.name;
429
+ else if (G.navigationParentItem !== undefined)
430
+ item.parent = G.navigationParentItem;
431
+ if (G.navigationBadgeColor !== 'default')
432
+ item.badgeColor = G.navigationBadgeColor;
433
+ if (G.navigationBadge)
434
+ pushBadge.push({ item, handler: G.navigationBadge });
435
+ raw.push(item);
436
+ }
437
+ for (let i = 0; i < cfg.pages.length; i++) {
438
+ if (!pageAccess[i])
439
+ continue;
440
+ const P = cfg.pages[i];
441
+ if (P.cluster && !clusterAccessByClass.get(P.cluster))
442
+ continue;
443
+ // The dashboard page collapses its nav URL to `${base}` so the
444
+ // sidebar entry deep-links to the panel root rather than
445
+ // `${base}/${P.getSlug()}` (which would 404 — the slug route skips
446
+ // the dashboard page at boot).
447
+ const isDashboard = cfg.dashboardPage === P;
448
+ const url = isDashboard ? base : pageBasePath(base, P);
449
+ if (P.cluster && !isDashboard)
450
+ recordChildUrl(P.cluster, url);
451
+ const item = {
452
+ name: P.name,
453
+ label: P.getNavigationLabel(),
454
+ url,
455
+ icon: serializeIcon(P.getNavigationIcon(), P.name),
456
+ _idx: idx++,
457
+ };
458
+ if (P.navigationGroup !== undefined)
459
+ item.group = P.navigationGroup;
460
+ if (P.navigationSort !== undefined)
461
+ item.sort = P.navigationSort;
462
+ if (P.cluster && !isDashboard)
463
+ item.parent = P.cluster.name;
464
+ else if (P.navigationParentItem !== undefined)
465
+ item.parent = P.navigationParentItem;
466
+ if (P.navigationBadgeColor !== 'default')
467
+ item.badgeColor = P.navigationBadgeColor;
468
+ if (P.navigationBadge)
469
+ pushBadge.push({ item, handler: P.navigationBadge });
470
+ raw.push(item);
471
+ }
472
+ // Clusters render as first-class nav items. Each gets a URL pointing
473
+ // at its `landingPage` (when set + accessible) or its first accessible
474
+ // child. Clusters whose every child was gated out are dropped silently
475
+ // — same posture as `navigationParentItem` with no resolvable parent.
476
+ for (let i = 0; i < cfg.clusters.length; i++) {
477
+ if (!clusterAccess[i])
478
+ continue;
479
+ const C = cfg.clusters[i];
480
+ let url;
481
+ if (C.landingPage) {
482
+ const lpIdx = cfg.pages.indexOf(C.landingPage);
483
+ if (lpIdx !== -1 && pageAccess[lpIdx]) {
484
+ url = cfg.dashboardPage === C.landingPage ? base : pageBasePath(base, C.landingPage);
485
+ }
486
+ }
487
+ if (url === undefined)
488
+ url = firstChildUrlByCluster.get(C);
489
+ if (url === undefined)
490
+ continue; // empty cluster — drop entirely
491
+ const item = {
492
+ name: C.name,
493
+ label: C.getNavigationLabel(),
494
+ url,
495
+ icon: serializeIcon(C.getNavigationIcon(), C.name),
496
+ _idx: idx++,
497
+ };
498
+ if (C.navigationGroup !== undefined)
499
+ item.group = C.navigationGroup;
500
+ if (C.navigationSort !== undefined)
501
+ item.sort = C.navigationSort;
502
+ if (C.navigationParentItem !== undefined)
503
+ item.parent = C.navigationParentItem;
504
+ if (C.navigationBadgeColor !== 'default')
505
+ item.badgeColor = C.navigationBadgeColor;
506
+ if (C.navigationBadge)
507
+ pushBadge.push({ item, handler: C.navigationBadge });
508
+ raw.push(item);
509
+ }
510
+ await Promise.all(pushBadge.map(async ({ item, handler }) => {
511
+ try {
512
+ const v = await handler();
513
+ if (v === undefined || v === null)
514
+ return;
515
+ item.badge = String(v);
516
+ }
517
+ catch {
518
+ // Per-badge errors stay silent.
519
+ }
520
+ }));
521
+ return nestAndSort(raw);
522
+ }
523
+ /**
524
+ * Resolve `parent` references → nest, drop cycles, sort within each
525
+ * grouping, then strip internal scaffolding (`parent`, `_idx`).
526
+ */
527
+ export function nestAndSort(raw) {
528
+ const byName = new Map();
529
+ for (const it of raw)
530
+ byName.set(it.name, it);
531
+ // Detect parent cycles: walk upwards from each item; any name seen
532
+ // twice → cycle. Items in a cycle get treated as top-level.
533
+ const inCycle = new Set();
534
+ for (const it of raw) {
535
+ if (it.parent === undefined)
536
+ continue;
537
+ const seen = new Set([it.name]);
538
+ let cur = it.parent;
539
+ while (cur !== undefined) {
540
+ if (seen.has(cur)) {
541
+ if (typeof console !== 'undefined' && typeof console.warn === 'function') {
542
+ console.warn(`[Pilotiq] navigationParentItem cycle detected at "${it.name}" — rendering at top level.`);
543
+ }
544
+ inCycle.add(it.name);
545
+ break;
546
+ }
547
+ seen.add(cur);
548
+ const parent = byName.get(cur);
549
+ if (!parent)
550
+ break;
551
+ cur = parent.parent;
552
+ }
553
+ }
554
+ const childrenOf = new Map();
555
+ const top = [];
556
+ for (const it of raw) {
557
+ const parent = it.parent;
558
+ if (parent && byName.has(parent) && !inCycle.has(it.name)) {
559
+ const list = childrenOf.get(parent) ?? [];
560
+ list.push(it);
561
+ childrenOf.set(parent, list);
562
+ }
563
+ else {
564
+ top.push(it);
565
+ }
566
+ }
567
+ // Sort items in a sibling group by sort (asc), ties → registration order.
568
+ const sortItems = (items) => {
569
+ return [...items].sort((a, b) => {
570
+ const aHas = a.sort !== undefined, bHas = b.sort !== undefined;
571
+ if (aHas && bHas)
572
+ return a.sort - b.sort || a._idx - b._idx;
573
+ if (aHas)
574
+ return -1; // sorted items come before unsorted
575
+ if (bHas)
576
+ return 1;
577
+ return a._idx - b._idx;
578
+ });
579
+ };
580
+ // Strip internals + recurse into children.
581
+ const finalize = (items) => sortItems(items).map(it => {
582
+ const kids = childrenOf.get(it.name);
583
+ const { parent, _idx, ...rest } = it;
584
+ const out = { ...rest };
585
+ if (kids && kids.length > 0)
586
+ out.children = finalize(kids);
587
+ return out;
588
+ });
589
+ return finalize(top);
590
+ }
591
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/pageData/navigation.ts"],"names":[],"mappings":"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"}