@multiplatform.one/backoffice 7.6.2 → 7.7.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 (353) hide show
  1. package/dist/cjs/chrome/BackofficeAwesomebar.native.js +1 -1
  2. package/dist/cjs/chrome/BackofficeAwesomebar.native.js.map +1 -1
  3. package/dist/cjs/chrome/CommandPalette.native.js +1 -1
  4. package/dist/cjs/chrome/CommandPalette.native.js.map +1 -1
  5. package/dist/cjs/chrome/HelpMenu.native.js +1 -1
  6. package/dist/cjs/chrome/HelpMenu.native.js.map +1 -1
  7. package/dist/cjs/chrome/NotificationsButton.native.js +1 -1
  8. package/dist/cjs/chrome/NotificationsButton.native.js.map +1 -1
  9. package/dist/cjs/chrome/UserMenu.native.js +1 -1
  10. package/dist/cjs/chrome/UserMenu.native.js.map +1 -1
  11. package/dist/cjs/chrome/awesomebar-data.native.js.map +1 -1
  12. package/dist/cjs/chrome/command-palette-model.native.js +1 -1
  13. package/dist/cjs/chrome/command-palette-model.native.js.map +1 -1
  14. package/dist/cjs/chrome/help-about-dialog.native.js +1 -1
  15. package/dist/cjs/chrome/help-about-dialog.native.js.map +1 -1
  16. package/dist/cjs/chrome/help-shortcuts-dialog.native.js +1 -1
  17. package/dist/cjs/chrome/help-shortcuts-dialog.native.js.map +1 -1
  18. package/dist/cjs/chrome/notifications-data.native.js.map +1 -1
  19. package/dist/cjs/chrome/notifications-panel.native.js +1 -1
  20. package/dist/cjs/chrome/notifications-panel.native.js.map +1 -1
  21. package/dist/cjs/chrome/notifications-utils.native.js.map +1 -1
  22. package/dist/cjs/chrome/shortcuts.native.js.map +1 -1
  23. package/dist/cjs/chrome/user-session.native.js.map +1 -1
  24. package/dist/cjs/config/BackofficeProvider.native.js +1 -1
  25. package/dist/cjs/config/BackofficeProvider.native.js.map +1 -1
  26. package/dist/cjs/config/capabilities.native.js.map +1 -1
  27. package/dist/cjs/config/events.native.js.map +1 -1
  28. package/dist/cjs/config/slots.native.js.map +1 -1
  29. package/dist/cjs/desk/Desk.native.js.map +1 -1
  30. package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
  31. package/dist/cjs/desk/resolveDeskPath.native.js.map +1 -1
  32. package/dist/cjs/desk/scope.native.js.map +1 -1
  33. package/dist/cjs/desk/target.native.js.map +1 -1
  34. package/dist/cjs/form/DocFormScreen.native.js +1 -1
  35. package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
  36. package/dist/cjs/form/FormConnections.native.js +1 -1
  37. package/dist/cjs/form/FormConnections.native.js.map +1 -1
  38. package/dist/cjs/form/FormDialogs.native.js +1 -1
  39. package/dist/cjs/form/FormDialogs.native.js.map +1 -1
  40. package/dist/cjs/form/FormErrorBoundary.native.js +1 -1
  41. package/dist/cjs/form/FormErrorBoundary.native.js.map +1 -1
  42. package/dist/cjs/form/FormHeaderCluster.native.js +1 -1
  43. package/dist/cjs/form/FormHeaderCluster.native.js.map +1 -1
  44. package/dist/cjs/form/FormSidebarPanel.native.js +1 -1
  45. package/dist/cjs/form/FormSidebarPanel.native.js.map +1 -1
  46. package/dist/cjs/form/FormTimeline.native.js +1 -1
  47. package/dist/cjs/form/FormTimeline.native.js.map +1 -1
  48. package/dist/cjs/form/FormToolbar.native.js +1 -1
  49. package/dist/cjs/form/FormToolbar.native.js.map +1 -1
  50. package/dist/cjs/form/connections-data.native.js.map +1 -1
  51. package/dist/cjs/form/createPrefill.cjs +3 -11
  52. package/dist/cjs/form/createPrefill.native.js +3 -11
  53. package/dist/cjs/form/createPrefill.native.js.map +1 -1
  54. package/dist/cjs/form/dependsOn.native.js.map +1 -1
  55. package/dist/cjs/form/dirtyTracking.cjs +4 -29
  56. package/dist/cjs/form/dirtyTracking.native.js +4 -48
  57. package/dist/cjs/form/dirtyTracking.native.js.map +1 -1
  58. package/dist/cjs/form/docinfo.native.js.map +1 -1
  59. package/dist/cjs/form/fetchFrom.cjs +4 -41
  60. package/dist/cjs/form/fetchFrom.native.js +4 -81
  61. package/dist/cjs/form/fetchFrom.native.js.map +1 -1
  62. package/dist/cjs/form/fieldPermissions.cjs +4 -29
  63. package/dist/cjs/form/fieldPermissions.native.js +4 -51
  64. package/dist/cjs/form/fieldPermissions.native.js.map +1 -1
  65. package/dist/cjs/form/formActions.cjs +2 -171
  66. package/dist/cjs/form/formActions.native.js +2 -178
  67. package/dist/cjs/form/formActions.native.js.map +1 -1
  68. package/dist/cjs/form/formLayout.cjs +5 -219
  69. package/dist/cjs/form/formLayout.native.js +5 -359
  70. package/dist/cjs/form/formLayout.native.js.map +1 -1
  71. package/dist/cjs/form/platformHooks.native.js.map +1 -1
  72. package/dist/cjs/form/sidebar-attachments.native.js +1 -1
  73. package/dist/cjs/form/sidebar-attachments.native.js.map +1 -1
  74. package/dist/cjs/form/sidebar-dialogs.native.js +1 -1
  75. package/dist/cjs/form/sidebar-dialogs.native.js.map +1 -1
  76. package/dist/cjs/form/sidebar-people.native.js +1 -1
  77. package/dist/cjs/form/sidebar-people.native.js.map +1 -1
  78. package/dist/cjs/form/sidebar-rpc.native.js.map +1 -1
  79. package/dist/cjs/form/sidebar-utils.native.js.map +1 -1
  80. package/dist/cjs/form/timeline-entries.native.js.map +1 -1
  81. package/dist/cjs/form/timeline-utils.native.js.map +1 -1
  82. package/dist/cjs/form/useFormEngine.cjs +2 -361
  83. package/dist/cjs/form/useFormEngine.native.js +2 -447
  84. package/dist/cjs/form/useFormEngine.native.js.map +1 -1
  85. package/dist/cjs/i18n/en.native.js.map +1 -1
  86. package/dist/cjs/i18n/index.native.js.map +1 -1
  87. package/dist/cjs/index.native.js +1 -1
  88. package/dist/cjs/index.native.js.map +1 -1
  89. package/dist/cjs/list/AddTagsDialog.native.js +1 -1
  90. package/dist/cjs/list/AddTagsDialog.native.js.map +1 -1
  91. package/dist/cjs/list/AssignToDialog.native.js +1 -1
  92. package/dist/cjs/list/AssignToDialog.native.js.map +1 -1
  93. package/dist/cjs/list/DoctypeListScreen.native.js +1 -1
  94. package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
  95. package/dist/cjs/list/ListBulkActionsBar.native.js +1 -1
  96. package/dist/cjs/list/ListBulkActionsBar.native.js.map +1 -1
  97. package/dist/cjs/list/ListFilterBar.native.js +1 -1
  98. package/dist/cjs/list/ListFilterBar.native.js.map +1 -1
  99. package/dist/cjs/list/ListSidebar.native.js +1 -1
  100. package/dist/cjs/list/ListSidebar.native.js.map +1 -1
  101. package/dist/cjs/list/bulk-edit-dialog.native.js +1 -1
  102. package/dist/cjs/list/bulk-edit-dialog.native.js.map +1 -1
  103. package/dist/cjs/list/bulk-export.native.js.map +1 -1
  104. package/dist/cjs/list/bulk-submit-cancel.native.js.map +1 -1
  105. package/dist/cjs/list/bulkActions.native.js.map +1 -1
  106. package/dist/cjs/list/filter-chips.native.js +1 -1
  107. package/dist/cjs/list/filter-chips.native.js.map +1 -1
  108. package/dist/cjs/list/filter-editor.native.js +1 -1
  109. package/dist/cjs/list/filter-editor.native.js.map +1 -1
  110. package/dist/cjs/list/filter-fields.native.js.map +1 -1
  111. package/dist/cjs/list/filter-saved.native.js +1 -1
  112. package/dist/cjs/list/filter-saved.native.js.map +1 -1
  113. package/dist/cjs/list/filter-sort.native.js +1 -1
  114. package/dist/cjs/list/filter-sort.native.js.map +1 -1
  115. package/dist/cjs/list/filter-standard.native.js.map +1 -1
  116. package/dist/cjs/list/filterConversion.native.js.map +1 -1
  117. package/dist/cjs/list/list-tools-sheet.native.js +1 -1
  118. package/dist/cjs/list/list-tools-sheet.native.js.map +1 -1
  119. package/dist/cjs/list/listColumns.native.js.map +1 -1
  120. package/dist/cjs/list/listFields.native.js.map +1 -1
  121. package/dist/cjs/list/listFormat.native.js.map +1 -1
  122. package/dist/cjs/list/listUrlState.native.js.map +1 -1
  123. package/dist/cjs/list/sidebar-section.native.js +1 -1
  124. package/dist/cjs/list/sidebar-section.native.js.map +1 -1
  125. package/dist/cjs/list/sidebar-stats.native.js.map +1 -1
  126. package/dist/cjs/list/statusColors.native.js.map +1 -1
  127. package/dist/cjs/navigation/navigator.native.js.map +1 -1
  128. package/dist/cjs/navigation/paths.native.js.map +1 -1
  129. package/dist/cjs/oneAdapter/index.native.js.map +1 -1
  130. package/dist/cjs/quickEntry/QuickEntryDialog.native.js +1 -1
  131. package/dist/cjs/quickEntry/QuickEntryDialog.native.js.map +1 -1
  132. package/dist/cjs/quickEntry/quickEntryPlan.native.js.map +1 -1
  133. package/dist/cjs/report/DoctypeReportView.native.js +1 -1
  134. package/dist/cjs/report/DoctypeReportView.native.js.map +1 -1
  135. package/dist/cjs/report/QueryReportScreen.native.js +1 -1
  136. package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
  137. package/dist/cjs/report/queryReportColumns.native.js.map +1 -1
  138. package/dist/cjs/report/queryReportFilterBar.native.js +1 -1
  139. package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
  140. package/dist/cjs/report/queryReportUrlState.native.js.map +1 -1
  141. package/dist/cjs/report/report-grid.native.js +1 -1
  142. package/dist/cjs/report/report-grid.native.js.map +1 -1
  143. package/dist/cjs/report/report-toolbar.native.js +1 -1
  144. package/dist/cjs/report/report-toolbar.native.js.map +1 -1
  145. package/dist/cjs/report/reportShapes.native.js.map +1 -1
  146. package/dist/cjs/report/reportViewModel.native.js.map +1 -1
  147. package/dist/cjs/report/savedReports.native.js.map +1 -1
  148. package/dist/cjs/report/useQueryReport.native.js.map +1 -1
  149. package/dist/cjs/shared/deskLinks.native.js.map +1 -1
  150. package/dist/cjs/shared/listNavContext.native.js.map +1 -1
  151. package/dist/cjs/shared/types.native.js.map +1 -1
  152. package/dist/cjs/shared/useDocinfo.native.js.map +1 -1
  153. package/dist/cjs/shared/useDoctypeMeta.native.js.map +1 -1
  154. package/dist/cjs/shared/useFrappeApp.native.js.map +1 -1
  155. package/dist/cjs/shared/useRecentVisit.native.js.map +1 -1
  156. package/dist/cjs/shared/useSessionUserId.native.js.map +1 -1
  157. package/dist/cjs/shared/useSlugTarget.native.js.map +1 -1
  158. package/dist/cjs/shared/useUserRoles.native.js.map +1 -1
  159. package/dist/cjs/shell/BackofficeShell.native.js +1 -1
  160. package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
  161. package/dist/cjs/shell/HomeRedirect.native.js +1 -1
  162. package/dist/cjs/shell/HomeRedirect.native.js.map +1 -1
  163. package/dist/cjs/shell/NotFoundScreen.native.js +1 -1
  164. package/dist/cjs/shell/NotFoundScreen.native.js.map +1 -1
  165. package/dist/cjs/shell/SlugScreen.native.js +1 -1
  166. package/dist/cjs/shell/SlugScreen.native.js.map +1 -1
  167. package/dist/cjs/shell/WorkspaceSidebar.native.js +1 -1
  168. package/dist/cjs/shell/WorkspaceSidebar.native.js.map +1 -1
  169. package/dist/cjs/shell/useWorkspaces.native.js.map +1 -1
  170. package/dist/cjs/shell/workspaceIcons.native.js.map +1 -1
  171. package/dist/cjs/views/CalendarView.native.js +1 -1
  172. package/dist/cjs/views/CalendarView.native.js.map +1 -1
  173. package/dist/cjs/views/DashboardView.native.js +1 -1
  174. package/dist/cjs/views/DashboardView.native.js.map +1 -1
  175. package/dist/cjs/views/DoctypeViewScreen.native.js.map +1 -1
  176. package/dist/cjs/views/ImageView.native.js +1 -1
  177. package/dist/cjs/views/ImageView.native.js.map +1 -1
  178. package/dist/cjs/views/KanbanView.native.js +1 -1
  179. package/dist/cjs/views/KanbanView.native.js.map +1 -1
  180. package/dist/cjs/views/ReportView.native.js +1 -1
  181. package/dist/cjs/views/ReportView.native.js.map +1 -1
  182. package/dist/cjs/views/TreeView.native.js +1 -1
  183. package/dist/cjs/views/TreeView.native.js.map +1 -1
  184. package/dist/cjs/views/ViewHeader.native.js +1 -1
  185. package/dist/cjs/views/ViewHeader.native.js.map +1 -1
  186. package/dist/cjs/views/ViewStates.native.js +1 -1
  187. package/dist/cjs/views/ViewStates.native.js.map +1 -1
  188. package/dist/cjs/views/ViewSwitcherMenu.native.js +1 -1
  189. package/dist/cjs/views/ViewSwitcherMenu.native.js.map +1 -1
  190. package/dist/cjs/views/calendar-field-selector.native.js +1 -1
  191. package/dist/cjs/views/calendar-field-selector.native.js.map +1 -1
  192. package/dist/cjs/views/connection.native.js.map +1 -1
  193. package/dist/cjs/views/dashboard-data.native.js.map +1 -1
  194. package/dist/cjs/views/deskViewConfigs.native.js.map +1 -1
  195. package/dist/cjs/views/kanban-board-controls.native.js +1 -1
  196. package/dist/cjs/views/kanban-board-controls.native.js.map +1 -1
  197. package/dist/cjs/views/kanban-field-picker.native.js +1 -1
  198. package/dist/cjs/views/kanban-field-picker.native.js.map +1 -1
  199. package/dist/cjs/views/kanbanBoardOps.native.js.map +1 -1
  200. package/dist/cjs/views/report-controls.native.js +1 -1
  201. package/dist/cjs/views/report-controls.native.js.map +1 -1
  202. package/dist/cjs/views/viewAvailability.native.js.map +1 -1
  203. package/dist/cjs/views/viewMeta.native.js.map +1 -1
  204. package/dist/cjs/workspace/WorkspaceChartBlock.native.js +1 -1
  205. package/dist/cjs/workspace/WorkspaceChartBlock.native.js.map +1 -1
  206. package/dist/cjs/workspace/WorkspaceGrid.native.js.map +1 -1
  207. package/dist/cjs/workspace/WorkspaceLinkCard.native.js +1 -1
  208. package/dist/cjs/workspace/WorkspaceLinkCard.native.js.map +1 -1
  209. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js +1 -1
  210. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  211. package/dist/cjs/workspace/WorkspaceNumberCard.native.js +1 -1
  212. package/dist/cjs/workspace/WorkspaceNumberCard.native.js.map +1 -1
  213. package/dist/cjs/workspace/WorkspaceQuickList.cjs +1 -1
  214. package/dist/cjs/workspace/WorkspaceQuickList.native.js +4 -2
  215. package/dist/cjs/workspace/WorkspaceQuickList.native.js.map +1 -1
  216. package/dist/cjs/workspace/WorkspaceRecents.cjs +1 -3
  217. package/dist/cjs/workspace/WorkspaceRecents.native.js +4 -4
  218. package/dist/cjs/workspace/WorkspaceRecents.native.js.map +1 -1
  219. package/dist/cjs/workspace/WorkspaceScreen.native.js +1 -1
  220. package/dist/cjs/workspace/WorkspaceScreen.native.js.map +1 -1
  221. package/dist/cjs/workspace/WorkspaceShortcut.cjs +1 -3
  222. package/dist/cjs/workspace/WorkspaceShortcut.native.js +5 -4
  223. package/dist/cjs/workspace/WorkspaceShortcut.native.js.map +1 -1
  224. package/dist/cjs/workspace/parseContent.native.js.map +1 -1
  225. package/dist/cjs/workspace/types.native.js.map +1 -1
  226. package/dist/cjs/workspace/useDashboardChart.native.js.map +1 -1
  227. package/dist/cjs/workspace/useWorkspaceDoc.native.js.map +1 -1
  228. package/dist/esm/desk/DeskSurface.mjs.map +1 -1
  229. package/dist/esm/desk/DeskSurface.native.js.map +1 -1
  230. package/dist/esm/form/createPrefill.mjs +1 -9
  231. package/dist/esm/form/createPrefill.mjs.map +1 -1
  232. package/dist/esm/form/createPrefill.native.js +1 -9
  233. package/dist/esm/form/createPrefill.native.js.map +1 -1
  234. package/dist/esm/form/dirtyTracking.mjs +1 -26
  235. package/dist/esm/form/dirtyTracking.mjs.map +1 -1
  236. package/dist/esm/form/dirtyTracking.native.js +1 -45
  237. package/dist/esm/form/dirtyTracking.native.js.map +1 -1
  238. package/dist/esm/form/fetchFrom.mjs +1 -38
  239. package/dist/esm/form/fetchFrom.mjs.map +1 -1
  240. package/dist/esm/form/fetchFrom.native.js +1 -78
  241. package/dist/esm/form/fetchFrom.native.js.map +1 -1
  242. package/dist/esm/form/fieldPermissions.mjs +1 -26
  243. package/dist/esm/form/fieldPermissions.mjs.map +1 -1
  244. package/dist/esm/form/fieldPermissions.native.js +1 -48
  245. package/dist/esm/form/fieldPermissions.native.js.map +1 -1
  246. package/dist/esm/form/formActions.mjs +1 -145
  247. package/dist/esm/form/formActions.mjs.map +1 -1
  248. package/dist/esm/form/formActions.native.js +1 -152
  249. package/dist/esm/form/formActions.native.js.map +1 -1
  250. package/dist/esm/form/formLayout.mjs +1 -215
  251. package/dist/esm/form/formLayout.mjs.map +1 -1
  252. package/dist/esm/form/formLayout.native.js +1 -355
  253. package/dist/esm/form/formLayout.native.js.map +1 -1
  254. package/dist/esm/form/useFormEngine.mjs +1 -360
  255. package/dist/esm/form/useFormEngine.mjs.map +1 -1
  256. package/dist/esm/form/useFormEngine.native.js +1 -446
  257. package/dist/esm/form/useFormEngine.native.js.map +1 -1
  258. package/dist/esm/shared/useDoctypeMeta.mjs.map +1 -1
  259. package/dist/esm/shared/useDoctypeMeta.native.js.map +1 -1
  260. package/dist/esm/workspace/WorkspaceQuickList.mjs +2 -2
  261. package/dist/esm/workspace/WorkspaceQuickList.mjs.map +1 -1
  262. package/dist/esm/workspace/WorkspaceQuickList.native.js +4 -2
  263. package/dist/esm/workspace/WorkspaceQuickList.native.js.map +1 -1
  264. package/dist/esm/workspace/WorkspaceRecents.mjs +1 -3
  265. package/dist/esm/workspace/WorkspaceRecents.mjs.map +1 -1
  266. package/dist/esm/workspace/WorkspaceRecents.native.js +3 -3
  267. package/dist/esm/workspace/WorkspaceRecents.native.js.map +1 -1
  268. package/dist/esm/workspace/WorkspaceShortcut.mjs +1 -3
  269. package/dist/esm/workspace/WorkspaceShortcut.mjs.map +1 -1
  270. package/dist/esm/workspace/WorkspaceShortcut.native.js +4 -3
  271. package/dist/esm/workspace/WorkspaceShortcut.native.js.map +1 -1
  272. package/dist/jsx/desk/DeskSurface.mjs.map +1 -1
  273. package/dist/jsx/desk/DeskSurface.native.js.map +1 -1
  274. package/dist/jsx/form/createPrefill.mjs +1 -9
  275. package/dist/jsx/form/createPrefill.mjs.map +1 -1
  276. package/dist/jsx/form/createPrefill.native.js +3 -11
  277. package/dist/jsx/form/createPrefill.native.js.map +1 -1
  278. package/dist/jsx/form/dirtyTracking.mjs +1 -26
  279. package/dist/jsx/form/dirtyTracking.mjs.map +1 -1
  280. package/dist/jsx/form/dirtyTracking.native.js +4 -48
  281. package/dist/jsx/form/dirtyTracking.native.js.map +1 -1
  282. package/dist/jsx/form/fetchFrom.mjs +1 -38
  283. package/dist/jsx/form/fetchFrom.mjs.map +1 -1
  284. package/dist/jsx/form/fetchFrom.native.js +4 -81
  285. package/dist/jsx/form/fetchFrom.native.js.map +1 -1
  286. package/dist/jsx/form/fieldPermissions.mjs +1 -26
  287. package/dist/jsx/form/fieldPermissions.mjs.map +1 -1
  288. package/dist/jsx/form/fieldPermissions.native.js +4 -51
  289. package/dist/jsx/form/fieldPermissions.native.js.map +1 -1
  290. package/dist/jsx/form/formActions.mjs +1 -145
  291. package/dist/jsx/form/formActions.mjs.map +1 -1
  292. package/dist/jsx/form/formActions.native.js +2 -178
  293. package/dist/jsx/form/formActions.native.js.map +1 -1
  294. package/dist/jsx/form/formLayout.mjs +1 -215
  295. package/dist/jsx/form/formLayout.mjs.map +1 -1
  296. package/dist/jsx/form/formLayout.native.js +5 -359
  297. package/dist/jsx/form/formLayout.native.js.map +1 -1
  298. package/dist/jsx/form/useFormEngine.mjs +1 -360
  299. package/dist/jsx/form/useFormEngine.mjs.map +1 -1
  300. package/dist/jsx/form/useFormEngine.native.js +2 -447
  301. package/dist/jsx/form/useFormEngine.native.js.map +1 -1
  302. package/dist/jsx/shared/useDoctypeMeta.mjs.map +1 -1
  303. package/dist/jsx/shared/useDoctypeMeta.native.js.map +1 -1
  304. package/dist/jsx/workspace/WorkspaceQuickList.mjs +2 -2
  305. package/dist/jsx/workspace/WorkspaceQuickList.mjs.map +1 -1
  306. package/dist/jsx/workspace/WorkspaceQuickList.native.js +3 -1
  307. package/dist/jsx/workspace/WorkspaceQuickList.native.js.map +1 -1
  308. package/dist/jsx/workspace/WorkspaceRecents.mjs +1 -3
  309. package/dist/jsx/workspace/WorkspaceRecents.mjs.map +1 -1
  310. package/dist/jsx/workspace/WorkspaceRecents.native.js +3 -3
  311. package/dist/jsx/workspace/WorkspaceRecents.native.js.map +1 -1
  312. package/dist/jsx/workspace/WorkspaceShortcut.mjs +1 -3
  313. package/dist/jsx/workspace/WorkspaceShortcut.mjs.map +1 -1
  314. package/dist/jsx/workspace/WorkspaceShortcut.native.js +4 -3
  315. package/dist/jsx/workspace/WorkspaceShortcut.native.js.map +1 -1
  316. package/package.json +12 -13
  317. package/src/desk/DeskSurface.tsx +8 -4
  318. package/src/form/createPrefill.ts +5 -25
  319. package/src/form/dirtyTracking.ts +4 -61
  320. package/src/form/fetchFrom.ts +5 -108
  321. package/src/form/fieldPermissions.ts +7 -65
  322. package/src/form/formActions.ts +10 -281
  323. package/src/form/formEngineShim.spec.ts +122 -0
  324. package/src/form/formLayout.ts +15 -387
  325. package/src/form/useFormEngine.ts +5 -493
  326. package/src/shared/useDoctypeMeta.ts +12 -100
  327. package/src/workspace/WorkspaceQuickList.tsx +10 -2
  328. package/src/workspace/WorkspaceRecents.tsx +3 -1
  329. package/src/workspace/WorkspaceShortcut.tsx +4 -1
  330. package/types/desk/DeskSurface.d.ts.map +1 -1
  331. package/types/form/createPrefill.d.ts +5 -16
  332. package/types/form/createPrefill.d.ts.map +1 -1
  333. package/types/form/dirtyTracking.d.ts +4 -33
  334. package/types/form/dirtyTracking.d.ts.map +1 -1
  335. package/types/form/fetchFrom.d.ts +5 -40
  336. package/types/form/fetchFrom.d.ts.map +1 -1
  337. package/types/form/fieldPermissions.d.ts +7 -35
  338. package/types/form/fieldPermissions.d.ts.map +1 -1
  339. package/types/form/formActions.d.ts +6 -91
  340. package/types/form/formActions.d.ts.map +1 -1
  341. package/types/form/formLayout.d.ts +12 -89
  342. package/types/form/formLayout.d.ts.map +1 -1
  343. package/types/form/useFormEngine.d.ts +5 -58
  344. package/types/form/useFormEngine.d.ts.map +1 -1
  345. package/types/shared/useDoctypeMeta.d.ts +2 -100
  346. package/types/shared/useDoctypeMeta.d.ts.map +1 -1
  347. package/types/workspace/WorkspaceQuickList.d.ts.map +1 -1
  348. package/types/workspace/WorkspaceRecents.d.ts.map +1 -1
  349. package/types/workspace/WorkspaceShortcut.d.ts.map +1 -1
  350. package/src/form/dirtyTracking.spec.ts +0 -91
  351. package/src/form/fetchFrom.spec.ts +0 -92
  352. package/src/form/fieldPermissions.spec.ts +0 -61
  353. package/src/form/formLayout.spec.ts +0 -373
