@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,504 @@
1
+ import { resourceBasePath } from '../clusterPaths.js';
2
+ import { resolveSchema } from '../schema/resolveSchema.js';
3
+ import { loadTableRecords } from '../elements/dispatchTable.js';
4
+ import { consumeFlashedNotifications } from '../notifications/flash.js';
5
+ import { serializeIcon } from '../icons/types.js';
6
+ import { findRecord, } from '../orm/modelDefaults.js';
7
+ import { resourceCreateBreadcrumbs, resourceEditBreadcrumbs, resourceListBreadcrumbs, resourceViewBreadcrumbs, } from './breadcrumbs.js';
8
+ import { applyFillPipeline, applyRelationshipBuilderFill, applyRelationshipRepeaterFill, callPageSchema, resolveServerDataElements, tagActionDispatch, tagCellEditUrls, tagFieldAiUrls, tagFormActions, tagFormSubresourceUrls, tagTableDeferred, tagTableReorderUrls, tagWidgetUrls, uploadCtx, userCtx, } from './helpers.js';
9
+ import { applyRoleHooks, panelInfo } from './navigation.js';
10
+ import { findForms } from '../elements/dispatchForm.js';
11
+ import { buildRelationTabs, deriveParentTitle, safeBool } from './relationTabs.js';
12
+ // ─── Resource page builders ─────────────────────────────────
13
+ //
14
+ // Resource-scoped GET-route data builders: dashboard, list, table
15
+ // (deferred-load shell), create, edit, view, and the optional record
16
+ // sub-page roles. Each loads its own context (record / parent / etc.),
17
+ // resolves the page schema through `resolveSchema`, stamps URL-tag
18
+ // helpers for dispatch endpoints, and returns the wire-shape envelope
19
+ // the page renderer consumes.
20
+ /**
21
+ * Per-row stamping spine shared by SSR `resourceIndexData` and the
22
+ * deferred-load JSON endpoint `resourceTableData`. Both walk the same
23
+ * Table tree and need the same dispatch / active-tab / reorder / cell-edit
24
+ * URL stamps in the same order — running them through one helper keeps
25
+ * the two paths in lock-step so any future addition (per-row chrome
26
+ * stamp, etc.) lands on both surfaces.
27
+ *
28
+ * Widget URL stamping + the `tagTableDeferred` flag stay outside the
29
+ * helper since only `resourceIndexData` mounts widgets / the deferred
30
+ * skeleton — the JSON endpoint re-runs without the flag and never
31
+ * collects widget metas.
32
+ */
33
+ async function prepareResourceTable(elements, R, indexUrl, query, user) {
34
+ tagActionDispatch(elements, indexUrl);
35
+ // Mark the active tab + parallel-eval badges + stamp per-tab URLs
36
+ // before the table records run — `loadTableRecords` walks the schema
37
+ // for the active tab and splices its `modifyQuery` predicate into the
38
+ // ORM chain alongside filters.
39
+ await resolveActiveTab(elements, query, indexUrl);
40
+ await loadTableRecords(elements, query, indexUrl, user, {
41
+ canEdit: (u, record) => R.canEdit(u, record),
42
+ });
43
+ tagTableReorderUrls(elements, `${indexUrl}/_reorder`);
44
+ tagCellEditUrls(elements, indexUrl);
45
+ }
46
+ export async function dashboardData(pilotiq, req) {
47
+ const cfg = pilotiq.getConfig();
48
+ const user = await pilotiq.resolveUser(req);
49
+ const ctx = uploadCtx(userCtx({ basePath: cfg.path }, user), cfg);
50
+ // Plan #15 — when `panel.dashboard(P)` was called, resolve P's
51
+ // schema instead of the builder-level `cfg.schema`. Page-scoped
52
+ // schema means widget elements read like a regular custom page —
53
+ // including action dispatch, form-state, and `_widget/:id` polling.
54
+ let elements;
55
+ if (cfg.dashboardPage) {
56
+ elements = await callPageSchema(cfg.dashboardPage, ctx);
57
+ tagFormActions(elements, cfg.path);
58
+ tagFormSubresourceUrls(elements, cfg.path);
59
+ tagActionDispatch(elements, cfg.path);
60
+ }
61
+ else {
62
+ elements = [];
63
+ if (cfg.schema) {
64
+ const def = cfg.schema;
65
+ elements = typeof def === 'function' ? await def(ctx) : def;
66
+ }
67
+ }
68
+ // Stamp polling URLs on every widget — panel-scope (no pageSlug
69
+ // segment) for the dashboard. Done before schema resolve so the URL
70
+ // rides on each widget's stamped meta.
71
+ tagWidgetUrls(elements, id => `${cfg.path}/_widget/${id}`);
72
+ const widgetData = await resolveServerDataElements(elements, ctx);
73
+ const dashRoute = cfg.dashboardPage ? { page: cfg.dashboardPage } : {};
74
+ const [panel, schemaData] = await Promise.all([
75
+ panelInfo(pilotiq, req, dashRoute),
76
+ resolveSchema(elements, ctx).then(metas => applyRoleHooks(pilotiq, user, 'dashboard', metas, dashRoute)),
77
+ ]);
78
+ return {
79
+ panel,
80
+ page: cfg.dashboardPage ? cfg.dashboardPage.toMeta() : undefined,
81
+ basePath: cfg.path,
82
+ layout: cfg.layout,
83
+ schemaData,
84
+ _widgetData: widgetData,
85
+ notifications: consumeFlashedNotifications(req),
86
+ };
87
+ }
88
+ export async function resourceIndexData(pilotiq, slug, query = {}, req) {
89
+ const cfg = pilotiq.getConfig();
90
+ const R = cfg.resources.find(r => r.getSlug() === slug);
91
+ if (!R)
92
+ return null;
93
+ const pages = R.resolvePages();
94
+ if (!pages.index)
95
+ return null;
96
+ const PageClass = pages.index;
97
+ const indexUrl = resourceBasePath(cfg.path, R);
98
+ const user = await pilotiq.resolveUser(req);
99
+ const ctx = uploadCtx(userCtx({ mode: 'table', basePath: cfg.path }, user), cfg);
100
+ const elements = await callPageSchema(PageClass, ctx);
101
+ // Plan #15 — resource-scope widget polling URL. Stamped before the
102
+ // schema resolves so each widget's meta carries its endpoint.
103
+ tagWidgetUrls(elements, id => `${indexUrl}/_widget/${id}`);
104
+ if (R.deferLoading)
105
+ tagTableDeferred(elements, `${indexUrl}/_table`);
106
+ await prepareResourceTable(elements, R, indexUrl, query, user);
107
+ const widgetData = await resolveServerDataElements(elements, ctx);
108
+ const breadcrumbs = resourceListBreadcrumbs(cfg, R);
109
+ if (breadcrumbs)
110
+ elements.unshift(breadcrumbs);
111
+ const listRoute = { resource: R, page: PageClass };
112
+ const [panel, schemaData] = await Promise.all([
113
+ panelInfo(pilotiq, req, listRoute),
114
+ resolveSchema(elements, ctx).then(metas => applyRoleHooks(pilotiq, user, 'list', metas, listRoute)),
115
+ ]);
116
+ return {
117
+ pageType: 'resource',
118
+ panel,
119
+ page: PageClass.toMeta(),
120
+ resource: { name: R.name, label: R.label, labelSingular: R.labelSingular, slug, icon: serializeIcon(R.icon, R.name) },
121
+ basePath: cfg.path,
122
+ layout: cfg.layout,
123
+ schemaData,
124
+ _widgetData: widgetData,
125
+ notifications: consumeFlashedNotifications(req),
126
+ };
127
+ }
128
+ // Deferred-load JSON endpoint payload — `GET {base}/{slug}/_table`
129
+ // re-runs the list-page builder without the deferred flag, then returns
130
+ // every resolved `TableMeta` as a flat array. Returns null on missing
131
+ // resource / index page (route 404s).
132
+ export async function resourceTableData(pilotiq, slug, query = {}, req) {
133
+ const cfg = pilotiq.getConfig();
134
+ const R = cfg.resources.find(r => r.getSlug() === slug);
135
+ if (!R)
136
+ return null;
137
+ const pages = R.resolvePages();
138
+ if (!pages.index)
139
+ return null;
140
+ const PageClass = pages.index;
141
+ const indexUrl = resourceBasePath(cfg.path, R);
142
+ const user = await pilotiq.resolveUser(req);
143
+ const ctx = uploadCtx(userCtx({ mode: 'table', basePath: cfg.path }, user), cfg);
144
+ const elements = await callPageSchema(PageClass, ctx);
145
+ await prepareResourceTable(elements, R, indexUrl, query, user);
146
+ const schemaData = await resolveSchema(elements, ctx);
147
+ const tables = collectTableMetas(schemaData);
148
+ return { tables };
149
+ }
150
+ function collectTableMetas(metas) {
151
+ const out = [];
152
+ const walk = (nodes) => {
153
+ for (const node of nodes) {
154
+ if (node['type'] === 'table')
155
+ out.push(node);
156
+ const children = node['children'];
157
+ if (Array.isArray(children))
158
+ walk(children);
159
+ }
160
+ };
161
+ walk(metas);
162
+ return out;
163
+ }
164
+ /**
165
+ * Walk the schema for `ListTabs` containers, pick the active tab from
166
+ * `?tab=…` (defaulting to the tab marked `.default()` or the first one),
167
+ * stamp render-time state (`active` flag, per-tab `?tab=` URL, and
168
+ * resolved badge counts) onto each tab. The active tab's query/context
169
+ * modifier is NOT applied here — `loadTableRecords` walks for the active
170
+ * tab and splices in its modifier when it builds the records-handler
171
+ * `TableContext`.
172
+ *
173
+ * No-op when the page has no `ListTabs`.
174
+ */
175
+ export async function resolveActiveTab(elements, query, currentPath) {
176
+ const listTabs = findListTabs(elements);
177
+ if (listTabs.length === 0)
178
+ return;
179
+ for (const container of listTabs) {
180
+ const children = (container.getChildren() ?? []).filter((c) => c.getType() === 'listTab');
181
+ if (children.length === 0)
182
+ continue;
183
+ // Default tab (used both for `?tab=` fallback and to omit the param
184
+ // from the canonical URL of that tab — see `buildTabUrl`).
185
+ const defaultTab = children.find(t => t.isDefault()) ?? children[0];
186
+ // Active tab: explicit `?tab=name` → default tab.
187
+ const wanted = typeof query['tab'] === 'string' ? query['tab'] : undefined;
188
+ const active = (wanted && children.find(t => t.name === wanted)) || defaultTab;
189
+ // Stamp render-time state on each tab.
190
+ children.forEach(t => {
191
+ t.withActive(t === active);
192
+ t.withUrl(buildTabUrl(currentPath, query, t.name, defaultTab.name));
193
+ });
194
+ // Resolve every tab's badge in parallel — failed handlers swallow
195
+ // silently (badge omitted) so a flaky count never blanks the page.
196
+ await Promise.all(children.map(async (tab) => {
197
+ const handler = tab.getBadgeHandler();
198
+ if (!handler)
199
+ return;
200
+ try {
201
+ const v = await handler();
202
+ if (v === undefined || v === null)
203
+ return;
204
+ tab.withResolvedBadge(String(v));
205
+ }
206
+ catch {
207
+ // Per-tab badge errors stay silent.
208
+ }
209
+ }));
210
+ }
211
+ }
212
+ function findListTabs(elements) {
213
+ const out = [];
214
+ const walk = (els) => {
215
+ for (const el of els) {
216
+ if (el.getType() === 'listTabs')
217
+ out.push(el);
218
+ const children = el.getChildren();
219
+ if (children)
220
+ walk(children);
221
+ }
222
+ };
223
+ walk(elements);
224
+ return out;
225
+ }
226
+ function buildTabUrl(pathname, query, tabName, defaultTabName) {
227
+ // Carry forward search/sort/perPage + any filter values; reset page to 1
228
+ // (tab change reshapes the result set, page numbers don't translate).
229
+ // The default tab gets the canonical, paramless URL — visiting that URL
230
+ // already lands on the default, so emitting `?tab=default` would just be
231
+ // noise that bookmarks/share-links pick up.
232
+ const params = new URLSearchParams();
233
+ for (const [k, v] of Object.entries(query)) {
234
+ if (v === undefined || v === '' || v === null)
235
+ continue;
236
+ if (k === 'tab' || k === 'page')
237
+ continue;
238
+ params.set(k, String(v));
239
+ }
240
+ if (tabName !== defaultTabName)
241
+ params.set('tab', tabName);
242
+ const qs = params.toString();
243
+ return qs ? `${pathname}?${qs}` : pathname;
244
+ }
245
+ export async function resourceCreateData(pilotiq, slug, prefill, req) {
246
+ const cfg = pilotiq.getConfig();
247
+ const R = cfg.resources.find(r => r.getSlug() === slug);
248
+ if (!R)
249
+ return null;
250
+ const pages = R.resolvePages();
251
+ if (!pages.create)
252
+ return null;
253
+ const PageClass = pages.create;
254
+ const resourceBase = resourceBasePath(cfg.path, R);
255
+ const createUrl = `${resourceBase}/create`;
256
+ const user = await pilotiq.resolveUser(req);
257
+ const ctx = uploadCtx(userCtx({ mode: 'create', basePath: cfg.path }, user), cfg);
258
+ const elements = await callPageSchema(PageClass, ctx);
259
+ tagFormActions(elements, createUrl);
260
+ tagActionDispatch(elements, createUrl);
261
+ tagFormSubresourceUrls(elements, resourceBase);
262
+ if (prefill) {
263
+ const form = findForms(elements)[0];
264
+ if (form) {
265
+ if (prefill.values)
266
+ form.withValues(prefill.values);
267
+ if (prefill.errors)
268
+ form.withErrors(prefill.errors);
269
+ }
270
+ }
271
+ const breadcrumbs = resourceCreateBreadcrumbs(cfg, R);
272
+ if (breadcrumbs)
273
+ elements.unshift(breadcrumbs);
274
+ const createRoute = { resource: R, page: PageClass };
275
+ const [panel, schemaData] = await Promise.all([
276
+ panelInfo(pilotiq, req, createRoute),
277
+ resolveSchema(elements, ctx).then(metas => applyRoleHooks(pilotiq, user, 'create', metas, createRoute)),
278
+ ]);
279
+ return {
280
+ panel,
281
+ page: PageClass.toMeta(),
282
+ resource: { name: R.name, label: R.labelSingular, slug, icon: serializeIcon(R.icon, R.name) },
283
+ mode: 'create',
284
+ basePath: cfg.path,
285
+ layout: cfg.layout,
286
+ schemaData,
287
+ notifications: consumeFlashedNotifications(req),
288
+ ...(prefill?.errors ? { hasErrors: true } : {}),
289
+ };
290
+ }
291
+ export async function resourceEditData(pilotiq, slug, recordId, prefill, req) {
292
+ const cfg = pilotiq.getConfig();
293
+ const R = cfg.resources.find(r => r.getSlug() === slug);
294
+ if (!R)
295
+ return null;
296
+ const pages = R.resolvePages();
297
+ if (!pages.edit)
298
+ return null;
299
+ const PageClass = pages.edit;
300
+ const resourceBase = resourceBasePath(cfg.path, R);
301
+ const editUrl = `${resourceBase}/${recordId}/edit`;
302
+ const user = await pilotiq.resolveUser(req);
303
+ const ctx = uploadCtx(userCtx({ mode: 'edit', recordId, basePath: cfg.path }, user), cfg);
304
+ const elements = await callPageSchema(PageClass, ctx);
305
+ tagFormActions(elements, editUrl);
306
+ tagActionDispatch(elements, editUrl);
307
+ tagFormSubresourceUrls(elements, `${resourceBase}/${recordId}`);
308
+ // Locate the primary form, load the record, fill values.
309
+ const form = findForms(elements)[0];
310
+ let record = undefined;
311
+ if (form?.getLoadRecord()) {
312
+ try {
313
+ record = await form.getLoadRecord()(recordId, { values: prefill?.values ?? {} });
314
+ }
315
+ catch {
316
+ // sentinel/missing record — fall through
317
+ }
318
+ if (!prefill?.values && record != null) {
319
+ const values = await applyFillPipeline(form, record);
320
+ const withRelations = await applyRelationshipRepeaterFill(form, values, record, R.model);
321
+ const withBuilders = await applyRelationshipBuilderFill(form, withRelations, record, R.model);
322
+ form.withValues(withBuilders);
323
+ }
324
+ else if (prefill?.values) {
325
+ form.withValues(prefill.values);
326
+ }
327
+ if (prefill?.errors)
328
+ form.withErrors(prefill.errors);
329
+ }
330
+ // Plan #11 — when the resource has relation managers, prepend a
331
+ // navigation strip so users can drill into each manager's table
332
+ // without leaving the parent record context. The "Edit" tab is
333
+ // active here.
334
+ const relationTabsEl = await buildRelationTabs(R, recordId, cfg.path, '__edit', user, record);
335
+ if (relationTabsEl)
336
+ elements.unshift(relationTabsEl);
337
+ const recordTitle = record !== undefined && record !== null
338
+ ? deriveParentTitle(R, record)
339
+ : recordId;
340
+ const breadcrumbs = resourceEditBreadcrumbs(cfg, R, recordId, recordTitle);
341
+ if (breadcrumbs)
342
+ elements.unshift(breadcrumbs);
343
+ const editRoute = { resource: R, page: PageClass, recordId };
344
+ const editCtx = record !== undefined ? { ...ctx, record } : ctx;
345
+ const [panel, schemaData] = await Promise.all([
346
+ panelInfo(pilotiq, req, editRoute),
347
+ resolveSchema(elements, editCtx).then(metas => applyRoleHooks(pilotiq, user, 'edit', metas, editRoute)),
348
+ ]);
349
+ tagFieldAiUrls(schemaData, `${resourceBase}/${recordId}/_agents`);
350
+ return {
351
+ panel,
352
+ page: PageClass.toMeta(),
353
+ resource: { name: R.name, label: R.labelSingular, slug, icon: serializeIcon(R.icon, R.name) },
354
+ mode: 'edit',
355
+ recordId,
356
+ basePath: cfg.path,
357
+ layout: cfg.layout,
358
+ schemaData,
359
+ notifications: consumeFlashedNotifications(req),
360
+ ...(prefill?.errors ? { hasErrors: true } : {}),
361
+ };
362
+ }
363
+ export async function resourceViewData(pilotiq, slug, recordId, req) {
364
+ const cfg = pilotiq.getConfig();
365
+ const R = cfg.resources.find(r => r.getSlug() === slug);
366
+ if (!R)
367
+ return null;
368
+ const pages = R.resolvePages();
369
+ if (!pages.view)
370
+ return null;
371
+ const PageClass = pages.view;
372
+ const user = await pilotiq.resolveUser(req);
373
+ const ctx = uploadCtx(userCtx({ mode: 'view', recordId, basePath: cfg.path }, user), cfg);
374
+ const elements = await callPageSchema(PageClass, ctx);
375
+ // For the view page we want the record threaded into resolveSchema so
376
+ // factory-attached visibility predicates see it. Resource.detail()
377
+ // already runs against the loaded record in user code; here we mirror
378
+ // that into ctx.record for the action eval pass.
379
+ let record = undefined;
380
+ if (R.model) {
381
+ try {
382
+ record = await findRecord(R, recordId, { user });
383
+ }
384
+ catch { /* ignore */ }
385
+ }
386
+ // Plan #11 — prepend the relation tabs strip with the "Details" tab
387
+ // active when the resource has relation managers configured.
388
+ const relationTabsEl = await buildRelationTabs(R, recordId, cfg.path, '__view', user, record);
389
+ if (relationTabsEl)
390
+ elements.unshift(relationTabsEl);
391
+ const recordTitle = record !== undefined && record !== null
392
+ ? deriveParentTitle(R, record)
393
+ : recordId;
394
+ const breadcrumbs = resourceViewBreadcrumbs(cfg, R, recordTitle);
395
+ if (breadcrumbs)
396
+ elements.unshift(breadcrumbs);
397
+ const viewRoute = { resource: R, page: PageClass, recordId };
398
+ const viewCtx = record !== undefined ? { ...ctx, record } : ctx;
399
+ const [panel, schemaData] = await Promise.all([
400
+ panelInfo(pilotiq, req, viewRoute),
401
+ resolveSchema(elements, viewCtx).then(metas => applyRoleHooks(pilotiq, user, 'view', metas, viewRoute)),
402
+ ]);
403
+ return {
404
+ panel,
405
+ page: PageClass.toMeta(),
406
+ resource: { name: R.name, label: R.labelSingular, slug, icon: serializeIcon(R.icon, R.name) },
407
+ mode: 'view',
408
+ recordId,
409
+ basePath: cfg.path,
410
+ layout: cfg.layout,
411
+ schemaData,
412
+ notifications: consumeFlashedNotifications(req),
413
+ };
414
+ }
415
+ /**
416
+ * Custom record sub-page data builder. Mounted at
417
+ * `${resourceBase}/${slug}/:id/${subPageSlug}` for each entry in
418
+ * `Resource.pages().record`. Mirrors `resourceViewData`'s shape: load
419
+ * the record, run R.canAccess + R.canView (parent-resource gates),
420
+ * then SubPage.canAccess(user, record) (sub-page-specific gate),
421
+ * then render the sub-page's schema with `ctx.record` set. Tab strip
422
+ * carries the sub-page slug as the active key so the matching record
423
+ * sub-page tab highlights.
424
+ *
425
+ * Returns:
426
+ * - `null` — resource / sub-page slug not found (404 upstream).
427
+ * - `{ ok: false, status: 403 }` — any gate fails or throws.
428
+ * - resolved page data — on success.
429
+ */
430
+ export async function resourceRecordPageData(pilotiq, slug, recordId, subPageSlug, req) {
431
+ const cfg = pilotiq.getConfig();
432
+ const R = cfg.resources.find(r => r.getSlug() === slug);
433
+ if (!R)
434
+ return null;
435
+ const recordPages = R.getRecordPages();
436
+ const PageClass = recordPages[subPageSlug];
437
+ if (!PageClass)
438
+ return null;
439
+ const user = await pilotiq.resolveUser(req);
440
+ // Load the parent record before gating so canView / SubPage.canAccess
441
+ // can branch on record state. Sub-pages without a Resource.model
442
+ // still get gated against an `undefined` record — the same posture as
443
+ // resourceViewData when no model is bound.
444
+ let record = undefined;
445
+ if (R.model) {
446
+ try {
447
+ record = await findRecord(R, recordId, { user });
448
+ }
449
+ catch { /* ignore */ }
450
+ }
451
+ if (record === undefined || record === null) {
452
+ // Distinguish "model bound but record missing" (route should 404)
453
+ // from "no model bound" (treat record as `{ id: recordId }` so the
454
+ // page can still render — same convention as the edit page).
455
+ if (R.model)
456
+ return null;
457
+ record = { id: recordId };
458
+ }
459
+ // Three gates: parent resource access + view, then the sub-page's own
460
+ // canAccess. The route would have run R.canAccess upstream, but
461
+ // re-running here makes resourceRecordPageData safe to call from
462
+ // dispatchPageData (where the SPA path skips the route prelude).
463
+ if (!await safeBool(() => R.canAccess(user)))
464
+ return { ok: false, status: 403 };
465
+ if (!await safeBool(() => R.canView(user, record)))
466
+ return { ok: false, status: 403 };
467
+ if (!await safeBool(() => PageClass.canAccess(user, record)))
468
+ return { ok: false, status: 403 };
469
+ const ctx = uploadCtx(userCtx({ mode: 'view', recordId, basePath: cfg.path }, user), cfg);
470
+ const elements = await callPageSchema(PageClass, ctx);
471
+ // Insert the relation-tabs strip with the sub-page slug active so the
472
+ // matching tab highlights. `buildRelationTabs` evaluates per-tab
473
+ // gating against `user + record` — record sub-page tabs are gated
474
+ // alongside __view/__edit/managers.
475
+ const relationTabsEl = await buildRelationTabs(R, recordId, cfg.path, subPageSlug, user, record);
476
+ if (relationTabsEl)
477
+ elements.unshift(relationTabsEl);
478
+ const recordTitle = record !== undefined && record !== null
479
+ ? deriveParentTitle(R, record)
480
+ : recordId;
481
+ const breadcrumbs = resourceViewBreadcrumbs(cfg, R, recordTitle);
482
+ if (breadcrumbs)
483
+ elements.unshift(breadcrumbs);
484
+ const recordPageRoute = { resource: R, page: PageClass, recordId };
485
+ const recordCtx = record !== undefined ? { ...ctx, record } : ctx;
486
+ const [panel, schemaData] = await Promise.all([
487
+ panelInfo(pilotiq, req, recordPageRoute),
488
+ resolveSchema(elements, recordCtx).then(metas => applyRoleHooks(pilotiq, user, 'view', metas, recordPageRoute)),
489
+ ]);
490
+ return {
491
+ pageType: 'record-page',
492
+ panel,
493
+ page: PageClass.toMeta(),
494
+ resource: { name: R.name, label: R.labelSingular, slug, icon: serializeIcon(R.icon, R.name) },
495
+ mode: 'record',
496
+ recordId,
497
+ subPage: { slug: subPageSlug, label: PageClass.getLabel() },
498
+ basePath: cfg.path,
499
+ layout: cfg.layout,
500
+ schemaData,
501
+ notifications: consumeFlashedNotifications(req),
502
+ };
503
+ }
504
+ //# sourceMappingURL=resourcePages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourcePages.js","sourceRoot":"","sources":["../../src/pageData/resourcePages.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,EAAE,aAAa,EAAsB,MAAM,4BAA4B,CAAA;AAO9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EACL,UAAU,GAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,6BAA6B,EAC7B,cAAc,EACd,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,OAAO,GACR,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAuB,MAAM,iBAAiB,CAAA;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAElF,+DAA+D;AAC/D,EAAE;AACF,kEAAkE;AAClE,qEAAqE;AACrE,uEAAuE;AACvE,mEAAmE;AACnE,sEAAsE;AACtE,8BAA8B;AAG9B;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,oBAAoB,CACjC,QAAmB,EACnB,CAAuB,EACvB,QAAgB,EAChB,KAAgC,EAChC,IAAiB;IAEjB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACrC,kEAAkE;IAClE,qEAAqE;IACrE,sEAAsE;IACtE,+BAA+B;IAC/B,MAAM,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACjD,MAAM,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;QACtD,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;KAC7C,CAAC,CAAA;IACF,mBAAmB,CAAC,QAAQ,EAAE,GAAG,QAAQ,WAAW,CAAC,CAAA;IACrD,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgB,EAAE,GAAa;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAkB,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IAEhF,+DAA+D;IAC/D,gEAAgE;IAChE,iEAAiE;IACjE,oEAAoE;IACpE,IAAI,QAAmB,CAAA;IACvB,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACtB,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;QACvD,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QAClC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QAC1C,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,EAAE,CAAA;QACb,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;YACtB,QAAQ,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QAC7D,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,oEAAoE;IACpE,uCAAuC;IACvC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,YAAY,EAAE,EAAE,CAAC,CAAA;IAE1D,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACjE,MAAM,SAAS,GAAmB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACtF,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC;QAClC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KACzG,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,IAAI,EAAM,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;QACpE,QAAQ,EAAE,GAAG,CAAC,IAAI;QAClB,MAAM,EAAI,GAAG,CAAC,MAAM;QACpB,UAAU;QACV,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,2BAA2B,CAAC,GAAG,CAAC;KAChD,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAgB,EAChB,IAAe,EACf,QAAkC,EAAE,EACpC,GAAgB;IAEhB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,EAAE,CAAA;IAC9B,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;IAE7B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAkB,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IAC/F,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACrD,mEAAmE;IACnE,8DAA8D;IAC9D,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,YAAY,EAAE,EAAE,CAAC,CAAA;IAC1D,IAAI,CAAC,CAAC,YAAY;QAAE,gBAAgB,CAAC,QAAQ,EAAE,GAAG,QAAQ,SAAS,CAAC,CAAA;IACpE,MAAM,oBAAoB,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC9D,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAEjE,MAAM,WAAW,GAAG,uBAAuB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACnD,IAAI,WAAW;QAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAE9C,MAAM,SAAS,GAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAClE,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC;QAClC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KACpG,CAAC,CAAA;IAEF,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,KAAK;QACL,IAAI,EAAM,SAAS,CAAC,MAAM,EAAE;QAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;QACrH,QAAQ,EAAE,GAAG,CAAC,IAAI;QAClB,MAAM,EAAI,GAAG,CAAC,MAAM;QACpB,UAAU;QACV,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,2BAA2B,CAAC,GAAG,CAAC;KAChD,CAAA;AACH,CAAC;AAED,mEAAmE;AACnE,wEAAwE;AACxE,sEAAsE;AACtE,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAgB,EAChB,IAAe,EACf,QAAkC,EAAE,EACpC,GAAgB;IAEhB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,EAAE,CAAA;IAC9B,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;IAE7B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAkB,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IAC/F,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACrD,MAAM,oBAAoB,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC9D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAA;AACnB,CAAC;AAED,SAAS,iBAAiB,CACxB,KAA6C;IAE7C,MAAM,GAAG,GAA8B,EAAE,CAAA;IACzC,MAAM,IAAI,GAAG,CAAC,KAA6C,EAAQ,EAAE;QACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAA;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,IAAI,CAAC,QAAqC,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC,CAAA;IACD,IAAI,CAAC,KAAK,CAAC,CAAA;IACX,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAmC,EACnC,KAAmC,EACnC,WAAmB;IAEnB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAEjC,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,SAAS,CAAC,CAAA;QACvG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAEnC,oEAAoE;QACpE,2DAA2D;QAC3D,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAA;QAEpE,kDAAkD;QAClD,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1E,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,IAAI,UAAU,CAAA;QAE9E,uCAAuC;QACvC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACnB,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,MAAM,CAAC,CAAA;YAC1B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;QAEF,kEAAkE;QAClE,mEAAmE;QACnE,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,EAAE,CAAA;YACrC,IAAI,CAAC,OAAO;gBAAE,OAAM;YACpB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAA;gBACzB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;oBAAE,OAAM;gBACzC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAgC;IACpD,MAAM,GAAG,GAAe,EAAE,CAAA;IAC1B,MAAM,IAAI,GAAG,CAAC,GAA2B,EAAQ,EAAE;QACjD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,UAAU;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAc,CAAC,CAAA;YACzD,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,EAAE,CAAA;YACjC,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC,CAAA;IACD,IAAI,CAAC,QAAQ,CAAC,CAAA;IACd,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,WAAW,CAClB,QAAsB,EACtB,KAAsC,EACtC,OAAsB,EACtB,cAAsB;IAEtB,yEAAyE;IACzE,sEAAsE;IACtE,wEAAwE;IACxE,yEAAyE;IACzE,4CAA4C;IAC5C,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;IACpC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI;YAAE,SAAQ;QACvD,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,MAAM;YAAE,SAAQ;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;IACD,IAAI,OAAO,KAAK,cAAc;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;IAC5B,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAA;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAgB,EAChB,IAAe,EACf,OAAiF,EACjF,GAAgB;IAEhB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACnB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,EAAE,CAAA;IAC9B,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAA;IAE9B,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAClD,MAAM,SAAS,GAAG,GAAG,YAAY,SAAS,CAAA;IAC1C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAkB,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IAChG,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACrD,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACnC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACtC,sBAAsB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAC9C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,OAAO,CAAC,MAAM;gBAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACnD,IAAI,OAAO,CAAC,MAAM;gBAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,yBAAyB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACrD,IAAI,WAAW;QAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAE9C,MAAM,WAAW,GAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IACpE,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC;QACpC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;KACxG,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,IAAI,EAAM,SAAS,CAAC,MAAM,EAAE;QAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;QAC7F,IAAI,EAAM,QAAiB;QAC3B,QAAQ,EAAE,GAAG,CAAC,IAAI;QAClB,MAAM,EAAI,GAAG,CAAC,MAAM;QACpB,UAAU;QACV,aAAa,EAAE,2BAA2B,CAAC,GAAG,CAAC;QAC/C,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAiB,EACjB,IAAgB,EAChB,QAAgB,EAChB,OAAiF,EACjF,GAAiB;IAEjB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACnB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,EAAE,CAAA;IAC9B,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAE5B,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,GAAG,YAAY,IAAI,QAAQ,OAAO,CAAA;IAClD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAkB,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IACxG,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACrD,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACjC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACpC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,YAAY,IAAI,QAAQ,EAAE,CAAC,CAAA;IAE/D,yDAAyD;IACzD,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,MAAM,GAAY,SAAS,CAAA;IAC/B,IAAI,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,CAAA;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YACpD,MAAM,aAAa,GAAI,MAAM,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;YACzF,MAAM,YAAY,GAAK,MAAM,4BAA4B,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;YAC/F,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QAC/B,CAAC;aAAM,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,OAAO,EAAE,MAAM;YAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtD,CAAC;IAED,gEAAgE;IAChE,gEAAgE;IAChE,+DAA+D;IAC/D,eAAe;IACf,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAC7F,IAAI,cAAc;QAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAEpD,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QACzD,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC;QAC9B,CAAC,CAAC,QAAQ,CAAA;IACZ,MAAM,WAAW,GAAG,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;IAC1E,IAAI,WAAW;QAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAE9C,MAAM,SAAS,GAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IAC5E,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IAC/D,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC;QAClC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KACxG,CAAC,CAAA;IAEF,cAAc,CAAC,UAAuC,EAAE,GAAG,YAAY,IAAI,QAAQ,UAAU,CAAC,CAAA;IAE9F,OAAO;QACL,KAAK;QACL,IAAI,EAAM,SAAS,CAAC,MAAM,EAAE;QAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;QAC7F,IAAI,EAAM,MAAe;QACzB,QAAQ;QACR,QAAQ,EAAE,GAAG,CAAC,IAAI;QAClB,MAAM,EAAI,GAAG,CAAC,MAAM;QACpB,UAAU;QACV,aAAa,EAAE,2BAA2B,CAAC,GAAG,CAAC;QAC/C,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAiB,EACjB,IAAgB,EAChB,QAAgB,EAChB,GAAiB;IAEjB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACnB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,EAAE,CAAA;IAC9B,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAE5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAkB,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IACxG,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACrD,sEAAsE;IACtE,mEAAmE;IACnE,sEAAsE;IACtE,iDAAiD;IACjD,IAAI,MAAM,GAAY,SAAS,CAAA;IAC/B,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,IAAI,CAAC;YAAC,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACjF,CAAC;IAED,oEAAoE;IACpE,6DAA6D;IAC7D,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAC7F,IAAI,cAAc;QAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAEpD,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QACzD,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC;QAC9B,CAAC,CAAC,QAAQ,CAAA;IACZ,MAAM,WAAW,GAAG,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;IAChE,IAAI,WAAW;QAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAE9C,MAAM,SAAS,GAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IAC5E,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IAC/D,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC;QAClC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;KACxG,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,IAAI,EAAM,SAAS,CAAC,MAAM,EAAE;QAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;QAC7F,IAAI,EAAM,MAAe;QACzB,QAAQ;QACR,QAAQ,EAAE,GAAG,CAAC,IAAI;QAClB,MAAM,EAAI,GAAG,CAAC,MAAM;QACpB,UAAU;QACV,aAAa,EAAE,2BAA2B,CAAC,GAAG,CAAC;KAChD,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAsB,EACtB,IAAqB,EACrB,QAAqB,EACrB,WAAqB,EACrB,GAAsB;IAEtB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAA;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACnB,MAAM,WAAW,GAAG,CAAC,CAAC,cAAc,EAAE,CAAA;IACtC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAC1C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAE3B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAE3C,sEAAsE;IACtE,iEAAiE;IACjE,sEAAsE;IACtE,2CAA2C;IAC3C,IAAI,MAAM,GAAY,SAAS,CAAA;IAC/B,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,IAAI,CAAC;YAAC,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5C,kEAAkE;QAClE,mEAAmE;QACnE,6DAA6D;QAC7D,IAAI,CAAC,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;IAC3B,CAAC;IAED,sEAAsE;IACtE,gEAAgE;IAChE,iEAAiE;IACjE,iEAAiE;IACjE,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAC/E,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IACrF,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAE/F,MAAM,GAAG,GAAkB,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;IACxG,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAErD,sEAAsE;IACtE,iEAAiE;IACjE,kEAAkE;IAClE,oCAAoC;IACpC,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAChG,IAAI,cAAc;QAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAEpD,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QACzD,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC;QAC9B,CAAC,CAAC,QAAQ,CAAA;IACZ,MAAM,WAAW,GAAG,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;IAChE,IAAI,WAAW;QAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAE9C,MAAM,eAAe,GAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IAClF,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IACjE,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,CAAC;QACxC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;KAChH,CAAC,CAAA;IAEF,OAAO;QACL,QAAQ,EAAE,aAAsB;QAChC,KAAK;QACL,IAAI,EAAM,SAAS,CAAC,MAAM,EAAE;QAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;QAC7F,IAAI,EAAM,QAAiB;QAC3B,QAAQ;QACR,OAAO,EAAG,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE;QAC5D,QAAQ,EAAE,GAAG,CAAC,IAAI;QAClB,MAAM,EAAI,GAAG,CAAC,MAAM;QACpB,UAAU;QACV,aAAa,EAAE,2BAA2B,CAAC,GAAG,CAAC;KAChD,CAAA;AACH,CAAC"}