@multiplatform.one/backoffice 7.34.4 → 7.36.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 (811) hide show
  1. package/dist/cjs/chrome/BackofficeAwesomebar.cjs +8 -3
  2. package/dist/cjs/chrome/BackofficeAwesomebar.native.js +8 -3
  3. package/dist/cjs/chrome/BackofficeAwesomebar.native.js.map +1 -1
  4. package/dist/cjs/chrome/CommandPalette.cjs +19 -15
  5. package/dist/cjs/chrome/CommandPalette.native.js +21 -15
  6. package/dist/cjs/chrome/CommandPalette.native.js.map +1 -1
  7. package/dist/cjs/chrome/NotificationsButton.cjs +2 -1
  8. package/dist/cjs/chrome/NotificationsButton.native.js +2 -1
  9. package/dist/cjs/chrome/NotificationsButton.native.js.map +1 -1
  10. package/dist/cjs/chrome/UserMenu.cjs +143 -77
  11. package/dist/cjs/chrome/UserMenu.native.js +157 -90
  12. package/dist/cjs/chrome/UserMenu.native.js.map +1 -1
  13. package/dist/cjs/chrome/notifications-panel.cjs +3 -4
  14. package/dist/cjs/chrome/notifications-panel.native.js +3 -4
  15. package/dist/cjs/chrome/notifications-panel.native.js.map +1 -1
  16. package/dist/cjs/chrome/user-session.cjs +2 -1
  17. package/dist/cjs/chrome/user-session.native.js +2 -1
  18. package/dist/cjs/chrome/user-session.native.js.map +1 -1
  19. package/dist/cjs/config/BackofficeProvider.cjs +3 -1
  20. package/dist/cjs/config/BackofficeProvider.native.js +3 -1
  21. package/dist/cjs/config/BackofficeProvider.native.js.map +1 -1
  22. package/dist/cjs/config/capabilities.cjs +3 -0
  23. package/dist/cjs/config/capabilities.native.js +3 -0
  24. package/dist/cjs/config/capabilities.native.js.map +1 -1
  25. package/dist/cjs/desk/Desk.cjs +17 -0
  26. package/dist/cjs/desk/Desk.native.js +17 -0
  27. package/dist/cjs/desk/Desk.native.js.map +1 -1
  28. package/dist/cjs/desk/DeskSurface.cjs +10 -0
  29. package/dist/cjs/desk/DeskSurface.native.js +10 -0
  30. package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
  31. package/dist/cjs/desk/resolveDeskPath.cjs +6 -0
  32. package/dist/cjs/desk/resolveDeskPath.native.js +6 -0
  33. package/dist/cjs/desk/resolveDeskPath.native.js.map +1 -1
  34. package/dist/cjs/desk/target.cjs +5 -0
  35. package/dist/cjs/desk/target.native.js +5 -0
  36. package/dist/cjs/desk/target.native.js.map +1 -1
  37. package/dist/cjs/form/DocFormScreen.cjs +24 -3
  38. package/dist/cjs/form/DocFormScreen.native.js +27 -6
  39. package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
  40. package/dist/cjs/form/FormConnections.cjs +2 -2
  41. package/dist/cjs/form/FormConnections.native.js +2 -2
  42. package/dist/cjs/form/FormConnections.native.js.map +1 -1
  43. package/dist/cjs/form/FormErrorBoundary.cjs +1 -1
  44. package/dist/cjs/form/FormErrorBoundary.native.js +1 -1
  45. package/dist/cjs/form/FormErrorBoundary.native.js.map +1 -1
  46. package/dist/cjs/form/FormSidebarPanel.cjs +1 -1
  47. package/dist/cjs/form/FormSidebarPanel.native.js +1 -1
  48. package/dist/cjs/form/FormSidebarPanel.native.js.map +1 -1
  49. package/dist/cjs/form/FormTimeline.cjs +1 -2
  50. package/dist/cjs/form/FormTimeline.native.js +1 -2
  51. package/dist/cjs/form/FormTimeline.native.js.map +1 -1
  52. package/dist/cjs/form/FormToolbar.cjs +97 -87
  53. package/dist/cjs/form/FormToolbar.native.js +98 -94
  54. package/dist/cjs/form/FormToolbar.native.js.map +1 -1
  55. package/dist/cjs/formBuilder/DoctypePicker.cjs +89 -0
  56. package/dist/cjs/formBuilder/DoctypePicker.native.js +98 -0
  57. package/dist/cjs/formBuilder/DoctypePicker.native.js.map +1 -0
  58. package/dist/cjs/formBuilder/FieldPalette.cjs +148 -0
  59. package/dist/cjs/formBuilder/FieldPalette.native.js +165 -0
  60. package/dist/cjs/formBuilder/FieldPalette.native.js.map +1 -0
  61. package/dist/cjs/formBuilder/FieldPropertiesPanel.cjs +186 -0
  62. package/dist/cjs/formBuilder/FieldPropertiesPanel.native.js +237 -0
  63. package/dist/cjs/formBuilder/FieldPropertiesPanel.native.js.map +1 -0
  64. package/dist/cjs/formBuilder/FormBuilderCanvas.cjs +407 -0
  65. package/dist/cjs/formBuilder/FormBuilderCanvas.native.js +472 -0
  66. package/dist/cjs/formBuilder/FormBuilderCanvas.native.js.map +1 -0
  67. package/dist/cjs/formBuilder/FormBuilderScreen.cjs +448 -0
  68. package/dist/cjs/formBuilder/FormBuilderScreen.native.js +537 -0
  69. package/dist/cjs/formBuilder/FormBuilderScreen.native.js.map +1 -0
  70. package/dist/cjs/formBuilder/api.cjs +160 -0
  71. package/dist/cjs/formBuilder/api.native.js +193 -0
  72. package/dist/cjs/formBuilder/api.native.js.map +1 -0
  73. package/dist/cjs/formBuilder/fieldtypes.cjs +114 -0
  74. package/dist/cjs/formBuilder/fieldtypes.native.js +133 -0
  75. package/dist/cjs/formBuilder/fieldtypes.native.js.map +1 -0
  76. package/dist/cjs/formBuilder/index.cjs +68 -0
  77. package/dist/cjs/formBuilder/index.native.js +71 -0
  78. package/dist/cjs/formBuilder/index.native.js.map +1 -0
  79. package/dist/cjs/formBuilder/model.cjs +466 -0
  80. package/dist/cjs/formBuilder/model.native.js +714 -0
  81. package/dist/cjs/formBuilder/model.native.js.map +1 -0
  82. package/dist/cjs/formBuilder/useFormBuilderDrag.cjs +399 -0
  83. package/dist/cjs/formBuilder/useFormBuilderDrag.native.js +434 -0
  84. package/dist/cjs/formBuilder/useFormBuilderDrag.native.js.map +1 -0
  85. package/dist/cjs/i18n/en.cjs +294 -4
  86. package/dist/cjs/i18n/en.native.js +294 -4
  87. package/dist/cjs/i18n/en.native.js.map +1 -1
  88. package/dist/cjs/index.cjs +41 -1
  89. package/dist/cjs/index.native.js +40 -0
  90. package/dist/cjs/index.native.js.map +1 -1
  91. package/dist/cjs/list/DoctypeListScreen.cjs +138 -40
  92. package/dist/cjs/list/DoctypeListScreen.native.js +155 -55
  93. package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
  94. package/dist/cjs/list/ListFilterBar.cjs +8 -4
  95. package/dist/cjs/list/ListFilterBar.native.js +8 -4
  96. package/dist/cjs/list/ListFilterBar.native.js.map +1 -1
  97. package/dist/cjs/list/ListSidebar.cjs +4 -3
  98. package/dist/cjs/list/ListSidebar.native.js +4 -3
  99. package/dist/cjs/list/ListSidebar.native.js.map +1 -1
  100. package/dist/cjs/list/filter-chips.cjs +10 -4
  101. package/dist/cjs/list/filter-chips.native.js +10 -4
  102. package/dist/cjs/list/filter-chips.native.js.map +1 -1
  103. package/dist/cjs/list/filter-editor.cjs +1 -10
  104. package/dist/cjs/list/filter-editor.native.js +1 -10
  105. package/dist/cjs/list/filter-editor.native.js.map +1 -1
  106. package/dist/cjs/list/filter-saved.cjs +0 -1
  107. package/dist/cjs/list/filter-saved.native.js +0 -1
  108. package/dist/cjs/list/filter-saved.native.js.map +1 -1
  109. package/dist/cjs/list/filter-sort.cjs +0 -1
  110. package/dist/cjs/list/filter-sort.native.js +0 -1
  111. package/dist/cjs/list/filter-sort.native.js.map +1 -1
  112. package/dist/cjs/list/filter-standard.cjs +1 -3
  113. package/dist/cjs/list/filter-standard.native.js +1 -3
  114. package/dist/cjs/list/filter-standard.native.js.map +1 -1
  115. package/dist/cjs/list/list-tools-sheet.cjs +10 -3
  116. package/dist/cjs/list/list-tools-sheet.native.js +12 -3
  117. package/dist/cjs/list/list-tools-sheet.native.js.map +1 -1
  118. package/dist/cjs/navigation/paths.cjs +5 -0
  119. package/dist/cjs/navigation/paths.native.js +7 -0
  120. package/dist/cjs/navigation/paths.native.js.map +1 -1
  121. package/dist/cjs/report/QueryReportScreen.cjs +1 -1
  122. package/dist/cjs/report/QueryReportScreen.native.js +1 -1
  123. package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
  124. package/dist/cjs/report/queryReportFilterBar.cjs +3 -8
  125. package/dist/cjs/report/queryReportFilterBar.native.js +3 -8
  126. package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
  127. package/dist/cjs/shared/sessionUser.cjs +21 -3
  128. package/dist/cjs/shared/sessionUser.native.js +44 -3
  129. package/dist/cjs/shared/sessionUser.native.js.map +1 -1
  130. package/dist/cjs/shell/BackofficeShell.cjs +127 -88
  131. package/dist/cjs/shell/BackofficeShell.native.js +144 -101
  132. package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
  133. package/dist/cjs/shell/HomeRedirect.cjs +17 -21
  134. package/dist/cjs/shell/HomeRedirect.native.js +17 -20
  135. package/dist/cjs/shell/HomeRedirect.native.js.map +1 -1
  136. package/dist/cjs/shell/WorkspaceSidebar.cjs +53 -25
  137. package/dist/cjs/shell/WorkspaceSidebar.native.js +55 -25
  138. package/dist/cjs/shell/WorkspaceSidebar.native.js.map +1 -1
  139. package/dist/cjs/shell/shellSidebarSlot.cjs +31 -0
  140. package/dist/cjs/shell/shellSidebarSlot.native.js +34 -0
  141. package/dist/cjs/shell/shellSidebarSlot.native.js.map +1 -0
  142. package/dist/cjs/shell/useWorkspaces.cjs +23 -6
  143. package/dist/cjs/shell/useWorkspaces.native.js +25 -6
  144. package/dist/cjs/shell/useWorkspaces.native.js.map +1 -1
  145. package/dist/cjs/views/DashboardView.cjs +2 -2
  146. package/dist/cjs/views/DashboardView.native.js +2 -2
  147. package/dist/cjs/views/DashboardView.native.js.map +1 -1
  148. package/dist/cjs/views/ImageView.cjs +14 -5
  149. package/dist/cjs/views/ImageView.native.js +14 -5
  150. package/dist/cjs/views/ImageView.native.js.map +1 -1
  151. package/dist/cjs/views/ViewHeader.cjs +17 -6
  152. package/dist/cjs/views/ViewHeader.native.js +17 -6
  153. package/dist/cjs/views/ViewHeader.native.js.map +1 -1
  154. package/dist/cjs/views/ViewSwitcherMenu.cjs +10 -9
  155. package/dist/cjs/views/ViewSwitcherMenu.native.js +10 -9
  156. package/dist/cjs/views/ViewSwitcherMenu.native.js.map +1 -1
  157. package/dist/cjs/views/viewAvailability.cjs +17 -9
  158. package/dist/cjs/views/viewAvailability.native.js +18 -8
  159. package/dist/cjs/views/viewAvailability.native.js.map +1 -1
  160. package/dist/cjs/views/viewMeta.cjs +24 -1
  161. package/dist/cjs/views/viewMeta.native.js +30 -1
  162. package/dist/cjs/views/viewMeta.native.js.map +1 -1
  163. package/dist/cjs/workspace/WorkspaceChartBlock.cjs +1 -1
  164. package/dist/cjs/workspace/WorkspaceChartBlock.native.js +1 -1
  165. package/dist/cjs/workspace/WorkspaceChartBlock.native.js.map +1 -1
  166. package/dist/cjs/workspace/WorkspaceLinkDirectory.cjs +2 -2
  167. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js +2 -2
  168. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  169. package/dist/cjs/workspace/WorkspaceRecents.cjs +1 -1
  170. package/dist/cjs/workspace/WorkspaceRecents.native.js +1 -1
  171. package/dist/cjs/workspace/WorkspaceRecents.native.js.map +1 -1
  172. package/dist/cjs/workspace/WorkspaceShortcut.cjs +1 -1
  173. package/dist/cjs/workspace/WorkspaceShortcut.native.js +1 -1
  174. package/dist/cjs/workspace/WorkspaceShortcut.native.js.map +1 -1
  175. package/dist/esm/chrome/BackofficeAwesomebar.mjs +9 -4
  176. package/dist/esm/chrome/BackofficeAwesomebar.mjs.map +1 -1
  177. package/dist/esm/chrome/BackofficeAwesomebar.native.js +9 -4
  178. package/dist/esm/chrome/BackofficeAwesomebar.native.js.map +1 -1
  179. package/dist/esm/chrome/CommandPalette.mjs +21 -17
  180. package/dist/esm/chrome/CommandPalette.mjs.map +1 -1
  181. package/dist/esm/chrome/CommandPalette.native.js +23 -17
  182. package/dist/esm/chrome/CommandPalette.native.js.map +1 -1
  183. package/dist/esm/chrome/NotificationsButton.mjs +3 -2
  184. package/dist/esm/chrome/NotificationsButton.mjs.map +1 -1
  185. package/dist/esm/chrome/NotificationsButton.native.js +3 -2
  186. package/dist/esm/chrome/NotificationsButton.native.js.map +1 -1
  187. package/dist/esm/chrome/UserMenu.mjs +145 -79
  188. package/dist/esm/chrome/UserMenu.mjs.map +1 -1
  189. package/dist/esm/chrome/UserMenu.native.js +159 -92
  190. package/dist/esm/chrome/UserMenu.native.js.map +1 -1
  191. package/dist/esm/chrome/notifications-panel.mjs +4 -5
  192. package/dist/esm/chrome/notifications-panel.mjs.map +1 -1
  193. package/dist/esm/chrome/notifications-panel.native.js +4 -5
  194. package/dist/esm/chrome/notifications-panel.native.js.map +1 -1
  195. package/dist/esm/chrome/user-session.mjs +3 -2
  196. package/dist/esm/chrome/user-session.mjs.map +1 -1
  197. package/dist/esm/chrome/user-session.native.js +3 -2
  198. package/dist/esm/chrome/user-session.native.js.map +1 -1
  199. package/dist/esm/config/BackofficeProvider.mjs +3 -1
  200. package/dist/esm/config/BackofficeProvider.mjs.map +1 -1
  201. package/dist/esm/config/BackofficeProvider.native.js +3 -1
  202. package/dist/esm/config/BackofficeProvider.native.js.map +1 -1
  203. package/dist/esm/config/capabilities.mjs +3 -0
  204. package/dist/esm/config/capabilities.mjs.map +1 -1
  205. package/dist/esm/config/capabilities.native.js +3 -0
  206. package/dist/esm/config/capabilities.native.js.map +1 -1
  207. package/dist/esm/desk/Desk.mjs +17 -0
  208. package/dist/esm/desk/Desk.mjs.map +1 -1
  209. package/dist/esm/desk/Desk.native.js +17 -0
  210. package/dist/esm/desk/Desk.native.js.map +1 -1
  211. package/dist/esm/desk/DeskSurface.mjs +10 -0
  212. package/dist/esm/desk/DeskSurface.mjs.map +1 -1
  213. package/dist/esm/desk/DeskSurface.native.js +10 -0
  214. package/dist/esm/desk/DeskSurface.native.js.map +1 -1
  215. package/dist/esm/desk/resolveDeskPath.mjs +6 -0
  216. package/dist/esm/desk/resolveDeskPath.mjs.map +1 -1
  217. package/dist/esm/desk/resolveDeskPath.native.js +6 -0
  218. package/dist/esm/desk/resolveDeskPath.native.js.map +1 -1
  219. package/dist/esm/desk/target.mjs +5 -0
  220. package/dist/esm/desk/target.mjs.map +1 -1
  221. package/dist/esm/desk/target.native.js +5 -0
  222. package/dist/esm/desk/target.native.js.map +1 -1
  223. package/dist/esm/form/DocFormScreen.mjs +24 -3
  224. package/dist/esm/form/DocFormScreen.mjs.map +1 -1
  225. package/dist/esm/form/DocFormScreen.native.js +27 -6
  226. package/dist/esm/form/DocFormScreen.native.js.map +1 -1
  227. package/dist/esm/form/FormConnections.mjs +2 -2
  228. package/dist/esm/form/FormConnections.mjs.map +1 -1
  229. package/dist/esm/form/FormConnections.native.js +2 -2
  230. package/dist/esm/form/FormConnections.native.js.map +1 -1
  231. package/dist/esm/form/FormErrorBoundary.mjs +1 -1
  232. package/dist/esm/form/FormErrorBoundary.mjs.map +1 -1
  233. package/dist/esm/form/FormErrorBoundary.native.js +1 -1
  234. package/dist/esm/form/FormErrorBoundary.native.js.map +1 -1
  235. package/dist/esm/form/FormSidebarPanel.mjs +1 -1
  236. package/dist/esm/form/FormSidebarPanel.mjs.map +1 -1
  237. package/dist/esm/form/FormSidebarPanel.native.js +1 -1
  238. package/dist/esm/form/FormSidebarPanel.native.js.map +1 -1
  239. package/dist/esm/form/FormTimeline.mjs +1 -2
  240. package/dist/esm/form/FormTimeline.mjs.map +1 -1
  241. package/dist/esm/form/FormTimeline.native.js +1 -2
  242. package/dist/esm/form/FormTimeline.native.js.map +1 -1
  243. package/dist/esm/form/FormToolbar.mjs +99 -89
  244. package/dist/esm/form/FormToolbar.mjs.map +1 -1
  245. package/dist/esm/form/FormToolbar.native.js +100 -96
  246. package/dist/esm/form/FormToolbar.native.js.map +1 -1
  247. package/dist/esm/formBuilder/DoctypePicker.mjs +64 -0
  248. package/dist/esm/formBuilder/DoctypePicker.mjs.map +1 -0
  249. package/dist/esm/formBuilder/DoctypePicker.native.js +70 -0
  250. package/dist/esm/formBuilder/DoctypePicker.native.js.map +1 -0
  251. package/dist/esm/formBuilder/FieldPalette.mjs +123 -0
  252. package/dist/esm/formBuilder/FieldPalette.mjs.map +1 -0
  253. package/dist/esm/formBuilder/FieldPalette.native.js +137 -0
  254. package/dist/esm/formBuilder/FieldPalette.native.js.map +1 -0
  255. package/dist/esm/formBuilder/FieldPropertiesPanel.mjs +161 -0
  256. package/dist/esm/formBuilder/FieldPropertiesPanel.mjs.map +1 -0
  257. package/dist/esm/formBuilder/FieldPropertiesPanel.native.js +209 -0
  258. package/dist/esm/formBuilder/FieldPropertiesPanel.native.js.map +1 -0
  259. package/dist/esm/formBuilder/FormBuilderCanvas.mjs +382 -0
  260. package/dist/esm/formBuilder/FormBuilderCanvas.mjs.map +1 -0
  261. package/dist/esm/formBuilder/FormBuilderCanvas.native.js +444 -0
  262. package/dist/esm/formBuilder/FormBuilderCanvas.native.js.map +1 -0
  263. package/dist/esm/formBuilder/FormBuilderScreen.mjs +423 -0
  264. package/dist/esm/formBuilder/FormBuilderScreen.mjs.map +1 -0
  265. package/dist/esm/formBuilder/FormBuilderScreen.native.js +509 -0
  266. package/dist/esm/formBuilder/FormBuilderScreen.native.js.map +1 -0
  267. package/dist/esm/formBuilder/api.mjs +129 -0
  268. package/dist/esm/formBuilder/api.mjs.map +1 -0
  269. package/dist/esm/formBuilder/api.native.js +159 -0
  270. package/dist/esm/formBuilder/api.native.js.map +1 -0
  271. package/dist/esm/formBuilder/fieldtypes.mjs +82 -0
  272. package/dist/esm/formBuilder/fieldtypes.mjs.map +1 -0
  273. package/dist/esm/formBuilder/fieldtypes.native.js +98 -0
  274. package/dist/esm/formBuilder/fieldtypes.native.js.map +1 -0
  275. package/dist/esm/formBuilder/index.mjs +6 -0
  276. package/dist/esm/formBuilder/index.mjs.map +1 -0
  277. package/dist/esm/formBuilder/index.native.js +6 -0
  278. package/dist/esm/formBuilder/index.native.js.map +1 -0
  279. package/dist/esm/formBuilder/model.mjs +420 -0
  280. package/dist/esm/formBuilder/model.mjs.map +1 -0
  281. package/dist/esm/formBuilder/model.native.js +665 -0
  282. package/dist/esm/formBuilder/model.native.js.map +1 -0
  283. package/dist/esm/formBuilder/useFormBuilderDrag.mjs +374 -0
  284. package/dist/esm/formBuilder/useFormBuilderDrag.mjs.map +1 -0
  285. package/dist/esm/formBuilder/useFormBuilderDrag.native.js +406 -0
  286. package/dist/esm/formBuilder/useFormBuilderDrag.native.js.map +1 -0
  287. package/dist/esm/i18n/en.mjs +294 -4
  288. package/dist/esm/i18n/en.mjs.map +1 -1
  289. package/dist/esm/i18n/en.native.js +294 -4
  290. package/dist/esm/i18n/en.native.js.map +1 -1
  291. package/dist/esm/index.mjs +3 -2
  292. package/dist/esm/index.mjs.map +1 -1
  293. package/dist/esm/index.native.js +3 -2
  294. package/dist/esm/index.native.js.map +1 -1
  295. package/dist/esm/list/DoctypeListScreen.mjs +141 -43
  296. package/dist/esm/list/DoctypeListScreen.mjs.map +1 -1
  297. package/dist/esm/list/DoctypeListScreen.native.js +158 -58
  298. package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
  299. package/dist/esm/list/ListFilterBar.mjs +9 -5
  300. package/dist/esm/list/ListFilterBar.mjs.map +1 -1
  301. package/dist/esm/list/ListFilterBar.native.js +9 -5
  302. package/dist/esm/list/ListFilterBar.native.js.map +1 -1
  303. package/dist/esm/list/ListSidebar.mjs +4 -3
  304. package/dist/esm/list/ListSidebar.mjs.map +1 -1
  305. package/dist/esm/list/ListSidebar.native.js +4 -3
  306. package/dist/esm/list/ListSidebar.native.js.map +1 -1
  307. package/dist/esm/list/filter-chips.mjs +10 -4
  308. package/dist/esm/list/filter-chips.mjs.map +1 -1
  309. package/dist/esm/list/filter-chips.native.js +10 -4
  310. package/dist/esm/list/filter-chips.native.js.map +1 -1
  311. package/dist/esm/list/filter-editor.mjs +1 -10
  312. package/dist/esm/list/filter-editor.mjs.map +1 -1
  313. package/dist/esm/list/filter-editor.native.js +1 -10
  314. package/dist/esm/list/filter-editor.native.js.map +1 -1
  315. package/dist/esm/list/filter-saved.mjs +0 -1
  316. package/dist/esm/list/filter-saved.mjs.map +1 -1
  317. package/dist/esm/list/filter-saved.native.js +0 -1
  318. package/dist/esm/list/filter-saved.native.js.map +1 -1
  319. package/dist/esm/list/filter-sort.mjs +0 -1
  320. package/dist/esm/list/filter-sort.mjs.map +1 -1
  321. package/dist/esm/list/filter-sort.native.js +0 -1
  322. package/dist/esm/list/filter-sort.native.js.map +1 -1
  323. package/dist/esm/list/filter-standard.mjs +1 -3
  324. package/dist/esm/list/filter-standard.mjs.map +1 -1
  325. package/dist/esm/list/filter-standard.native.js +1 -3
  326. package/dist/esm/list/filter-standard.native.js.map +1 -1
  327. package/dist/esm/list/list-tools-sheet.mjs +10 -3
  328. package/dist/esm/list/list-tools-sheet.mjs.map +1 -1
  329. package/dist/esm/list/list-tools-sheet.native.js +12 -3
  330. package/dist/esm/list/list-tools-sheet.native.js.map +1 -1
  331. package/dist/esm/navigation/paths.mjs +5 -1
  332. package/dist/esm/navigation/paths.mjs.map +1 -1
  333. package/dist/esm/navigation/paths.native.js +7 -1
  334. package/dist/esm/navigation/paths.native.js.map +1 -1
  335. package/dist/esm/report/QueryReportScreen.mjs +1 -1
  336. package/dist/esm/report/QueryReportScreen.mjs.map +1 -1
  337. package/dist/esm/report/QueryReportScreen.native.js +1 -1
  338. package/dist/esm/report/QueryReportScreen.native.js.map +1 -1
  339. package/dist/esm/report/queryReportFilterBar.mjs +3 -8
  340. package/dist/esm/report/queryReportFilterBar.mjs.map +1 -1
  341. package/dist/esm/report/queryReportFilterBar.native.js +3 -8
  342. package/dist/esm/report/queryReportFilterBar.native.js.map +1 -1
  343. package/dist/esm/shared/sessionUser.mjs +21 -4
  344. package/dist/esm/shared/sessionUser.mjs.map +1 -1
  345. package/dist/esm/shared/sessionUser.native.js +44 -4
  346. package/dist/esm/shared/sessionUser.native.js.map +1 -1
  347. package/dist/esm/shell/BackofficeShell.mjs +130 -91
  348. package/dist/esm/shell/BackofficeShell.mjs.map +1 -1
  349. package/dist/esm/shell/BackofficeShell.native.js +147 -104
  350. package/dist/esm/shell/BackofficeShell.native.js.map +1 -1
  351. package/dist/esm/shell/HomeRedirect.mjs +20 -24
  352. package/dist/esm/shell/HomeRedirect.mjs.map +1 -1
  353. package/dist/esm/shell/HomeRedirect.native.js +20 -23
  354. package/dist/esm/shell/HomeRedirect.native.js.map +1 -1
  355. package/dist/esm/shell/WorkspaceSidebar.mjs +55 -27
  356. package/dist/esm/shell/WorkspaceSidebar.mjs.map +1 -1
  357. package/dist/esm/shell/WorkspaceSidebar.native.js +57 -27
  358. package/dist/esm/shell/WorkspaceSidebar.native.js.map +1 -1
  359. package/dist/esm/shell/shellSidebarSlot.mjs +3 -0
  360. package/dist/esm/shell/shellSidebarSlot.mjs.map +1 -0
  361. package/dist/esm/shell/shellSidebarSlot.native.js +3 -0
  362. package/dist/esm/shell/shellSidebarSlot.native.js.map +1 -0
  363. package/dist/esm/shell/useWorkspaces.mjs +25 -8
  364. package/dist/esm/shell/useWorkspaces.mjs.map +1 -1
  365. package/dist/esm/shell/useWorkspaces.native.js +27 -8
  366. package/dist/esm/shell/useWorkspaces.native.js.map +1 -1
  367. package/dist/esm/views/DashboardView.mjs +2 -2
  368. package/dist/esm/views/DashboardView.mjs.map +1 -1
  369. package/dist/esm/views/DashboardView.native.js +2 -2
  370. package/dist/esm/views/DashboardView.native.js.map +1 -1
  371. package/dist/esm/views/ImageView.mjs +15 -6
  372. package/dist/esm/views/ImageView.mjs.map +1 -1
  373. package/dist/esm/views/ImageView.native.js +15 -6
  374. package/dist/esm/views/ImageView.native.js.map +1 -1
  375. package/dist/esm/views/ViewHeader.mjs +18 -7
  376. package/dist/esm/views/ViewHeader.mjs.map +1 -1
  377. package/dist/esm/views/ViewHeader.native.js +18 -7
  378. package/dist/esm/views/ViewHeader.native.js.map +1 -1
  379. package/dist/esm/views/ViewSwitcherMenu.mjs +11 -10
  380. package/dist/esm/views/ViewSwitcherMenu.mjs.map +1 -1
  381. package/dist/esm/views/ViewSwitcherMenu.native.js +11 -10
  382. package/dist/esm/views/ViewSwitcherMenu.native.js.map +1 -1
  383. package/dist/esm/views/viewAvailability.mjs +17 -9
  384. package/dist/esm/views/viewAvailability.mjs.map +1 -1
  385. package/dist/esm/views/viewAvailability.native.js +18 -8
  386. package/dist/esm/views/viewAvailability.native.js.map +1 -1
  387. package/dist/esm/views/viewMeta.mjs +23 -1
  388. package/dist/esm/views/viewMeta.mjs.map +1 -1
  389. package/dist/esm/views/viewMeta.native.js +29 -1
  390. package/dist/esm/views/viewMeta.native.js.map +1 -1
  391. package/dist/esm/workspace/WorkspaceChartBlock.mjs +1 -1
  392. package/dist/esm/workspace/WorkspaceChartBlock.mjs.map +1 -1
  393. package/dist/esm/workspace/WorkspaceChartBlock.native.js +1 -1
  394. package/dist/esm/workspace/WorkspaceChartBlock.native.js.map +1 -1
  395. package/dist/esm/workspace/WorkspaceLinkDirectory.mjs +2 -2
  396. package/dist/esm/workspace/WorkspaceLinkDirectory.mjs.map +1 -1
  397. package/dist/esm/workspace/WorkspaceLinkDirectory.native.js +2 -2
  398. package/dist/esm/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  399. package/dist/esm/workspace/WorkspaceRecents.mjs +2 -2
  400. package/dist/esm/workspace/WorkspaceRecents.mjs.map +1 -1
  401. package/dist/esm/workspace/WorkspaceRecents.native.js +2 -2
  402. package/dist/esm/workspace/WorkspaceRecents.native.js.map +1 -1
  403. package/dist/esm/workspace/WorkspaceShortcut.mjs +2 -2
  404. package/dist/esm/workspace/WorkspaceShortcut.mjs.map +1 -1
  405. package/dist/esm/workspace/WorkspaceShortcut.native.js +2 -2
  406. package/dist/esm/workspace/WorkspaceShortcut.native.js.map +1 -1
  407. package/dist/jsx/chrome/BackofficeAwesomebar.mjs +9 -4
  408. package/dist/jsx/chrome/BackofficeAwesomebar.mjs.map +1 -1
  409. package/dist/jsx/chrome/BackofficeAwesomebar.native.js +8 -3
  410. package/dist/jsx/chrome/BackofficeAwesomebar.native.js.map +1 -1
  411. package/dist/jsx/chrome/CommandPalette.mjs +21 -17
  412. package/dist/jsx/chrome/CommandPalette.mjs.map +1 -1
  413. package/dist/jsx/chrome/CommandPalette.native.js +21 -15
  414. package/dist/jsx/chrome/CommandPalette.native.js.map +1 -1
  415. package/dist/jsx/chrome/NotificationsButton.mjs +3 -2
  416. package/dist/jsx/chrome/NotificationsButton.mjs.map +1 -1
  417. package/dist/jsx/chrome/NotificationsButton.native.js +2 -1
  418. package/dist/jsx/chrome/NotificationsButton.native.js.map +1 -1
  419. package/dist/jsx/chrome/UserMenu.mjs +145 -79
  420. package/dist/jsx/chrome/UserMenu.mjs.map +1 -1
  421. package/dist/jsx/chrome/UserMenu.native.js +157 -90
  422. package/dist/jsx/chrome/UserMenu.native.js.map +1 -1
  423. package/dist/jsx/chrome/notifications-panel.mjs +4 -5
  424. package/dist/jsx/chrome/notifications-panel.mjs.map +1 -1
  425. package/dist/jsx/chrome/notifications-panel.native.js +3 -4
  426. package/dist/jsx/chrome/notifications-panel.native.js.map +1 -1
  427. package/dist/jsx/chrome/user-session.mjs +3 -2
  428. package/dist/jsx/chrome/user-session.mjs.map +1 -1
  429. package/dist/jsx/chrome/user-session.native.js +2 -1
  430. package/dist/jsx/chrome/user-session.native.js.map +1 -1
  431. package/dist/jsx/config/BackofficeProvider.mjs +3 -1
  432. package/dist/jsx/config/BackofficeProvider.mjs.map +1 -1
  433. package/dist/jsx/config/BackofficeProvider.native.js +3 -1
  434. package/dist/jsx/config/BackofficeProvider.native.js.map +1 -1
  435. package/dist/jsx/config/capabilities.mjs +3 -0
  436. package/dist/jsx/config/capabilities.mjs.map +1 -1
  437. package/dist/jsx/config/capabilities.native.js +3 -0
  438. package/dist/jsx/config/capabilities.native.js.map +1 -1
  439. package/dist/jsx/desk/Desk.mjs +17 -0
  440. package/dist/jsx/desk/Desk.mjs.map +1 -1
  441. package/dist/jsx/desk/Desk.native.js +17 -0
  442. package/dist/jsx/desk/Desk.native.js.map +1 -1
  443. package/dist/jsx/desk/DeskSurface.mjs +10 -0
  444. package/dist/jsx/desk/DeskSurface.mjs.map +1 -1
  445. package/dist/jsx/desk/DeskSurface.native.js +10 -0
  446. package/dist/jsx/desk/DeskSurface.native.js.map +1 -1
  447. package/dist/jsx/desk/resolveDeskPath.mjs +6 -0
  448. package/dist/jsx/desk/resolveDeskPath.mjs.map +1 -1
  449. package/dist/jsx/desk/resolveDeskPath.native.js +6 -0
  450. package/dist/jsx/desk/resolveDeskPath.native.js.map +1 -1
  451. package/dist/jsx/desk/target.mjs +5 -0
  452. package/dist/jsx/desk/target.mjs.map +1 -1
  453. package/dist/jsx/desk/target.native.js +5 -0
  454. package/dist/jsx/desk/target.native.js.map +1 -1
  455. package/dist/jsx/form/DocFormScreen.mjs +24 -3
  456. package/dist/jsx/form/DocFormScreen.mjs.map +1 -1
  457. package/dist/jsx/form/DocFormScreen.native.js +27 -6
  458. package/dist/jsx/form/DocFormScreen.native.js.map +1 -1
  459. package/dist/jsx/form/FormConnections.mjs +2 -2
  460. package/dist/jsx/form/FormConnections.mjs.map +1 -1
  461. package/dist/jsx/form/FormConnections.native.js +2 -2
  462. package/dist/jsx/form/FormConnections.native.js.map +1 -1
  463. package/dist/jsx/form/FormErrorBoundary.mjs +1 -1
  464. package/dist/jsx/form/FormErrorBoundary.mjs.map +1 -1
  465. package/dist/jsx/form/FormErrorBoundary.native.js +1 -1
  466. package/dist/jsx/form/FormErrorBoundary.native.js.map +1 -1
  467. package/dist/jsx/form/FormSidebarPanel.mjs +1 -1
  468. package/dist/jsx/form/FormSidebarPanel.mjs.map +1 -1
  469. package/dist/jsx/form/FormSidebarPanel.native.js +1 -1
  470. package/dist/jsx/form/FormSidebarPanel.native.js.map +1 -1
  471. package/dist/jsx/form/FormTimeline.mjs +1 -2
  472. package/dist/jsx/form/FormTimeline.mjs.map +1 -1
  473. package/dist/jsx/form/FormTimeline.native.js +1 -2
  474. package/dist/jsx/form/FormTimeline.native.js.map +1 -1
  475. package/dist/jsx/form/FormToolbar.mjs +99 -89
  476. package/dist/jsx/form/FormToolbar.mjs.map +1 -1
  477. package/dist/jsx/form/FormToolbar.native.js +98 -94
  478. package/dist/jsx/form/FormToolbar.native.js.map +1 -1
  479. package/dist/jsx/formBuilder/DoctypePicker.mjs +64 -0
  480. package/dist/jsx/formBuilder/DoctypePicker.mjs.map +1 -0
  481. package/dist/jsx/formBuilder/DoctypePicker.native.js +98 -0
  482. package/dist/jsx/formBuilder/DoctypePicker.native.js.map +1 -0
  483. package/dist/jsx/formBuilder/FieldPalette.mjs +123 -0
  484. package/dist/jsx/formBuilder/FieldPalette.mjs.map +1 -0
  485. package/dist/jsx/formBuilder/FieldPalette.native.js +165 -0
  486. package/dist/jsx/formBuilder/FieldPalette.native.js.map +1 -0
  487. package/dist/jsx/formBuilder/FieldPropertiesPanel.mjs +161 -0
  488. package/dist/jsx/formBuilder/FieldPropertiesPanel.mjs.map +1 -0
  489. package/dist/jsx/formBuilder/FieldPropertiesPanel.native.js +237 -0
  490. package/dist/jsx/formBuilder/FieldPropertiesPanel.native.js.map +1 -0
  491. package/dist/jsx/formBuilder/FormBuilderCanvas.mjs +382 -0
  492. package/dist/jsx/formBuilder/FormBuilderCanvas.mjs.map +1 -0
  493. package/dist/jsx/formBuilder/FormBuilderCanvas.native.js +472 -0
  494. package/dist/jsx/formBuilder/FormBuilderCanvas.native.js.map +1 -0
  495. package/dist/jsx/formBuilder/FormBuilderScreen.mjs +423 -0
  496. package/dist/jsx/formBuilder/FormBuilderScreen.mjs.map +1 -0
  497. package/dist/jsx/formBuilder/FormBuilderScreen.native.js +537 -0
  498. package/dist/jsx/formBuilder/FormBuilderScreen.native.js.map +1 -0
  499. package/dist/jsx/formBuilder/api.mjs +129 -0
  500. package/dist/jsx/formBuilder/api.mjs.map +1 -0
  501. package/dist/jsx/formBuilder/api.native.js +193 -0
  502. package/dist/jsx/formBuilder/api.native.js.map +1 -0
  503. package/dist/jsx/formBuilder/fieldtypes.mjs +82 -0
  504. package/dist/jsx/formBuilder/fieldtypes.mjs.map +1 -0
  505. package/dist/jsx/formBuilder/fieldtypes.native.js +133 -0
  506. package/dist/jsx/formBuilder/fieldtypes.native.js.map +1 -0
  507. package/dist/jsx/formBuilder/index.mjs +6 -0
  508. package/dist/jsx/formBuilder/index.mjs.map +1 -0
  509. package/dist/jsx/formBuilder/index.native.js +71 -0
  510. package/dist/jsx/formBuilder/index.native.js.map +1 -0
  511. package/dist/jsx/formBuilder/model.mjs +420 -0
  512. package/dist/jsx/formBuilder/model.mjs.map +1 -0
  513. package/dist/jsx/formBuilder/model.native.js +714 -0
  514. package/dist/jsx/formBuilder/model.native.js.map +1 -0
  515. package/dist/jsx/formBuilder/useFormBuilderDrag.mjs +374 -0
  516. package/dist/jsx/formBuilder/useFormBuilderDrag.mjs.map +1 -0
  517. package/dist/jsx/formBuilder/useFormBuilderDrag.native.js +434 -0
  518. package/dist/jsx/formBuilder/useFormBuilderDrag.native.js.map +1 -0
  519. package/dist/jsx/i18n/en.mjs +294 -4
  520. package/dist/jsx/i18n/en.mjs.map +1 -1
  521. package/dist/jsx/i18n/en.native.js +294 -4
  522. package/dist/jsx/i18n/en.native.js.map +1 -1
  523. package/dist/jsx/index.js +3 -2
  524. package/dist/jsx/index.js.map +1 -1
  525. package/dist/jsx/index.mjs +3 -2
  526. package/dist/jsx/index.mjs.map +1 -1
  527. package/dist/jsx/index.native.js +40 -0
  528. package/dist/jsx/index.native.js.map +1 -1
  529. package/dist/jsx/list/DoctypeListScreen.mjs +141 -43
  530. package/dist/jsx/list/DoctypeListScreen.mjs.map +1 -1
  531. package/dist/jsx/list/DoctypeListScreen.native.js +155 -55
  532. package/dist/jsx/list/DoctypeListScreen.native.js.map +1 -1
  533. package/dist/jsx/list/ListFilterBar.mjs +9 -5
  534. package/dist/jsx/list/ListFilterBar.mjs.map +1 -1
  535. package/dist/jsx/list/ListFilterBar.native.js +8 -4
  536. package/dist/jsx/list/ListFilterBar.native.js.map +1 -1
  537. package/dist/jsx/list/ListSidebar.mjs +4 -3
  538. package/dist/jsx/list/ListSidebar.mjs.map +1 -1
  539. package/dist/jsx/list/ListSidebar.native.js +4 -3
  540. package/dist/jsx/list/ListSidebar.native.js.map +1 -1
  541. package/dist/jsx/list/filter-chips.mjs +10 -4
  542. package/dist/jsx/list/filter-chips.mjs.map +1 -1
  543. package/dist/jsx/list/filter-chips.native.js +10 -4
  544. package/dist/jsx/list/filter-chips.native.js.map +1 -1
  545. package/dist/jsx/list/filter-editor.mjs +1 -10
  546. package/dist/jsx/list/filter-editor.mjs.map +1 -1
  547. package/dist/jsx/list/filter-editor.native.js +1 -10
  548. package/dist/jsx/list/filter-editor.native.js.map +1 -1
  549. package/dist/jsx/list/filter-saved.mjs +0 -1
  550. package/dist/jsx/list/filter-saved.mjs.map +1 -1
  551. package/dist/jsx/list/filter-saved.native.js +0 -1
  552. package/dist/jsx/list/filter-saved.native.js.map +1 -1
  553. package/dist/jsx/list/filter-sort.mjs +0 -1
  554. package/dist/jsx/list/filter-sort.mjs.map +1 -1
  555. package/dist/jsx/list/filter-sort.native.js +0 -1
  556. package/dist/jsx/list/filter-sort.native.js.map +1 -1
  557. package/dist/jsx/list/filter-standard.mjs +1 -3
  558. package/dist/jsx/list/filter-standard.mjs.map +1 -1
  559. package/dist/jsx/list/filter-standard.native.js +1 -3
  560. package/dist/jsx/list/filter-standard.native.js.map +1 -1
  561. package/dist/jsx/list/list-tools-sheet.mjs +10 -3
  562. package/dist/jsx/list/list-tools-sheet.mjs.map +1 -1
  563. package/dist/jsx/list/list-tools-sheet.native.js +12 -3
  564. package/dist/jsx/list/list-tools-sheet.native.js.map +1 -1
  565. package/dist/jsx/navigation/paths.mjs +5 -1
  566. package/dist/jsx/navigation/paths.mjs.map +1 -1
  567. package/dist/jsx/navigation/paths.native.js +7 -0
  568. package/dist/jsx/navigation/paths.native.js.map +1 -1
  569. package/dist/jsx/report/QueryReportScreen.mjs +1 -1
  570. package/dist/jsx/report/QueryReportScreen.mjs.map +1 -1
  571. package/dist/jsx/report/QueryReportScreen.native.js +1 -1
  572. package/dist/jsx/report/QueryReportScreen.native.js.map +1 -1
  573. package/dist/jsx/report/queryReportFilterBar.mjs +3 -8
  574. package/dist/jsx/report/queryReportFilterBar.mjs.map +1 -1
  575. package/dist/jsx/report/queryReportFilterBar.native.js +3 -8
  576. package/dist/jsx/report/queryReportFilterBar.native.js.map +1 -1
  577. package/dist/jsx/shared/sessionUser.mjs +21 -4
  578. package/dist/jsx/shared/sessionUser.mjs.map +1 -1
  579. package/dist/jsx/shared/sessionUser.native.js +44 -3
  580. package/dist/jsx/shared/sessionUser.native.js.map +1 -1
  581. package/dist/jsx/shell/BackofficeShell.mjs +130 -91
  582. package/dist/jsx/shell/BackofficeShell.mjs.map +1 -1
  583. package/dist/jsx/shell/BackofficeShell.native.js +144 -101
  584. package/dist/jsx/shell/BackofficeShell.native.js.map +1 -1
  585. package/dist/jsx/shell/HomeRedirect.mjs +20 -24
  586. package/dist/jsx/shell/HomeRedirect.mjs.map +1 -1
  587. package/dist/jsx/shell/HomeRedirect.native.js +17 -20
  588. package/dist/jsx/shell/HomeRedirect.native.js.map +1 -1
  589. package/dist/jsx/shell/WorkspaceSidebar.mjs +55 -27
  590. package/dist/jsx/shell/WorkspaceSidebar.mjs.map +1 -1
  591. package/dist/jsx/shell/WorkspaceSidebar.native.js +55 -25
  592. package/dist/jsx/shell/WorkspaceSidebar.native.js.map +1 -1
  593. package/dist/jsx/shell/shellSidebarSlot.mjs +3 -0
  594. package/dist/jsx/shell/shellSidebarSlot.mjs.map +1 -0
  595. package/dist/jsx/shell/shellSidebarSlot.native.js +34 -0
  596. package/dist/jsx/shell/shellSidebarSlot.native.js.map +1 -0
  597. package/dist/jsx/shell/useWorkspaces.mjs +25 -8
  598. package/dist/jsx/shell/useWorkspaces.mjs.map +1 -1
  599. package/dist/jsx/shell/useWorkspaces.native.js +25 -6
  600. package/dist/jsx/shell/useWorkspaces.native.js.map +1 -1
  601. package/dist/jsx/views/DashboardView.mjs +2 -2
  602. package/dist/jsx/views/DashboardView.mjs.map +1 -1
  603. package/dist/jsx/views/DashboardView.native.js +2 -2
  604. package/dist/jsx/views/DashboardView.native.js.map +1 -1
  605. package/dist/jsx/views/ImageView.mjs +15 -6
  606. package/dist/jsx/views/ImageView.mjs.map +1 -1
  607. package/dist/jsx/views/ImageView.native.js +14 -5
  608. package/dist/jsx/views/ImageView.native.js.map +1 -1
  609. package/dist/jsx/views/ViewHeader.mjs +18 -7
  610. package/dist/jsx/views/ViewHeader.mjs.map +1 -1
  611. package/dist/jsx/views/ViewHeader.native.js +17 -6
  612. package/dist/jsx/views/ViewHeader.native.js.map +1 -1
  613. package/dist/jsx/views/ViewSwitcherMenu.mjs +11 -10
  614. package/dist/jsx/views/ViewSwitcherMenu.mjs.map +1 -1
  615. package/dist/jsx/views/ViewSwitcherMenu.native.js +10 -9
  616. package/dist/jsx/views/ViewSwitcherMenu.native.js.map +1 -1
  617. package/dist/jsx/views/viewAvailability.mjs +17 -9
  618. package/dist/jsx/views/viewAvailability.mjs.map +1 -1
  619. package/dist/jsx/views/viewAvailability.native.js +18 -8
  620. package/dist/jsx/views/viewAvailability.native.js.map +1 -1
  621. package/dist/jsx/views/viewMeta.mjs +23 -1
  622. package/dist/jsx/views/viewMeta.mjs.map +1 -1
  623. package/dist/jsx/views/viewMeta.native.js +30 -1
  624. package/dist/jsx/views/viewMeta.native.js.map +1 -1
  625. package/dist/jsx/workspace/WorkspaceChartBlock.mjs +1 -1
  626. package/dist/jsx/workspace/WorkspaceChartBlock.mjs.map +1 -1
  627. package/dist/jsx/workspace/WorkspaceChartBlock.native.js +1 -1
  628. package/dist/jsx/workspace/WorkspaceChartBlock.native.js.map +1 -1
  629. package/dist/jsx/workspace/WorkspaceLinkDirectory.mjs +2 -2
  630. package/dist/jsx/workspace/WorkspaceLinkDirectory.mjs.map +1 -1
  631. package/dist/jsx/workspace/WorkspaceLinkDirectory.native.js +2 -2
  632. package/dist/jsx/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  633. package/dist/jsx/workspace/WorkspaceRecents.mjs +2 -2
  634. package/dist/jsx/workspace/WorkspaceRecents.mjs.map +1 -1
  635. package/dist/jsx/workspace/WorkspaceRecents.native.js +1 -1
  636. package/dist/jsx/workspace/WorkspaceRecents.native.js.map +1 -1
  637. package/dist/jsx/workspace/WorkspaceShortcut.mjs +2 -2
  638. package/dist/jsx/workspace/WorkspaceShortcut.mjs.map +1 -1
  639. package/dist/jsx/workspace/WorkspaceShortcut.native.js +1 -1
  640. package/dist/jsx/workspace/WorkspaceShortcut.native.js.map +1 -1
  641. package/package.json +12 -12
  642. package/src/backofficeScreens.designLaw.spec.ts +27 -0
  643. package/src/chrome/BackofficeAwesomebar.tsx +8 -4
  644. package/src/chrome/CommandPalette.spec.tsx +19 -0
  645. package/src/chrome/CommandPalette.tsx +38 -24
  646. package/src/chrome/NotificationsButton.screen.spec.tsx +1 -0
  647. package/src/chrome/NotificationsButton.tsx +3 -2
  648. package/src/chrome/UserMenu.screen.spec.tsx +77 -7
  649. package/src/chrome/UserMenu.tsx +173 -109
  650. package/src/chrome/notifications-panel.tsx +3 -6
  651. package/src/chrome/user-session.tsx +8 -2
  652. package/src/config/BackofficeProvider.spec.tsx +6 -2
  653. package/src/config/BackofficeProvider.tsx +10 -0
  654. package/src/config/capabilities.spec.ts +13 -0
  655. package/src/config/capabilities.ts +4 -0
  656. package/src/desk/Desk.spec.tsx +48 -0
  657. package/src/desk/Desk.tsx +25 -1
  658. package/src/desk/DeskPokemon.stories.tsx +177 -0
  659. package/src/desk/DeskSurface.spec.tsx +2 -0
  660. package/src/desk/DeskSurface.tsx +8 -0
  661. package/src/desk/resolveDeskPath.spec.ts +20 -0
  662. package/src/desk/resolveDeskPath.ts +6 -1
  663. package/src/desk/target.ts +3 -0
  664. package/src/form/DocFormScreen.guest.screen.spec.tsx +4 -0
  665. package/src/form/DocFormScreen.rights.spec.tsx +113 -8
  666. package/src/form/DocFormScreen.tsx +65 -44
  667. package/src/form/FormConnections.tsx +2 -2
  668. package/src/form/FormErrorBoundary.spec.tsx +2 -3
  669. package/src/form/FormErrorBoundary.tsx +1 -1
  670. package/src/form/FormSidebarPanel.tsx +1 -1
  671. package/src/form/FormTimeline.tsx +0 -1
  672. package/src/form/FormToolbar.screen.spec.tsx +90 -29
  673. package/src/form/FormToolbar.tsx +98 -132
  674. package/src/formBuilder/DoctypePicker.tsx +72 -0
  675. package/src/formBuilder/FieldPalette.tsx +119 -0
  676. package/src/formBuilder/FieldPropertiesPanel.tsx +213 -0
  677. package/src/formBuilder/FormBuilderCanvas.tsx +468 -0
  678. package/src/formBuilder/FormBuilderScreen.screen.spec.tsx +392 -0
  679. package/src/formBuilder/FormBuilderScreen.stories.tsx +122 -0
  680. package/src/formBuilder/FormBuilderScreen.tsx +491 -0
  681. package/src/formBuilder/api.spec.ts +301 -0
  682. package/src/formBuilder/api.ts +198 -0
  683. package/src/formBuilder/fieldtypes.ts +140 -0
  684. package/src/formBuilder/index.ts +58 -0
  685. package/src/formBuilder/model.spec.ts +401 -0
  686. package/src/formBuilder/model.ts +522 -0
  687. package/src/formBuilder/useFormBuilderDrag.spec.tsx +170 -0
  688. package/src/formBuilder/useFormBuilderDrag.ts +498 -0
  689. package/src/i18n/en.ts +293 -3
  690. package/src/index.ts +58 -1
  691. package/src/list/DoctypeListScreen.guest.screen.spec.tsx +63 -2
  692. package/src/list/DoctypeListScreen.tsx +204 -85
  693. package/src/list/ListFilterBar.screen.spec.tsx +1 -1
  694. package/src/list/ListFilterBar.tsx +16 -6
  695. package/src/list/ListSidebar.tsx +11 -2
  696. package/src/list/filter-chips.tsx +19 -4
  697. package/src/list/filter-editor.tsx +1 -10
  698. package/src/list/filter-saved.tsx +0 -1
  699. package/src/list/filter-sort.tsx +0 -1
  700. package/src/list/filter-standard.tsx +1 -3
  701. package/src/list/list-tools-sheet.tsx +32 -13
  702. package/src/navigation/paths.spec.ts +19 -0
  703. package/src/navigation/paths.ts +8 -0
  704. package/src/report/QueryReportScreen.tsx +1 -1
  705. package/src/report/queryReportFilterBar.tsx +0 -5
  706. package/src/shared/sessionUser.spec.tsx +14 -1
  707. package/src/shared/sessionUser.ts +27 -6
  708. package/src/shell/BackofficeShell.spec.tsx +93 -10
  709. package/src/shell/BackofficeShell.tsx +184 -116
  710. package/src/shell/HomeRedirect.spec.tsx +89 -0
  711. package/src/shell/HomeRedirect.tsx +31 -20
  712. package/src/shell/WorkspaceSidebar.spec.tsx +15 -0
  713. package/src/shell/WorkspaceSidebar.tsx +58 -29
  714. package/src/shell/shellSidebarSlot.spec.tsx +178 -0
  715. package/src/shell/shellSidebarSlot.tsx +7 -0
  716. package/src/shell/useWorkspaces.spec.tsx +45 -0
  717. package/src/shell/useWorkspaces.ts +24 -8
  718. package/src/views/DashboardView.tsx +2 -2
  719. package/src/views/ImageView.tsx +19 -3
  720. package/src/views/ViewHeader.tsx +13 -14
  721. package/src/views/ViewSwitcherMenu.spec.tsx +3 -0
  722. package/src/views/ViewSwitcherMenu.tsx +11 -10
  723. package/src/views/viewAvailability.spec.ts +45 -12
  724. package/src/views/viewAvailability.ts +27 -24
  725. package/src/views/viewMeta.ts +30 -0
  726. package/src/workspace/WorkspaceChartBlock.tsx +1 -1
  727. package/src/workspace/WorkspaceLinkDirectory.tsx +2 -2
  728. package/src/workspace/WorkspaceRecents.tsx +9 -2
  729. package/src/workspace/WorkspaceShortcut.tsx +12 -2
  730. package/types/chrome/BackofficeAwesomebar.d.ts.map +1 -1
  731. package/types/chrome/CommandPalette.d.ts +7 -1
  732. package/types/chrome/CommandPalette.d.ts.map +1 -1
  733. package/types/chrome/NotificationsButton.d.ts.map +1 -1
  734. package/types/chrome/UserMenu.d.ts.map +1 -1
  735. package/types/chrome/notifications-panel.d.ts.map +1 -1
  736. package/types/chrome/user-session.d.ts.map +1 -1
  737. package/types/config/BackofficeProvider.d.ts +7 -1
  738. package/types/config/BackofficeProvider.d.ts.map +1 -1
  739. package/types/config/capabilities.d.ts +3 -0
  740. package/types/config/capabilities.d.ts.map +1 -1
  741. package/types/desk/Desk.d.ts +2 -1
  742. package/types/desk/Desk.d.ts.map +1 -1
  743. package/types/desk/DeskSurface.d.ts.map +1 -1
  744. package/types/desk/resolveDeskPath.d.ts +4 -1
  745. package/types/desk/resolveDeskPath.d.ts.map +1 -1
  746. package/types/desk/target.d.ts +3 -0
  747. package/types/desk/target.d.ts.map +1 -1
  748. package/types/form/DocFormScreen.d.ts +1 -1
  749. package/types/form/DocFormScreen.d.ts.map +1 -1
  750. package/types/form/FormTimeline.d.ts.map +1 -1
  751. package/types/form/FormToolbar.d.ts +5 -32
  752. package/types/form/FormToolbar.d.ts.map +1 -1
  753. package/types/formBuilder/DoctypePicker.d.ts +2 -0
  754. package/types/formBuilder/DoctypePicker.d.ts.map +1 -0
  755. package/types/formBuilder/FieldPalette.d.ts +6 -0
  756. package/types/formBuilder/FieldPalette.d.ts.map +1 -0
  757. package/types/formBuilder/FieldPropertiesPanel.d.ts +10 -0
  758. package/types/formBuilder/FieldPropertiesPanel.d.ts.map +1 -0
  759. package/types/formBuilder/FormBuilderCanvas.d.ts +17 -0
  760. package/types/formBuilder/FormBuilderCanvas.d.ts.map +1 -0
  761. package/types/formBuilder/FormBuilderScreen.d.ts +7 -0
  762. package/types/formBuilder/FormBuilderScreen.d.ts.map +1 -0
  763. package/types/formBuilder/api.d.ts +32 -0
  764. package/types/formBuilder/api.d.ts.map +1 -0
  765. package/types/formBuilder/fieldtypes.d.ts +21 -0
  766. package/types/formBuilder/fieldtypes.d.ts.map +1 -0
  767. package/types/formBuilder/index.d.ts +5 -0
  768. package/types/formBuilder/index.d.ts.map +1 -0
  769. package/types/formBuilder/model.d.ts +76 -0
  770. package/types/formBuilder/model.d.ts.map +1 -0
  771. package/types/formBuilder/useFormBuilderDrag.d.ts +44 -0
  772. package/types/formBuilder/useFormBuilderDrag.d.ts.map +1 -0
  773. package/types/i18n/en.d.ts +293 -3
  774. package/types/i18n/en.d.ts.map +1 -1
  775. package/types/index.d.ts +4 -3
  776. package/types/index.d.ts.map +1 -1
  777. package/types/list/DoctypeListScreen.d.ts.map +1 -1
  778. package/types/list/ListFilterBar.d.ts +10 -4
  779. package/types/list/ListFilterBar.d.ts.map +1 -1
  780. package/types/list/ListSidebar.d.ts +7 -1
  781. package/types/list/ListSidebar.d.ts.map +1 -1
  782. package/types/list/filter-chips.d.ts +9 -1
  783. package/types/list/filter-chips.d.ts.map +1 -1
  784. package/types/list/filter-saved.d.ts.map +1 -1
  785. package/types/list/filter-sort.d.ts.map +1 -1
  786. package/types/list/list-tools-sheet.d.ts +9 -1
  787. package/types/list/list-tools-sheet.d.ts.map +1 -1
  788. package/types/navigation/paths.d.ts +3 -0
  789. package/types/navigation/paths.d.ts.map +1 -1
  790. package/types/report/queryReportFilterBar.d.ts.map +1 -1
  791. package/types/shared/sessionUser.d.ts +1 -0
  792. package/types/shared/sessionUser.d.ts.map +1 -1
  793. package/types/shell/BackofficeShell.d.ts +6 -1
  794. package/types/shell/BackofficeShell.d.ts.map +1 -1
  795. package/types/shell/HomeRedirect.d.ts +3 -1
  796. package/types/shell/HomeRedirect.d.ts.map +1 -1
  797. package/types/shell/WorkspaceSidebar.d.ts.map +1 -1
  798. package/types/shell/shellSidebarSlot.d.ts +2 -0
  799. package/types/shell/shellSidebarSlot.d.ts.map +1 -0
  800. package/types/shell/useWorkspaces.d.ts +4 -0
  801. package/types/shell/useWorkspaces.d.ts.map +1 -1
  802. package/types/views/ImageView.d.ts.map +1 -1
  803. package/types/views/ViewHeader.d.ts +1 -10
  804. package/types/views/ViewHeader.d.ts.map +1 -1
  805. package/types/views/ViewSwitcherMenu.d.ts.map +1 -1
  806. package/types/views/viewAvailability.d.ts +12 -15
  807. package/types/views/viewAvailability.d.ts.map +1 -1
  808. package/types/views/viewMeta.d.ts +10 -0
  809. package/types/views/viewMeta.d.ts.map +1 -1
  810. package/types/workspace/WorkspaceRecents.d.ts.map +1 -1
  811. package/types/workspace/WorkspaceShortcut.d.ts.map +1 -1
