@pilotiq/pilotiq 0.7.2 → 0.8.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 (367) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/CHANGELOG.md +142 -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/RecordWrapperGate.d.ts +25 -0
  93. package/dist/react/RecordWrapperGate.d.ts.map +1 -0
  94. package/dist/react/RecordWrapperGate.js +30 -0
  95. package/dist/react/RecordWrapperGate.js.map +1 -0
  96. package/dist/react/RecordWrapperRegistry.d.ts +31 -0
  97. package/dist/react/RecordWrapperRegistry.d.ts.map +1 -0
  98. package/dist/react/RecordWrapperRegistry.js +15 -0
  99. package/dist/react/RecordWrapperRegistry.js.map +1 -0
  100. package/dist/react/SchemaRenderer.d.ts +17 -23
  101. package/dist/react/SchemaRenderer.d.ts.map +1 -1
  102. package/dist/react/SchemaRenderer.js +71 -3647
  103. package/dist/react/SchemaRenderer.js.map +1 -1
  104. package/dist/react/component-slots.d.ts +103 -0
  105. package/dist/react/component-slots.d.ts.map +1 -0
  106. package/dist/react/component-slots.js +18 -0
  107. package/dist/react/component-slots.js.map +1 -0
  108. package/dist/react/fields/BuilderInput.d.ts.map +1 -1
  109. package/dist/react/fields/BuilderInput.js +21 -117
  110. package/dist/react/fields/BuilderInput.js.map +1 -1
  111. package/dist/react/fields/MarkdownInput.d.ts.map +1 -1
  112. package/dist/react/fields/MarkdownInput.js +1 -3
  113. package/dist/react/fields/MarkdownInput.js.map +1 -1
  114. package/dist/react/fields/RepeaterInput.d.ts.map +1 -1
  115. package/dist/react/fields/RepeaterInput.js +22 -127
  116. package/dist/react/fields/RepeaterInput.js.map +1 -1
  117. package/dist/react/fields/rowState.d.ts +40 -0
  118. package/dist/react/fields/rowState.d.ts.map +1 -0
  119. package/dist/react/fields/rowState.js +60 -0
  120. package/dist/react/fields/rowState.js.map +1 -0
  121. package/dist/react/fields/useRowReorderDnd.d.ts +28 -0
  122. package/dist/react/fields/useRowReorderDnd.d.ts.map +1 -0
  123. package/dist/react/fields/useRowReorderDnd.js +51 -0
  124. package/dist/react/fields/useRowReorderDnd.js.map +1 -0
  125. package/dist/react/index.d.ts +9 -0
  126. package/dist/react/index.d.ts.map +1 -1
  127. package/dist/react/index.js +8 -0
  128. package/dist/react/index.js.map +1 -1
  129. package/dist/react/layouts/SidebarLayout.d.ts +1 -1
  130. package/dist/react/layouts/SidebarLayout.d.ts.map +1 -1
  131. package/dist/react/layouts/SidebarLayout.js +10 -2
  132. package/dist/react/layouts/SidebarLayout.js.map +1 -1
  133. package/dist/react/layouts/TopbarLayout.d.ts +1 -1
  134. package/dist/react/layouts/TopbarLayout.d.ts.map +1 -1
  135. package/dist/react/layouts/TopbarLayout.js +19 -11
  136. package/dist/react/layouts/TopbarLayout.js.map +1 -1
  137. package/dist/react/parseRecordEditUrl.d.ts +29 -0
  138. package/dist/react/parseRecordEditUrl.d.ts.map +1 -0
  139. package/dist/react/parseRecordEditUrl.js +25 -0
  140. package/dist/react/parseRecordEditUrl.js.map +1 -0
  141. package/dist/react/persistedState.d.ts +19 -0
  142. package/dist/react/persistedState.d.ts.map +1 -0
  143. package/dist/react/persistedState.js +51 -0
  144. package/dist/react/persistedState.js.map +1 -0
  145. package/dist/react/schemaRenderer/AlertRenderer.d.ts +12 -0
  146. package/dist/react/schemaRenderer/AlertRenderer.d.ts.map +1 -0
  147. package/dist/react/schemaRenderer/AlertRenderer.js +61 -0
  148. package/dist/react/schemaRenderer/AlertRenderer.js.map +1 -0
  149. package/dist/react/schemaRenderer/EntryRenderer.d.ts +13 -0
  150. package/dist/react/schemaRenderer/EntryRenderer.d.ts.map +1 -0
  151. package/dist/react/schemaRenderer/EntryRenderer.js +277 -0
  152. package/dist/react/schemaRenderer/EntryRenderer.js.map +1 -0
  153. package/dist/react/schemaRenderer/SectionRenderer.d.ts +16 -0
  154. package/dist/react/schemaRenderer/SectionRenderer.d.ts.map +1 -0
  155. package/dist/react/schemaRenderer/SectionRenderer.js +62 -0
  156. package/dist/react/schemaRenderer/SectionRenderer.js.map +1 -0
  157. package/dist/react/schemaRenderer/SimpleElements.d.ts +25 -0
  158. package/dist/react/schemaRenderer/SimpleElements.d.ts.map +1 -0
  159. package/dist/react/schemaRenderer/SimpleElements.js +147 -0
  160. package/dist/react/schemaRenderer/SimpleElements.js.map +1 -0
  161. package/dist/react/schemaRenderer/TabsRenderer.d.ts +17 -0
  162. package/dist/react/schemaRenderer/TabsRenderer.d.ts.map +1 -0
  163. package/dist/react/schemaRenderer/TabsRenderer.js +31 -0
  164. package/dist/react/schemaRenderer/TabsRenderer.js.map +1 -0
  165. package/dist/react/schemaRenderer/WizardRenderer.d.ts +34 -0
  166. package/dist/react/schemaRenderer/WizardRenderer.d.ts.map +1 -0
  167. package/dist/react/schemaRenderer/WizardRenderer.js +208 -0
  168. package/dist/react/schemaRenderer/WizardRenderer.js.map +1 -0
  169. package/dist/react/schemaRenderer/action/ActionGroupTrigger.d.ts +21 -0
  170. package/dist/react/schemaRenderer/action/ActionGroupTrigger.d.ts.map +1 -0
  171. package/dist/react/schemaRenderer/action/ActionGroupTrigger.js +82 -0
  172. package/dist/react/schemaRenderer/action/ActionGroupTrigger.js.map +1 -0
  173. package/dist/react/schemaRenderer/action/ActionModalDialog.d.ts +30 -0
  174. package/dist/react/schemaRenderer/action/ActionModalDialog.d.ts.map +1 -0
  175. package/dist/react/schemaRenderer/action/ActionModalDialog.js +182 -0
  176. package/dist/react/schemaRenderer/action/ActionModalDialog.js.map +1 -0
  177. package/dist/react/schemaRenderer/action/ConfirmActionDialog.d.ts +17 -0
  178. package/dist/react/schemaRenderer/action/ConfirmActionDialog.d.ts.map +1 -0
  179. package/dist/react/schemaRenderer/action/ConfirmActionDialog.js +19 -0
  180. package/dist/react/schemaRenderer/action/ConfirmActionDialog.js.map +1 -0
  181. package/dist/react/schemaRenderer/action/HandlerActionButton.d.ts +16 -0
  182. package/dist/react/schemaRenderer/action/HandlerActionButton.d.ts.map +1 -0
  183. package/dist/react/schemaRenderer/action/HandlerActionButton.js +16 -0
  184. package/dist/react/schemaRenderer/action/HandlerActionButton.js.map +1 -0
  185. package/dist/react/schemaRenderer/action/MethodActionButton.d.ts +22 -0
  186. package/dist/react/schemaRenderer/action/MethodActionButton.d.ts.map +1 -0
  187. package/dist/react/schemaRenderer/action/MethodActionButton.js +26 -0
  188. package/dist/react/schemaRenderer/action/MethodActionButton.js.map +1 -0
  189. package/dist/react/schemaRenderer/action/buttons.d.ts +18 -0
  190. package/dist/react/schemaRenderer/action/buttons.d.ts.map +1 -0
  191. package/dist/react/schemaRenderer/action/buttons.js +74 -0
  192. package/dist/react/schemaRenderer/action/buttons.js.map +1 -0
  193. package/dist/react/schemaRenderer/action/helpers.d.ts +26 -0
  194. package/dist/react/schemaRenderer/action/helpers.d.ts.map +1 -0
  195. package/dist/react/schemaRenderer/action/helpers.js +126 -0
  196. package/dist/react/schemaRenderer/action/helpers.js.map +1 -0
  197. package/dist/react/schemaRenderer/action/renderAction.d.ts +21 -0
  198. package/dist/react/schemaRenderer/action/renderAction.d.ts.map +1 -0
  199. package/dist/react/schemaRenderer/action/renderAction.js +102 -0
  200. package/dist/react/schemaRenderer/action/renderAction.js.map +1 -0
  201. package/dist/react/schemaRenderer/columnFormat.d.ts +10 -0
  202. package/dist/react/schemaRenderer/columnFormat.d.ts.map +1 -0
  203. package/dist/react/schemaRenderer/columnFormat.js +76 -0
  204. package/dist/react/schemaRenderer/columnFormat.js.map +1 -0
  205. package/dist/react/schemaRenderer/constants.d.ts +8 -0
  206. package/dist/react/schemaRenderer/constants.d.ts.map +1 -0
  207. package/dist/react/schemaRenderer/constants.js +45 -0
  208. package/dist/react/schemaRenderer/constants.js.map +1 -0
  209. package/dist/react/schemaRenderer/form/FormRenderer.d.ts +29 -0
  210. package/dist/react/schemaRenderer/form/FormRenderer.d.ts.map +1 -0
  211. package/dist/react/schemaRenderer/form/FormRenderer.js +152 -0
  212. package/dist/react/schemaRenderer/form/FormRenderer.js.map +1 -0
  213. package/dist/react/schemaRenderer/form/renderField.d.ts +6 -0
  214. package/dist/react/schemaRenderer/form/renderField.d.ts.map +1 -0
  215. package/dist/react/schemaRenderer/form/renderField.js +239 -0
  216. package/dist/react/schemaRenderer/form/renderField.js.map +1 -0
  217. package/dist/react/schemaRenderer/helpers.d.ts +32 -0
  218. package/dist/react/schemaRenderer/helpers.d.ts.map +1 -0
  219. package/dist/react/schemaRenderer/helpers.js +52 -0
  220. package/dist/react/schemaRenderer/helpers.js.map +1 -0
  221. package/dist/react/schemaRenderer/table/CardsLayoutBody.d.ts +60 -0
  222. package/dist/react/schemaRenderer/table/CardsLayoutBody.d.ts.map +1 -0
  223. package/dist/react/schemaRenderer/table/CardsLayoutBody.js +189 -0
  224. package/dist/react/schemaRenderer/table/CardsLayoutBody.js.map +1 -0
  225. package/dist/react/schemaRenderer/table/TableRenderer.d.ts +29 -0
  226. package/dist/react/schemaRenderer/table/TableRenderer.d.ts.map +1 -0
  227. package/dist/react/schemaRenderer/table/TableRenderer.js +85 -0
  228. package/dist/react/schemaRenderer/table/TableRenderer.js.map +1 -0
  229. package/dist/react/schemaRenderer/table/TableRendererBody.d.ts +18 -0
  230. package/dist/react/schemaRenderer/table/TableRendererBody.d.ts.map +1 -0
  231. package/dist/react/schemaRenderer/table/TableRendererBody.js +555 -0
  232. package/dist/react/schemaRenderer/table/TableRendererBody.js.map +1 -0
  233. package/dist/react/schemaRenderer/table/filters.d.ts +263 -0
  234. package/dist/react/schemaRenderer/table/filters.d.ts.map +1 -0
  235. package/dist/react/schemaRenderer/table/filters.js +497 -0
  236. package/dist/react/schemaRenderer/table/filters.js.map +1 -0
  237. package/dist/react/schemaRenderer/table/formatCell.d.ts +11 -0
  238. package/dist/react/schemaRenderer/table/formatCell.d.ts.map +1 -0
  239. package/dist/react/schemaRenderer/table/formatCell.js +172 -0
  240. package/dist/react/schemaRenderer/table/formatCell.js.map +1 -0
  241. package/dist/react/schemaRenderer/table/links.d.ts +42 -0
  242. package/dist/react/schemaRenderer/table/links.d.ts.map +1 -0
  243. package/dist/react/schemaRenderer/table/links.js +55 -0
  244. package/dist/react/schemaRenderer/table/links.js.map +1 -0
  245. package/dist/react/schemaRenderer/table/renderRowActions.d.ts +13 -0
  246. package/dist/react/schemaRenderer/table/renderRowActions.d.ts.map +1 -0
  247. package/dist/react/schemaRenderer/table/renderRowActions.js +25 -0
  248. package/dist/react/schemaRenderer/table/renderRowActions.js.map +1 -0
  249. package/dist/react/schemaRenderer/table/url.d.ts +41 -0
  250. package/dist/react/schemaRenderer/table/url.d.ts.map +1 -0
  251. package/dist/react/schemaRenderer/table/url.js +114 -0
  252. package/dist/react/schemaRenderer/table/url.js.map +1 -0
  253. package/dist/routes/globals.d.ts +13 -0
  254. package/dist/routes/globals.d.ts.map +1 -0
  255. package/dist/routes/globals.js +131 -0
  256. package/dist/routes/globals.js.map +1 -0
  257. package/dist/routes/helpers.d.ts +217 -0
  258. package/dist/routes/helpers.d.ts.map +1 -0
  259. package/dist/routes/helpers.js +498 -0
  260. package/dist/routes/helpers.js.map +1 -0
  261. package/dist/routes/pages.d.ts +15 -0
  262. package/dist/routes/pages.d.ts.map +1 -0
  263. package/dist/routes/pages.js +145 -0
  264. package/dist/routes/pages.js.map +1 -0
  265. package/dist/routes/panel.d.ts +19 -0
  266. package/dist/routes/panel.d.ts.map +1 -0
  267. package/dist/routes/panel.js +191 -0
  268. package/dist/routes/panel.js.map +1 -0
  269. package/dist/routes/relations.d.ts +21 -0
  270. package/dist/routes/relations.d.ts.map +1 -0
  271. package/dist/routes/relations.js +1239 -0
  272. package/dist/routes/relations.js.map +1 -0
  273. package/dist/routes/resources.d.ts +28 -0
  274. package/dist/routes/resources.d.ts.map +1 -0
  275. package/dist/routes/resources.js +741 -0
  276. package/dist/routes/resources.js.map +1 -0
  277. package/dist/routes/theme.d.ts +12 -0
  278. package/dist/routes/theme.d.ts.map +1 -0
  279. package/dist/routes/theme.js +82 -0
  280. package/dist/routes/theme.js.map +1 -0
  281. package/dist/routes.d.ts.map +1 -1
  282. package/dist/routes.js +64 -3078
  283. package/dist/routes.js.map +1 -1
  284. package/dist/vite.d.ts +1 -0
  285. package/dist/vite.d.ts.map +1 -1
  286. package/dist/vite.js +26 -5
  287. package/dist/vite.js.map +1 -1
  288. package/package.json +2 -1
  289. package/src/Pilotiq.ts +95 -0
  290. package/src/actions/Action.ts +79 -723
  291. package/src/actions/bulkFactories.ts +168 -0
  292. package/src/actions/crudFactories.ts +220 -0
  293. package/src/actions/factoryHelpers.ts +177 -0
  294. package/src/actions/m2mFactories.ts +193 -0
  295. package/src/actions/relationFactories.ts +372 -0
  296. package/src/elements/dispatchForm.ts +1 -1
  297. package/src/elements/dispatchTable.ts +1 -1
  298. package/src/fields/Field.ts +39 -0
  299. package/src/pageData/breadcrumbs.ts +288 -0
  300. package/src/pageData/forms.ts +578 -0
  301. package/src/pageData/helpers.ts +764 -0
  302. package/src/pageData/misc.ts +347 -0
  303. package/src/pageData/navigation.ts +779 -0
  304. package/src/pageData/relationPages.ts +1246 -0
  305. package/src/pageData/relationTabs.ts +286 -0
  306. package/src/pageData/resourcePages.ts +593 -0
  307. package/src/pageData.ts +122 -4731
  308. package/src/react/AppShell.tsx +27 -1
  309. package/src/react/CollabExtensionFactoryRegistry.ts +55 -0
  310. package/src/react/CollabRoomContext.ts +42 -0
  311. package/src/react/FormCollabBindingRegistry.ts +72 -0
  312. package/src/react/RecordWrapperGate.tsx +40 -0
  313. package/src/react/RecordWrapperRegistry.ts +39 -0
  314. package/src/react/SchemaRenderer.tsx +230 -6479
  315. package/src/react/component-slots.test.ts +103 -0
  316. package/src/react/component-slots.ts +116 -0
  317. package/src/react/fields/BuilderInput.tsx +29 -117
  318. package/src/react/fields/MarkdownInput.tsx +0 -1
  319. package/src/react/fields/RepeaterInput.tsx +29 -130
  320. package/src/react/fields/rowState.ts +106 -0
  321. package/src/react/fields/useRowReorderDnd.ts +78 -0
  322. package/src/react/index.ts +38 -0
  323. package/src/react/layouts/SidebarLayout.tsx +39 -28
  324. package/src/react/layouts/TopbarLayout.tsx +70 -57
  325. package/src/react/parseRecordEditUrl.test.ts +75 -0
  326. package/src/react/parseRecordEditUrl.ts +55 -0
  327. package/src/react/persistedState.ts +40 -0
  328. package/src/react/schemaRenderer/AlertRenderer.tsx +112 -0
  329. package/src/react/schemaRenderer/EntryRenderer.tsx +501 -0
  330. package/src/react/schemaRenderer/SectionRenderer.tsx +120 -0
  331. package/src/react/schemaRenderer/SimpleElements.tsx +306 -0
  332. package/src/react/schemaRenderer/TabsRenderer.tsx +62 -0
  333. package/src/react/schemaRenderer/WizardRenderer.tsx +338 -0
  334. package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +177 -0
  335. package/src/react/schemaRenderer/action/ActionModalDialog.tsx +273 -0
  336. package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +61 -0
  337. package/src/react/schemaRenderer/action/HandlerActionButton.tsx +43 -0
  338. package/src/react/schemaRenderer/action/MethodActionButton.tsx +64 -0
  339. package/src/react/schemaRenderer/action/buttons.tsx +99 -0
  340. package/src/react/schemaRenderer/action/helpers.ts +140 -0
  341. package/src/react/schemaRenderer/action/renderAction.tsx +245 -0
  342. package/src/react/schemaRenderer/columnFormat.ts +65 -0
  343. package/src/react/schemaRenderer/constants.ts +50 -0
  344. package/src/react/schemaRenderer/form/FormRenderer.tsx +233 -0
  345. package/src/react/schemaRenderer/form/renderField.tsx +511 -0
  346. package/src/react/schemaRenderer/helpers.tsx +81 -0
  347. package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +308 -0
  348. package/src/react/schemaRenderer/table/TableRenderer.tsx +123 -0
  349. package/src/react/schemaRenderer/table/TableRendererBody.tsx +974 -0
  350. package/src/react/schemaRenderer/table/filters.tsx +1233 -0
  351. package/src/react/schemaRenderer/table/formatCell.tsx +264 -0
  352. package/src/react/schemaRenderer/table/links.tsx +112 -0
  353. package/src/react/schemaRenderer/table/renderRowActions.tsx +52 -0
  354. package/src/react/schemaRenderer/table/url.tsx +143 -0
  355. package/src/routes/globals.ts +154 -0
  356. package/src/routes/helpers.ts +668 -0
  357. package/src/routes/pages.ts +173 -0
  358. package/src/routes/panel.ts +204 -0
  359. package/src/routes/relations.ts +1219 -0
  360. package/src/routes/resources.ts +786 -0
  361. package/src/routes/theme.ts +109 -0
  362. package/src/routes.test.ts +1 -1
  363. package/src/routes.ts +64 -3176
  364. package/src/schema/TableWidget.test.ts +2 -2
  365. package/src/theme/migrate.test.ts +178 -0
  366. package/src/vite.test.ts +184 -0
  367. package/src/vite.ts +26 -4