@@ -1,391 +1,19 @@
1
1
  /**
2
- * Desk form layout engine.
2
+ * Desk form layout engine — moved to
3
+ * `@multiplatform.one/frappe-ui/src/formEngine/formLayout` (MPO-15).
3
4
  *
4
- * Splits the flat DocType field list into desk tabs (Tab Break), sections
5
- * (Section Break, collapsible honored), and columns (Column Break), and
6
- * maps them to the generic `FormSchema` consumed by frappe-ui's SchemaForm.
7
- *
8
- * Dynamic behavior is computed HERE with the safe depends_on evaluator
9
- * (dependsOn.ts) the `depends_on` string is deliberately stripped from the
10
- * FieldSchema handed to SchemaForm so its string-eval-based evaluator
11
- * (which cannot run on Hermes/GJS) never engages:
12
- *
13
- * - depends_on → field omitted from the built schema
14
- * - mandatory_depends_on → `required: true` on the built FieldSchema
15
- * - read_only_depends_on → `readOnly: true` on the built FieldSchema
16
- * - permlevel → hidden without level read, read-only without
17
- * level write (role matrix via fieldPermissions.ts; coarse read-only
18
- * fallback when roles are unavailable)
19
- * - set_only_once → read-only on saved docs
20
- * - fetch_from → read-only while the source link holds a value
21
- * (unless fetch_if_empty)
22
- * - docstatus > 0 → everything read-only except allow_on_submit
23
- * fields on a submitted (1) doc
24
- * - collapsible / collapsible_depends_on / missing-mandatory → per-section
25
- * computed collapse state (desk refresh_section_collapse)
26
- *
27
- * Sections whose Section Break has a false depends_on hide wholesale; a
28
- * section with no visible fields is dropped so SchemaForm never renders an
29
- * empty card.
30
- */
31
-
32
- import { formatCalendarDate } from "@multiplatform.one/theme";
33
- import type { FieldSchema, FormSchema, FormSection } from "@multiplatform.one/frappe-ui";
34
- import { evaluateDependsOn } from "./dependsOn";
35
- import { canReadLevel, canWriteLevel, type PermLevelMatrix } from "./fieldPermissions";
36
- import { isFetchLocked } from "./fetchFrom";
37
- import type { DocFieldMeta } from "../shared/useDoctypeMeta";
38
-
39
- // ---------------------------------------------------------------------------
40
- // Types
41
- // ---------------------------------------------------------------------------
42
-
43
- export interface FormTab {
44
- /** Stable key (fieldname of the Tab Break or "__details") */
45
- key: string;
46
- label: string;
47
- schema: FormSchema;
48
- }
49
-
50
- interface LayoutColumn {
51
- fields: DocFieldMeta[];
52
- }
53
-
54
- interface LayoutSection {
55
- breakField?: DocFieldMeta;
56
- columns: LayoutColumn[];
57
- }
58
-
59
- interface LayoutTab {
60
- key: string;
61
- label?: string;
62
- sections: LayoutSection[];
63
- }
64
-
65
- // ---------------------------------------------------------------------------
66
- // Static structure (from meta, doc-independent)
67
- // ---------------------------------------------------------------------------
68
-
69
- function splitIntoTabs(fields: DocFieldMeta[]): LayoutTab[] {
70
- const tabs: LayoutTab[] = [];
71
- let currentTab: LayoutTab = { key: "__details", sections: [] };
72
- let currentSection: LayoutSection = { columns: [{ fields: [] }] };
73
- currentTab.sections.push(currentSection);
74
- tabs.push(currentTab);
75
-
76
- for (const field of fields) {
77
- switch (field.fieldtype) {
78
- case "Tab Break":
79
- currentTab = { key: field.fieldname, label: field.label, sections: [] };
80
- currentSection = { columns: [{ fields: [] }] };
81
- currentTab.sections.push(currentSection);
82
- tabs.push(currentTab);
83
- break;
84
- case "Section Break":
85
- currentSection = { breakField: field, columns: [{ fields: [] }] };
86
- currentTab.sections.push(currentSection);
87
- break;
88
- case "Column Break":
89
- currentSection.columns.push({ fields: [] });
90
- break;
91
- default:
92
- currentSection.columns[currentSection.columns.length - 1].fields.push(field);
93
- break;
94
- }
95
- }
96
- return tabs;
97
- }
98
-
99
- // ---------------------------------------------------------------------------
100
- // Doc-dependent resolution
101
- // ---------------------------------------------------------------------------
102
-
103
- export interface BuildTabsOptions {
104
- fields: DocFieldMeta[];
105
- doc: Record<string, unknown>;
106
- /** docstatus of the loaded doc (0 draft / 1 submitted / 2 cancelled). */
107
- docstatus: number;
108
- /** Meta-level read_only or missing write permission. */
109
- formReadOnly: boolean;
110
- /** Create mode relaxes read_only_depends_on on unsaved values. */
111
- isCreate: boolean;
112
- /** Default label for the implicit first tab. */
113
- detailsLabel: string;
114
- /**
115
- * Role-derived permlevel matrix (fieldPermissions.ts). Desk semantics:
116
- * fields at a level without read HIDE; read without write → read-only.
117
- * Undefined (fixtures / roles unavailable) → coarse fallback: any
118
- * permlevel > 0 renders read-only, never hidden.
119
- */
120
- permLevels?: PermLevelMatrix;
121
- /** Host-hidden fields (fieldnames) — dropped before layout resolution. */
122
- hiddenFields?: readonly string[];
123
- /**
124
- * Host-hidden sections/tabs. Matches a Section Break's or Tab Break's
125
- * fieldname OR label; the whole section (or tab) is dropped.
126
- */
127
- hiddenSections?: readonly string[];
128
- }
129
-
130
- function isFieldVisible(
131
- field: DocFieldMeta,
132
- doc: Record<string, unknown>,
133
- permLevels?: PermLevelMatrix,
134
- ): boolean {
135
- if (field.hidden) return false;
136
- // Desk hides fields whose permlevel the user cannot read (perm.js:209-215).
137
- if (!canReadLevel(permLevels, field.permlevel ?? 0)) return false;
138
- // Visibility fallback = true: an unparseable expression shows the field.
139
- return evaluateDependsOn(field.depends_on, doc, true);
140
- }
141
-
142
- function toFieldSchema(
143
- field: DocFieldMeta,
144
- doc: Record<string, unknown>,
145
- options: BuildTabsOptions,
146
- ): FieldSchema {
147
- const required =
148
- !!field.reqd ||
149
- (!!field.mandatory_depends_on && evaluateDependsOn(field.mandatory_depends_on, doc, false));
150
-
151
- let readOnly =
152
- !!field.read_only ||
153
- (!!field.read_only_depends_on && evaluateDependsOn(field.read_only_depends_on, doc, false)) ||
154
- !canWriteLevel(options.permLevels, field.permlevel ?? 0);
155
- // set_only_once: editable only while the doc is unsaved (perm.js:261-263).
156
- if (field.set_only_once && !options.isCreate) readOnly = true;
157
- // fetch_from without fetch_if_empty locks the target while its source link
158
- // holds a value (desk read_only_because_of_fetch_from).
159
- if (!readOnly && isFetchLocked(field, doc)) readOnly = true;
160
- if (options.docstatus === 1 && !field.allow_on_submit) readOnly = true;
161
- if (options.docstatus === 2) readOnly = true;
162
- if (options.formReadOnly) readOnly = true;
163
-
164
- return {
165
- type: field.fieldtype,
166
- name: field.fieldname,
167
- label: field.label,
168
- options: field.options,
169
- description: field.description,
170
- required,
171
- readOnly,
172
- precision:
173
- field.precision !== undefined && field.precision !== null && field.precision !== ""
174
- ? Number(field.precision)
175
- : undefined,
176
- maxLength:
177
- field.length !== undefined && field.length !== null && Number(field.length) > 0
178
- ? Number(field.length)
179
- : undefined,
180
- // depends_on intentionally NOT forwarded — visibility resolved here.
181
- fieldtype: field.fieldtype,
182
- fieldname: field.fieldname,
183
- in_list_view: field.in_list_view,
184
- in_standard_filter: field.in_standard_filter,
185
- };
186
- }
187
-
188
- /**
189
- * Desk's refresh_section_collapse (layout.js:463-483): a collapsible section
190
- * starts collapsed unless its `collapsible_depends_on` evaluates truthy, and
191
- * a section with a missing mandatory value is forced open. Recomputed per
192
- * doc change — SchemaForm treats it as the live default while manual toggles
193
- * survive between recomputes.
194
- */
195
- function resolveSectionCollapsed(
196
- breakField: DocFieldMeta | undefined,
197
- sectionFields: DocFieldMeta[],
198
- doc: Record<string, unknown>,
199
- ): boolean | undefined {
200
- if (!breakField?.collapsible) return undefined;
201
- let collapsed = true;
202
- if (breakField.collapsible_depends_on) {
203
- // Unparseable expression → expanded (never hide content silently).
204
- collapsed = !evaluateDependsOn(breakField.collapsible_depends_on, doc, true);
205
- }
206
- if (collapsed && sectionHasMissingMandatory(sectionFields, doc)) collapsed = false;
207
- return collapsed;
208
- }
209
-
210
- /** Desk section.has_missing_mandatory: `reqd && value == null` (section.js:146-156). */
211
- function sectionHasMissingMandatory(fields: DocFieldMeta[], doc: Record<string, unknown>): boolean {
212
- return fields.some((field) => !!field.reqd && doc[field.fieldname] == null);
213
- }
214
-
215
- /**
216
- * Build the desk tab list for the current doc state. Recomputed whenever
217
- * the doc changes so depends_on chains re-resolve; the work is O(fields).
218
- */
219
- export function buildFormTabs(options: BuildTabsOptions): FormTab[] {
220
- const { fields, doc, detailsLabel, permLevels } = options;
221
- const hiddenFieldSet = new Set(options.hiddenFields ?? []);
222
- const hiddenSectionSet = new Set(options.hiddenSections ?? []);
223
- const sectionHidden = (breakField: DocFieldMeta | undefined, label?: string): boolean => {
224
- if (hiddenSectionSet.size === 0) return false;
225
- if (breakField && hiddenSectionSet.has(breakField.fieldname)) return true;
226
- const resolvedLabel = breakField?.label ?? label;
227
- return !!resolvedLabel && hiddenSectionSet.has(resolvedLabel);
228
- };
229
- const layoutTabs = splitIntoTabs(fields);
230
- const tabs: FormTab[] = [];
231
-
232
- for (const layoutTab of layoutTabs) {
233
- // Tab Break fields support depends_on + permlevel gating too (tab.js:38-43).
234
- const tabBreak = fields.find(
235
- (field) => field.fieldtype === "Tab Break" && field.fieldname === layoutTab.key,
236
- );
237
- if (tabBreak && !isFieldVisible(tabBreak, doc, permLevels)) continue;
238
- // Host hiddenSections also match tabs (fieldname or label).
239
- if (sectionHidden(tabBreak, layoutTab.label)) continue;
240
-
241
- const sections: FormSection[] = [];
242
- const flatFields: FieldSchema[] = [];
243
-
244
- for (const section of layoutTab.sections) {
245
- // Section Breaks are not permlevel-gated in desk (sections aren't
246
- // controls; they only auto-hide when all their fields hide) — so the
247
- // permlevel matrix is deliberately not passed here.
248
- if (section.breakField && !isFieldVisible(section.breakField, doc)) continue;
249
- if (sectionHidden(section.breakField)) continue;
250
-
251
- const columns = section.columns
252
- .map((column) => ({
253
- fields: column.fields
254
- .filter(
255
- (field) =>
256
- !hiddenFieldSet.has(field.fieldname) && isFieldVisible(field, doc, permLevels),
257
- )
258
- .map((field) => toFieldSchema(field, doc, options)),
259
- }))
260
- .filter((column) => column.fields.length > 0);
261
- if (columns.length === 0) continue;
262
-
263
- for (const column of columns) flatFields.push(...column.fields);
264
- const sectionFields = section.columns.flatMap((column) => column.fields);
265
- sections.push({
266
- label: section.breakField?.label,
267
- description: section.breakField?.description,
268
- collapsible: !!section.breakField?.collapsible,
269
- collapsed: resolveSectionCollapsed(section.breakField, sectionFields, doc),
270
- hideBorder: !!section.breakField?.hide_border,
271
- columns,
272
- });
273
- }
274
-
275
- if (sections.length === 0) continue;
276
- tabs.push({
277
- key: layoutTab.key,
278
- label: layoutTab.label || detailsLabel,
279
- schema: { sections, fields: flatFields },
280
- });
281
- }
282
-
283
- return tabs;
284
- }
285
-
286
- // ---------------------------------------------------------------------------
287
- // Create-mode defaults
288
- // ---------------------------------------------------------------------------
289
-
290
- const LAYOUT_TYPES = new Set(["Section Break", "Column Break", "Tab Break", "Fold"]);
291
- const NUMERIC_TYPES = new Set(["Int", "Float", "Currency", "Percent", "Check", "Rating"]);
292
-
293
- const todayISO = () => formatCalendarDate(new Date());
294
- const nowTime = () => formatCalendarDate(new Date(), "time");
295
-
296
- /**
297
- * Seed a create-mode doc from meta field defaults — desk parity with
298
- * create_new.js get_default_value / set_default_values:
299
- *
300
- * - `Today` → today's date; `now` → time (Time) / local datetime (else)
301
- * - `__user` / `user` (Link/Data only, avoiding Select option collisions)
302
- * → session user
303
- * - Select fields with no default seed their first option
304
- * (create_new.js:107-114)
305
- * - `:fieldname` boot sysdefaults, `frappe.*`, `user_fullname` stay unset —
306
- * server-resolved on insert (documented gap)
307
- */
308
- export function buildCreateDefaults(
309
- fields: DocFieldMeta[],
310
- currentUser?: string,
311
- ): Record<string, unknown> {
312
- const doc: Record<string, unknown> = {};
313
- for (const field of fields) {
314
- if (LAYOUT_TYPES.has(field.fieldtype)) continue;
315
- const raw = field.default;
316
- if (raw === undefined || raw === null || raw === "") {
317
- // Desk seeds the first Select option when no default resolves.
318
- if (
319
- field.fieldtype === "Select" &&
320
- typeof field.options === "string" &&
321
- field.options &&
322
- !["[Select]", "Loading..."].includes(field.options)
323
- ) {
324
- doc[field.fieldname] = field.options.split("\n")[0];
325
- }
326
- continue;
327
- }
328
- if (raw === "Today") {
329
- doc[field.fieldname] = todayISO();
330
- continue;
331
- }
332
- if (raw.toLowerCase() === "now") {
333
- doc[field.fieldname] = field.fieldtype === "Time" ? nowTime() : `${todayISO()} ${nowTime()}`;
334
- continue;
335
- }
336
- if (
337
- raw === "__user" ||
338
- (raw.toLowerCase() === "user" && (field.fieldtype === "Link" || field.fieldtype === "Data"))
339
- ) {
340
- if (currentUser) doc[field.fieldname] = currentUser;
341
- continue;
342
- }
343
- if (raw === "user_fullname") continue; // session fullname not mirrored client-side
344
- if (raw.startsWith(":") || raw.startsWith("frappe.")) continue; // server-resolved
345
- doc[field.fieldname] = NUMERIC_TYPES.has(field.fieldtype) ? Number(raw) || 0 : raw;
346
- }
347
- return doc;
348
- }
349
-
350
- /**
351
- * Copyable field values for Duplicate / Amend: strips standard bookkeeping
352
- * fields, `no_copy` fields, layout breaks, and empty values.
5
+ * The exported `FrappeForm` needed the same tab / section / depends_on /
6
+ * permlevel / fetch_from resolution the desk uses, and backoffice sits a
7
+ * tier ABOVE frappe-ui, so the engine could not be reached from there. It
8
+ * lives in frappe-ui now. This module re-exports it so the barrel and the
9
+ * `@multiplatform.one/backoffice/src/form/formLayout` deep import keep
10
+ * resolving unchanged; the specs moved with the implementation.
353
11
  */
