@pilotiq/pilotiq 0.24.1 → 0.24.3

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 (518) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/boost/guidelines.md +571 -0
  3. package/boost/skills/pilotiq-actions/SKILL.md +49 -0
  4. package/boost/skills/pilotiq-actions/rules/dispatch-modes.md +177 -0
  5. package/boost/skills/pilotiq-actions/rules/factories.md +130 -0
  6. package/boost/skills/pilotiq-actions/rules/visibility-and-authorization.md +125 -0
  7. package/boost/skills/pilotiq-fields/SKILL.md +47 -0
  8. package/boost/skills/pilotiq-fields/rules/field-catalog.md +288 -0
  9. package/boost/skills/pilotiq-fields/rules/reactive-fields.md +199 -0
  10. package/boost/skills/pilotiq-fields/rules/validation.md +198 -0
  11. package/boost/skills/pilotiq-relations/SKILL.md +47 -0
  12. package/boost/skills/pilotiq-relations/rules/relation-managers.md +256 -0
  13. package/boost/skills/pilotiq-relations/rules/repeater-relationship.md +177 -0
  14. package/boost/skills/pilotiq-resource/SKILL.md +61 -0
  15. package/boost/skills/pilotiq-resource/rules/authorization.md +242 -0
  16. package/boost/skills/pilotiq-resource/rules/defining-resources.md +228 -0
  17. package/boost/skills/pilotiq-resource/rules/page-overrides.md +296 -0
  18. package/dist/Pilotiq.d.ts +31 -0
  19. package/dist/Pilotiq.d.ts.map +1 -1
  20. package/dist/Pilotiq.js +3 -1
  21. package/dist/Pilotiq.js.map +1 -1
  22. package/dist/PilotiqRegistry.d.ts +13 -0
  23. package/dist/PilotiqRegistry.d.ts.map +1 -1
  24. package/dist/PilotiqRegistry.js +15 -0
  25. package/dist/PilotiqRegistry.js.map +1 -1
  26. package/dist/pageData/misc.d.ts.map +1 -1
  27. package/dist/pageData/misc.js +6 -0
  28. package/dist/pageData/misc.js.map +1 -1
  29. package/dist/pageData/navigation.d.ts +1 -0
  30. package/dist/pageData/navigation.d.ts.map +1 -1
  31. package/dist/pageData/navigation.js +3 -0
  32. package/dist/pageData/navigation.js.map +1 -1
  33. package/dist/pageData/relationPages.d.ts.map +1 -1
  34. package/dist/pageData/relationPages.js +3 -0
  35. package/dist/pageData/relationPages.js.map +1 -1
  36. package/dist/pageData/resourcePages.d.ts.map +1 -1
  37. package/dist/pageData/resourcePages.js +8 -0
  38. package/dist/pageData/resourcePages.js.map +1 -1
  39. package/dist/react/AppShell.d.ts +8 -0
  40. package/dist/react/AppShell.d.ts.map +1 -1
  41. package/dist/react/AppShell.js.map +1 -1
  42. package/dist/react/layouts/SidebarLayout.d.ts.map +1 -1
  43. package/dist/react/layouts/SidebarLayout.js +10 -2
  44. package/dist/react/layouts/SidebarLayout.js.map +1 -1
  45. package/dist/react/widgets/StatsOverviewRenderer.d.ts.map +1 -1
  46. package/dist/react/widgets/StatsOverviewRenderer.js +32 -18
  47. package/dist/react/widgets/StatsOverviewRenderer.js.map +1 -1
  48. package/dist/routes/relations.d.ts.map +1 -1
  49. package/dist/routes/relations.js +25 -18
  50. package/dist/routes/relations.js.map +1 -1
  51. package/dist/routes/resources.js.map +1 -1
  52. package/package.json +10 -5
  53. package/.turbo/turbo-build.log +0 -8
  54. package/CLAUDE.md +0 -265
  55. package/src/Cluster.test.ts +0 -283
  56. package/src/Cluster.ts +0 -83
  57. package/src/Column.test.ts +0 -199
  58. package/src/Column.ts +0 -710
  59. package/src/Global.test.ts +0 -367
  60. package/src/Global.ts +0 -169
  61. package/src/Page.test.ts +0 -114
  62. package/src/Page.ts +0 -208
  63. package/src/Pilotiq.perf.test.ts +0 -252
  64. package/src/Pilotiq.test.ts +0 -129
  65. package/src/Pilotiq.ts +0 -1158
  66. package/src/PilotiqRegistry.ts +0 -36
  67. package/src/PilotiqServiceProvider.ts +0 -121
  68. package/src/RelationManager.test.ts +0 -400
  69. package/src/RelationManager.ts +0 -527
  70. package/src/RenderHook.test.ts +0 -252
  71. package/src/RenderHook.ts +0 -242
  72. package/src/Resource.test.ts +0 -284
  73. package/src/Resource.ts +0 -526
  74. package/src/RightPanel.test.ts +0 -202
  75. package/src/RightPanel.ts +0 -132
  76. package/src/Tab.test.ts +0 -91
  77. package/src/Tab.ts +0 -156
  78. package/src/UserMenuItem.ts +0 -145
  79. package/src/actions/Action.test.ts +0 -2526
  80. package/src/actions/Action.ts +0 -1515
  81. package/src/actions/ActionGroup.test.ts +0 -112
  82. package/src/actions/ActionGroup.ts +0 -173
  83. package/src/actions/attachFactory.ts +0 -172
  84. package/src/actions/bulkFactories.ts +0 -168
  85. package/src/actions/crudFactories.ts +0 -220
  86. package/src/actions/exportFactory.ts +0 -225
  87. package/src/actions/factoryHelpers.ts +0 -177
  88. package/src/actions/importFactory.ts +0 -243
  89. package/src/actions/index.ts +0 -17
  90. package/src/actions/m2mFactories.ts +0 -193
  91. package/src/actions/relationFactories.ts +0 -372
  92. package/src/applyPageHooks.test.ts +0 -463
  93. package/src/applyPageHooks.ts +0 -330
  94. package/src/authorization.test.ts +0 -483
  95. package/src/breadcrumbs.test.ts +0 -238
  96. package/src/cells/coerce.test.ts +0 -85
  97. package/src/cells/coerce.ts +0 -84
  98. package/src/clusterPaths.ts +0 -35
  99. package/src/columns/BadgeColumn.test.ts +0 -54
  100. package/src/columns/BadgeColumn.ts +0 -32
  101. package/src/columns/BooleanColumn.test.ts +0 -41
  102. package/src/columns/BooleanColumn.ts +0 -18
  103. package/src/columns/ColorColumn.test.ts +0 -37
  104. package/src/columns/ColorColumn.ts +0 -38
  105. package/src/columns/IconColumn.test.ts +0 -54
  106. package/src/columns/IconColumn.ts +0 -37
  107. package/src/columns/ImageColumn.test.ts +0 -41
  108. package/src/columns/ImageColumn.ts +0 -28
  109. package/src/columns/SelectColumn.ts +0 -98
  110. package/src/columns/TextColumn.test.ts +0 -190
  111. package/src/columns/TextColumn.ts +0 -20
  112. package/src/columns/TextInputColumn.ts +0 -68
  113. package/src/columns/ToggleColumn.ts +0 -46
  114. package/src/columns/editableColumns.test.ts +0 -238
  115. package/src/columns/index.ts +0 -9
  116. package/src/defaultGlobalPages.ts +0 -95
  117. package/src/defaultPages.test.ts +0 -634
  118. package/src/defaultPages.ts +0 -617
  119. package/src/defaultViewPage.test.ts +0 -147
  120. package/src/elements/Form.test.ts +0 -223
  121. package/src/elements/Form.ts +0 -416
  122. package/src/elements/ListTabs.ts +0 -28
  123. package/src/elements/Table.test.ts +0 -422
  124. package/src/elements/Table.ts +0 -850
  125. package/src/elements/TableGroup.test.ts +0 -260
  126. package/src/elements/TableGroup.ts +0 -334
  127. package/src/elements/dispatchAction.test.ts +0 -463
  128. package/src/elements/dispatchAction.ts +0 -355
  129. package/src/elements/dispatchForm.test.ts +0 -477
  130. package/src/elements/dispatchForm.ts +0 -1993
  131. package/src/elements/dispatchTable.test.ts +0 -1514
  132. package/src/elements/dispatchTable.ts +0 -745
  133. package/src/elements/index.ts +0 -21
  134. package/src/entries/BadgeEntry.ts +0 -39
  135. package/src/entries/CodeEntry.test.ts +0 -40
  136. package/src/entries/CodeEntry.ts +0 -52
  137. package/src/entries/ColorEntry.ts +0 -63
  138. package/src/entries/ComponentEntry.test.ts +0 -173
  139. package/src/entries/ComponentEntry.ts +0 -95
  140. package/src/entries/Entry.ts +0 -304
  141. package/src/entries/IconEntry.ts +0 -49
  142. package/src/entries/ImageEntry.ts +0 -61
  143. package/src/entries/KeyValueEntry.ts +0 -47
  144. package/src/entries/RepeatableEntry.test.ts +0 -239
  145. package/src/entries/RepeatableEntry.ts +0 -173
  146. package/src/entries/TextEntry.test.ts +0 -394
  147. package/src/entries/TextEntry.ts +0 -60
  148. package/src/entries/index.ts +0 -12
  149. package/src/entries/leaves.test.ts +0 -306
  150. package/src/entries/registry.ts +0 -54
  151. package/src/fields/BuilderField.test.ts +0 -1188
  152. package/src/fields/BuilderField.ts +0 -605
  153. package/src/fields/BuilderRelationship.test.ts +0 -811
  154. package/src/fields/CheckboxField.test.ts +0 -44
  155. package/src/fields/CheckboxField.ts +0 -27
  156. package/src/fields/CheckboxListField.test.ts +0 -99
  157. package/src/fields/CheckboxListField.ts +0 -66
  158. package/src/fields/ColorPickerField.test.ts +0 -33
  159. package/src/fields/ColorPickerField.ts +0 -25
  160. package/src/fields/DateField.ts +0 -54
  161. package/src/fields/DateTimeField.test.ts +0 -55
  162. package/src/fields/EmailField.ts +0 -16
  163. package/src/fields/Field.test.ts +0 -654
  164. package/src/fields/Field.ts +0 -817
  165. package/src/fields/FileUploadField.test.ts +0 -143
  166. package/src/fields/FileUploadField.ts +0 -159
  167. package/src/fields/HiddenField.test.ts +0 -27
  168. package/src/fields/HiddenField.ts +0 -28
  169. package/src/fields/KeyValueField.test.ts +0 -105
  170. package/src/fields/KeyValueField.ts +0 -55
  171. package/src/fields/MarkdownField.test.ts +0 -167
  172. package/src/fields/MarkdownField.ts +0 -162
  173. package/src/fields/NumberField.ts +0 -33
  174. package/src/fields/RadioField.test.ts +0 -94
  175. package/src/fields/RadioField.ts +0 -67
  176. package/src/fields/RepeaterField.test.ts +0 -1806
  177. package/src/fields/RepeaterField.ts +0 -939
  178. package/src/fields/RepeaterRelationship.test.ts +0 -1923
  179. package/src/fields/RepeaterSimple.test.ts +0 -248
  180. package/src/fields/RowButton.test.ts +0 -219
  181. package/src/fields/RowButton.ts +0 -135
  182. package/src/fields/SelectField.test.ts +0 -192
  183. package/src/fields/SelectField.ts +0 -235
  184. package/src/fields/SliderField.test.ts +0 -50
  185. package/src/fields/SliderField.ts +0 -53
  186. package/src/fields/SlugField.ts +0 -24
  187. package/src/fields/TagsInputField.test.ts +0 -154
  188. package/src/fields/TagsInputField.ts +0 -133
  189. package/src/fields/TextField.test.ts +0 -213
  190. package/src/fields/TextField.ts +0 -177
  191. package/src/fields/TextareaField.test.ts +0 -58
  192. package/src/fields/TextareaField.ts +0 -59
  193. package/src/fields/ToggleButtonsField.test.ts +0 -106
  194. package/src/fields/ToggleButtonsField.ts +0 -59
  195. package/src/fields/ToggleField.ts +0 -16
  196. package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +0 -319
  197. package/src/fields/optionsResolver.ts +0 -95
  198. package/src/fields/resolveField.ts +0 -28
  199. package/src/filters/BooleanFilter.ts +0 -35
  200. package/src/filters/DateRangeFilter.test.ts +0 -194
  201. package/src/filters/DateRangeFilter.ts +0 -148
  202. package/src/filters/Filter.test.ts +0 -268
  203. package/src/filters/Filter.ts +0 -184
  204. package/src/filters/FormFilter.test.ts +0 -238
  205. package/src/filters/FormFilter.ts +0 -215
  206. package/src/filters/MultiSelectFilter.test.ts +0 -119
  207. package/src/filters/MultiSelectFilter.ts +0 -78
  208. package/src/filters/QueryBuilderFilter.test.ts +0 -662
  209. package/src/filters/QueryBuilderFilter.ts +0 -398
  210. package/src/filters/SelectFilter.ts +0 -46
  211. package/src/filters/TernaryFilter.test.ts +0 -160
  212. package/src/filters/TernaryFilter.ts +0 -72
  213. package/src/filters/TrashedFilter.test.ts +0 -149
  214. package/src/filters/TrashedFilter.ts +0 -55
  215. package/src/filters/queryBuilder/BooleanConstraint.ts +0 -31
  216. package/src/filters/queryBuilder/Constraint.ts +0 -115
  217. package/src/filters/queryBuilder/DateConstraint.ts +0 -69
  218. package/src/filters/queryBuilder/NumberConstraint.ts +0 -66
  219. package/src/filters/queryBuilder/SelectConstraint.ts +0 -72
  220. package/src/filters/queryBuilder/TextConstraint.ts +0 -64
  221. package/src/filters/queryBuilder/index.ts +0 -12
  222. package/src/icons/index.ts +0 -2
  223. package/src/icons/lucide.ts +0 -204
  224. package/src/icons/registry.test.ts +0 -56
  225. package/src/icons/registry.ts +0 -41
  226. package/src/icons/types.ts +0 -47
  227. package/src/index.ts +0 -525
  228. package/src/io/csv.test.ts +0 -142
  229. package/src/io/csv.ts +0 -170
  230. package/src/nestedRelationManagerData.test.ts +0 -547
  231. package/src/notifications/Notification.test.ts +0 -210
  232. package/src/notifications/Notification.ts +0 -354
  233. package/src/notifications/broadcast.test.ts +0 -110
  234. package/src/notifications/broadcast.ts +0 -95
  235. package/src/notifications/database.test.ts +0 -383
  236. package/src/notifications/database.ts +0 -398
  237. package/src/notifications/databaseNotifications.test.ts +0 -187
  238. package/src/notifications/dispatchNotificationAction.test.ts +0 -341
  239. package/src/notifications/dispatchNotificationAction.ts +0 -142
  240. package/src/notifications/flash.test.ts +0 -89
  241. package/src/notifications/flash.ts +0 -71
  242. package/src/notifications/index.ts +0 -45
  243. package/src/notifications/registerBroadcastAuth.test.ts +0 -134
  244. package/src/notifications/registerBroadcastAuth.ts +0 -100
  245. package/src/notifications/resolveSavedNotification.test.ts +0 -82
  246. package/src/notifications/resolveSavedNotification.ts +0 -59
  247. package/src/notifications/types.ts +0 -93
  248. package/src/orm/m2mAccessor.ts +0 -66
  249. package/src/orm/modelDefaults.test.ts +0 -633
  250. package/src/orm/modelDefaults.ts +0 -666
  251. package/src/pageData/breadcrumbs.ts +0 -288
  252. package/src/pageData/forms.ts +0 -578
  253. package/src/pageData/helpers.ts +0 -857
  254. package/src/pageData/misc.ts +0 -347
  255. package/src/pageData/navigation.ts +0 -842
  256. package/src/pageData/relationPages.ts +0 -1248
  257. package/src/pageData/relationTabs.ts +0 -286
  258. package/src/pageData/resourcePages.ts +0 -609
  259. package/src/pageData.test.ts +0 -1545
  260. package/src/pageData.ts +0 -341
  261. package/src/plugins/index.ts +0 -8
  262. package/src/plugins/themeEditor.test.ts +0 -36
  263. package/src/plugins/themeEditor.ts +0 -45
  264. package/src/react/AppShell.tsx +0 -251
  265. package/src/react/CollabExtensionFactoryRegistry.ts +0 -55
  266. package/src/react/CollabRoomContext.ts +0 -98
  267. package/src/react/CollabTextRendererRegistry.ts +0 -102
  268. package/src/react/CommandPalette.tsx +0 -375
  269. package/src/react/CurrentUserContext.tsx +0 -50
  270. package/src/react/CustomPageWrapperGate.tsx +0 -69
  271. package/src/react/CustomPageWrapperRegistry.ts +0 -45
  272. package/src/react/FieldFocusReporterRegistry.ts +0 -37
  273. package/src/react/FieldLabelSlotRegistry.ts +0 -30
  274. package/src/react/FieldPresenceRegistry.ts +0 -46
  275. package/src/react/FormCollabBindingRegistry.ts +0 -242
  276. package/src/react/FormStateContext.tsx +0 -591
  277. package/src/react/HeadHooks.tsx +0 -126
  278. package/src/react/MarkdownEditorRegistry.test.ts +0 -38
  279. package/src/react/MarkdownEditorRegistry.ts +0 -107
  280. package/src/react/NotificationActionStrip.tsx +0 -263
  281. package/src/react/NotificationBell.tsx +0 -426
  282. package/src/react/PendingSuggestionApplierRegistry.test.ts +0 -97
  283. package/src/react/PendingSuggestionApplierRegistry.ts +0 -98
  284. package/src/react/PendingSuggestionOverlayRegistry.ts +0 -54
  285. package/src/react/PendingSuggestionsContext.tsx +0 -172
  286. package/src/react/RecordWrapperGate.tsx +0 -58
  287. package/src/react/RecordWrapperRegistry.ts +0 -39
  288. package/src/react/RenderHookSlot.tsx +0 -32
  289. package/src/react/RightSidebar.tsx +0 -257
  290. package/src/react/RightSidebarContext.tsx +0 -234
  291. package/src/react/RightSidebarTrigger.tsx +0 -53
  292. package/src/react/RowCoordsContext.tsx +0 -23
  293. package/src/react/SchemaRenderer.tsx +0 -549
  294. package/src/react/SearchTrigger.tsx +0 -46
  295. package/src/react/ThemeProvider.tsx +0 -93
  296. package/src/react/ThemeSettingsPage.tsx +0 -579
  297. package/src/react/ThemeToggle.tsx +0 -20
  298. package/src/react/Toaster.tsx +0 -158
  299. package/src/react/UserMenu.tsx +0 -196
  300. package/src/react/WidgetDataContext.tsx +0 -157
  301. package/src/react/cells/EditableCell.tsx +0 -389
  302. package/src/react/component-slots.test.ts +0 -103
  303. package/src/react/component-slots.ts +0 -116
  304. package/src/react/fieldJsHandler.test.ts +0 -166
  305. package/src/react/fieldJsHandler.ts +0 -79
  306. package/src/react/fields/BuilderInput.tsx +0 -1078
  307. package/src/react/fields/CheckboxInput.tsx +0 -39
  308. package/src/react/fields/CheckboxListInput.tsx +0 -102
  309. package/src/react/fields/ColorInput.tsx +0 -71
  310. package/src/react/fields/DateFieldInput.tsx +0 -70
  311. package/src/react/fields/DateTimeInput.tsx +0 -62
  312. package/src/react/fields/FieldShell.tsx +0 -348
  313. package/src/react/fields/FileUploadInput.tsx +0 -639
  314. package/src/react/fields/HiddenInput.tsx +0 -17
  315. package/src/react/fields/KeyValueInput.tsx +0 -230
  316. package/src/react/fields/MarkdownInput.tsx +0 -560
  317. package/src/react/fields/RadioInput.tsx +0 -81
  318. package/src/react/fields/RepeaterInput.test.ts +0 -116
  319. package/src/react/fields/RepeaterInput.tsx +0 -1420
  320. package/src/react/fields/SelectFieldInput.tsx +0 -280
  321. package/src/react/fields/SliderInput.tsx +0 -81
  322. package/src/react/fields/TagsInput.tsx +0 -283
  323. package/src/react/fields/TextLikeInput.tsx +0 -256
  324. package/src/react/fields/ToggleButtonsInput.tsx +0 -60
  325. package/src/react/fields/ToggleFieldInput.tsx +0 -56
  326. package/src/react/fields/relationshipRenameDispatch.test.ts +0 -106
  327. package/src/react/fields/relationshipRenameDispatch.ts +0 -97
  328. package/src/react/fields/repeaterReconcile.test.ts +0 -114
  329. package/src/react/fields/repeaterReconcile.ts +0 -104
  330. package/src/react/fields/rowChromeButton.tsx +0 -336
  331. package/src/react/fields/rowState.ts +0 -106
  332. package/src/react/fields/syncRowGates.test.ts +0 -202
  333. package/src/react/fields/syncRowGates.ts +0 -66
  334. package/src/react/fields/textInputControls.tsx +0 -238
  335. package/src/react/fields/useRowReorderDnd.ts +0 -78
  336. package/src/react/formStateHelpers.test.ts +0 -508
  337. package/src/react/formStateHelpers.ts +0 -381
  338. package/src/react/hooks/use-mobile.ts +0 -19
  339. package/src/react/icon-context.tsx +0 -60
  340. package/src/react/index.ts +0 -194
  341. package/src/react/layouts/SidebarLayout.tsx +0 -250
  342. package/src/react/layouts/TopbarLayout.tsx +0 -258
  343. package/src/react/navigate.tsx +0 -37
  344. package/src/react/onProviderSynced.test.ts +0 -90
  345. package/src/react/parseRecordEditUrl.test.ts +0 -122
  346. package/src/react/parseRecordEditUrl.ts +0 -94
  347. package/src/react/persistedState.ts +0 -40
  348. package/src/react/registry.ts +0 -48
  349. package/src/react/right-panel-registry.tsx +0 -47
  350. package/src/react/schemaRenderer/AlertRenderer.tsx +0 -112
  351. package/src/react/schemaRenderer/EntryRenderer.tsx +0 -501
  352. package/src/react/schemaRenderer/SectionRenderer.tsx +0 -120
  353. package/src/react/schemaRenderer/SimpleElements.tsx +0 -306
  354. package/src/react/schemaRenderer/TabsRenderer.tsx +0 -62
  355. package/src/react/schemaRenderer/WizardRenderer.tsx +0 -338
  356. package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +0 -177
  357. package/src/react/schemaRenderer/action/ActionModalDialog.tsx +0 -273
  358. package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +0 -61
  359. package/src/react/schemaRenderer/action/HandlerActionButton.tsx +0 -43
  360. package/src/react/schemaRenderer/action/MethodActionButton.tsx +0 -64
  361. package/src/react/schemaRenderer/action/buttons.tsx +0 -99
  362. package/src/react/schemaRenderer/action/helpers.ts +0 -140
  363. package/src/react/schemaRenderer/action/renderAction.tsx +0 -245
  364. package/src/react/schemaRenderer/columnFormat.ts +0 -65
  365. package/src/react/schemaRenderer/constants.ts +0 -50
  366. package/src/react/schemaRenderer/form/FormRenderer.tsx +0 -274
  367. package/src/react/schemaRenderer/form/renderField.tsx +0 -511
  368. package/src/react/schemaRenderer/helpers.tsx +0 -81
  369. package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +0 -308
  370. package/src/react/schemaRenderer/table/TableRenderer.tsx +0 -123
  371. package/src/react/schemaRenderer/table/TableRendererBody.tsx +0 -974
  372. package/src/react/schemaRenderer/table/filters.tsx +0 -1233
  373. package/src/react/schemaRenderer/table/formatCell.tsx +0 -264
  374. package/src/react/schemaRenderer/table/links.tsx +0 -112
  375. package/src/react/schemaRenderer/table/renderRowActions.tsx +0 -52
  376. package/src/react/schemaRenderer/table/url.tsx +0 -143
  377. package/src/react/theme-preview/apply.ts +0 -99
  378. package/src/react/theme-preview/build-html.ts +0 -436
  379. package/src/react/ui/button.tsx +0 -51
  380. package/src/react/ui/calendar.tsx +0 -67
  381. package/src/react/ui/checkbox.tsx +0 -29
  382. package/src/react/ui/dialog.tsx +0 -108
  383. package/src/react/ui/dropdown-menu.tsx +0 -97
  384. package/src/react/ui/input.tsx +0 -20
  385. package/src/react/ui/label.tsx +0 -21
  386. package/src/react/ui/popover.tsx +0 -50
  387. package/src/react/ui/select.tsx +0 -169
  388. package/src/react/ui/separator.tsx +0 -25
  389. package/src/react/ui/sheet.tsx +0 -136
  390. package/src/react/ui/sidebar.tsx +0 -723
  391. package/src/react/ui/skeleton.tsx +0 -13
  392. package/src/react/ui/slider.tsx +0 -34
  393. package/src/react/ui/switch.tsx +0 -28
  394. package/src/react/ui/table.tsx +0 -105
  395. package/src/react/ui/tabs.tsx +0 -63
  396. package/src/react/ui/textarea.tsx +0 -18
  397. package/src/react/ui/tooltip.tsx +0 -64
  398. package/src/react/useResizableWidth.ts +0 -139
  399. package/src/react/utils.ts +0 -6
  400. package/src/react/widgetRegistry.test.ts +0 -43
  401. package/src/react/widgetRegistry.ts +0 -50
  402. package/src/react/widgets/StatsOverviewRenderer.tsx +0 -232
  403. package/src/react/widgets/TableWidgetRenderer.tsx +0 -231
  404. package/src/react/widgets/ViewRenderer.tsx +0 -71
  405. package/src/relationManagerData.test.ts +0 -1595
  406. package/src/richtext/index.ts +0 -8
  407. package/src/richtext/registry.ts +0 -89
  408. package/src/routes/globals.ts +0 -148
  409. package/src/routes/guard.test.ts +0 -325
  410. package/src/routes/helpers.ts +0 -704
  411. package/src/routes/pages.ts +0 -175
  412. package/src/routes/panel.ts +0 -204
  413. package/src/routes/relations.ts +0 -1243
  414. package/src/routes/resources.ts +0 -781
  415. package/src/routes/theme.ts +0 -91
  416. package/src/routes-nested-relations.test.ts +0 -676
  417. package/src/routes-relations.test.ts +0 -972
  418. package/src/routes.test.ts +0 -2027
  419. package/src/routes.ts +0 -303
  420. package/src/schema/Alert.test.ts +0 -109
  421. package/src/schema/Alert.ts +0 -131
  422. package/src/schema/Block.ts +0 -169
  423. package/src/schema/Breadcrumbs.ts +0 -40
  424. package/src/schema/Card.ts +0 -35
  425. package/src/schema/Divider.ts +0 -20
  426. package/src/schema/Element.ts +0 -219
  427. package/src/schema/EmptyState.test.ts +0 -37
  428. package/src/schema/EmptyState.ts +0 -63
  429. package/src/schema/Fieldset.ts +0 -43
  430. package/src/schema/Grid.ts +0 -43
  431. package/src/schema/Group.ts +0 -30
  432. package/src/schema/Heading.ts +0 -39
  433. package/src/schema/Html.ts +0 -67
  434. package/src/schema/Icon.ts +0 -54
  435. package/src/schema/Image.ts +0 -57
  436. package/src/schema/LinkTag.ts +0 -41
  437. package/src/schema/Markdown.ts +0 -85
  438. package/src/schema/MetaTag.ts +0 -41
  439. package/src/schema/RelationTabs.ts +0 -71
  440. package/src/schema/ScriptTag.ts +0 -55
  441. package/src/schema/Section.ts +0 -160
  442. package/src/schema/ServerDataElement.test.ts +0 -140
  443. package/src/schema/ServerDataElement.ts +0 -156
  444. package/src/schema/SlotComponent.test.ts +0 -77
  445. package/src/schema/SlotComponent.ts +0 -71
  446. package/src/schema/Split.ts +0 -50
  447. package/src/schema/Stat.test.ts +0 -118
  448. package/src/schema/Stat.ts +0 -154
  449. package/src/schema/StatsOverview.test.ts +0 -141
  450. package/src/schema/StatsOverview.ts +0 -119
  451. package/src/schema/StyleTag.ts +0 -35
  452. package/src/schema/TableWidget.test.ts +0 -297
  453. package/src/schema/TableWidget.ts +0 -289
  454. package/src/schema/Tabs.ts +0 -79
  455. package/src/schema/Text.ts +0 -58
  456. package/src/schema/UnorderedList.ts +0 -49
  457. package/src/schema/View.test.ts +0 -111
  458. package/src/schema/View.ts +0 -127
  459. package/src/schema/Wizard.ts +0 -220
  460. package/src/schema/containers.test.ts +0 -564
  461. package/src/schema/headTags.test.ts +0 -134
  462. package/src/schema/index.ts +0 -40
  463. package/src/schema/primes.test.ts +0 -269
  464. package/src/schema/resolveSchema.test.ts +0 -379
  465. package/src/schema/resolveSchema.ts +0 -917
  466. package/src/schema/sanitize.ts +0 -58
  467. package/src/search.test.ts +0 -446
  468. package/src/search.ts +0 -178
  469. package/src/sessionFilters.test.ts +0 -375
  470. package/src/sessionFilters.ts +0 -143
  471. package/src/slot-components/index.ts +0 -10
  472. package/src/slot-components/registry.ts +0 -56
  473. package/src/styles/file-upload.css +0 -13
  474. package/src/summarizers/Summarizer.test.ts +0 -84
  475. package/src/summarizers/Summarizer.ts +0 -123
  476. package/src/summarizers/index.ts +0 -11
  477. package/src/theme/base-colors.ts +0 -68
  478. package/src/theme/chart-colors.ts +0 -50
  479. package/src/theme/colors.ts +0 -447
  480. package/src/theme/generate-css.test.ts +0 -139
  481. package/src/theme/generate-css.ts +0 -44
  482. package/src/theme/generate-scale.test.ts +0 -106
  483. package/src/theme/generate-scale.ts +0 -97
  484. package/src/theme/icon-map.ts +0 -42
  485. package/src/theme/index.ts +0 -34
  486. package/src/theme/migrate.test.ts +0 -178
  487. package/src/theme/migrate.ts +0 -81
  488. package/src/theme/presets.ts +0 -135
  489. package/src/theme/radius.ts +0 -18
  490. package/src/theme/resolve.test.ts +0 -238
  491. package/src/theme/resolve.ts +0 -96
  492. package/src/theme/spacing.ts +0 -18
  493. package/src/theme/storage.test.ts +0 -126
  494. package/src/theme/storage.ts +0 -106
  495. package/src/theme/theme-colors.ts +0 -88
  496. package/src/theme/types.ts +0 -125
  497. package/src/uploads/UploadAdapter.ts +0 -35
  498. package/src/uploads/index.ts +0 -2
  499. package/src/uploads/localUpload.test.ts +0 -70
  500. package/src/uploads/localUpload.ts +0 -84
  501. package/src/validation/Validator.ts +0 -49
  502. package/src/validation/index.ts +0 -28
  503. package/src/validation/rules.ts +0 -78
  504. package/src/validation/runValidators.ts +0 -435
  505. package/src/validation/uniqueValidator.test.ts +0 -196
  506. package/src/validation/uniqueValidator.ts +0 -133
  507. package/src/validation/validators.test.ts +0 -268
  508. package/src/vite.test.ts +0 -184
  509. package/src/vite.ts +0 -787
  510. package/src/widgets/index.ts +0 -10
  511. package/src/widgets/registry.ts +0 -45
  512. package/src/widgets.test.ts +0 -592
  513. package/tsconfig.build.json +0 -11
  514. package/tsconfig.json +0 -4
  515. package/tsconfig.test.json +0 -10
  516. package/views/react/Dashboard.tsx +0 -27
  517. package/views/react/Resources/Form.tsx +0 -102
  518. package/views/react/Resources/Index.tsx +0 -49