@@ -0,0 +1,145 @@
1
+ import { view } from '@rudderjs/view';
2
+ import { resolveSchema } from '../schema/resolveSchema.js';
3
+ import { dispatchFormSubmit, findForms, selectForm } from '../elements/dispatchForm.js';
4
+ import { dispatchAction, parseActionBody } from '../elements/dispatchAction.js';
5
+ import { pageBasePath } from '../clusterPaths.js';
6
+ import { panelInfo, callPageSchema, tagFormActions, tagActionDispatch, customPageData, } from '../pageData.js';
7
+ import { wantsJson, readFormBody, normalizeRedirect, splitMeta, forbidden, policyAccess, resolveDispatchTarget, handleFormState, handleFormWizard, handleFormCreateOption, handleFormMentions, handleWidgetData, sendActionResult, sendRedirectResponse, } from './helpers.js';
8
+ /**
9
+ * Register the routes for a single custom Page — the optional widget /
10
+ * form-state companions, the GET render, action dispatch, and the
11
+ * page-level POST (when the page's schema includes a `Form`).
12
+ *
13
+ * Pulled out of `registerPilotiqRoutes` in 2026-05-12 (Phase 3 of the
14
+ * routes.ts split). Called once per `cfg.pages` entry. The caller is
15
+ * responsible for skipping the dashboard page (it's served by the
16
+ * panel-base GET).
17
+ */
18
+ export function registerCustomPageRoutes(router, pilotiq, PageClass, base) {
19
+ const cfg = pilotiq.getConfig();
20
+ const pageSlug = PageClass.getSlug();
21
+ const pageUrl = pageBasePath(base, PageClass);
22
+ // Plan #15 — per-page widget polling endpoint. Mirrors the
23
+ // panel-scope `${base}/_widget/:id` but resolves the custom page's
24
+ // schema instead of the dashboard's.
25
+ router.post(`${pageUrl}/_widget/:id`, async (req, res) => {
26
+ const user = await pilotiq.resolveUser(req);
27
+ if (!await policyAccess(PageClass, user))
28
+ return forbidden(res, true);
29
+ return handleWidgetData(req, res, pilotiq, { kind: 'page', pageSlug }, req.params['id']);
30
+ });
31
+ // Plan #5 partial-resolve endpoint for custom pages with reactive forms.
32
+ // POST ${base}/${pageSlug}/_form/:formId/state
33
+ router.post(`${pageUrl}/_form/:formId/state`, async (req, res) => {
34
+ const user = await pilotiq.resolveUser(req);
35
+ if (!await policyAccess(PageClass, user))
36
+ return forbidden(res, true);
37
+ const formId = req.params['formId'];
38
+ return handleFormState(req, res, pilotiq, { kind: 'page', pageSlug }, formId);
39
+ });
40
+ // Plan #8 wizard step-validate endpoint for custom pages.
41
+ router.post(`${pageUrl}/_form/:formId/wizard`, async (req, res) => {
42
+ const user = await pilotiq.resolveUser(req);
43
+ if (!await policyAccess(PageClass, user))
44
+ return forbidden(res, true);
45
+ const formId = req.params['formId'];
46
+ return handleFormWizard(req, res, pilotiq, { kind: 'page', pageSlug }, formId);
47
+ });
48
+ // Async-mention endpoint for custom pages.
49
+ router.post(`${pageUrl}/_form/:formId/mentions`, async (req, res) => {
50
+ const user = await pilotiq.resolveUser(req);
51
+ if (!await policyAccess(PageClass, user))
52
+ return forbidden(res, true);
53
+ const formId = req.params['formId'];
54
+ return handleFormMentions(req, res, pilotiq, { kind: 'page', pageSlug }, formId);
55
+ });
56
+ // SelectField inline-create modal endpoint for custom pages.
57
+ router.post(`${pageUrl}/_form/:formId/create-option/:fieldName`, async (req, res) => {
58
+ const user = await pilotiq.resolveUser(req);
59
+ if (!await policyAccess(PageClass, user))
60
+ return forbidden(res, true);
61
+ const formId = req.params['formId'];
62
+ const fieldName = req.params['fieldName'];
63
+ return handleFormCreateOption(req, res, pilotiq, { kind: 'page', pageSlug }, formId, fieldName);
64
+ });
65
+ router.get(pageUrl, async (req, res) => {
66
+ const user = await pilotiq.resolveUser(req);
67
+ if (!await policyAccess(PageClass, user))
68
+ return forbidden(res, wantsJson(req));
69
+ const data = await customPageData(pilotiq, pageSlug, req);
70
+ return view('pilotiq.slug', data ?? {});
71
+ });
72
+ // Action dispatch — POST ${base}/${pageSlug}/_action/:actionName
73
+ router.post(`${pageUrl}/_action/:actionName`, async (req, res) => {
74
+ const user = await pilotiq.resolveUser(req);
75
+ if (!await policyAccess(PageClass, user))
76
+ return forbidden(res, wantsJson(req));
77
+ const actionName = req.params['actionName'];
78
+ const json = wantsJson(req);
79
+ const body = await readFormBody(req);
80
+ const input = parseActionBody(body);
81
+ const ctx = user !== null ? { user: user } : {};
82
+ const elements = await callPageSchema(PageClass, ctx);
83
+ tagActionDispatch(elements, pageUrl);
84
+ const target = resolveDispatchTarget(elements, actionName);
85
+ if (!target) {
86
+ if (json) {
87
+ res.status(404);
88
+ return res.json({ ok: false, error: `Action "${actionName}" not found` });
89
+ }
90
+ res.status(404);
91
+ return res.send(`Action "${actionName}" not found on page`);
92
+ }
93
+ const result = await dispatchAction(target.action, {
94
+ ...input,
95
+ request: req,
96
+ user,
97
+ ...(target.rowField ? { rowField: target.rowField } : {}),
98
+ ...(target.formSchema ? { formSchema: target.formSchema } : {}),
99
+ });
100
+ return sendActionResult(req, res, json, result, base, pageUrl);
101
+ });
102
+ // Custom pages can also accept submits when their schema includes a Form.
103
+ router.post(pageUrl, async (req, res) => {
104
+ const body = await readFormBody(req);
105
+ const { values, formId } = splitMeta(body);
106
+ const json = wantsJson(req);
107
+ const user = await pilotiq.resolveUser(req);
108
+ if (!await policyAccess(PageClass, user))
109
+ return forbidden(res, json);
110
+ const ctx = user !== null ? { user: user } : {};
111
+ const elements = await callPageSchema(PageClass, ctx);
112
+ tagFormActions(elements, pageUrl);
113
+ const form = selectForm(findForms(elements), formId);
114
+ if (!form) {
115
+ if (json) {
116
+ res.status(404);
117
+ return res.json({ ok: false, error: 'No form found on page' });
118
+ }
119
+ res.status(404);
120
+ return res.send('No form found on page');
121
+ }
122
+ const result = await dispatchFormSubmit(form, values, { values, basePath: base });
123
+ if (!result.ok) {
124
+ if (json) {
125
+ res.status(422);
126
+ return res.json({ ok: false, errors: result.errors });
127
+ }
128
+ form.withValues(values).withErrors(result.errors);
129
+ const schemaData = await resolveSchema(elements, ctx);
130
+ res.status(422);
131
+ return view('pilotiq.slug', {
132
+ pageType: 'page',
133
+ panel: await panelInfo(pilotiq, req),
134
+ page: PageClass.toMeta(),
135
+ schemaData,
136
+ basePath: base,
137
+ layout: cfg.layout,
138
+ hasErrors: true,
139
+ });
140
+ }
141
+ const redirect = normalizeRedirect(result.redirect, base) ?? pageUrl;
142
+ return sendRedirectResponse(req, res, json, redirect, result.notifications);
143
+ });
144
+ }
145
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/routes/pages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Router } from '@rudderjs/router';
2
+ import type { Pilotiq } from '../Pilotiq.js';
3
+ /**
4
+ * Register the panel-level sibling routes — the ones that don't belong
5
+ * to any individual Resource / Global / custom Page:
6
+ *
7
+ * - `GET ${base}` — dashboard
8
+ * - `POST ${base}/_uploads` — `FileUpload` field POST target
9
+ * - `POST ${base}/_widget/:id` — Plan #15 dashboard widget polling
10
+ * - `GET ${base}/_search` — Plan #12 global search
11
+ * - `${base}/_notifications/...` — bell-icon dropdown endpoints (only
12
+ * mounted when `Pilotiq.databaseNotifications()` was called)
13
+ *
14
+ * Plus the broadcast-auth registration that the notifications path
15
+ * needs in the same `if` branch. Reads `cfg = pilotiq.getConfig()`
16
+ * internally so the call site only has to thread the basePath.
17
+ */
18
+ export declare function registerPanelRoutes(router: Router, pilotiq: Pilotiq, base: string): void;
19
+ //# sourceMappingURL=panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/routes/panel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAkB5C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAG,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAK,MAAM,GACd,IAAI,CAmKN"}
@@ -0,0 +1,191 @@
1
+ import { view } from '@rudderjs/view';
2
+ import { dashboardData, searchData } from '../pageData.js';
3
+ import { listForUser as listDatabaseNotifications, markAsRead as markDatabaseNotificationAsRead, markAsUnread as markDatabaseNotificationAsUnread, markAllAsRead as markAllDatabaseNotificationsAsRead, } from '../notifications/database.js';
4
+ import { dispatchNotificationAction } from '../notifications/dispatchNotificationAction.js';
5
+ import { registerBroadcastAuth } from '../notifications/registerBroadcastAuth.js';
6
+ import { wantsJson, forbidden, policyAccess, handleWidgetData, handleUploadRequest, } from './helpers.js';
7
+ /**
8
+ * Register the panel-level sibling routes — the ones that don't belong
9
+ * to any individual Resource / Global / custom Page:
10
+ *
11
+ * - `GET ${base}` — dashboard
12
+ * - `POST ${base}/_uploads` — `FileUpload` field POST target
13
+ * - `POST ${base}/_widget/:id` — Plan #15 dashboard widget polling
14
+ * - `GET ${base}/_search` — Plan #12 global search
15
+ * - `${base}/_notifications/...` — bell-icon dropdown endpoints (only
16
+ * mounted when `Pilotiq.databaseNotifications()` was called)
17
+ *
18
+ * Plus the broadcast-auth registration that the notifications path
19
+ * needs in the same `if` branch. Reads `cfg = pilotiq.getConfig()`
20
+ * internally so the call site only has to thread the basePath.
21
+ */
22
+ export function registerPanelRoutes(router, pilotiq, base) {
23
+ const cfg = pilotiq.getConfig();
24
+ // ── Dashboard (1-segment) ─────────────────────────────
25
+ router.get(base, async (req, res) => {
26
+ // Plan #15 — when `panel.dashboard(P)` is set, gate the dashboard
27
+ // route through the page's `canAccess` predicate. Same posture as
28
+ // custom pages — fail-closed on throw.
29
+ if (cfg.dashboardPage) {
30
+ const user = await pilotiq.resolveUser(req);
31
+ if (!await policyAccess(cfg.dashboardPage, user)) {
32
+ return forbidden(res, wantsJson(req));
33
+ }
34
+ }
35
+ return view('pilotiq.dashboard', await dashboardData(pilotiq, req));
36
+ });
37
+ // ── File uploads (FileUpload field POST target) ───────
38
+ router.post(`${base}/_uploads`, async (req, res) => {
39
+ return handleUploadRequest(req, res, pilotiq);
40
+ });
41
+ // ── Plan #15 dashboard widget polling ─────────────────
42
+ // POST ${base}/_widget/:id — re-resolves the dashboard page schema,
43
+ // finds widget by id, runs `getServerData(ctx)`. Body: `{ filter? }`.
44
+ // Mounted unconditionally — widgetData() returns 404 when no
45
+ // dashboard page is registered, so this stays cheap when unused.
46
+ router.post(`${base}/_widget/:id`, async (req, res) => {
47
+ if (cfg.dashboardPage) {
48
+ const user = await pilotiq.resolveUser(req);
49
+ if (!await policyAccess(cfg.dashboardPage, user))
50
+ return forbidden(res, true);
51
+ }
52
+ return handleWidgetData(req, res, pilotiq, { kind: 'panel' }, req.params['id']);
53
+ });
54
+ // ── Plan #12 global search ────────────────────────────
55
+ // GET ${base}/_search?q=…&limit=… → { ok, results }
56
+ // No 403 on unrecognised users — `searchAllResources` filters per
57
+ // resource. The Pilotiq.guard() layer above is the panel-level gate.
58
+ router.get(`${base}/_search`, async (req, res) => {
59
+ const query = req.query;
60
+ const rawQ = query?.['q'];
61
+ const q = typeof rawQ === 'string' ? rawQ.slice(0, 200) : '';
62
+ const data = await searchData(pilotiq, q, req);
63
+ return res.json(data);
64
+ });
65
+ // ── Database notifications (bell-icon dropdown) ───────
66
+ // Only mounted when `Pilotiq.databaseNotifications()` was called.
67
+ // Every route 401s when no user resolves so a non-authenticated
68
+ // request never sees another user's inbox. The `notifiable_type`
69
+ // value is configurable but defaults to `'users'` to match
70
+ // `@rudderjs/notification`'s `DatabaseChannel` writes.
71
+ if (cfg.databaseNotifications?.enabled) {
72
+ const dn = cfg.databaseNotifications;
73
+ const notifiableType = dn.notifiableType ?? 'users';
74
+ const pageSize = dn.pageSize ?? 25;
75
+ /** Resolve `{ id }` from the panel's user resolver. Returns null
76
+ * when no user / unknown id — every route then 401s. The user
77
+ * object is opaque to pilotiq; we duck-type `.id`. */
78
+ const resolveUserId = async (req) => {
79
+ const user = await pilotiq.resolveUser(req);
80
+ if (!user || typeof user !== 'object')
81
+ return null;
82
+ const id = user.id;
83
+ if (id === undefined || id === null)
84
+ return null;
85
+ return String(id);
86
+ };
87
+ // GET ${base}/_notifications → { notifications, unreadCount }
88
+ router.get(`${base}/_notifications`, async (req, res) => {
89
+ const id = await resolveUserId(req);
90
+ if (id === null) {
91
+ res.status(401);
92
+ return res.json({ ok: false, error: 'Not authenticated' });
93
+ }
94
+ const url = new URL(req.url ?? '/', 'http://localhost');
95
+ const unreadOnly = url.searchParams.get('unread') === 'true';
96
+ const limitRaw = Number(url.searchParams.get('limit') ?? pageSize);
97
+ const limit = Number.isFinite(limitRaw) && limitRaw > 0 ? Math.min(limitRaw, 100) : pageSize;
98
+ const data = await listDatabaseNotifications({
99
+ notifiableType,
100
+ notifiableId: id,
101
+ limit,
102
+ unreadOnly,
103
+ });
104
+ return res.json({ ok: true, ...data });
105
+ });
106
+ // POST ${base}/_notifications/:id/read
107
+ router.post(`${base}/_notifications/:id/read`, async (req, res) => {
108
+ const userId = await resolveUserId(req);
109
+ if (userId === null) {
110
+ res.status(401);
111
+ return res.json({ ok: false, error: 'Not authenticated' });
112
+ }
113
+ const rowId = req.params['id'] ?? '';
114
+ const updated = await markDatabaseNotificationAsRead(rowId, {
115
+ notifiableType,
116
+ notifiableId: userId,
117
+ });
118
+ return res.json({ ok: updated });
119
+ });
120
+ // POST ${base}/_notifications/:id/unread
121
+ router.post(`${base}/_notifications/:id/unread`, async (req, res) => {
122
+ const userId = await resolveUserId(req);
123
+ if (userId === null) {
124
+ res.status(401);
125
+ return res.json({ ok: false, error: 'Not authenticated' });
126
+ }
127
+ const rowId = req.params['id'] ?? '';
128
+ const updated = await markDatabaseNotificationAsUnread(rowId, {
129
+ notifiableType,
130
+ notifiableId: userId,
131
+ });
132
+ return res.json({ ok: updated });
133
+ });
134
+ // POST ${base}/_notifications/read-all
135
+ router.post(`${base}/_notifications/read-all`, async (req, res) => {
136
+ const userId = await resolveUserId(req);
137
+ if (userId === null) {
138
+ res.status(401);
139
+ return res.json({ ok: false, error: 'Not authenticated' });
140
+ }
141
+ const count = await markAllDatabaseNotificationsAsRead({
142
+ notifiableType,
143
+ notifiableId: userId,
144
+ });
145
+ return res.json({ ok: true, count });
146
+ });
147
+ // POST ${base}/_notifications/:id/_action/:actionName
148
+ //
149
+ // Notification action dispatch — looks up the stored action on the
150
+ // row, resolves the named handler against the panel's
151
+ // `notificationHandlers` registry, and runs it with the row's
152
+ // stored payload. Optionally flips `read_at` server-side when the
153
+ // action carried `markAsRead: true`.
154
+ //
155
+ // Defends in depth: 404s on missing row / wrong owner / action
156
+ // missing / non-string handler / unknown registry name. Body is
157
+ // ignored — payload reads exclusively from the stored row, so a
158
+ // tampered client can't inject extra payload keys.
159
+ router.post(`${base}/_notifications/:id/_action/:actionName`, async (req, res) => {
160
+ const user = await pilotiq.resolveUser(req);
161
+ const userId = user && typeof user === 'object'
162
+ ? (user.id !== undefined && user.id !== null
163
+ ? String(user.id) : null)
164
+ : null;
165
+ if (userId === null) {
166
+ res.status(401);
167
+ return res.json({ ok: false, error: 'Not authenticated' });
168
+ }
169
+ const params = req.params;
170
+ const result = await dispatchNotificationAction(pilotiq, {
171
+ notificationId: params['id'] ?? '',
172
+ actionName: params['actionName'] ?? '',
173
+ notifiableType,
174
+ notifiableId: userId,
175
+ user,
176
+ request: req,
177
+ });
178
+ if (!result.ok) {
179
+ res.status(result.status);
180
+ return res.json({ ok: false, error: result.error });
181
+ }
182
+ return res.json(result);
183
+ });
184
+ // Phase 2 — register the broadcast auth callback for private
185
+ // `pilotiq-notifications.<userId>` channels. Soft-fails when
186
+ // `@rudderjs/broadcast` isn't installed; apps that haven't enabled
187
+ // broadcast on the toggle stay quiet either way.
188
+ void registerBroadcastAuth(pilotiq);
189
+ }
190
+ }
191
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/routes/panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Router } from '@rudderjs/router';
2
+ import type { Pilotiq } from '../Pilotiq.js';
3
+ import type { ResourceClass } from '../Resource.js';
4
+ /**
5
+ * Register the relation manager routes for one Resource — every
6
+ * relation declared via `R.relations()` mounts a depth-1 strip
7
+ * (list / create / view / edit / delete / restore / force-delete /
8
+ * `_action` / `_detach`); each nested `M.relations()` entry mounts a
9
+ * depth-2 strip with the same shape under a `nestedBase` prefix.
10
+ *
11
+ * Authorization is two-layered: parent `canAccess + canEdit` runs first,
12
+ * then manager-scoped `canX` (with fall-through to the related Resource
13
+ * via `safeManagerPolicy`). Reserved-token / depth-3 / morphTo-no-target
14
+ * guards run at boot in the host barrel (`routes.ts`), not here.
15
+ *
16
+ * Pulled out of `registerPilotiqRoutes` in 2026-05-12 (Phase 4 of the
17
+ * routes.ts split). Called once per `cfg.resources` entry from
18
+ * `registerResourceRoutes`.
19
+ */
20
+ export declare function registerRelationRoutes(router: Router, pilotiq: Pilotiq, R: ResourceClass, base: string): void;
21
+ //# sourceMappingURL=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../src/routes/relations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAoCnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAG,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,CAAC,EAAQ,aAAa,EACtB,IAAI,EAAK,MAAM,GACd,IAAI,CAqoCN"}