354
- export function buildCopyValues(
355
- fields: DocFieldMeta[],
356
- doc: Record<string, unknown>,
357
- ): Record<string, unknown> {
358
- const copy: Record<string, unknown> = {};
359
- for (const field of fields) {
360
- if (LAYOUT_TYPES.has(field.fieldtype)) continue;
361
- if (field.no_copy) continue;
362
- if (field.fieldtype === "Attach" || field.fieldtype === "Attach Image") continue;
363
- const value = doc[field.fieldname];
364
- if (value === undefined || value === null || value === "") continue;
365
- if (field.fieldtype === "Table" || field.fieldtype === "Table MultiSelect") {
366
- if (Array.isArray(value)) {
367
- copy[field.fieldname] = value.map((row) => {
368
- const {
369
- name: _name,
370
- parent: _parent,
371
- parentfield: _parentfield,
372
- parenttype: _parenttype,
373
- creation: _creation,
374
- modified: _modified,
375
- ...rest
376
- } = (row ?? {}) as Record<string, unknown>;
377
- return rest;
378
- });
379
- }
380
- continue;
381
- }
382
- copy[field.fieldname] = value;
383
- }
384
- return copy;
385
- }
386
12
 
387
- /** True when the doctype names docs by user prompt (show a name input). */
388
- export function isPromptNamed(autoname?: string, namingRule?: string): boolean {
389
- if (namingRule === 'By "Prompt"') return true;
390
- return (autoname ?? "").toLowerCase() === "prompt";
391
- }
13
+ export {
14
+ buildCopyValues,
15
+ buildCreateDefaults,
16
+ buildFormTabs,
17
+ isPromptNamed,
18
+ } from "@multiplatform.one/frappe-ui";
19
+ export type { BuildTabsOptions, FormTab } from "@multiplatform.one/frappe-ui";