@@ -0,0 +1,522 @@
1
+ import type { KanbanBoardColumnSnapshot, KanbanDropTarget } from "@multiplatform.one/components";
2
+ import type { DocFieldMeta } from "@multiplatform.one/frappe-ui";
3
+ import {
4
+ fieldtypeCatalog,
5
+ holdsValue,
6
+ isBreakType,
7
+ isColumnBreak,
8
+ isSectionBreak,
9
+ isTabBreak,
10
+ needsOptions,
11
+ type BuilderMessage,
12
+ } from "./fieldtypes";
13
+
14
+ export type BuilderDocField = Omit<
15
+ DocFieldMeta,
16
+ "fieldtype" | "reqd" | "hidden" | "read_only" | "in_list_view"
17
+ > & {
18
+ fieldname: string;
19
+ fieldtype: string;
20
+ label?: string;
21
+ options?: string;
22
+ default?: DocFieldMeta["default"];
23
+ description?: DocFieldMeta["description"];
24
+ reqd?: number;
25
+ hidden?: number;
26
+ read_only?: number;
27
+ in_list_view?: number;
28
+ idx?: number;
29
+ name?: string;
30
+ is_custom_field?: number;
31
+ };
32
+ export interface BuilderField {
33
+ key: string;
34
+ df: BuilderDocField;
35
+ isNew?: boolean;
36
+ fieldnameEdited?: boolean;
37
+ }
38
+ export interface BuilderColumn {
39
+ key: string;
40
+ df?: BuilderDocField;
41
+ fields: BuilderField[];
42
+ }
43
+ export interface BuilderSection {
44
+ key: string;
45
+ df?: BuilderDocField;
46
+ columns: BuilderColumn[];
47
+ }
48
+ export interface BuilderTab {
49
+ key: string;
50
+ df?: BuilderDocField;
51
+ sections: BuilderSection[];
52
+ }
53
+ export interface BuilderLayout {
54
+ tabs: BuilderTab[];
55
+ }
56
+ export interface BuilderFieldLocation {
57
+ tabKey: string;
58
+ sectionKey: string;
59
+ columnKey: string;
60
+ index: number;
61
+ }
62
+ export type FormBuilderMode = "customize" | "doctype";
63
+
64
+ type BuilderNode = BuilderTab | BuilderSection | BuilderColumn | BuilderField;
65
+
66
+ function nodes(layout: BuilderLayout): BuilderNode[] {
67
+ return layout.tabs.flatMap((tab) => [
68
+ tab,
69
+ ...tab.sections.flatMap((section) => [
70
+ section,
71
+ ...section.columns.flatMap((column) => [column, ...column.fields]),
72
+ ]),
73
+ ]);
74
+ }
75
+
76
+ function keyFactory(layout: BuilderLayout) {
77
+ const used = new Set(nodes(layout).map((node) => node.key));
78
+ let next = 1;
79
+ return () => {
80
+ while (used.has(`builder_${next}`)) next++;
81
+ const key = `builder_${next++}`;
82
+ used.add(key);
83
+ return key;
84
+ };
85
+ }
86
+
87
+ function emptyColumn(key: () => string): BuilderColumn {
88
+ return { key: key(), fields: [] };
89
+ }
90
+ function emptySection(key: () => string): BuilderSection {
91
+ return { key: key(), columns: [emptyColumn(key)] };
92
+ }
93
+ function emptyTab(key: () => string): BuilderTab {
94
+ return { key: key(), sections: [emptySection(key)] };
95
+ }
96
+
97
+ export function layoutFromFields(fields: readonly BuilderDocField[]): BuilderLayout {
98
+ const layout: BuilderLayout = { tabs: [] };
99
+ const key = keyFactory(layout);
100
+ let tab = emptyTab(key);
101
+ layout.tabs.push(tab);
102
+ let section = tab.sections[0];
103
+ let column = section.columns[0];
104
+ const ordered = fields
105
+ .map((df, index) => ({ df, index }))
106
+ .sort((a, b) => (a.df.idx ?? a.index + 1) - (b.df.idx ?? b.index + 1));
107
+ for (const [position, original] of ordered.entries()) {
108
+ const df = { ...original.df };
109
+ if (isTabBreak(df.fieldtype)) {
110
+ if (position !== 0 || tab.df) {
111
+ tab = emptyTab(key);
112
+ layout.tabs.push(tab);
113
+ }
114
+ tab.df = df;
115
+ section = tab.sections[0];
116
+ column = section.columns[0];
117
+ } else if (isSectionBreak(df.fieldtype)) {
118
+ if (section.df || section.columns.length > 1 || column.fields.length > 0) {
119
+ section = emptySection(key);
120
+ tab.sections.push(section);
121
+ }
122
+ section.df = df;
123
+ column = section.columns[0];
124
+ } else if (isColumnBreak(df.fieldtype)) {
125
+ if (column.df || column.fields.length > 0) {
126
+ column = emptyColumn(key);
127
+ section.columns.push(column);
128
+ }
129
+ column.df = df;
130
+ } else {
131
+ column.fields.push({ key: key(), df });
132
+ }
133
+ }
134
+ return layout;
135
+ }
136
+
137
+ export function scrub(text: string): string {
138
+ return text
139
+ .toLowerCase()
140
+ .replace(/[ -]/g, "_")
141
+ .replace(/[^a-z0-9_]/g, "");
142
+ }
143
+
144
+ function fieldnames(layout: BuilderLayout, exceptKey?: string): Set<string> {
145
+ return new Set(
146
+ nodes(layout)
147
+ .filter((n) => n.key !== exceptKey)
148
+ .flatMap((n) => (n.df?.fieldname ? [n.df.fieldname] : [])),
149
+ );
150
+ }
151
+
152
+ function uniqueName(base: string, used: Set<string>, numbered = false): string {
153
+ let candidate = base;
154
+ let n = 1;
155
+ if (numbered) candidate = `${base}_${n++}`;
156
+ while (used.has(candidate)) candidate = `${base}_${n++}`;
157
+ used.add(candidate);
158
+ return candidate;
159
+ }
160
+
161
+ export function fieldsFromLayout(layout: BuilderLayout): BuilderDocField[] {
162
+ const used = fieldnames(layout);
163
+ const fields: BuilderDocField[] = [];
164
+ const emit = (df: BuilderDocField) => fields.push({ ...df, idx: fields.length + 1 });
165
+ const emitBreak = (node: BuilderNode, type: string, needed: boolean) => {
166
+ if (node.df) emit(node.df);
167
+ else if (needed) emit({ fieldtype: type, fieldname: uniqueName(scrub(type), used, true) });
168
+ };
169
+ layout.tabs.forEach((tab, ti) => {
170
+ if (ti > 0 && !tab.sections.some((s) => s.columns.some((c) => c.fields.length))) return;
171
+ emitBreak(tab, "Tab Break", ti > 0);
172
+ tab.sections.forEach((section, si) => {
173
+ if (!section.columns.some((c) => c.fields.length)) return;
174
+ emitBreak(section, "Section Break", si > 0);
175
+ section.columns.forEach((column, ci) => {
176
+ emitBreak(column, "Column Break", ci > 0 || column.fields.length === 0);
177
+ column.fields.forEach((field) => emit(field.df));
178
+ });
179
+ });
180
+ });
181
+ return fields;
182
+ }
183
+
184
+ function copy(layout: BuilderLayout): BuilderLayout {
185
+ return {
186
+ tabs: layout.tabs.map((tab) => ({
187
+ ...tab,
188
+ sections: tab.sections.map((section) => ({
189
+ ...section,
190
+ columns: section.columns.map((column) => ({ ...column, fields: [...column.fields] })),
191
+ })),
192
+ })),
193
+ };
194
+ }
195
+ function columns(layout: BuilderLayout): BuilderColumn[] {
196
+ return layout.tabs.flatMap((t) => t.sections.flatMap((s) => s.columns));
197
+ }
198
+ function getColumn(layout: BuilderLayout, key: string) {
199
+ return columns(layout).find((c) => c.key === key);
200
+ }
201
+
202
+ export function findField(layout: BuilderLayout, key: string): BuilderField | undefined {
203
+ return columns(layout)
204
+ .flatMap((c) => c.fields)
205
+ .find((field) => field.key === key);
206
+ }
207
+
208
+ export function fieldLocation(
209
+ layout: BuilderLayout,
210
+ key: string,
211
+ ): BuilderFieldLocation | undefined {
212
+ for (const tab of layout.tabs)
213
+ for (const section of tab.sections)
214
+ for (const column of section.columns) {
215
+ const index = column.fields.findIndex((f) => f.key === key);
216
+ if (index >= 0)
217
+ return { tabKey: tab.key, sectionKey: section.key, columnKey: column.key, index };
218
+ }
219
+ return undefined;
220
+ }
221
+
222
+ export function moveField(
223
+ layout: BuilderLayout,
224
+ fieldKey: string,
225
+ target: KanbanDropTarget,
226
+ ): BuilderLayout {
227
+ const from = fieldLocation(layout, fieldKey);
228
+ if (!from || !getColumn(layout, target.columnId)) return layout;
229
+ const next = copy(layout);
230
+ const [field] = getColumn(next, from.columnKey)!.fields.splice(from.index, 1);
231
+ const dest = getColumn(next, target.columnId)!;
232
+ dest.fields.splice(Math.max(0, Math.min(target.index, dest.fields.length)), 0, field);
233
+ return next;
234
+ }
235
+
236
+ /** A palette draft is inserted with insertField, which routes break types to structure. */
237
+ export function newFieldFromType(layout: BuilderLayout, fieldtype: string): BuilderField {
238
+ const label = fieldtypeCatalog.find((f) => f.fieldtype === fieldtype)?.label ?? fieldtype;
239
+ return {
240
+ key: keyFactory(layout)(),
241
+ df: {
242
+ fieldtype,
243
+ label,
244
+ fieldname: uniqueName(scrub(label), fieldnames(layout), isBreakType(fieldtype)),
245
+ },
246
+ isNew: true,
247
+ };
248
+ }
249
+
250
+ export function insertField(
251
+ layout: BuilderLayout,
252
+ draft: BuilderDocField | BuilderField,
253
+ target: KanbanDropTarget,
254
+ ): { layout: BuilderLayout; key: string } {
255
+ if (!getColumn(layout, target.columnId)) throw new Error("Unknown form builder column");
256
+ const key = keyFactory(layout);
257
+ const field: BuilderField =
258
+ "df" in draft && typeof draft.key === "string"
259
+ ? {
260
+ ...(draft as BuilderField),
261
+ key: key(),
262
+ df: { ...(draft as BuilderField).df },
263
+ isNew: true,
264
+ }
265
+ : { key: key(), df: { ...(draft as BuilderDocField) }, isNew: true };
266
+ const next = copy(layout);
267
+ if (isBreakType(field.df.fieldtype)) {
268
+ const tab = next.tabs.find((t) =>
269
+ t.sections.some((s) => s.columns.some((c) => c.key === target.columnId)),
270
+ )!;
271
+ const section = tab.sections.find((s) => s.columns.some((c) => c.key === target.columnId))!;
272
+ if (isTabBreak(field.df.fieldtype)) {
273
+ next.tabs.splice(next.tabs.indexOf(tab) + 1, 0, {
274
+ key: field.key,
275
+ df: field.df,
276
+ sections: [emptySection(key)],
277
+ });
278
+ } else if (isSectionBreak(field.df.fieldtype)) {
279
+ tab.sections.splice(tab.sections.indexOf(section) + 1, 0, {
280
+ key: field.key,
281
+ df: field.df,
282
+ columns: [emptyColumn(key)],
283
+ });
284
+ } else {
285
+ section.columns.splice(section.columns.findIndex((c) => c.key === target.columnId) + 1, 0, {
286
+ key: field.key,
287
+ df: field.df,
288
+ fields: [],
289
+ });
290
+ }
291
+ } else {
292
+ const column = getColumn(next, target.columnId)!;
293
+ column.fields.splice(Math.max(0, Math.min(target.index, column.fields.length)), 0, field);
294
+ }
295
+ return { layout: next, key: field.key };
296
+ }
297
+
298
+ export function removeField(layout: BuilderLayout, key: string): BuilderLayout {
299
+ const location = fieldLocation(layout, key);
300
+ if (!location) return layout;
301
+ const next = copy(layout);
302
+ getColumn(next, location.columnKey)!.fields.splice(location.index, 1);
303
+ return next;
304
+ }
305
+
306
+ export function updateField(
307
+ layout: BuilderLayout,
308
+ key: string,
309
+ patch: Partial<BuilderDocField>,
310
+ ): BuilderLayout {
311
+ const location = fieldLocation(layout, key);
312
+ if (!location) return layout;
313
+ const next = copy(layout);
314
+ const column = getColumn(next, location.columnKey)!;
315
+ const field = column.fields[location.index];
316
+ const df = { ...field.df, ...patch };
317
+ const fieldnameEdited = field.fieldnameEdited || Object.hasOwn(patch, "fieldname");
318
+ if (field.isNew && !fieldnameEdited && patch.label !== undefined)
319
+ df.fieldname = uniqueName(scrub(patch.label), fieldnames(layout, key));
320
+ if (isBreakType(df.fieldtype)) {
321
+ const nextKey = keyFactory(layout);
322
+ const tab = next.tabs.find((t) => t.key === location.tabKey)!;
323
+ const section = tab.sections.find((s) => s.key === location.sectionKey)!;
324
+ const ci = section.columns.indexOf(column);
325
+ const following = column.fields.splice(location.index);
326
+ following.shift();
327
+ if (isColumnBreak(df.fieldtype)) {
328
+ section.columns.splice(ci + 1, 0, { key, df, fields: following });
329
+ } else {
330
+ const remainingColumns = [
331
+ { key: nextKey(), fields: following },
332
+ ...section.columns.splice(ci + 1),
333
+ ];
334
+ const si = tab.sections.indexOf(section);
335
+ if (isSectionBreak(df.fieldtype)) {
336
+ tab.sections.splice(si + 1, 0, { key, df, columns: remainingColumns });
337
+ } else {
338
+ next.tabs.splice(next.tabs.indexOf(tab) + 1, 0, {
339
+ key,
340
+ df,
341
+ sections: [{ key: nextKey(), columns: remainingColumns }, ...tab.sections.splice(si + 1)],
342
+ });
343
+ }
344
+ }
345
+ return next;
346
+ }
347
+ column.fields[location.index] = {
348
+ ...field,
349
+ df,
350
+ ...(fieldnameEdited ? { fieldnameEdited: true } : {}),
351
+ };
352
+ return next;
353
+ }
354
+
355
+ export function moveFieldBy(layout: BuilderLayout, key: string, direction: -1 | 1): BuilderLayout {
356
+ const location = fieldLocation(layout, key);
357
+ if (!location) return layout;
358
+ const tab = layout.tabs.find((t) => t.key === location.tabKey)!;
359
+ const ordered = tab.sections.flatMap((s) => s.columns);
360
+ const ci = ordered.findIndex((c) => c.key === location.columnKey);
361
+ const index = location.index + direction;
362
+ if (index >= 0 && index < ordered[ci].fields.length)
363
+ return moveField(layout, key, { columnId: location.columnKey, index });
364
+ const dest = ordered[ci + direction];
365
+ return dest
366
+ ? moveField(layout, key, { columnId: dest.key, index: direction < 0 ? dest.fields.length : 0 })
367
+ : layout;
368
+ }
369
+
370
+ export function moveFieldToSection(
371
+ layout: BuilderLayout,
372
+ key: string,
373
+ sectionKey: string,
374
+ ): BuilderLayout {
375
+ const column = layout.tabs.flatMap((t) => t.sections).find((s) => s.key === sectionKey)
376
+ ?.columns[0];
377
+ if (!column) return layout;
378
+ return moveField(layout, key, { columnId: column.key, index: column.fields.length });
379
+ }
380
+
381
+ export function addTab(layout: BuilderLayout): BuilderLayout {
382
+ const next = copy(layout);
383
+ next.tabs.push(emptyTab(keyFactory(layout)));
384
+ return next;
385
+ }
386
+
387
+ export function addSection(
388
+ layout: BuilderLayout,
389
+ tabKey: string,
390
+ afterSectionKey?: string,
391
+ ): BuilderLayout {
392
+ const next = copy(layout);
393
+ const tab = next.tabs.find((t) => t.key === tabKey);
394
+ if (!tab) return layout;
395
+ const after =
396
+ afterSectionKey === undefined
397
+ ? tab.sections.length - 1
398
+ : tab.sections.findIndex((s) => s.key === afterSectionKey);
399
+ if (afterSectionKey !== undefined && after < 0) return layout;
400
+ tab.sections.splice(after + 1, 0, emptySection(keyFactory(layout)));
401
+ return next;
402
+ }
403
+
404
+ export function addColumn(layout: BuilderLayout, sectionKey: string): BuilderLayout {
405
+ const next = copy(layout);
406
+ const section = next.tabs.flatMap((t) => t.sections).find((s) => s.key === sectionKey);
407
+ if (!section) return layout;
408
+ section.columns.push(emptyColumn(keyFactory(layout)));
409
+ return next;
410
+ }
411
+
412
+ export function removeTab(layout: BuilderLayout, key: string): BuilderLayout {
413
+ const index = layout.tabs.findIndex((t) => t.key === key);
414
+ if (index < 0 || layout.tabs.length === 1) return layout;
415
+ const next = copy(layout);
416
+ const [removed] = next.tabs.splice(index, 1);
417
+ if (index > 0) next.tabs[index - 1].sections.push(...removed.sections);
418
+ else next.tabs[0].sections.unshift(...removed.sections);
419
+ return next;
420
+ }
421
+
422
+ export function removeSection(layout: BuilderLayout, key: string): BuilderLayout {
423
+ const ti = layout.tabs.findIndex((t) => t.sections.some((s) => s.key === key));
424
+ if (ti < 0 || (layout.tabs.length === 1 && layout.tabs[ti].sections.length === 1)) return layout;
425
+ const next = copy(layout);
426
+ const tab = next.tabs[ti];
427
+ const si = tab.sections.findIndex((s) => s.key === key);
428
+ const [section] = tab.sections.splice(si, 1);
429
+ let previous = si > 0;
430
+ let dest = tab.sections[previous ? si - 1 : 0];
431
+ if (!dest) {
432
+ next.tabs.splice(ti, 1);
433
+ previous = ti > 0;
434
+ const neighbour = next.tabs[previous ? ti - 1 : 0];
435
+ dest = neighbour.sections[previous ? neighbour.sections.length - 1 : 0];
436
+ }
437
+ const column = dest.columns[previous ? dest.columns.length - 1 : 0];
438
+ const fields = section.columns.flatMap((c) => c.fields);
439
+ if (previous) column.fields.push(...fields);
440
+ else column.fields.unshift(...fields);
441
+ return next;
442
+ }
443
+
444
+ export function removeColumn(layout: BuilderLayout, key: string): BuilderLayout {
445
+ const next = copy(layout);
446
+ const section = next.tabs
447
+ .flatMap((t) => t.sections)
448
+ .find((s) => s.columns.some((c) => c.key === key));
449
+ if (!section || section.columns.length === 1) return layout;
450
+ const index = section.columns.findIndex((c) => c.key === key);
451
+ const [column] = section.columns.splice(index, 1);
452
+ if (index > 0) section.columns[index - 1].fields.push(...column.fields);
453
+ else section.columns[0].fields.unshift(...column.fields);
454
+ return next;
455
+ }
456
+
457
+ export function updateBreak(
458
+ layout: BuilderLayout,
459
+ key: string,
460
+ patch: Partial<BuilderDocField>,
461
+ ): BuilderLayout {
462
+ const next = copy(layout);
463
+ const node = nodes(next).find((n) => n.key === key);
464
+ if (!node || "isNew" in node || !("sections" in node || "columns" in node || "fields" in node))
465
+ return layout;
466
+ const fieldtype =
467
+ "sections" in node ? "Tab Break" : "columns" in node ? "Section Break" : "Column Break";
468
+ node.df = {
469
+ ...(node.df ?? {
470
+ fieldtype,
471
+ fieldname: uniqueName(scrub(fieldtype), fieldnames(layout), true),
472
+ }),
473
+ ...patch,
474
+ fieldtype,
475
+ };
476
+ return next;
477
+ }
478
+
479
+ export function tabBoard(
480
+ layout: BuilderLayout,
481
+ tabKey: string,
482
+ columnTitle: (column: BuilderColumn, index: number) => string,
483
+ ): KanbanBoardColumnSnapshot[] {
484
+ return (layout.tabs.find((t) => t.key === tabKey)?.sections.flatMap((s) => s.columns) ?? []).map(
485
+ (column, index) => ({
486
+ id: column.key,
487
+ title: columnTitle(column, index),
488
+ count: column.fields.length,
489
+ }),
490
+ );
491
+ }
492
+
493
+ export function canDeleteField(field: BuilderField, mode: FormBuilderMode): boolean {
494
+ return mode === "doctype" || !!field.isNew || field.df.is_custom_field === 1;
495
+ }
496
+
497
+ export function validateLayout(layout: BuilderLayout): Record<string, BuilderMessage[]> {
498
+ const errors: Record<string, BuilderMessage[]> = {};
499
+ const entries = nodes(layout).filter((n) => n.df);
500
+ const counts = new Map<string, number>();
501
+ for (const node of entries)
502
+ if (node.df?.fieldname) counts.set(node.df.fieldname, (counts.get(node.df.fieldname) ?? 0) + 1);
503
+ for (const node of entries) {
504
+ const df = node.df!;
505
+ const add = (key: string, text: string) =>
506
+ (errors[node.key] ??= []).push({ key: `formBuilder.validation.${key}`, default: text });
507
+ if (holdsValue(df.fieldtype) && !df.fieldname?.trim())
508
+ add("fieldnameRequired", "A fieldname is required.");
509
+ if (df.fieldname && !/^[a-z][a-z0-9_]*$/.test(df.fieldname))
510
+ add(
511
+ "invalidFieldname",
512
+ "Use lowercase letters, digits and underscores, starting with a letter.",
513
+ );
514
+ if (df.fieldname && (counts.get(df.fieldname) ?? 0) > 1)
515
+ add("duplicateFieldname", "Fieldnames must be unique.");
516
+ if (!df.label?.trim() && !df.fieldname?.trim())
517
+ add("labelRequired", "A label or fieldname is required.");
518
+ if (needsOptions(df.fieldtype) && !df.options?.trim())
519
+ add("optionsRequired", "Options are required for this field type.");
520
+ }
521
+ return errors;
522
+ }
@@ -0,0 +1,170 @@
1
+ import { act, renderHook } from "@testing-library/react";
2
+ import { TOUCH_LONG_PRESS_MS } from "@multiplatform.one/components";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import { layoutFromFields } from "./model";
5
+ import { useFormBuilderDrag } from "./useFormBuilderDrag";
6
+
7
+ afterEach(() => {
8
+ vi.restoreAllMocks();
9
+ vi.useRealTimers();
10
+ document.querySelector("[data-drag-spec]")?.remove();
11
+ });
12
+
13
+ function setup() {
14
+ const layout = layoutFromFields([
15
+ { fieldname: "first", fieldtype: "Data", label: "First" },
16
+ { fieldname: "other", fieldtype: "Column Break" },
17
+ { fieldname: "second", fieldtype: "Data", label: "Second" },
18
+ ]);
19
+ const [first, second] = layout.tabs[0].sections[0].columns;
20
+ const onChange = vi.fn();
21
+ const onSelect = vi.fn();
22
+ const mounted = renderHook(() =>
23
+ useFormBuilderDrag({ layout, tabKey: layout.tabs[0].key, onChange, onSelect }),
24
+ );
25
+ const root = document.createElement("div");
26
+ root.setAttribute("data-drag-spec", "");
27
+ document.body.append(root);
28
+ const column = document.createElement("div");
29
+ column.setAttribute("data-fb-column", first.key);
30
+ root.append(column);
31
+ const target = document.createElement("div");
32
+ target.setAttribute("data-fb-field", first.fields[0].key);
33
+ column.append(target);
34
+ const source = document.createElement("div");
35
+ source.setAttribute("data-fb-field", second.fields[0].key);
36
+ root.append(source);
37
+ const rect = (x: number, y: number) => ({
38
+ x,
39
+ y,
40
+ left: x,
41
+ top: y,
42
+ right: x + 100,
43
+ bottom: y + 40,
44
+ width: 100,
45
+ height: 40,
46
+ toJSON: () => ({}),
47
+ });
48
+ vi.spyOn(source, "getBoundingClientRect").mockReturnValue(rect(200, 100));
49
+ vi.spyOn(target, "getBoundingClientRect").mockReturnValue(rect(0, 100));
50
+ vi.spyOn(column, "getBoundingClientRect").mockReturnValue(rect(0, 100));
51
+ vi.spyOn(document, "elementFromPoint").mockReturnValue(target);
52
+ const down = (pointerType = "mouse") =>
53
+ act(() =>
54
+ mounted.result.current.fieldPointerDown(second.fields[0].key, {
55
+ currentTarget: source,
56
+ clientX: 210,
57
+ clientY: 110,
58
+ pointerType,
59
+ pointerId: 1,
60
+ }),
61
+ );
62
+ const move = (x: number, y: number) =>
63
+ act(() =>
64
+ window.dispatchEvent(
65
+ new PointerEvent("pointermove", { pointerId: 1, clientX: x, clientY: y }),
66
+ ),
67
+ );
68
+ return { ...mounted, root, source, first, second, onChange, onSelect, down, move };
69
+ }
70
+
71
+ describe("form builder drag session", () => {
72
+ it("keeps data unchanged until pointer drop and tracks the original grab offset", () => {
73
+ const test = setup();
74
+ test.down();
75
+ test.move(50, 110);
76
+ expect(test.result.current.drag).toMatchObject({
77
+ x: 40,
78
+ y: 100,
79
+ target: { columnId: test.first.key, index: 0 },
80
+ });
81
+ expect(test.result.current.offset(test.first.key, 0)).toBe(40);
82
+ expect(test.onChange).not.toHaveBeenCalled();
83
+ test.move(70, 115);
84
+ expect(test.result.current.drag).toMatchObject({ x: 60, y: 105 });
85
+ act(() =>
86
+ window.dispatchEvent(
87
+ new PointerEvent("pointerup", { pointerId: 1, clientX: 50, clientY: 110 }),
88
+ ),
89
+ );
90
+ expect(
91
+ test.onChange.mock.calls[0][0].tabs[0].sections[0].columns[0].fields.map(
92
+ (f: { df: { fieldname: string } }) => f.df.fieldname,
93
+ ),
94
+ ).toEqual(["second", "first"]);
95
+ expect(test.result.current.drag).toBeNull();
96
+ });
97
+
98
+ it.each(["pointercancel", "Escape"])("cancels with %s without writing a layout", (action) => {
99
+ const test = setup();
100
+ test.down();
101
+ test.move(50, 110);
102
+ act(() =>
103
+ window.dispatchEvent(
104
+ action === "Escape"
105
+ ? new KeyboardEvent("keydown", { key: "Escape" })
106
+ : new PointerEvent("pointercancel", { pointerId: 1 }),
107
+ ),
108
+ );
109
+ expect(test.result.current.drag).toBeNull();
110
+ expect(test.onChange).not.toHaveBeenCalled();
111
+ expect(document.body.style.userSelect).not.toBe("none");
112
+ });
113
+
114
+ it("leaves touch swipes to scrolling and only lifts after the hold", () => {
115
+ vi.useFakeTimers();
116
+ const test = setup();
117
+ test.down("touch");
118
+ test.move(210, 130);
119
+ act(() => vi.advanceTimersByTime(TOUCH_LONG_PRESS_MS));
120
+ expect(test.result.current.drag).toBeNull();
121
+ test.down("touch");
122
+ act(() => vi.advanceTimersByTime(TOUCH_LONG_PRESS_MS - 1));
123
+ expect(test.result.current.drag).toBeNull();
124
+ act(() => vi.advanceTimersByTime(1));
125
+ expect(test.result.current.drag?.mode).toBe("pointer");
126
+ expect(test.onChange).not.toHaveBeenCalled();
127
+ test.unmount();
128
+ expect(document.body.style.userSelect).not.toBe("none");
129
+ });
130
+
131
+ it("inserts a palette draft only at drop", () => {
132
+ const test = setup();
133
+ test.source.setAttribute("data-fb-palette", "Data");
134
+ act(() =>
135
+ test.result.current.palettePointerDown("Data", {
136
+ currentTarget: test.source,
137
+ clientX: 210,
138
+ clientY: 110,
139
+ pointerType: "mouse",
140
+ pointerId: 1,
141
+ }),
142
+ );
143
+ test.move(50, 110);
144
+ expect(test.onChange).not.toHaveBeenCalled();
145
+ act(() =>
146
+ window.dispatchEvent(
147
+ new PointerEvent("pointerup", { pointerId: 1, clientX: 50, clientY: 110 }),
148
+ ),
149
+ );
150
+ expect(test.onChange.mock.calls[0][0].tabs[0].sections[0].columns[0].fields[0]).toMatchObject({
151
+ isNew: true,
152
+ df: { fieldtype: "Data" },
153
+ });
154
+ expect(test.onSelect).toHaveBeenCalledOnce();
155
+ });
156
+
157
+ it("cancels a drop outside the board", () => {
158
+ const test = setup();
159
+ test.down();
160
+ test.move(50, 110);
161
+ vi.mocked(document.elementFromPoint).mockReturnValue(null);
162
+ test.move(500, 110);
163
+ act(() =>
164
+ window.dispatchEvent(
165
+ new PointerEvent("pointerup", { pointerId: 1, clientX: 500, clientY: 110 }),
166
+ ),
167
+ );
168
+ expect(test.onChange).not.toHaveBeenCalled();
169
+ });
170
+ });