@@ -1,114 +0,0 @@
1
- import { describe, it, before, after, beforeEach } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import {
5
- computeReconcilePlan,
6
- markSubmitForReconcile,
7
- consumeReconcileFlag,
8
- } from './repeaterReconcile.js'
9
-
10
- describe('computeReconcilePlan', () => {
11
- it('returns empty plan when current and authoritative match', () => {
12
- const plan = computeReconcilePlan({
13
- current: ['a', 'b', 'c'],
14
- authoritative: ['a', 'b', 'c'],
15
- })
16
- assert.deepEqual(plan.toRemove, [])
17
- assert.deepEqual(plan.toAdd, [])
18
- })
19
-
20
- it('flags orphan CRDT rows as toRemove (PK-switch happy path)', () => {
21
- // Submitting tab reloaded — server returned the new DB PK; CRDT
22
- // still carries the renderer-minted UUID from the just-saved row.
23
- const plan = computeReconcilePlan({
24
- current: ['uuid-foo', '42'],
25
- authoritative: ['42'],
26
- })
27
- assert.deepEqual(plan.toRemove, ['uuid-foo'])
28
- assert.deepEqual(plan.toAdd, [])
29
- })
30
-
31
- it('flags missing CRDT rows as toAdd (raw-SQL-seeded record)', () => {
32
- // First peer to open a record whose DB rows weren't seeded into the
33
- // Y.Doc (no `seedRowArraysFromRecord` coverage for relationship-
34
- // backed fields). Reconciler ensures CRDT mirrors initialRows.
35
- const plan = computeReconcilePlan({
36
- current: [],
37
- authoritative: ['42', '43'],
38
- })
39
- assert.deepEqual(plan.toRemove, [])
40
- assert.deepEqual(plan.toAdd, ['42', '43'])
41
- })
42
-
43
- it('handles both directions in a single pass', () => {
44
- const plan = computeReconcilePlan({
45
- current: ['uuid-foo', 'uuid-bar', '42'],
46
- authoritative: ['42', '43'],
47
- })
48
- assert.deepEqual(plan.toRemove, ['uuid-foo', 'uuid-bar'])
49
- assert.deepEqual(plan.toAdd, ['43'])
50
- })
51
-
52
- it('preserves order from inputs in toRemove / toAdd', () => {
53
- const plan = computeReconcilePlan({
54
- current: ['z', 'a', 'm'],
55
- authoritative: ['a', 'b', 'c'],
56
- })
57
- // toRemove walks current in order; toAdd walks authoritative in order.
58
- // Order-stability matters because reconciler applies them sequentially
59
- // and we want deterministic test snapshots.
60
- assert.deepEqual(plan.toRemove, ['z', 'm'])
61
- assert.deepEqual(plan.toAdd, ['b', 'c'])
62
- })
63
- })
64
-
65
- describe('markSubmitForReconcile / consumeReconcileFlag', () => {
66
- // Minimal in-memory sessionStorage stub — Node lacks one, and we
67
- // want to avoid bringing in jsdom for a flag-roundtrip test.
68
- const realSessionStorage = (globalThis as { sessionStorage?: Storage }).sessionStorage
69
- const store: Map<string, string> = new Map()
70
-
71
- before(() => {
72
- ;(globalThis as { sessionStorage?: Storage }).sessionStorage = {
73
- get length() { return store.size },
74
- key: (i: number) => Array.from(store.keys())[i] ?? null,
75
- getItem: (k: string) => store.has(k) ? store.get(k)! : null,
76
- setItem: (k: string, v: string) => { store.set(k, v) },
77
- removeItem: (k: string) => { store.delete(k) },
78
- clear: () => { store.clear() },
79
- } as Storage
80
- })
81
-
82
- after(() => {
83
- if (realSessionStorage === undefined) {
84
- delete (globalThis as { sessionStorage?: Storage }).sessionStorage
85
- } else {
86
- (globalThis as { sessionStorage?: Storage }).sessionStorage = realSessionStorage
87
- }
88
- })
89
-
90
- beforeEach(() => { store.clear() })
91
-
92
- it('returns false when no flag has been set', () => {
93
- assert.equal(consumeReconcileFlag('form-1'), false)
94
- })
95
-
96
- it('round-trips a flag and clears on first consume', () => {
97
- markSubmitForReconcile('form-1')
98
- assert.equal(consumeReconcileFlag('form-1'), true)
99
- // Second read: flag was cleared on the first consume.
100
- assert.equal(consumeReconcileFlag('form-1'), false)
101
- })
102
-
103
- it('scopes the flag per formId', () => {
104
- markSubmitForReconcile('form-1')
105
- assert.equal(consumeReconcileFlag('form-2'), false)
106
- assert.equal(consumeReconcileFlag('form-1'), true)
107
- })
108
-
109
- it('no-ops on empty formId (mark and consume both)', () => {
110
- markSubmitForReconcile('')
111
- assert.equal(store.size, 0)
112
- assert.equal(consumeReconcileFlag(''), false)
113
- })
114
- })
@@ -1,104 +0,0 @@
1
- /**
2
- * Phase A of the `Repeater.relationship` PK-switch reconciliation
3
- * (see `pilotiq-pro/docs/plans/repeater-relationship-pk-switch.md`).
4
- *
5
- * When a parent form submit creates new relationship-backed rows, the
6
- * server assigns each child a DB primary key — but the row's `__id` in
7
- * the row CRDT is still the renderer-minted UUID from the local session.
8
- * After redirect, the submitting tab's pageData carries `__id = String(pk)`
9
- * while CRDT still has the UUID, so the renderer ends up showing the
10
- * same row twice (DB PK from initialRows + orphan UUID from CRDT).
11
- *
12
- * Phase A fix: the submitting tab marks itself for a one-shot CRDT
13
- * reconcile on the next mount via a per-formId sessionStorage flag.
14
- * `RepeaterInput` / `BuilderInput` read the flag on mount and, when set,
15
- * snapshot the row CRDT after a short settle (waiting for WS sync) and
16
- * reconcile against `initialRows` — removing orphan CRDT rows not in
17
- * the form's authoritative data, and adding missing CRDT rows (rare,
18
- * happens when the row was DB-seeded outside the collab session).
19
- *
20
- * The flag is scoped per-tab via sessionStorage, so other peers' tabs
21
- * never run the reconciler — preserving their in-flight edits.
22
- *
23
- * Phase B (server-side rename via the @rudderjs/sync Y.Doc seam) will
24
- * extend this to other peers without requiring them to reload.
25
- */
26
-
27
- const STORAGE_PREFIX = 'pilotiq.repeaterReconcile.'
28
-
29
- function storageKey(formId: string): string {
30
- return STORAGE_PREFIX + formId
31
- }
32
-
33
- /**
34
- * Called by `FormRenderer` on submit success. Records that this tab
35
- * has just persisted the form, so the next mount of any Repeater /
36
- * Builder under the same form runs the PK-switch reconciler. No-op
37
- * when `formId` is empty or `sessionStorage` is unavailable (SSR).
38
- */
39
- export function markSubmitForReconcile(formId: string): void {
40
- if (!formId) return
41
- if (typeof sessionStorage === 'undefined') return
42
- try {
43
- sessionStorage.setItem(storageKey(formId), '1')
44
- } catch {
45
- // Quota exceeded / disabled — silently skip. Reconciliation is
46
- // an optimization, not a correctness requirement.
47
- }
48
- }
49
-
50
- /**
51
- * Called by `RepeaterInput` / `BuilderInput` on mount. Returns `true`
52
- * iff the form was just submitted in this tab AND clears the flag so
53
- * subsequent mounts no-op. Idempotent across multiple Repeater/Builder
54
- * fields on the same form — the FIRST reader clears the flag, so
55
- * siblings see `false`. To avoid that, both fields call this helper at
56
- * the same mount tick — for v1 we accept the limitation: only the first
57
- * Repeater on the form runs the reconciler; siblings don't.
58
- *
59
- * If a future need surfaces (multiple relationship-backed Repeaters on
60
- * the same form), switch to a per-field flag keyed by `formId.fieldName`
61
- * or have the FormRenderer dispatch a custom event instead.
62
- */
63
- export function consumeReconcileFlag(formId: string): boolean {
64
- if (!formId) return false
65
- if (typeof sessionStorage === 'undefined') return false
66
- try {
67
- const v = sessionStorage.getItem(storageKey(formId))
68
- if (v !== '1') return false
69
- sessionStorage.removeItem(storageKey(formId))
70
- return true
71
- } catch {
72
- return false
73
- }
74
- }
75
-
76
- export interface ReconcileInputs {
77
- /** Current CRDT row id order (post-WS-sync). */
78
- current: readonly string[]
79
- /** Authoritative row id list from server-rendered initialRows. */
80
- authoritative: readonly string[]
81
- }
82
-
83
- export interface ReconcilePlan {
84
- /** Row ids present in CRDT but not in initialRows — orphan UUIDs. */
85
- toRemove: string[]
86
- /** Row ids present in initialRows but not in CRDT — DB rows not yet
87
- * in the room (rare; only happens when DB was seeded outside collab). */
88
- toAdd: string[]
89
- }
90
-
91
- /**
92
- * Pure helper: compute the symmetric difference. Exported separately so
93
- * unit tests don't need a DOM / sessionStorage shim to verify the
94
- * reconciliation arithmetic.
95
- */
96
- export function computeReconcilePlan({ current, authoritative }: ReconcileInputs): ReconcilePlan {
97
- const currentSet = new Set(current)
98
- const authSet = new Set(authoritative)
99
- const toRemove: string[] = []
100
- const toAdd: string[] = []
101
- for (const id of current) if (!authSet.has(id)) toRemove.push(id)
102
- for (const id of authoritative) if (!currentSet.has(id)) toAdd.push(id)
103
- return { toRemove, toAdd }
104
- }
@@ -1,336 +0,0 @@
1
- import React from 'react'
2
- import {
3
- ArrowDownIcon,
4
- ArrowUpIcon,
5
- ChevronDownIcon,
6
- ChevronRightIcon,
7
- ChevronsDownIcon,
8
- ChevronsUpIcon,
9
- CopyIcon,
10
- GripVerticalIcon,
11
- Trash2Icon,
12
- } from 'lucide-react'
13
- import { getIcon, type IconType } from '../../icons/registry.js'
14
- import type {
15
- RowButtonColor,
16
- RowButtonKind,
17
- RowButtonMeta,
18
- RowButtonsMeta,
19
- } from '../../fields/RowButton.js'
20
-
21
- /**
22
- * Foreground color slot → Tailwind class pair. Mirrors `Action.color()`
23
- * semantics with a softer hover transition since these are
24
- * icon-only buttons inside a dense row header.
25
- */
26
- const COLOR_CLASS: Record<RowButtonColor, string> = {
27
- foreground: 'text-muted-foreground hover:text-foreground',
28
- destructive: 'text-muted-foreground hover:text-destructive',
29
- primary: 'text-primary hover:text-primary/80',
30
- success: 'text-emerald-600 hover:text-emerald-700',
31
- warning: 'text-amber-600 hover:text-amber-700',
32
- info: 'text-blue-600 hover:text-blue-700',
33
- muted: 'text-muted-foreground/60 hover:text-muted-foreground',
34
- }
35
-
36
- interface ButtonDefaults {
37
- Icon: IconType
38
- label: string
39
- tooltip: string
40
- /**
41
- * Default tailwind color class when no `color` override is set. Most
42
- * row buttons share `text-muted-foreground hover:text-foreground`;
43
- * the trash slot defaults to `…hover:text-destructive`. Defaults always
44
- * lose to an explicit `RowButton.color()` call.
45
- */
46
- colorClass: string
47
- }
48
-
49
- interface ResolvedChrome {
50
- Icon: IconType
51
- label: string
52
- tooltip: string
53
- colorClass: string
54
- }
55
-
56
- /**
57
- * Merge a meta override on top of a slot's hardcoded defaults. The
58
- * override may set any subset of `{ icon, label, color, tooltip }`; missing
59
- * keys fall through. An overridden `icon` that doesn't resolve in the
60
- * runtime registry falls back to the default Lucide glyph (matches
61
- * `useIconFor`'s fail-soft posture).
62
- */
63
- export function resolveRowChrome(
64
- defaults: ButtonDefaults,
65
- override: RowButtonMeta | undefined,
66
- ): ResolvedChrome {
67
- if (override === undefined) return defaults
68
- const overrideIcon = override.icon !== undefined ? getIcon(override.icon) : undefined
69
- return {
70
- Icon: overrideIcon ?? defaults.Icon,
71
- label: override.label ?? defaults.label,
72
- tooltip: override.tooltip ?? defaults.tooltip,
73
- colorClass: override.color !== undefined ? COLOR_CLASS[override.color] : defaults.colorClass,
74
- }
75
- }
76
-
77
- /**
78
- * Default chrome for each of the seven slots. Centralized here so both
79
- * Repeater and Builder renderers stay in sync — when a new slot lands,
80
- * the defaults live in one place. The Icon imports happen at the call
81
- * site (renderers already import from lucide-react); we accept them as
82
- * inputs to keep this file React-tree-shake friendly.
83
- */
84
- export type SlotDefaults = Record<RowButtonKind, ButtonDefaults>
85
-
86
- /** Convenience for renderers — pass a slot kind + the merged buttons meta. */
87
- export function resolveRowChromeFor(
88
- kind: RowButtonKind,
89
- defaults: ButtonDefaults,
90
- buttons: RowButtonsMeta | undefined,
91
- ): ResolvedChrome {
92
- return resolveRowChrome(defaults, buttons?.[kind])
93
- }
94
-
95
- /**
96
- * Standard icon-button shell used by every row chrome slot except the
97
- * grip (which is a draggable `<span>`) and the Add button (which uses
98
- * the shadcn `<Button>` for outline styling). Centralizes the
99
- * `disabled` opacity, focus ring, and icon sizing so customizer overrides
100
- * land consistently across Repeater + Builder.
101
- */
102
- export function RowChromeIconButton({
103
- defaults,
104
- override,
105
- disabled,
106
- onClick,
107
- extraClassName = '',
108
- ariaExpanded,
109
- }: {
110
- defaults: ButtonDefaults
111
- override: RowButtonMeta | undefined
112
- disabled: boolean
113
- onClick: () => void
114
- extraClassName?: string
115
- ariaExpanded?: boolean
116
- }): React.ReactElement {
117
- const { Icon, label, tooltip, colorClass } = resolveRowChrome(defaults, override)
118
- return (
119
- <button
120
- type="button"
121
- onClick={onClick}
122
- disabled={disabled}
123
- aria-label={label}
124
- title={tooltip}
125
- {...(ariaExpanded !== undefined ? { 'aria-expanded': ariaExpanded } : {})}
126
- className={`${colorClass} disabled:opacity-30 ${extraClassName}`.trim()}
127
- >
128
- <Icon className="size-4" />
129
- </button>
130
- )
131
- }
132
-
133
- /**
134
- * Drag grip — a `<span>` not a `<button>`. Honors the `reorderAction`
135
- * customizer for icon / label / tooltip / color so users can swap the
136
- * glyph or copy without owning the drag wiring.
137
- *
138
- * When `dragHandleProps` is passed, the grip carries `draggable=true` +
139
- * `onDragStart` and becomes the HTML5 drag source — required for row
140
- * layouts whose body hosts a contenteditable (Tiptap-backed fields).
141
- * If `draggable=true` lives on the row container instead, a dragstart
142
- * that initiates over the contenteditable is absorbed by the text-
143
- * selection handler and the row drag never fires. Moving the source to
144
- * the grip sidesteps that. Drop-target handlers (`onDragOver/onDrop/
145
- * onDragEnd`) stay on the row container — `dragend` bubbles so source-
146
- * side cleanup still reaches it.
147
- */
148
- export function ReorderGrip({
149
- disabled,
150
- buttons,
151
- dragHandleProps,
152
- }: {
153
- disabled: boolean
154
- buttons: RowButtonsMeta | undefined
155
- dragHandleProps?: {
156
- draggable: true
157
- onDragStart: (e: React.DragEvent<HTMLElement>) => void
158
- } | undefined
159
- }): React.ReactElement {
160
- const { Icon, label, tooltip, colorClass } = resolveRowChromeFor('reorder', DEFAULT_REORDER, buttons)
161
- return (
162
- <span
163
- aria-label={label}
164
- title={tooltip}
165
- className={`${colorClass} ${disabled ? 'opacity-30' : 'cursor-grab active:cursor-grabbing'}`}
166
- {...dragHandleProps}
167
- >
168
- <Icon className="size-4" />
169
- </span>
170
- )
171
- }
172
-
173
- /**
174
- * Collapse chevron — picks the open/closed glyph from state, then lets
175
- * customizer overrides take over. When the row is currently collapsed,
176
- * `expand` (from `expandAction(...)`) wins, falling back to `collapse`
177
- * (from `collapseAction(...)`) for back-compat with single-override
178
- * setups. When the row is open, `collapse` is used directly. Authors
179
- * who want different chrome per state set both `collapseAction` and
180
- * `expandAction`; authors who want a single uniform override keep
181
- * setting just `collapseAction`.
182
- */
183
- export function CollapseChevron({
184
- isCollapsed,
185
- disabled,
186
- buttons,
187
- onToggle,
188
- }: {
189
- isCollapsed: boolean
190
- disabled: boolean
191
- buttons: RowButtonsMeta | undefined
192
- onToggle: () => void
193
- }): React.ReactElement {
194
- const defaults = {
195
- Icon: isCollapsed ? ChevronRightIcon : ChevronDownIcon,
196
- label: isCollapsed ? 'Expand' : 'Collapse',
197
- tooltip: isCollapsed ? 'Expand' : 'Collapse',
198
- colorClass: 'text-muted-foreground hover:text-foreground',
199
- }
200
- const override = isCollapsed
201
- ? (buttons?.expand ?? buttons?.collapse)
202
- : buttons?.collapse
203
- return (
204
- <RowChromeIconButton
205
- defaults={defaults}
206
- override={override}
207
- disabled={disabled}
208
- onClick={onToggle}
209
- ariaExpanded={!isCollapsed}
210
- />
211
- )
212
- }
213
-
214
- // ─── Per-slot defaults ─────────────────────────────────────
215
- // Centralized so Repeater + Builder stay in lockstep. When a new slot
216
- // lands, defaults live in one place. `colorClass` defaults match the
217
- // historic hardcoded classes — preserves chrome for non-customized fields.
218
-
219
- export const DEFAULT_MOVE_UP: ButtonDefaults = {
220
- Icon: ArrowUpIcon,
221
- label: 'Move up',
222
- tooltip: 'Move up',
223
- colorClass: 'text-muted-foreground hover:text-foreground',
224
- }
225
- export const DEFAULT_MOVE_DOWN: ButtonDefaults = {
226
- Icon: ArrowDownIcon,
227
- label: 'Move down',
228
- tooltip: 'Move down',
229
- colorClass: 'text-muted-foreground hover:text-foreground',
230
- }
231
- export const DEFAULT_CLONE: ButtonDefaults = {
232
- Icon: CopyIcon,
233
- label: 'Duplicate row',
234
- tooltip: 'Duplicate row',
235
- colorClass: 'text-muted-foreground hover:text-foreground',
236
- }
237
- export const DEFAULT_DELETE: ButtonDefaults = {
238
- Icon: Trash2Icon,
239
- label: 'Remove row',
240
- tooltip: 'Remove row',
241
- colorClass: 'text-muted-foreground hover:text-destructive',
242
- }
243
- export const DEFAULT_REORDER: ButtonDefaults = {
244
- Icon: GripVerticalIcon,
245
- label: 'Drag to reorder',
246
- tooltip: 'Drag to reorder',
247
- colorClass: 'text-muted-foreground',
248
- }
249
- export const DEFAULT_EXPAND_ALL: ButtonDefaults = {
250
- Icon: ChevronsDownIcon,
251
- label: 'Expand all',
252
- tooltip: 'Expand all',
253
- colorClass: 'text-muted-foreground hover:text-foreground',
254
- }
255
- export const DEFAULT_COLLAPSE_ALL: ButtonDefaults = {
256
- Icon: ChevronsUpIcon,
257
- label: 'Collapse all',
258
- tooltip: 'Collapse all',
259
- colorClass: 'text-muted-foreground hover:text-foreground',
260
- }
261
-
262
- /**
263
- * Field-header strip with bulk Expand-all / Collapse-all chips. Renders
264
- * only the buttons whose customizer slot is set on `buttons` — the
265
- * presence of `buttons.expandAll` / `buttons.collapseAll` is what flips
266
- * the matching button into existence (different from per-row chrome,
267
- * which always renders when collapsible). Returns `null` when neither
268
- * slot is configured so callers can mount the strip unconditionally.
269
- */
270
- export function BulkCollapseHeader({
271
- buttons,
272
- disabled,
273
- onExpandAll,
274
- onCollapseAll,
275
- }: {
276
- buttons: RowButtonsMeta | undefined
277
- disabled: boolean
278
- onExpandAll: () => void
279
- onCollapseAll: () => void
280
- }): React.ReactElement | null {
281
- const expandAllOverride = buttons?.expandAll
282
- const collapseAllOverride = buttons?.collapseAll
283
- if (!expandAllOverride && !collapseAllOverride) return null
284
- return (
285
- <div className="flex items-center justify-end gap-1">
286
- {expandAllOverride && (
287
- <BulkChromeButton
288
- defaults={DEFAULT_EXPAND_ALL}
289
- override={expandAllOverride}
290
- disabled={disabled}
291
- onClick={onExpandAll}
292
- />
293
- )}
294
- {collapseAllOverride && (
295
- <BulkChromeButton
296
- defaults={DEFAULT_COLLAPSE_ALL}
297
- override={collapseAllOverride}
298
- disabled={disabled}
299
- onClick={onCollapseAll}
300
- />
301
- )}
302
- </div>
303
- )
304
- }
305
-
306
- /**
307
- * Compact button used by `BulkCollapseHeader` — icon + label, sized to
308
- * read as a header chip (smaller than a full Action button, larger than
309
- * the icon-only per-row chrome). Picks up the same `RowButton`
310
- * override surface as every other slot.
311
- */
312
- function BulkChromeButton({
313
- defaults,
314
- override,
315
- disabled,
316
- onClick,
317
- }: {
318
- defaults: ButtonDefaults
319
- override: RowButtonMeta | undefined
320
- disabled: boolean
321
- onClick: () => void
322
- }): React.ReactElement {
323
- const { Icon, label, tooltip, colorClass } = resolveRowChrome(defaults, override)
324
- return (
325
- <button
326
- type="button"
327
- onClick={onClick}
328
- disabled={disabled}
329
- title={tooltip}
330
- className={`inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs ${colorClass} disabled:opacity-30`}
331
- >
332
- <Icon className="size-3.5" />
333
- {label}
334
- </button>
335
- )
336
- }
@@ -1,106 +0,0 @@
1
- /**
2
- * Shared row-state helpers consumed by both `RepeaterInput` and
3
- * `BuilderInput`. The two fields keep parallel storage namespaces
4
- * (`pilotiq.repeater.…` vs `pilotiq.builder.…`) so users with both on
5
- * the same page can collapse them independently — the namespace is the
6
- * only thing that varies between the two callers.
7
- */
8
-
9
- import {
10
- readStoredString, removeStoredString, writeStoredString,
11
- } from '../persistedState.js'
12
-
13
- let _rowSeqFallback = 0
14
-
15
- export function generateRowId(): string {
16
- type CryptoLike = { randomUUID?: () => string }
17
- const c = (globalThis as { crypto?: CryptoLike }).crypto
18
- if (c?.randomUUID) return c.randomUUID()
19
- return `row-${Date.now()}-${++_rowSeqFallback}`
20
- }
21
-
22
- export type RowStateNamespace = 'repeater' | 'builder'
23
-
24
- export interface CollapsedStorage {
25
- key: (formId: string, name: string, rowId: string) => string
26
- read: (formId: string, name: string, rowId: string, defaultValue: boolean) => boolean
27
- write: (formId: string, name: string, rowId: string, value: boolean) => void
28
- remove: (formId: string, name: string, rowId: string) => void
29
- seed: (
30
- rows: { id: string }[],
31
- formId: string,
32
- name: string,
33
- defaultValue: boolean,
34
- collapsible: boolean,
35
- ) => Record<string, boolean>
36
- }
37
-
38
- /**
39
- * Build a namespaced per-row collapse-state store. Uses `'true'` /
40
- * `'false'` encoding (predates the `'1'` / `'0'` flag helper — kept for
41
- * back-compat with already-persisted state).
42
- */
43
- export function makeCollapsedStorage(namespace: RowStateNamespace): CollapsedStorage {
44
- const key = (formId: string, name: string, rowId: string): string =>
45
- `pilotiq.${namespace}.${formId}.${name}.${rowId}`
46
-
47
- const read = (formId: string, name: string, rowId: string, defaultValue: boolean): boolean => {
48
- const raw = readStoredString(key(formId, name, rowId))
49
- if (raw === null) return defaultValue
50
- return raw === 'true'
51
- }
52
-
53
- const write = (formId: string, name: string, rowId: string, value: boolean): void => {
54
- writeStoredString(key(formId, name, rowId), String(value))
55
- }
56
-
57
- const remove = (formId: string, name: string, rowId: string): void => {
58
- removeStoredString(key(formId, name, rowId))
59
- }
60
-
61
- const seed = (
62
- rows: { id: string }[],
63
- formId: string,
64
- name: string,
65
- defaultValue: boolean,
66
- collapsible: boolean,
67
- ): Record<string, boolean> => {
68
- if (!collapsible) return {}
69
- const out: Record<string, boolean> = {}
70
- for (const row of rows) out[row.id] = read(formId, name, row.id, defaultValue)
71
- return out
72
- }
73
-
74
- return { key, read, write, remove, seed }
75
- }
76
-
77
- export interface AccordionStorage {
78
- key: (formId: string, name: string) => string
79
- /**
80
- * `undefined` = no value stored (caller falls back to default-open
81
- * heuristic). Empty string = user explicitly closed every row (caller
82
- * maps to `null` openId). Any other string = the open row id.
83
- */
84
- read: (formId: string, name: string) => string | undefined
85
- write: (formId: string, name: string, openId: string | null) => void
86
- }
87
-
88
- /**
89
- * Build a namespaced accordion-open-row store. Always one slot per
90
- * (formId, name) pair regardless of row count.
91
- */
92
- export function makeAccordionStorage(namespace: RowStateNamespace): AccordionStorage {
93
- const key = (formId: string, name: string): string =>
94
- `pilotiq.${namespace}.${formId}.${name}.accordion`
95
-
96
- const read = (formId: string, name: string): string | undefined => {
97
- const raw = readStoredString(key(formId, name))
98
- return raw === null ? undefined : raw
99
- }
100
-
101
- const write = (formId: string, name: string, openId: string | null): void => {
102
- writeStoredString(key(formId, name), openId ?? '')
103
- }
104
-
105
- return { key, read, write }
106
- }