@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,347 @@
1
+ import type { Pilotiq } from '../Pilotiq.js'
2
+ import type { Page } from '../Page.js'
3
+ import { globalBasePath, pageBasePath } from '../clusterPaths.js'
4
+ import { Element } from '../schema/Element.js'
5
+ import { resolveSchema, type SchemaContext, type RenderContext } from '../schema/resolveSchema.js'
6
+ import { isServerDataElement, type ServerDataElement } from '../schema/ServerDataElement.js'
7
+ import { findForms } from '../elements/dispatchForm.js'
8
+ import { searchAllResources, type GlobalSearchResult } from '../search.js'
9
+ import { consumeFlashedNotifications } from '../notifications/flash.js'
10
+ import { serializeIcon } from '../icons/types.js'
11
+ import { pageHooksFor } from '../applyPageHooks.js'
12
+ import type { RenderHookMap } from '../RenderHook.js'
13
+ import {
14
+ customPageBreadcrumbs,
15
+ globalBreadcrumbs,
16
+ } from './breadcrumbs.js'
17
+ import {
18
+ applyFillPipeline,
19
+ callPageSchema,
20
+ resolveServerDataElements,
21
+ tagActionDispatch,
22
+ tagFormActions,
23
+ tagFormSubresourceUrls,
24
+ tagWidgetUrls,
25
+ uploadCtx,
26
+ userCtx,
27
+ } from './helpers.js'
28
+ import { applyRoleHooks, panelInfo, resolvePageHooks, type PanelInfoRoute } from './navigation.js'
29
+
30
+ // ─── Misc page builders ─────────────────────────────────────
31
+ //
32
+ // Global edit/view, custom page, widget polling, global search. All
33
+ // take a `Pilotiq` instance + a tag (slug / pageSlug / query) and
34
+ // return the wire-shape envelope for their respective routes.
35
+
36
+
37
+
38
+
39
+ export async function globalEditData(
40
+ pilotiq: Pilotiq,
41
+ slug: string,
42
+ prefill?: { values?: Record<string, unknown>; errors?: Record<string, string[]> },
43
+ req?: unknown,
44
+ ): Promise<Record<string, unknown> | null> {
45
+ const cfg = pilotiq.getConfig()
46
+ const G = cfg.globals.find(g => g.getSlug() === slug)
47
+ if (!G) return null
48
+ const pages = G.resolvePages()
49
+ if (!pages.edit) return null
50
+ const PageClass = pages.edit
51
+
52
+ const editUrl = globalBasePath(cfg.path, G)
53
+ const user = await pilotiq.resolveUser(req)
54
+ const ctx: SchemaContext = uploadCtx(userCtx({ mode: 'edit', basePath: cfg.path }, user), cfg)
55
+ const elements = await callPageSchema(PageClass, ctx)
56
+ tagFormActions(elements, editUrl)
57
+ tagFormSubresourceUrls(elements, editUrl)
58
+
59
+ const form = findForms(elements)[0]
60
+ let record: unknown = undefined
61
+ if (form?.getLoadRecord()) {
62
+ try { record = await form.getLoadRecord()!('', { values: prefill?.values ?? {} }) } catch { /* ignore */ }
63
+ if (!prefill?.values && record != null) {
64
+ const values = await applyFillPipeline(form, record)
65
+ form.withValues(values)
66
+ } else if (prefill?.values) {
67
+ form.withValues(prefill.values)
68
+ }
69
+ if (prefill?.errors) form.withErrors(prefill.errors)
70
+ }
71
+
72
+ const breadcrumbs = globalBreadcrumbs(cfg, G)
73
+ if (breadcrumbs) elements.unshift(breadcrumbs)
74
+
75
+ const globalEditRoute: PanelInfoRoute = { global: G, page: PageClass }
76
+ const globalEditCtx = record !== undefined ? { ...ctx, record } : ctx
77
+ const [panel, schemaData] = await Promise.all([
78
+ panelInfo(pilotiq, req, globalEditRoute),
79
+ resolveSchema(elements, globalEditCtx).then(metas => applyRoleHooks(pilotiq, user, 'global-edit', metas, globalEditRoute)),
80
+ ])
81
+
82
+ return {
83
+ pageType: 'global',
84
+ panel,
85
+ page: PageClass.toMeta(),
86
+ global: { name: G.name, label: G.label, labelSingular: G.labelSingular, slug, icon: serializeIcon(G.icon, G.name) },
87
+ basePath: cfg.path,
88
+ layout: cfg.layout,
89
+ schemaData,
90
+ notifications: consumeFlashedNotifications(req),
91
+ ...(prefill?.errors ? { hasErrors: true } : {}),
92
+ }
93
+ }
94
+
95
+ export async function globalViewData(
96
+ pilotiq: Pilotiq,
97
+ slug: string,
98
+ req?: unknown,
99
+ ): Promise<Record<string, unknown> | null> {
100
+ const cfg = pilotiq.getConfig()
101
+ const G = cfg.globals.find(g => g.getSlug() === slug)
102
+ if (!G) return null
103
+ const pages = G.resolvePages()
104
+ if (!pages.view) return null
105
+ const PageClass = pages.view
106
+
107
+ const user = await pilotiq.resolveUser(req)
108
+ const ctx: SchemaContext = uploadCtx(userCtx({ mode: 'view', basePath: cfg.path }, user), cfg)
109
+ const elements = await callPageSchema(PageClass, ctx)
110
+
111
+ const breadcrumbs = globalBreadcrumbs(cfg, G)
112
+ if (breadcrumbs) elements.unshift(breadcrumbs)
113
+
114
+ const globalViewRoute: PanelInfoRoute = { global: G, page: PageClass }
115
+ const [panel, schemaData] = await Promise.all([
116
+ panelInfo(pilotiq, req, globalViewRoute),
117
+ resolveSchema(elements, ctx).then(metas => applyRoleHooks(pilotiq, user, 'global-view', metas, globalViewRoute)),
118
+ ])
119
+
120
+ return {
121
+ panel,
122
+ page: PageClass.toMeta(),
123
+ global: { name: G.name, label: G.label, labelSingular: G.labelSingular, slug, icon: serializeIcon(G.icon, G.name) },
124
+ basePath: cfg.path,
125
+ layout: cfg.layout,
126
+ schemaData,
127
+ notifications: consumeFlashedNotifications(req),
128
+ }
129
+ }
130
+
131
+ export async function customPageData(
132
+ pilotiq: Pilotiq,
133
+ pageSlug: string,
134
+ req?: unknown,
135
+ ): Promise<Record<string, unknown> | null> {
136
+ const cfg = pilotiq.getConfig()
137
+ const PageClass = cfg.pages.find(P => P.getSlug() === pageSlug)
138
+ if (!PageClass) return null
139
+
140
+ const pageUrl = pageBasePath(cfg.path, PageClass)
141
+ const user = await pilotiq.resolveUser(req)
142
+ const ctx: SchemaContext = uploadCtx(userCtx({}, user), cfg)
143
+ const elements = await callPageSchema(PageClass, ctx)
144
+ tagFormActions(elements, pageUrl)
145
+ tagFormSubresourceUrls(elements, pageUrl)
146
+ tagActionDispatch(elements, pageUrl)
147
+ // Page-scope polling URL (mirrors `${base}/${pageSlug}/_widget/:id`
148
+ // route registered in routes.ts).
149
+ tagWidgetUrls(elements, id => `${pageUrl}/_widget/${id}`)
150
+ const resolvedWidgets = await resolveServerDataElements(elements, ctx)
151
+
152
+ const breadcrumbs = customPageBreadcrumbs(cfg, PageClass)
153
+ if (breadcrumbs) elements.unshift(breadcrumbs)
154
+
155
+ const customRoute: PanelInfoRoute = { page: PageClass }
156
+ const [panel, schemaData] = await Promise.all([
157
+ panelInfo(pilotiq, req, customRoute),
158
+ resolveSchema(elements, ctx).then(metas => applyRoleHooks(pilotiq, user, 'page', metas, customRoute)),
159
+ ])
160
+
161
+ return {
162
+ pageType: 'page',
163
+ panel,
164
+ page: PageClass.toMeta(),
165
+ schemaData,
166
+ _widgetData: resolvedWidgets,
167
+ basePath: cfg.path,
168
+ layout: cfg.layout,
169
+ notifications: consumeFlashedNotifications(req),
170
+ }
171
+ }
172
+
173
+ // ─── Plan #15 widget polling data builder ────────────────────
174
+
175
+ /**
176
+ * Scopes the polling endpoint resolves against. Mirrors the
177
+ * form-state / wizard scope discriminator.
178
+ *
179
+ * panel: dashboard page (`POST {base}/_widget/:id`)
180
+ * page: custom page (`POST {base}/{pageSlug}/_widget/:id`)
181
+ * resource: list page (`POST {base}/{slug}/_widget/:id`) —
182
+ * resolves the resource's index `Page.schema()` so widgets
183
+ * from `Resource.headerSchema()` / `footerSchema()` are
184
+ * reachable. Auth runs `R.canAccess + R.canViewAny` in
185
+ * front of the per-widget visibility check.
186
+ */
187
+ export type WidgetScope =
188
+ | { kind: 'panel' }
189
+ | { kind: 'page'; pageSlug: string }
190
+ | { kind: 'resource'; slug: string }
191
+
192
+ export interface WidgetRequest {
193
+ id: string
194
+ filter?: string
195
+ }
196
+
197
+ export interface WidgetSuccess {
198
+ ok: true
199
+ data: unknown
200
+ timestamp: number
201
+ }
202
+
203
+ export interface WidgetFailure {
204
+ ok: false
205
+ status: 403 | 404 | 500
206
+ error: string
207
+ }
208
+
209
+ /**
210
+ * Plan #15 — re-resolve the active page's schema, find the widget by
211
+ * id, fail-closed via `evaluateVisibility`, then run
212
+ * `resolveServerData(ctx)` and return the payload.
213
+ *
214
+ * - 404 when the page or widget id doesn't exist.
215
+ * - 403 when the layout-level `visible(rule)` says the widget is
216
+ * hidden (server doesn't show data for hidden surfaces).
217
+ * - 500 when the hook itself throws.
218
+ *
219
+ * `body.filter` rides along on `RenderContext.filter` so per-chart
220
+ * filter dropdowns can re-fetch with the new filter value. Treated as
221
+ * an opaque string — widget hooks decode it however they want.
222
+ */
223
+ export async function widgetData(
224
+ pilotiq: Pilotiq,
225
+ scope: WidgetScope,
226
+ body: WidgetRequest,
227
+ req?: unknown,
228
+ ): Promise<WidgetSuccess | WidgetFailure> {
229
+ const cfg = pilotiq.getConfig()
230
+ const user = await pilotiq.resolveUser(req)
231
+
232
+ let elements: Element[]
233
+ let ctx: RenderContext
234
+
235
+ if (scope.kind === 'panel') {
236
+ if (!cfg.dashboardPage) return { ok: false, status: 404, error: 'No dashboard page registered' }
237
+ ctx = uploadCtx(userCtx({ basePath: cfg.path }, user), cfg)
238
+ elements = await callPageSchema(cfg.dashboardPage, ctx)
239
+ } else if (scope.kind === 'page') {
240
+ const P = cfg.pages.find(p => p.getSlug() === scope.pageSlug)
241
+ if (!P) return { ok: false, status: 404, error: 'Page not found' }
242
+ ctx = uploadCtx(userCtx({ basePath: cfg.path }, user), cfg)
243
+ elements = await callPageSchema(P, ctx)
244
+ } else {
245
+ // Resource-scope: re-resolve the list page's schema so widgets from
246
+ // `Resource.headerSchema()` / `footerSchema()` are reachable.
247
+ const R = cfg.resources.find(r => r.getSlug() === scope.slug)
248
+ if (!R) return { ok: false, status: 404, error: 'Resource not found' }
249
+ const pages = R.resolvePages()
250
+ if (!pages.index) return { ok: false, status: 404, error: 'Resource has no list page' }
251
+ ctx = uploadCtx(userCtx({ mode: 'table', basePath: cfg.path }, user), cfg)
252
+ elements = await callPageSchema(pages.index, ctx)
253
+ }
254
+
255
+ // Stamp the request's filter onto the render context so widget hooks
256
+ // can branch on it. Opaque string — widgets decode their own format.
257
+ if (body.filter !== undefined) ctx = { ...ctx, filter: body.filter } as RenderContext
258
+
259
+ const widget = findWidgetById(elements, body.id)
260
+ if (!widget) return { ok: false, status: 404, error: `Widget "${body.id}" not found` }
261
+
262
+ // Layout-level visibility re-check — if the widget is hidden by a
263
+ // visible(rule), refuse to ship data. Same fail-closed posture as
264
+ // the schema resolver. (Parent-container `visible(false)` would
265
+ // already drop the widget from the schema tree at SSR time, so a
266
+ // direct hidden-widget probe here covers the visible-rule-only case.)
267
+ const layoutCtx: import('../schema/Element.js').LayoutContext = {}
268
+ if (user !== null && user !== undefined) layoutCtx.user = user
269
+ if (!await widget.evaluateVisibility(layoutCtx)) {
270
+ return { ok: false, status: 403, error: 'Widget hidden' }
271
+ }
272
+
273
+ try {
274
+ const data = await widget.resolveServerData(ctx)
275
+ return { ok: true, data, timestamp: Date.now() }
276
+ } catch (err) {
277
+ return {
278
+ ok: false,
279
+ status: 500,
280
+ error: err instanceof Error ? err.message : 'Widget failed',
281
+ }
282
+ }
283
+ }
284
+
285
+ /** Walk the element tree looking for a server-data element with the
286
+ * given id. Same walker as `collectServerDataElements` but stops on
287
+ * first match. */
288
+ function findWidgetById(elements: ReadonlyArray<Element>, id: string): ServerDataElement | undefined {
289
+ let found: ServerDataElement | undefined
290
+ const walk = (els: ReadonlyArray<Element>): void => {
291
+ for (const el of els) {
292
+ if (found) return
293
+ if (isServerDataElement(el)) {
294
+ if (el.getId() === id) { found = el; return }
295
+ continue
296
+ }
297
+ const type = el.getType()
298
+ if (type === 'form' || type === 'repeater' || type === 'builder' || type === 'table' || type === 'tableWidget') continue
299
+ const children = el.getChildren()
300
+ if (children) walk(children)
301
+ }
302
+ }
303
+ walk(elements)
304
+ return found
305
+ }
306
+
307
+ // ─── Plan #12 global search data builder ─────────────────────
308
+
309
+ /**
310
+ * Resolve the user via `pilotiq.resolveUser(req)` and run the
311
+ * panel-wide search. Mirrors the formStateData/formWizardData
312
+ * shape so the `/_search` route handler stays a thin wrapper.
313
+ *
314
+ * Also resolves the `panels::global-search.results.before/.after`
315
+ * render hooks when the panel registered any — sparse, absent when
316
+ * neither slot has registered fns. Sent as a `RenderHookMap` so the
317
+ * client `<CommandPalette>` can mount `<RenderHookSlot>` above and
318
+ * below the result list (same pattern chrome slots use).
319
+ */
320
+ export async function searchData(
321
+ pilotiq: Pilotiq,
322
+ query: string,
323
+ req?: unknown,
324
+ ): Promise<{
325
+ ok: true
326
+ results: GlobalSearchResult[]
327
+ renderHooks?: RenderHookMap
328
+ }> {
329
+ const user = await pilotiq.resolveUser(req)
330
+ const results = await searchAllResources(pilotiq, query, user)
331
+ const cfg = pilotiq.getConfig()
332
+ const out: { ok: true; results: GlobalSearchResult[]; renderHooks?: RenderHookMap } = {
333
+ ok: true,
334
+ results,
335
+ }
336
+ if (cfg.renderHooks && cfg.renderHooks.length > 0) {
337
+ const hooks = await resolvePageHooks(
338
+ pilotiq,
339
+ user,
340
+ pageHooksFor('search'),
341
+ { url: `${cfg.path}/_search` },
342
+ )
343
+ if (Object.keys(hooks).length > 0) out.renderHooks = hooks
344
+ }
345
+ return out
346
+ }
347
+