@multiplatform.one/backoffice 7.28.0 → 7.29.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 (759) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/chrome/BackofficeAwesomebar.native.js +1 -1
  3. package/dist/cjs/chrome/BackofficeAwesomebar.native.js.map +1 -1
  4. package/dist/cjs/chrome/CommandPalette.native.js +1 -1
  5. package/dist/cjs/chrome/CommandPalette.native.js.map +1 -1
  6. package/dist/cjs/chrome/HelpMenu.native.js +1 -1
  7. package/dist/cjs/chrome/HelpMenu.native.js.map +1 -1
  8. package/dist/cjs/chrome/NotificationsButton.native.js +1 -1
  9. package/dist/cjs/chrome/NotificationsButton.native.js.map +1 -1
  10. package/dist/cjs/chrome/UserMenu.native.js +1 -1
  11. package/dist/cjs/chrome/UserMenu.native.js.map +1 -1
  12. package/dist/cjs/chrome/awesomebar-data.native.js.map +1 -1
  13. package/dist/cjs/chrome/command-palette-model.native.js +1 -1
  14. package/dist/cjs/chrome/command-palette-model.native.js.map +1 -1
  15. package/dist/cjs/chrome/help-about-dialog.native.js +1 -1
  16. package/dist/cjs/chrome/help-about-dialog.native.js.map +1 -1
  17. package/dist/cjs/chrome/help-shortcuts-dialog.native.js +1 -1
  18. package/dist/cjs/chrome/help-shortcuts-dialog.native.js.map +1 -1
  19. package/dist/cjs/chrome/notifications-data.native.js.map +1 -1
  20. package/dist/cjs/chrome/notifications-panel.native.js +1 -1
  21. package/dist/cjs/chrome/notifications-panel.native.js.map +1 -1
  22. package/dist/cjs/chrome/notifications-utils.native.js.map +1 -1
  23. package/dist/cjs/chrome/shortcuts.native.js.map +1 -1
  24. package/dist/cjs/chrome/user-session.native.js.map +1 -1
  25. package/dist/cjs/config/BackofficeProvider.native.js +1 -1
  26. package/dist/cjs/config/BackofficeProvider.native.js.map +1 -1
  27. package/dist/cjs/config/capabilities.native.js.map +1 -1
  28. package/dist/cjs/config/events.native.js.map +1 -1
  29. package/dist/cjs/config/slots.native.js.map +1 -1
  30. package/dist/cjs/desk/Desk.native.js.map +1 -1
  31. package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
  32. package/dist/cjs/desk/resolveDeskPath.native.js.map +1 -1
  33. package/dist/cjs/desk/scope.native.js.map +1 -1
  34. package/dist/cjs/desk/target.native.js.map +1 -1
  35. package/dist/cjs/form/DocFormScreen.cjs +167 -224
  36. package/dist/cjs/form/DocFormScreen.native.js +183 -260
  37. package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
  38. package/dist/cjs/form/FormConnections.native.js +1 -1
  39. package/dist/cjs/form/FormConnections.native.js.map +1 -1
  40. package/dist/cjs/form/FormDialogs.native.js +1 -1
  41. package/dist/cjs/form/FormDialogs.native.js.map +1 -1
  42. package/dist/cjs/form/FormErrorBoundary.native.js +1 -1
  43. package/dist/cjs/form/FormErrorBoundary.native.js.map +1 -1
  44. package/dist/cjs/form/FormHeaderCluster.native.js +1 -1
  45. package/dist/cjs/form/FormHeaderCluster.native.js.map +1 -1
  46. package/dist/cjs/form/FormSidebarPanel.native.js +1 -1
  47. package/dist/cjs/form/FormSidebarPanel.native.js.map +1 -1
  48. package/dist/cjs/form/FormTimeline.native.js +1 -1
  49. package/dist/cjs/form/FormTimeline.native.js.map +1 -1
  50. package/dist/cjs/form/FormToolbar.native.js +1 -1
  51. package/dist/cjs/form/FormToolbar.native.js.map +1 -1
  52. package/dist/cjs/form/connections-data.native.js.map +1 -1
  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.native.js.map +1 -1
  56. package/dist/cjs/form/docinfo.native.js.map +1 -1
  57. package/dist/cjs/form/fetchFrom.native.js.map +1 -1
  58. package/dist/cjs/form/fieldPermissions.native.js.map +1 -1
  59. package/dist/cjs/form/formActions.native.js.map +1 -1
  60. package/dist/cjs/form/formLayout.native.js.map +1 -1
  61. package/dist/cjs/form/platformHooks.native.js.map +1 -1
  62. package/dist/cjs/form/sidebar-attachments.native.js +1 -1
  63. package/dist/cjs/form/sidebar-attachments.native.js.map +1 -1
  64. package/dist/cjs/form/sidebar-dialogs.native.js +1 -1
  65. package/dist/cjs/form/sidebar-dialogs.native.js.map +1 -1
  66. package/dist/cjs/form/sidebar-people.native.js +1 -1
  67. package/dist/cjs/form/sidebar-people.native.js.map +1 -1
  68. package/dist/cjs/form/sidebar-rpc.native.js.map +1 -1
  69. package/dist/cjs/form/sidebar-utils.native.js.map +1 -1
  70. package/dist/cjs/form/timeline-entries.native.js.map +1 -1
  71. package/dist/cjs/form/timeline-utils.native.js.map +1 -1
  72. package/dist/cjs/form/useFormEngine.native.js.map +1 -1
  73. package/dist/cjs/i18n/en.cjs +1 -0
  74. package/dist/cjs/i18n/en.native.js +1 -0
  75. package/dist/cjs/i18n/en.native.js.map +1 -1
  76. package/dist/cjs/i18n/index.native.js.map +1 -1
  77. package/dist/cjs/index.native.js +1 -1
  78. package/dist/cjs/index.native.js.map +1 -1
  79. package/dist/cjs/list/AddTagsDialog.native.js +1 -1
  80. package/dist/cjs/list/AddTagsDialog.native.js.map +1 -1
  81. package/dist/cjs/list/AssignToDialog.native.js +1 -1
  82. package/dist/cjs/list/AssignToDialog.native.js.map +1 -1
  83. package/dist/cjs/list/DoctypeListScreen.native.js +1 -1
  84. package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
  85. package/dist/cjs/list/ListBulkActionsBar.cjs +30 -18
  86. package/dist/cjs/list/ListBulkActionsBar.native.js +44 -32
  87. package/dist/cjs/list/ListBulkActionsBar.native.js.map +1 -1
  88. package/dist/cjs/list/ListFilterBar.native.js +1 -1
  89. package/dist/cjs/list/ListFilterBar.native.js.map +1 -1
  90. package/dist/cjs/list/ListSidebar.native.js +1 -1
  91. package/dist/cjs/list/ListSidebar.native.js.map +1 -1
  92. package/dist/cjs/list/bulk-edit-dialog.native.js +1 -1
  93. package/dist/cjs/list/bulk-edit-dialog.native.js.map +1 -1
  94. package/dist/cjs/list/bulk-export.native.js.map +1 -1
  95. package/dist/cjs/list/bulk-submit-cancel.native.js.map +1 -1
  96. package/dist/cjs/list/bulkActions.native.js.map +1 -1
  97. package/dist/cjs/list/filter-chips.native.js +1 -1
  98. package/dist/cjs/list/filter-chips.native.js.map +1 -1
  99. package/dist/cjs/list/filter-editor.native.js +1 -1
  100. package/dist/cjs/list/filter-editor.native.js.map +1 -1
  101. package/dist/cjs/list/filter-fields.native.js.map +1 -1
  102. package/dist/cjs/list/filter-saved.native.js +1 -1
  103. package/dist/cjs/list/filter-saved.native.js.map +1 -1
  104. package/dist/cjs/list/filter-sort.native.js +1 -1
  105. package/dist/cjs/list/filter-sort.native.js.map +1 -1
  106. package/dist/cjs/list/filter-standard.native.js.map +1 -1
  107. package/dist/cjs/list/filterConversion.native.js.map +1 -1
  108. package/dist/cjs/list/list-tools-sheet.native.js +1 -1
  109. package/dist/cjs/list/list-tools-sheet.native.js.map +1 -1
  110. package/dist/cjs/list/listColumns.native.js.map +1 -1
  111. package/dist/cjs/list/listFields.native.js.map +1 -1
  112. package/dist/cjs/list/listFormat.native.js.map +1 -1
  113. package/dist/cjs/list/listUrlState.native.js.map +1 -1
  114. package/dist/cjs/list/sidebar-section.cjs +15 -7
  115. package/dist/cjs/list/sidebar-section.native.js +17 -8
  116. package/dist/cjs/list/sidebar-section.native.js.map +1 -1
  117. package/dist/cjs/list/sidebar-stats.native.js.map +1 -1
  118. package/dist/cjs/list/statusColors.native.js.map +1 -1
  119. package/dist/cjs/navigation/navigator.native.js.map +1 -1
  120. package/dist/cjs/navigation/paths.native.js.map +1 -1
  121. package/dist/cjs/oneAdapter/index.native.js.map +1 -1
  122. package/dist/cjs/quickEntry/QuickEntryDialog.native.js +1 -1
  123. package/dist/cjs/quickEntry/QuickEntryDialog.native.js.map +1 -1
  124. package/dist/cjs/quickEntry/quickEntryPlan.native.js.map +1 -1
  125. package/dist/cjs/report/DoctypeReportView.cjs +20 -374
  126. package/dist/cjs/report/DoctypeReportView.native.js +23 -455
  127. package/dist/cjs/report/DoctypeReportView.native.js.map +1 -1
  128. package/dist/cjs/report/QueryReportScreen.cjs +33 -23
  129. package/dist/cjs/report/QueryReportScreen.native.js +34 -24
  130. package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
  131. package/dist/cjs/report/queryReportColumns.cjs +3 -105
  132. package/dist/cjs/report/queryReportColumns.native.js +2 -129
  133. package/dist/cjs/report/queryReportColumns.native.js.map +1 -1
  134. package/dist/cjs/report/queryReportFilterBar.cjs +3 -4
  135. package/dist/cjs/report/queryReportFilterBar.native.js +4 -5
  136. package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
  137. package/dist/cjs/report/queryReportUrlState.cjs +2 -2
  138. package/dist/cjs/report/queryReportUrlState.native.js +2 -2
  139. package/dist/cjs/report/queryReportUrlState.native.js.map +1 -1
  140. package/dist/cjs/report/report-grid.cjs +2 -426
  141. package/dist/cjs/report/report-grid.native.js +1 -479
  142. package/dist/cjs/report/report-grid.native.js.map +1 -1
  143. package/dist/cjs/report/report-toolbar.cjs +2 -228
  144. package/dist/cjs/report/report-toolbar.native.js +1 -274
  145. package/dist/cjs/report/report-toolbar.native.js.map +1 -1
  146. package/dist/cjs/report/reportShapes.cjs +12 -383
  147. package/dist/cjs/report/reportShapes.native.js +12 -501
  148. package/dist/cjs/report/reportShapes.native.js.map +1 -1
  149. package/dist/cjs/report/reportViewModel.cjs +20 -360
  150. package/dist/cjs/report/reportViewModel.native.js +19 -627
  151. package/dist/cjs/report/reportViewModel.native.js.map +1 -1
  152. package/dist/cjs/report/savedReports.cjs +2 -106
  153. package/dist/cjs/report/savedReports.native.js +1 -132
  154. package/dist/cjs/report/savedReports.native.js.map +1 -1
  155. package/dist/cjs/report/useQueryReport.cjs +11 -219
  156. package/dist/cjs/report/useQueryReport.native.js +11 -244
  157. package/dist/cjs/report/useQueryReport.native.js.map +1 -1
  158. package/dist/cjs/shared/deskLinks.native.js.map +1 -1
  159. package/dist/cjs/shared/listNavContext.native.js.map +1 -1
  160. package/dist/cjs/shared/measures.cjs +3 -5
  161. package/dist/cjs/shared/measures.native.js +3 -5
  162. package/dist/cjs/shared/measures.native.js.map +1 -1
  163. package/dist/cjs/shared/types.native.js.map +1 -1
  164. package/dist/cjs/shared/useDocinfo.native.js.map +1 -1
  165. package/dist/cjs/shared/useDoctypeMeta.native.js.map +1 -1
  166. package/dist/cjs/shared/useFrappeApp.native.js.map +1 -1
  167. package/dist/cjs/shared/useRecentVisit.native.js.map +1 -1
  168. package/dist/cjs/shared/useSessionUserId.native.js.map +1 -1
  169. package/dist/cjs/shared/useSlugTarget.native.js.map +1 -1
  170. package/dist/cjs/shared/useUserRoles.native.js.map +1 -1
  171. package/dist/cjs/shell/BackofficeShell.native.js +1 -1
  172. package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
  173. package/dist/cjs/shell/HomeRedirect.native.js +1 -1
  174. package/dist/cjs/shell/HomeRedirect.native.js.map +1 -1
  175. package/dist/cjs/shell/NotFoundScreen.native.js +1 -1
  176. package/dist/cjs/shell/NotFoundScreen.native.js.map +1 -1
  177. package/dist/cjs/shell/SlugScreen.native.js +1 -1
  178. package/dist/cjs/shell/SlugScreen.native.js.map +1 -1
  179. package/dist/cjs/shell/WorkspaceSidebar.native.js +1 -1
  180. package/dist/cjs/shell/WorkspaceSidebar.native.js.map +1 -1
  181. package/dist/cjs/shell/useWorkspaces.native.js.map +1 -1
  182. package/dist/cjs/shell/workspaceIcons.native.js.map +1 -1
  183. package/dist/cjs/views/CalendarView.native.js +1 -1
  184. package/dist/cjs/views/CalendarView.native.js.map +1 -1
  185. package/dist/cjs/views/DashboardView.native.js +1 -1
  186. package/dist/cjs/views/DashboardView.native.js.map +1 -1
  187. package/dist/cjs/views/DoctypeViewScreen.native.js.map +1 -1
  188. package/dist/cjs/views/ImageView.native.js +1 -1
  189. package/dist/cjs/views/ImageView.native.js.map +1 -1
  190. package/dist/cjs/views/KanbanView.native.js +1 -1
  191. package/dist/cjs/views/KanbanView.native.js.map +1 -1
  192. package/dist/cjs/views/ReportView.cjs +3 -256
  193. package/dist/cjs/views/ReportView.native.js +3 -382
  194. package/dist/cjs/views/ReportView.native.js.map +1 -1
  195. package/dist/cjs/views/TreeView.native.js +1 -1
  196. package/dist/cjs/views/TreeView.native.js.map +1 -1
  197. package/dist/cjs/views/ViewHeader.native.js +1 -1
  198. package/dist/cjs/views/ViewHeader.native.js.map +1 -1
  199. package/dist/cjs/views/ViewStates.native.js +1 -1
  200. package/dist/cjs/views/ViewStates.native.js.map +1 -1
  201. package/dist/cjs/views/ViewSwitcherMenu.native.js +1 -1
  202. package/dist/cjs/views/ViewSwitcherMenu.native.js.map +1 -1
  203. package/dist/cjs/views/calendar-field-selector.native.js +1 -1
  204. package/dist/cjs/views/calendar-field-selector.native.js.map +1 -1
  205. package/dist/cjs/views/connection.native.js.map +1 -1
  206. package/dist/cjs/views/dashboard-data.native.js.map +1 -1
  207. package/dist/cjs/views/deskViewConfigs.native.js.map +1 -1
  208. package/dist/cjs/views/kanban-board-controls.native.js +1 -1
  209. package/dist/cjs/views/kanban-board-controls.native.js.map +1 -1
  210. package/dist/cjs/views/kanban-field-picker.native.js +1 -1
  211. package/dist/cjs/views/kanban-field-picker.native.js.map +1 -1
  212. package/dist/cjs/views/kanbanBoardOps.native.js.map +1 -1
  213. package/dist/cjs/views/report-controls.cjs +6 -6
  214. package/dist/cjs/views/report-controls.native.js +7 -7
  215. package/dist/cjs/views/report-controls.native.js.map +1 -1
  216. package/dist/cjs/views/viewAvailability.native.js.map +1 -1
  217. package/dist/cjs/views/viewMeta.native.js.map +1 -1
  218. package/dist/cjs/workspace/WorkspaceChartBlock.native.js +1 -1
  219. package/dist/cjs/workspace/WorkspaceChartBlock.native.js.map +1 -1
  220. package/dist/cjs/workspace/WorkspaceGrid.native.js.map +1 -1
  221. package/dist/cjs/workspace/WorkspaceLinkCard.native.js +1 -1
  222. package/dist/cjs/workspace/WorkspaceLinkCard.native.js.map +1 -1
  223. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js +1 -1
  224. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  225. package/dist/cjs/workspace/WorkspaceNumberCard.native.js +1 -1
  226. package/dist/cjs/workspace/WorkspaceNumberCard.native.js.map +1 -1
  227. package/dist/cjs/workspace/WorkspaceQuickList.native.js +1 -1
  228. package/dist/cjs/workspace/WorkspaceQuickList.native.js.map +1 -1
  229. package/dist/cjs/workspace/WorkspaceRecents.native.js +1 -1
  230. package/dist/cjs/workspace/WorkspaceRecents.native.js.map +1 -1
  231. package/dist/cjs/workspace/WorkspaceScreen.native.js +1 -1
  232. package/dist/cjs/workspace/WorkspaceScreen.native.js.map +1 -1
  233. package/dist/cjs/workspace/WorkspaceShortcut.native.js +1 -1
  234. package/dist/cjs/workspace/WorkspaceShortcut.native.js.map +1 -1
  235. package/dist/cjs/workspace/parseContent.native.js.map +1 -1
  236. package/dist/cjs/workspace/types.native.js.map +1 -1
  237. package/dist/cjs/workspace/useDashboardChart.native.js.map +1 -1
  238. package/dist/cjs/workspace/useWorkspaceDoc.native.js.map +1 -1
  239. package/dist/esm/chrome/BackofficeAwesomebar.native.js.map +1 -1
  240. package/dist/esm/chrome/CommandPalette.native.js.map +1 -1
  241. package/dist/esm/chrome/HelpMenu.native.js.map +1 -1
  242. package/dist/esm/chrome/NotificationsButton.native.js.map +1 -1
  243. package/dist/esm/chrome/UserMenu.native.js.map +1 -1
  244. package/dist/esm/chrome/awesomebar-data.native.js.map +1 -1
  245. package/dist/esm/chrome/command-palette-model.native.js.map +1 -1
  246. package/dist/esm/chrome/help-about-dialog.native.js.map +1 -1
  247. package/dist/esm/chrome/help-shortcuts-dialog.native.js.map +1 -1
  248. package/dist/esm/chrome/notifications-data.native.js.map +1 -1
  249. package/dist/esm/chrome/notifications-panel.native.js.map +1 -1
  250. package/dist/esm/chrome/notifications-utils.native.js.map +1 -1
  251. package/dist/esm/chrome/shortcuts.native.js.map +1 -1
  252. package/dist/esm/chrome/user-session.native.js.map +1 -1
  253. package/dist/esm/config/BackofficeProvider.native.js.map +1 -1
  254. package/dist/esm/config/capabilities.native.js.map +1 -1
  255. package/dist/esm/config/events.native.js.map +1 -1
  256. package/dist/esm/config/slots.native.js.map +1 -1
  257. package/dist/esm/desk/Desk.native.js.map +1 -1
  258. package/dist/esm/desk/DeskSurface.mjs.map +1 -1
  259. package/dist/esm/desk/DeskSurface.native.js.map +1 -1
  260. package/dist/esm/desk/resolveDeskPath.native.js.map +1 -1
  261. package/dist/esm/desk/scope.native.js.map +1 -1
  262. package/dist/esm/desk/target.native.js.map +1 -1
  263. package/dist/esm/form/DocFormScreen.mjs +169 -226
  264. package/dist/esm/form/DocFormScreen.mjs.map +1 -1
  265. package/dist/esm/form/DocFormScreen.native.js +184 -261
  266. package/dist/esm/form/DocFormScreen.native.js.map +1 -1
  267. package/dist/esm/form/FormConnections.native.js.map +1 -1
  268. package/dist/esm/form/FormDialogs.native.js.map +1 -1
  269. package/dist/esm/form/FormErrorBoundary.native.js.map +1 -1
  270. package/dist/esm/form/FormHeaderCluster.native.js.map +1 -1
  271. package/dist/esm/form/FormSidebarPanel.native.js.map +1 -1
  272. package/dist/esm/form/FormTimeline.native.js.map +1 -1
  273. package/dist/esm/form/FormToolbar.native.js.map +1 -1
  274. package/dist/esm/form/connections-data.native.js.map +1 -1
  275. package/dist/esm/form/createPrefill.native.js.map +1 -1
  276. package/dist/esm/form/dependsOn.native.js.map +1 -1
  277. package/dist/esm/form/dirtyTracking.native.js.map +1 -1
  278. package/dist/esm/form/docinfo.native.js.map +1 -1
  279. package/dist/esm/form/fetchFrom.native.js.map +1 -1
  280. package/dist/esm/form/fieldPermissions.native.js.map +1 -1
  281. package/dist/esm/form/formActions.native.js.map +1 -1
  282. package/dist/esm/form/formLayout.native.js.map +1 -1
  283. package/dist/esm/form/platformHooks.native.js.map +1 -1
  284. package/dist/esm/form/sidebar-attachments.native.js.map +1 -1
  285. package/dist/esm/form/sidebar-dialogs.native.js.map +1 -1
  286. package/dist/esm/form/sidebar-people.native.js.map +1 -1
  287. package/dist/esm/form/sidebar-rpc.native.js.map +1 -1
  288. package/dist/esm/form/sidebar-utils.native.js.map +1 -1
  289. package/dist/esm/form/timeline-entries.native.js.map +1 -1
  290. package/dist/esm/form/timeline-utils.native.js.map +1 -1
  291. package/dist/esm/form/useFormEngine.native.js.map +1 -1
  292. package/dist/esm/i18n/en.mjs +1 -0
  293. package/dist/esm/i18n/en.mjs.map +1 -1
  294. package/dist/esm/i18n/en.native.js +1 -0
  295. package/dist/esm/i18n/en.native.js.map +1 -1
  296. package/dist/esm/i18n/index.native.js.map +1 -1
  297. package/dist/esm/index.native.js.map +1 -1
  298. package/dist/esm/list/AddTagsDialog.native.js.map +1 -1
  299. package/dist/esm/list/AssignToDialog.native.js.map +1 -1
  300. package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
  301. package/dist/esm/list/ListBulkActionsBar.mjs +31 -19
  302. package/dist/esm/list/ListBulkActionsBar.mjs.map +1 -1
  303. package/dist/esm/list/ListBulkActionsBar.native.js +37 -25
  304. package/dist/esm/list/ListBulkActionsBar.native.js.map +1 -1
  305. package/dist/esm/list/ListFilterBar.native.js.map +1 -1
  306. package/dist/esm/list/ListSidebar.native.js.map +1 -1
  307. package/dist/esm/list/bulk-edit-dialog.native.js.map +1 -1
  308. package/dist/esm/list/bulk-export.native.js.map +1 -1
  309. package/dist/esm/list/bulk-submit-cancel.native.js.map +1 -1
  310. package/dist/esm/list/bulkActions.native.js.map +1 -1
  311. package/dist/esm/list/filter-chips.native.js.map +1 -1
  312. package/dist/esm/list/filter-editor.native.js.map +1 -1
  313. package/dist/esm/list/filter-fields.native.js.map +1 -1
  314. package/dist/esm/list/filter-saved.native.js.map +1 -1
  315. package/dist/esm/list/filter-sort.native.js.map +1 -1
  316. package/dist/esm/list/filter-standard.native.js.map +1 -1
  317. package/dist/esm/list/filterConversion.native.js.map +1 -1
  318. package/dist/esm/list/list-tools-sheet.native.js.map +1 -1
  319. package/dist/esm/list/listColumns.native.js.map +1 -1
  320. package/dist/esm/list/listFields.native.js.map +1 -1
  321. package/dist/esm/list/listFormat.native.js.map +1 -1
  322. package/dist/esm/list/listUrlState.native.js.map +1 -1
  323. package/dist/esm/list/sidebar-section.mjs +16 -8
  324. package/dist/esm/list/sidebar-section.mjs.map +1 -1
  325. package/dist/esm/list/sidebar-section.native.js +17 -8
  326. package/dist/esm/list/sidebar-section.native.js.map +1 -1
  327. package/dist/esm/list/sidebar-stats.native.js.map +1 -1
  328. package/dist/esm/list/statusColors.native.js.map +1 -1
  329. package/dist/esm/navigation/navigator.native.js.map +1 -1
  330. package/dist/esm/navigation/paths.native.js.map +1 -1
  331. package/dist/esm/oneAdapter/index.native.js.map +1 -1
  332. package/dist/esm/quickEntry/QuickEntryDialog.native.js.map +1 -1
  333. package/dist/esm/quickEntry/quickEntryPlan.native.js.map +1 -1
  334. package/dist/esm/report/DoctypeReportView.mjs +21 -375
  335. package/dist/esm/report/DoctypeReportView.mjs.map +1 -1
  336. package/dist/esm/report/DoctypeReportView.native.js +24 -456
  337. package/dist/esm/report/DoctypeReportView.native.js.map +1 -1
  338. package/dist/esm/report/QueryReportScreen.mjs +26 -16
  339. package/dist/esm/report/QueryReportScreen.mjs.map +1 -1
  340. package/dist/esm/report/QueryReportScreen.native.js +26 -16
  341. package/dist/esm/report/QueryReportScreen.native.js.map +1 -1
  342. package/dist/esm/report/queryReportColumns.mjs +1 -103
  343. package/dist/esm/report/queryReportColumns.mjs.map +1 -1
  344. package/dist/esm/report/queryReportColumns.native.js +1 -117
  345. package/dist/esm/report/queryReportColumns.native.js.map +1 -1
  346. package/dist/esm/report/queryReportFilterBar.mjs +1 -2
  347. package/dist/esm/report/queryReportFilterBar.mjs.map +1 -1
  348. package/dist/esm/report/queryReportFilterBar.native.js +1 -2
  349. package/dist/esm/report/queryReportFilterBar.native.js.map +1 -1
  350. package/dist/esm/report/queryReportUrlState.mjs +1 -1
  351. package/dist/esm/report/queryReportUrlState.native.js +1 -1
  352. package/dist/esm/report/queryReportUrlState.native.js.map +1 -1
  353. package/dist/esm/report/report-grid.mjs +1 -425
  354. package/dist/esm/report/report-grid.mjs.map +1 -1
  355. package/dist/esm/report/report-grid.native.js +1 -468
  356. package/dist/esm/report/report-grid.native.js.map +1 -1
  357. package/dist/esm/report/report-toolbar.mjs +2 -228
  358. package/dist/esm/report/report-toolbar.mjs.map +1 -1
  359. package/dist/esm/report/report-toolbar.native.js +2 -264
  360. package/dist/esm/report/report-toolbar.native.js.map +1 -1
  361. package/dist/esm/report/reportShapes.mjs +2 -373
  362. package/dist/esm/report/reportShapes.mjs.map +1 -1
  363. package/dist/esm/report/reportShapes.native.js +2 -491
  364. package/dist/esm/report/reportShapes.native.js.map +1 -1
  365. package/dist/esm/report/reportViewModel.mjs +2 -342
  366. package/dist/esm/report/reportViewModel.mjs.map +1 -1
  367. package/dist/esm/report/reportViewModel.native.js +2 -610
  368. package/dist/esm/report/reportViewModel.native.js.map +1 -1
  369. package/dist/esm/report/savedReports.mjs +1 -105
  370. package/dist/esm/report/savedReports.mjs.map +1 -1
  371. package/dist/esm/report/savedReports.native.js +1 -132
  372. package/dist/esm/report/savedReports.native.js.map +1 -1
  373. package/dist/esm/report/useQueryReport.mjs +2 -210
  374. package/dist/esm/report/useQueryReport.mjs.map +1 -1
  375. package/dist/esm/report/useQueryReport.native.js +2 -235
  376. package/dist/esm/report/useQueryReport.native.js.map +1 -1
  377. package/dist/esm/shared/deskLinks.native.js.map +1 -1
  378. package/dist/esm/shared/listNavContext.native.js.map +1 -1
  379. package/dist/esm/shared/measures.mjs +1 -3
  380. package/dist/esm/shared/measures.mjs.map +1 -1
  381. package/dist/esm/shared/measures.native.js +1 -3
  382. package/dist/esm/shared/measures.native.js.map +1 -1
  383. package/dist/esm/shared/types.native.js.map +1 -1
  384. package/dist/esm/shared/useDocinfo.native.js.map +1 -1
  385. package/dist/esm/shared/useDoctypeMeta.native.js.map +1 -1
  386. package/dist/esm/shared/useFrappeApp.native.js.map +1 -1
  387. package/dist/esm/shared/useRecentVisit.native.js.map +1 -1
  388. package/dist/esm/shared/useSessionUserId.native.js.map +1 -1
  389. package/dist/esm/shared/useSlugTarget.native.js.map +1 -1
  390. package/dist/esm/shared/useUserRoles.native.js.map +1 -1
  391. package/dist/esm/shell/BackofficeShell.native.js.map +1 -1
  392. package/dist/esm/shell/HomeRedirect.native.js.map +1 -1
  393. package/dist/esm/shell/NotFoundScreen.native.js.map +1 -1
  394. package/dist/esm/shell/SlugScreen.native.js.map +1 -1
  395. package/dist/esm/shell/WorkspaceSidebar.native.js.map +1 -1
  396. package/dist/esm/shell/useWorkspaces.native.js.map +1 -1
  397. package/dist/esm/shell/workspaceIcons.native.js.map +1 -1
  398. package/dist/esm/views/CalendarView.native.js.map +1 -1
  399. package/dist/esm/views/DashboardView.native.js.map +1 -1
  400. package/dist/esm/views/DoctypeViewScreen.native.js.map +1 -1
  401. package/dist/esm/views/ImageView.native.js.map +1 -1
  402. package/dist/esm/views/KanbanView.native.js.map +1 -1
  403. package/dist/esm/views/ReportView.mjs +3 -256
  404. package/dist/esm/views/ReportView.mjs.map +1 -1
  405. package/dist/esm/views/ReportView.native.js +3 -382
  406. package/dist/esm/views/ReportView.native.js.map +1 -1
  407. package/dist/esm/views/TreeView.native.js.map +1 -1
  408. package/dist/esm/views/ViewHeader.native.js.map +1 -1
  409. package/dist/esm/views/ViewStates.native.js.map +1 -1
  410. package/dist/esm/views/ViewSwitcherMenu.native.js.map +1 -1
  411. package/dist/esm/views/calendar-field-selector.native.js.map +1 -1
  412. package/dist/esm/views/connection.native.js.map +1 -1
  413. package/dist/esm/views/dashboard-data.native.js.map +1 -1
  414. package/dist/esm/views/deskViewConfigs.native.js.map +1 -1
  415. package/dist/esm/views/kanban-board-controls.native.js.map +1 -1
  416. package/dist/esm/views/kanban-field-picker.native.js.map +1 -1
  417. package/dist/esm/views/kanbanBoardOps.native.js.map +1 -1
  418. package/dist/esm/views/report-controls.mjs +3 -3
  419. package/dist/esm/views/report-controls.mjs.map +1 -1
  420. package/dist/esm/views/report-controls.native.js +3 -3
  421. package/dist/esm/views/report-controls.native.js.map +1 -1
  422. package/dist/esm/views/viewAvailability.native.js.map +1 -1
  423. package/dist/esm/views/viewMeta.native.js.map +1 -1
  424. package/dist/esm/workspace/WorkspaceChartBlock.native.js.map +1 -1
  425. package/dist/esm/workspace/WorkspaceGrid.native.js.map +1 -1
  426. package/dist/esm/workspace/WorkspaceLinkCard.native.js.map +1 -1
  427. package/dist/esm/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  428. package/dist/esm/workspace/WorkspaceNumberCard.native.js.map +1 -1
  429. package/dist/esm/workspace/WorkspaceQuickList.native.js.map +1 -1
  430. package/dist/esm/workspace/WorkspaceRecents.native.js.map +1 -1
  431. package/dist/esm/workspace/WorkspaceScreen.native.js.map +1 -1
  432. package/dist/esm/workspace/WorkspaceShortcut.native.js.map +1 -1
  433. package/dist/esm/workspace/parseContent.native.js.map +1 -1
  434. package/dist/esm/workspace/types.native.js.map +1 -1
  435. package/dist/esm/workspace/useDashboardChart.native.js.map +1 -1
  436. package/dist/esm/workspace/useWorkspaceDoc.native.js.map +1 -1
  437. package/dist/jsx/chrome/BackofficeAwesomebar.native.js +1 -1
  438. package/dist/jsx/chrome/BackofficeAwesomebar.native.js.map +1 -1
  439. package/dist/jsx/chrome/CommandPalette.native.js +1 -1
  440. package/dist/jsx/chrome/CommandPalette.native.js.map +1 -1
  441. package/dist/jsx/chrome/HelpMenu.native.js +1 -1
  442. package/dist/jsx/chrome/HelpMenu.native.js.map +1 -1
  443. package/dist/jsx/chrome/NotificationsButton.native.js +1 -1
  444. package/dist/jsx/chrome/NotificationsButton.native.js.map +1 -1
  445. package/dist/jsx/chrome/UserMenu.native.js +1 -1
  446. package/dist/jsx/chrome/UserMenu.native.js.map +1 -1
  447. package/dist/jsx/chrome/awesomebar-data.native.js.map +1 -1
  448. package/dist/jsx/chrome/command-palette-model.native.js +1 -1
  449. package/dist/jsx/chrome/command-palette-model.native.js.map +1 -1
  450. package/dist/jsx/chrome/help-about-dialog.native.js +1 -1
  451. package/dist/jsx/chrome/help-about-dialog.native.js.map +1 -1
  452. package/dist/jsx/chrome/help-shortcuts-dialog.native.js +1 -1
  453. package/dist/jsx/chrome/help-shortcuts-dialog.native.js.map +1 -1
  454. package/dist/jsx/chrome/notifications-data.native.js.map +1 -1
  455. package/dist/jsx/chrome/notifications-panel.native.js +1 -1
  456. package/dist/jsx/chrome/notifications-panel.native.js.map +1 -1
  457. package/dist/jsx/chrome/notifications-utils.native.js.map +1 -1
  458. package/dist/jsx/chrome/shortcuts.native.js.map +1 -1
  459. package/dist/jsx/chrome/user-session.native.js.map +1 -1
  460. package/dist/jsx/config/BackofficeProvider.native.js +1 -1
  461. package/dist/jsx/config/BackofficeProvider.native.js.map +1 -1
  462. package/dist/jsx/config/capabilities.native.js.map +1 -1
  463. package/dist/jsx/config/events.native.js.map +1 -1
  464. package/dist/jsx/config/slots.native.js.map +1 -1
  465. package/dist/jsx/desk/Desk.native.js.map +1 -1
  466. package/dist/jsx/desk/DeskSurface.mjs.map +1 -1
  467. package/dist/jsx/desk/DeskSurface.native.js.map +1 -1
  468. package/dist/jsx/desk/resolveDeskPath.native.js.map +1 -1
  469. package/dist/jsx/desk/scope.native.js.map +1 -1
  470. package/dist/jsx/desk/target.native.js.map +1 -1
  471. package/dist/jsx/form/DocFormScreen.mjs +169 -226
  472. package/dist/jsx/form/DocFormScreen.mjs.map +1 -1
  473. package/dist/jsx/form/DocFormScreen.native.js +183 -260
  474. package/dist/jsx/form/DocFormScreen.native.js.map +1 -1
  475. package/dist/jsx/form/FormConnections.native.js +1 -1
  476. package/dist/jsx/form/FormConnections.native.js.map +1 -1
  477. package/dist/jsx/form/FormDialogs.native.js +1 -1
  478. package/dist/jsx/form/FormDialogs.native.js.map +1 -1
  479. package/dist/jsx/form/FormErrorBoundary.native.js +1 -1
  480. package/dist/jsx/form/FormErrorBoundary.native.js.map +1 -1
  481. package/dist/jsx/form/FormHeaderCluster.native.js +1 -1
  482. package/dist/jsx/form/FormHeaderCluster.native.js.map +1 -1
  483. package/dist/jsx/form/FormSidebarPanel.native.js +1 -1
  484. package/dist/jsx/form/FormSidebarPanel.native.js.map +1 -1
  485. package/dist/jsx/form/FormTimeline.native.js +1 -1
  486. package/dist/jsx/form/FormTimeline.native.js.map +1 -1
  487. package/dist/jsx/form/FormToolbar.native.js +1 -1
  488. package/dist/jsx/form/FormToolbar.native.js.map +1 -1
  489. package/dist/jsx/form/connections-data.native.js.map +1 -1
  490. package/dist/jsx/form/createPrefill.native.js.map +1 -1
  491. package/dist/jsx/form/dependsOn.native.js.map +1 -1
  492. package/dist/jsx/form/dirtyTracking.native.js.map +1 -1
  493. package/dist/jsx/form/docinfo.native.js.map +1 -1
  494. package/dist/jsx/form/fetchFrom.native.js.map +1 -1
  495. package/dist/jsx/form/fieldPermissions.native.js.map +1 -1
  496. package/dist/jsx/form/formActions.native.js.map +1 -1
  497. package/dist/jsx/form/formLayout.native.js.map +1 -1
  498. package/dist/jsx/form/platformHooks.native.js.map +1 -1
  499. package/dist/jsx/form/sidebar-attachments.native.js +1 -1
  500. package/dist/jsx/form/sidebar-attachments.native.js.map +1 -1
  501. package/dist/jsx/form/sidebar-dialogs.native.js +1 -1
  502. package/dist/jsx/form/sidebar-dialogs.native.js.map +1 -1
  503. package/dist/jsx/form/sidebar-people.native.js +1 -1
  504. package/dist/jsx/form/sidebar-people.native.js.map +1 -1
  505. package/dist/jsx/form/sidebar-rpc.native.js.map +1 -1
  506. package/dist/jsx/form/sidebar-utils.native.js.map +1 -1
  507. package/dist/jsx/form/timeline-entries.native.js.map +1 -1
  508. package/dist/jsx/form/timeline-utils.native.js.map +1 -1
  509. package/dist/jsx/form/useFormEngine.native.js.map +1 -1
  510. package/dist/jsx/i18n/en.mjs +1 -0
  511. package/dist/jsx/i18n/en.mjs.map +1 -1
  512. package/dist/jsx/i18n/en.native.js +1 -0
  513. package/dist/jsx/i18n/en.native.js.map +1 -1
  514. package/dist/jsx/i18n/index.native.js.map +1 -1
  515. package/dist/jsx/index.native.js +1 -1
  516. package/dist/jsx/index.native.js.map +1 -1
  517. package/dist/jsx/list/AddTagsDialog.native.js +1 -1
  518. package/dist/jsx/list/AddTagsDialog.native.js.map +1 -1
  519. package/dist/jsx/list/AssignToDialog.native.js +1 -1
  520. package/dist/jsx/list/AssignToDialog.native.js.map +1 -1
  521. package/dist/jsx/list/DoctypeListScreen.native.js +1 -1
  522. package/dist/jsx/list/DoctypeListScreen.native.js.map +1 -1
  523. package/dist/jsx/list/ListBulkActionsBar.mjs +31 -19
  524. package/dist/jsx/list/ListBulkActionsBar.mjs.map +1 -1
  525. package/dist/jsx/list/ListBulkActionsBar.native.js +44 -32
  526. package/dist/jsx/list/ListBulkActionsBar.native.js.map +1 -1
  527. package/dist/jsx/list/ListFilterBar.native.js +1 -1
  528. package/dist/jsx/list/ListFilterBar.native.js.map +1 -1
  529. package/dist/jsx/list/ListSidebar.native.js +1 -1
  530. package/dist/jsx/list/ListSidebar.native.js.map +1 -1
  531. package/dist/jsx/list/bulk-edit-dialog.native.js +1 -1
  532. package/dist/jsx/list/bulk-edit-dialog.native.js.map +1 -1
  533. package/dist/jsx/list/bulk-export.native.js.map +1 -1
  534. package/dist/jsx/list/bulk-submit-cancel.native.js.map +1 -1
  535. package/dist/jsx/list/bulkActions.native.js.map +1 -1
  536. package/dist/jsx/list/filter-chips.native.js +1 -1
  537. package/dist/jsx/list/filter-chips.native.js.map +1 -1
  538. package/dist/jsx/list/filter-editor.native.js +1 -1
  539. package/dist/jsx/list/filter-editor.native.js.map +1 -1
  540. package/dist/jsx/list/filter-fields.native.js.map +1 -1
  541. package/dist/jsx/list/filter-saved.native.js +1 -1
  542. package/dist/jsx/list/filter-saved.native.js.map +1 -1
  543. package/dist/jsx/list/filter-sort.native.js +1 -1
  544. package/dist/jsx/list/filter-sort.native.js.map +1 -1
  545. package/dist/jsx/list/filter-standard.native.js.map +1 -1
  546. package/dist/jsx/list/filterConversion.native.js.map +1 -1
  547. package/dist/jsx/list/list-tools-sheet.native.js +1 -1
  548. package/dist/jsx/list/list-tools-sheet.native.js.map +1 -1
  549. package/dist/jsx/list/listColumns.native.js.map +1 -1
  550. package/dist/jsx/list/listFields.native.js.map +1 -1
  551. package/dist/jsx/list/listFormat.native.js.map +1 -1
  552. package/dist/jsx/list/listUrlState.native.js.map +1 -1
  553. package/dist/jsx/list/sidebar-section.mjs +16 -8
  554. package/dist/jsx/list/sidebar-section.mjs.map +1 -1
  555. package/dist/jsx/list/sidebar-section.native.js +17 -8
  556. package/dist/jsx/list/sidebar-section.native.js.map +1 -1
  557. package/dist/jsx/list/sidebar-stats.native.js.map +1 -1
  558. package/dist/jsx/list/statusColors.native.js.map +1 -1
  559. package/dist/jsx/navigation/navigator.native.js.map +1 -1
  560. package/dist/jsx/navigation/paths.native.js.map +1 -1
  561. package/dist/jsx/oneAdapter/index.native.js.map +1 -1
  562. package/dist/jsx/quickEntry/QuickEntryDialog.native.js +1 -1
  563. package/dist/jsx/quickEntry/QuickEntryDialog.native.js.map +1 -1
  564. package/dist/jsx/quickEntry/quickEntryPlan.native.js.map +1 -1
  565. package/dist/jsx/report/DoctypeReportView.mjs +21 -375
  566. package/dist/jsx/report/DoctypeReportView.mjs.map +1 -1
  567. package/dist/jsx/report/DoctypeReportView.native.js +23 -455
  568. package/dist/jsx/report/DoctypeReportView.native.js.map +1 -1
  569. package/dist/jsx/report/QueryReportScreen.mjs +26 -16
  570. package/dist/jsx/report/QueryReportScreen.mjs.map +1 -1
  571. package/dist/jsx/report/QueryReportScreen.native.js +34 -24
  572. package/dist/jsx/report/QueryReportScreen.native.js.map +1 -1
  573. package/dist/jsx/report/queryReportColumns.mjs +1 -103
  574. package/dist/jsx/report/queryReportColumns.mjs.map +1 -1
  575. package/dist/jsx/report/queryReportColumns.native.js +2 -129
  576. package/dist/jsx/report/queryReportColumns.native.js.map +1 -1
  577. package/dist/jsx/report/queryReportFilterBar.mjs +1 -2
  578. package/dist/jsx/report/queryReportFilterBar.mjs.map +1 -1
  579. package/dist/jsx/report/queryReportFilterBar.native.js +4 -5
  580. package/dist/jsx/report/queryReportFilterBar.native.js.map +1 -1
  581. package/dist/jsx/report/queryReportUrlState.mjs +1 -1
  582. package/dist/jsx/report/queryReportUrlState.native.js +2 -2
  583. package/dist/jsx/report/queryReportUrlState.native.js.map +1 -1
  584. package/dist/jsx/report/report-grid.mjs +1 -425
  585. package/dist/jsx/report/report-grid.mjs.map +1 -1
  586. package/dist/jsx/report/report-grid.native.js +1 -479
  587. package/dist/jsx/report/report-grid.native.js.map +1 -1
  588. package/dist/jsx/report/report-toolbar.mjs +2 -228
  589. package/dist/jsx/report/report-toolbar.mjs.map +1 -1
  590. package/dist/jsx/report/report-toolbar.native.js +1 -274
  591. package/dist/jsx/report/report-toolbar.native.js.map +1 -1
  592. package/dist/jsx/report/reportShapes.mjs +2 -373
  593. package/dist/jsx/report/reportShapes.mjs.map +1 -1
  594. package/dist/jsx/report/reportShapes.native.js +12 -501
  595. package/dist/jsx/report/reportShapes.native.js.map +1 -1
  596. package/dist/jsx/report/reportViewModel.mjs +2 -342
  597. package/dist/jsx/report/reportViewModel.mjs.map +1 -1
  598. package/dist/jsx/report/reportViewModel.native.js +19 -627
  599. package/dist/jsx/report/reportViewModel.native.js.map +1 -1
  600. package/dist/jsx/report/savedReports.mjs +1 -105
  601. package/dist/jsx/report/savedReports.mjs.map +1 -1
  602. package/dist/jsx/report/savedReports.native.js +1 -132
  603. package/dist/jsx/report/savedReports.native.js.map +1 -1
  604. package/dist/jsx/report/useQueryReport.mjs +2 -210
  605. package/dist/jsx/report/useQueryReport.mjs.map +1 -1
  606. package/dist/jsx/report/useQueryReport.native.js +11 -244
  607. package/dist/jsx/report/useQueryReport.native.js.map +1 -1
  608. package/dist/jsx/shared/deskLinks.native.js.map +1 -1
  609. package/dist/jsx/shared/listNavContext.native.js.map +1 -1
  610. package/dist/jsx/shared/measures.mjs +1 -3
  611. package/dist/jsx/shared/measures.mjs.map +1 -1
  612. package/dist/jsx/shared/measures.native.js +3 -5
  613. package/dist/jsx/shared/measures.native.js.map +1 -1
  614. package/dist/jsx/shared/types.native.js.map +1 -1
  615. package/dist/jsx/shared/useDocinfo.native.js.map +1 -1
  616. package/dist/jsx/shared/useDoctypeMeta.native.js.map +1 -1
  617. package/dist/jsx/shared/useFrappeApp.native.js.map +1 -1
  618. package/dist/jsx/shared/useRecentVisit.native.js.map +1 -1
  619. package/dist/jsx/shared/useSessionUserId.native.js.map +1 -1
  620. package/dist/jsx/shared/useSlugTarget.native.js.map +1 -1
  621. package/dist/jsx/shared/useUserRoles.native.js.map +1 -1
  622. package/dist/jsx/shell/BackofficeShell.native.js +1 -1
  623. package/dist/jsx/shell/BackofficeShell.native.js.map +1 -1
  624. package/dist/jsx/shell/HomeRedirect.native.js +1 -1
  625. package/dist/jsx/shell/HomeRedirect.native.js.map +1 -1
  626. package/dist/jsx/shell/NotFoundScreen.native.js +1 -1
  627. package/dist/jsx/shell/NotFoundScreen.native.js.map +1 -1
  628. package/dist/jsx/shell/SlugScreen.native.js +1 -1
  629. package/dist/jsx/shell/SlugScreen.native.js.map +1 -1
  630. package/dist/jsx/shell/WorkspaceSidebar.native.js +1 -1
  631. package/dist/jsx/shell/WorkspaceSidebar.native.js.map +1 -1
  632. package/dist/jsx/shell/useWorkspaces.native.js.map +1 -1
  633. package/dist/jsx/shell/workspaceIcons.native.js.map +1 -1
  634. package/dist/jsx/views/CalendarView.native.js +1 -1
  635. package/dist/jsx/views/CalendarView.native.js.map +1 -1
  636. package/dist/jsx/views/DashboardView.native.js +1 -1
  637. package/dist/jsx/views/DashboardView.native.js.map +1 -1
  638. package/dist/jsx/views/DoctypeViewScreen.native.js.map +1 -1
  639. package/dist/jsx/views/ImageView.native.js +1 -1
  640. package/dist/jsx/views/ImageView.native.js.map +1 -1
  641. package/dist/jsx/views/KanbanView.native.js +1 -1
  642. package/dist/jsx/views/KanbanView.native.js.map +1 -1
  643. package/dist/jsx/views/ReportView.mjs +3 -256
  644. package/dist/jsx/views/ReportView.mjs.map +1 -1
  645. package/dist/jsx/views/ReportView.native.js +3 -382
  646. package/dist/jsx/views/ReportView.native.js.map +1 -1
  647. package/dist/jsx/views/TreeView.native.js +1 -1
  648. package/dist/jsx/views/TreeView.native.js.map +1 -1
  649. package/dist/jsx/views/ViewHeader.native.js +1 -1
  650. package/dist/jsx/views/ViewHeader.native.js.map +1 -1
  651. package/dist/jsx/views/ViewStates.native.js +1 -1
  652. package/dist/jsx/views/ViewStates.native.js.map +1 -1
  653. package/dist/jsx/views/ViewSwitcherMenu.native.js +1 -1
  654. package/dist/jsx/views/ViewSwitcherMenu.native.js.map +1 -1
  655. package/dist/jsx/views/calendar-field-selector.native.js +1 -1
  656. package/dist/jsx/views/calendar-field-selector.native.js.map +1 -1
  657. package/dist/jsx/views/connection.native.js.map +1 -1
  658. package/dist/jsx/views/dashboard-data.native.js.map +1 -1
  659. package/dist/jsx/views/deskViewConfigs.native.js.map +1 -1
  660. package/dist/jsx/views/kanban-board-controls.native.js +1 -1
  661. package/dist/jsx/views/kanban-board-controls.native.js.map +1 -1
  662. package/dist/jsx/views/kanban-field-picker.native.js +1 -1
  663. package/dist/jsx/views/kanban-field-picker.native.js.map +1 -1
  664. package/dist/jsx/views/kanbanBoardOps.native.js.map +1 -1
  665. package/dist/jsx/views/report-controls.mjs +3 -3
  666. package/dist/jsx/views/report-controls.mjs.map +1 -1
  667. package/dist/jsx/views/report-controls.native.js +7 -7
  668. package/dist/jsx/views/report-controls.native.js.map +1 -1
  669. package/dist/jsx/views/viewAvailability.native.js.map +1 -1
  670. package/dist/jsx/views/viewMeta.native.js.map +1 -1
  671. package/dist/jsx/workspace/WorkspaceChartBlock.native.js +1 -1
  672. package/dist/jsx/workspace/WorkspaceChartBlock.native.js.map +1 -1
  673. package/dist/jsx/workspace/WorkspaceGrid.native.js.map +1 -1
  674. package/dist/jsx/workspace/WorkspaceLinkCard.native.js +1 -1
  675. package/dist/jsx/workspace/WorkspaceLinkCard.native.js.map +1 -1
  676. package/dist/jsx/workspace/WorkspaceLinkDirectory.native.js +1 -1
  677. package/dist/jsx/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  678. package/dist/jsx/workspace/WorkspaceNumberCard.native.js +1 -1
  679. package/dist/jsx/workspace/WorkspaceNumberCard.native.js.map +1 -1
  680. package/dist/jsx/workspace/WorkspaceQuickList.native.js +1 -1
  681. package/dist/jsx/workspace/WorkspaceQuickList.native.js.map +1 -1
  682. package/dist/jsx/workspace/WorkspaceRecents.native.js +1 -1
  683. package/dist/jsx/workspace/WorkspaceRecents.native.js.map +1 -1
  684. package/dist/jsx/workspace/WorkspaceScreen.native.js +1 -1
  685. package/dist/jsx/workspace/WorkspaceScreen.native.js.map +1 -1
  686. package/dist/jsx/workspace/WorkspaceShortcut.native.js +1 -1
  687. package/dist/jsx/workspace/WorkspaceShortcut.native.js.map +1 -1
  688. package/dist/jsx/workspace/parseContent.native.js.map +1 -1
  689. package/dist/jsx/workspace/types.native.js.map +1 -1
  690. package/dist/jsx/workspace/useDashboardChart.native.js.map +1 -1
  691. package/dist/jsx/workspace/useWorkspaceDoc.native.js.map +1 -1
  692. package/package.json +12 -12
  693. package/src/backofficeScreens.designLaw.spec.ts +0 -5
  694. package/src/desk/DeskSurface.tsx +4 -7
  695. package/src/form/DocFormScreen.chrome.spec.ts +77 -0
  696. package/src/form/DocFormScreen.guest.screen.spec.tsx +175 -0
  697. package/src/form/DocFormScreen.rights.spec.tsx +7 -3
  698. package/src/form/DocFormScreen.tsx +214 -315
  699. package/src/i18n/en.ts +1 -0
  700. package/src/list/ListBulkActionsBar.rights.spec.tsx +134 -0
  701. package/src/list/ListBulkActionsBar.screen.spec.tsx +7 -1
  702. package/src/list/ListBulkActionsBar.tsx +76 -57
  703. package/src/list/ListFilterBar.screen.spec.tsx +14 -13
  704. package/src/list/sidebar-section.tsx +11 -3
  705. package/src/report/DoctypeReportView.tsx +28 -550
  706. package/src/report/QueryReportScreen.spec.tsx +75 -1
  707. package/src/report/QueryReportScreen.tsx +38 -22
  708. package/src/report/queryReportColumns.tsx +4 -123
  709. package/src/report/queryReportFilterBar.tsx +3 -5
  710. package/src/report/queryReportUrlState.ts +1 -1
  711. package/src/report/report-grid.tsx +4 -529
  712. package/src/report/report-toolbar.tsx +4 -308
  713. package/src/report/reportShapes.ts +25 -613
  714. package/src/report/reportShim.spec.ts +162 -0
  715. package/src/report/reportViewModel.ts +32 -605
  716. package/src/report/savedReports.ts +4 -161
  717. package/src/report/useQueryReport.ts +9 -347
  718. package/src/shared/measures.ts +3 -11
  719. package/src/views/ReportView.screen.spec.tsx +25 -20
  720. package/src/views/ReportView.tsx +7 -439
  721. package/src/views/report-controls.tsx +12 -20
  722. package/types/desk/DeskSurface.d.ts.map +1 -1
  723. package/types/form/DocFormScreen.d.ts +2 -2
  724. package/types/form/DocFormScreen.d.ts.map +1 -1
  725. package/types/i18n/en.d.ts +1 -0
  726. package/types/i18n/en.d.ts.map +1 -1
  727. package/types/list/ListBulkActionsBar.d.ts.map +1 -1
  728. package/types/list/sidebar-section.d.ts.map +1 -1
  729. package/types/report/DoctypeReportView.d.ts.map +1 -1
  730. package/types/report/QueryReportScreen.d.ts +1 -1
  731. package/types/report/QueryReportScreen.d.ts.map +1 -1
  732. package/types/report/queryReportColumns.d.ts +2 -11
  733. package/types/report/queryReportColumns.d.ts.map +1 -1
  734. package/types/report/queryReportFilterBar.d.ts +1 -1
  735. package/types/report/queryReportFilterBar.d.ts.map +1 -1
  736. package/types/report/queryReportUrlState.d.ts +1 -1
  737. package/types/report/queryReportUrlState.d.ts.map +1 -1
  738. package/types/report/report-grid.d.ts +2 -19
  739. package/types/report/report-grid.d.ts.map +1 -1
  740. package/types/report/report-toolbar.d.ts +2 -29
  741. package/types/report/report-toolbar.d.ts.map +1 -1
  742. package/types/report/reportShapes.d.ts +2 -115
  743. package/types/report/reportShapes.d.ts.map +1 -1
  744. package/types/report/reportViewModel.d.ts +2 -135
  745. package/types/report/reportViewModel.d.ts.map +1 -1
  746. package/types/report/savedReports.d.ts +2 -18
  747. package/types/report/savedReports.d.ts.map +1 -1
  748. package/types/report/useQueryReport.d.ts +2 -35
  749. package/types/report/useQueryReport.d.ts.map +1 -1
  750. package/types/shared/measures.d.ts +1 -2
  751. package/types/shared/measures.d.ts.map +1 -1
  752. package/types/views/ReportView.d.ts +3 -22
  753. package/types/views/ReportView.d.ts.map +1 -1
  754. package/types/views/report-controls.d.ts +2 -5
  755. package/types/views/report-controls.d.ts.map +1 -1
  756. package/src/report/report-grid.spec.tsx +0 -175
  757. package/src/report/report-toolbar.spec.tsx +0 -90
  758. package/src/report/reportShapes.spec.ts +0 -391
  759. package/src/report/reportViewModel.spec.ts +0 -393
@@ -1,12 +1,13 @@
1
1
  import React from "react";
2
2
  /**
3
- * The document form page — desk form parity.
3
+ * The document form page — desk form parity, as page chrome over FrappeForm.
4
4
  *
5
5
  * Composition:
6
6
  * FormToolbar breadcrumbs / title (title_field) / status chip /
7
7
  * Save → Submit → Cancel/Amend lifecycle / ⋯ menu
8
- * FormBody meta-driven tabs → SchemaForm sections/columns/fields
9
- * (safe depends_on engine in formLayout.ts)
8
+ * FrappeForm the fields: tabs, sections, columns and every rule that
9
+ * decides what renders, from the controller useFrappeForm
10
+ * returns (the same engine a bare <FrappeForm> runs)
10
11
  * Sidebar assignments / attachments / tags / shares / likes / follow
11
12
  * Timeline docinfo comments + versions + communications interleaved
12
13
  * Connections linked-doctype tiles with live counts
@@ -17,24 +18,27 @@ import React from "react";
17
18
  */
18
19
 
19
20
  import {
21
+ AsyncBoundary,
20
22
  AsyncSkeleton,
21
23
  Button,
22
24
  ConfirmDialog,
23
25
  EmptyState,
24
26
  ScrollView,
25
- Tabs,
26
27
  Text,
27
28
  XStack,
28
29
  YStack,
29
30
  notify,
30
- type TabsItem,
31
31
  } from "@multiplatform.one/components";
32
- import { Input } from "@multiplatform.one/forms";
33
32
  import {
34
- SchemaForm,
35
- sessionDocRights,
33
+ FrappeForm,
34
+ docinfoRights,
35
+ fixtureDocRights,
36
+ isPermissionError,
37
+ refusalReason,
36
38
  useFrappeConfig,
39
+ useFrappeForm,
37
40
  type DocShareGrant,
41
+ type FormTab,
38
42
  } from "@multiplatform.one/frappe-ui";
39
43
  import { useLayoutSizeClass, useResolvedKnobs } from "@multiplatform.one/theme";
40
44
  import { ListBulletsIcon } from "@phosphor-icons/react";
@@ -54,10 +58,8 @@ import { getListNavNeighbors, type ListNavNeighbors } from "../shared/listNavCon
54
58
  import { invalidateDocinfo, useDocinfo } from "../shared/useDocinfo";
55
59
  import { useRecentVisit } from "../shared/useRecentVisit";
56
60
  import { useDoctypeMeta } from "../shared/useDoctypeMeta";
57
- import { useUserRoles } from "../shared/useUserRoles";
61
+ import { groupConnectionLinks } from "./connections-data";
58
62
  import { setCreatePrefill } from "./createPrefill";
59
- import { normalizeDocPermissions } from "./docinfo";
60
- import { buildPermLevelMatrix } from "./fieldPermissions";
61
63
  import { createHttpClient, renameDoc, sendEmail } from "./formActions";
62
64
  import {
63
65
  EmailDialog,
@@ -66,7 +68,6 @@ import {
66
68
  type JumpToFieldTarget,
67
69
  } from "./FormDialogs";
68
70
  import { FormErrorBoundary, wrapFieldWithErrorBoundary } from "./FormErrorBoundary";
69
- import { buildCopyValues, buildFormTabs, isPromptNamed } from "./formLayout";
70
71
  import { FormConnections } from "./FormConnections";
71
72
  import { FormHeaderCluster } from "./FormHeaderCluster";
72
73
  import { FormSidebarPanel } from "./FormSidebarPanel";
@@ -82,7 +83,6 @@ import {
82
83
  useNavigationDirtyGuard,
83
84
  useSaveShortcut,
84
85
  } from "./platformHooks";
85
- import { useFormEngine } from "./useFormEngine";
86
86
 
87
87
  /** Host overrides for the form's ⋯ toolbar menu. */
88
88
  export interface DocFormActionOverrides {
@@ -102,9 +102,9 @@ export interface DocFormScreenProps {
102
102
  name: string;
103
103
  /** Force the whole form read-only regardless of permissions. */
104
104
  readOnly?: boolean;
105
- /** Hide form sections/tabs by Section/Tab Break fieldname or label. */
105
+ /** Hide form sections/tabs by Section/Tab Break name or label. */
106
106
  hiddenSections?: readonly string[];
107
- /** Hide individual fields by fieldname. */
107
+ /** Hide individual fields by name. */
108
108
  hiddenFields?: readonly string[];
109
109
  /** Create-mode field prefill (merged over meta defaults). */
110
110
  defaults?: Record<string, unknown>;
@@ -118,6 +118,8 @@ export interface DocFormScreenProps {
118
118
 
119
119
  const CONNECTIONS_TAB = "__connections";
120
120
 
121
+ type DeskDoc = Record<string, unknown> & { name: string; doctype: string };
122
+
121
123
  export function DocFormScreen({
122
124
  doctype,
123
125
  name,
@@ -153,8 +155,8 @@ export function DocFormScreen({
153
155
 
154
156
  // `defaults` prop rides the SAME one-shot stash Duplicate/Amend and the
155
157
  // `?d=` route param use (createPrefill) — stashed in a memo (not an
156
- // effect) so the values land before useFormEngine's create-mode seeding
157
- // runs, and keyed on content so re-renders don't re-stash consumed values.
158
+ // effect) so the values land before the form's create-mode seeding runs,
159
+ // and keyed on content so re-renders don't re-stash consumed values.
158
160
  const defaultsKey = defaults ? JSON.stringify(defaults) : undefined;
159
161
  useMemo(() => {
160
162
  if (!isCreate || !defaultsKey) return;
@@ -167,24 +169,8 @@ export function DocFormScreen({
167
169
  if (!isCreate) emitEvent({ type: "doc-opened", doctype, name });
168
170
  }, [isCreate, doctype, name, emitEvent]);
169
171
 
170
- const connection = useMemo(
171
- () =>
172
- config?.baseURL
173
- ? {
174
- baseURL: config.baseURL,
175
- socketPort: config.socketPort,
176
- siteName: config.siteName,
177
- socketBaseURL: config.socketBaseURL,
178
- auth: config.auth,
179
- syncOptions: config.syncOptions,
180
- fixtures: config.fixtures,
181
- }
182
- : undefined,
183
- [config],
184
- );
185
-
186
172
  // One meta loader for the whole screen (shared getdoctype cache with the
187
- // fixture branch for stories) — the engine, sidebar, and connections all
173
+ // fixture branch for stories) — the form, sidebar, and connections all
188
174
  // read the same bundle.
189
175
  const {
190
176
  meta,
@@ -192,11 +178,14 @@ export function DocFormScreen({
192
178
  error: metaError,
193
179
  reload: refetchMeta,
194
180
  } = useDoctypeMeta(doctype);
195
- const engine = useFormEngine(connection, doctype, docName, meta, t);
196
-
197
- useEffect(() => {
198
- if (metaError && !meta) emitEvent({ type: "error", error: metaError, context: "form-meta" });
199
- }, [metaError, meta, emitEvent]);
181
+ const metaSource = useMemo(
182
+ () => ({ meta, isLoading: isMetaLoading, error: metaError }),
183
+ [meta, isMetaLoading, metaError],
184
+ );
185
+ // Guest is refused getdoctype while it may still read the record (LC-96):
186
+ // FrappeForm then lays the record out read-only, and the page offers
187
+ // nothing that needs the meta or the docinfo Guest can't read either.
188
+ const metaRefused = !meta && metaError !== undefined && isPermissionError(metaError);
200
189
 
201
190
  // Shared docinfo — one get_docinfo fetch shared with the header cluster,
202
191
  // sidebar, and timeline panels; the screen reads the permission flags and
@@ -207,10 +196,42 @@ export function DocFormScreen({
207
196
  reloadDocinfo();
208
197
  }, [doctype, docName, reloadDocinfo]);
209
198
 
199
+ // Rights: the bench's per-record answer (docinfo) when it gave one, else the
200
+ // session's (the form resolves those). Fixture mode has no session and
201
+ // keeps what the doctype's rows grant.
202
+ const fixtureMode = Boolean(config?.fixtures);
203
+ const rights = useMemo(
204
+ () =>
205
+ docinfoRights(docinfo?.permissions as Record<string, unknown> | undefined) ??
206
+ (fixtureMode ? fixtureDocRights(meta) : undefined),
207
+ [docinfo?.permissions, fixtureMode, meta],
208
+ );
209
+
210
+ const form = useFrappeForm<DeskDoc>({
211
+ doctype,
212
+ name: docName,
213
+ meta: metaSource,
214
+ rights,
215
+ shares: docinfo?.shared as DocShareGrant[] | undefined,
216
+ readShares: false,
217
+ disabled: readOnly,
218
+ hideFields: hiddenFields,
219
+ hideSections: hiddenSections,
220
+ });
221
+ const connection = form.connection;
222
+ const currentUser = form.user ?? "";
223
+ const perms = form.rights;
224
+
225
+ useEffect(() => {
226
+ if (metaError && !meta && !metaRefused) {
227
+ emitEvent({ type: "error", error: metaError, context: "form-meta" });
228
+ }
229
+ }, [metaError, meta, metaRefused, emitEvent]);
230
+
210
231
  // Refresh docinfo whenever the live doc's `modified` stamp moves —
211
232
  // an external edit usually lands with new versions/comments too.
212
233
  const modifiedStamp =
213
- typeof engine.baseline?.modified === "string" ? engine.baseline.modified : undefined;
234
+ typeof form.baseline?.modified === "string" ? form.baseline.modified : undefined;
214
235
  const stampRef = useRef<string | undefined>(undefined);
215
236
  useEffect(() => {
216
237
  stampRef.current = undefined;
@@ -226,133 +247,13 @@ export function DocFormScreen({
226
247
  }
227
248
  }, [modifiedStamp, docName, doctype, reloadDocinfo]);
228
249
 
229
- // -----------------------------------------------------------------------
230
- // Permissions: per-doc flags from docinfo when usable, else the session's
231
- // roles against meta's DocPerm rows (sessionDocRights). Fixture mode has no
232
- // session, so it keeps the union of every role's rows.
233
- // -----------------------------------------------------------------------
234
- const { roles, user: sessionUser } = useUserRoles();
235
- const fixtureMode = Boolean(config?.fixtures);
236
- const recordOwner =
237
- !isCreate && typeof engine.baseline?.owner === "string" ? engine.baseline.owner : undefined;
238
- const perms = useMemo(() => {
239
- const docPerms = normalizeDocPermissions(
240
- docinfo?.permissions as Record<string, number> | undefined,
241
- );
242
- if (docPerms) {
243
- return {
244
- write: !!docPerms.write,
245
- create: !!docPerms.create,
246
- delete: !!docPerms.delete,
247
- submit: !!docPerms.submit,
248
- cancel: !!docPerms.cancel,
249
- amend: !!docPerms.amend,
250
- email: !!docPerms.email,
251
- print: !!docPerms.print,
252
- };
253
- }
254
- if (!fixtureMode) {
255
- const rights = sessionDocRights({
256
- fixtures: false,
257
- meta,
258
- roles,
259
- user: sessionUser,
260
- owner: recordOwner,
261
- shares: docinfo?.shared as DocShareGrant[] | undefined,
262
- });
263
- return {
264
- write: rights.write,
265
- create: rights.create,
266
- delete: rights.delete,
267
- submit: rights.submit,
268
- cancel: rights.cancel,
269
- amend: rights.amend,
270
- email: rights.email,
271
- print: rights.print,
272
- };
273
- }
274
- const rules = meta?.permissions ?? [];
275
- const anyRole = (key: keyof (typeof rules)[number]) =>
276
- rules.some((rule) => !rule.permlevel && !!rule[key]);
277
- return {
278
- write: rules.length === 0 || anyRole("write"),
279
- create: rules.length === 0 || anyRole("create"),
280
- delete: anyRole("delete"),
281
- submit: anyRole("submit"),
282
- cancel: anyRole("cancel"),
283
- amend: anyRole("amend"),
284
- email: rules.length === 0 || anyRole("email"),
285
- print: rules.length === 0 || anyRole("print"),
286
- };
287
- }, [docinfo?.permissions, docinfo?.shared, meta, fixtureMode, roles, sessionUser, recordOwner]);
250
+ const isSubmittable = form.isSubmittable;
251
+ const formReadOnly = form.readOnly;
252
+ const jumpTargets = form.fieldTargets;
288
253
 
289
- const isSubmittable = !!meta?.is_submittable;
290
- const formReadOnly =
291
- !!readOnly ||
292
- !!meta?.read_only ||
293
- engine.wasDeleted ||
294
- (!isCreate && !perms.write) ||
295
- (isCreate && !perms.create);
296
-
297
- // -----------------------------------------------------------------------
298
- // Body tabs (meta + doc → SchemaForm schemas) + Connections
299
- // -----------------------------------------------------------------------
300
- // Permlevel matrix: session roles × meta.permissions (desk perm.js). Roles
301
- // stay undefined in fixture mode → coarse permlevel>0 read-only fallback.
302
- const permLevels = useMemo(
303
- () => buildPermLevelMatrix(meta?.permissions, roles),
304
- [meta?.permissions, roles],
305
- );
306
- const formTabs = useMemo(() => {
307
- if (!meta) return [];
308
- return buildFormTabs({
309
- fields: meta.fields,
310
- // depends_on evaluates against the doc plus desk's ambient context:
311
- // __islocal (unsaved doc flag) and the session user behind
312
- // `frappe.session.user` references.
313
- doc: {
314
- ...engine.doc,
315
- __islocal: isCreate ? 1 : 0,
316
- ...(engine.currentUser ? { __session_user: engine.currentUser } : {}),
317
- },
318
- docstatus: engine.docstatus,
319
- formReadOnly,
320
- isCreate,
321
- detailsLabel: t("detailsTab", "Details"),
322
- permLevels,
323
- hiddenFields,
324
- hiddenSections,
325
- });
326
- }, [
327
- meta,
328
- engine.doc,
329
- engine.currentUser,
330
- engine.docstatus,
331
- formReadOnly,
332
- isCreate,
333
- permLevels,
334
- hiddenFields,
335
- hiddenSections,
336
- t,
337
- ]);
338
-
339
- const jumpTargets = useMemo<JumpToFieldTarget[]>(
340
- () =>
341
- formTabs.flatMap((tab) =>
342
- tab.schema.fields.map((field) => ({
343
- name: field.name,
344
- label: field.label || field.name,
345
- tabKey: tab.key,
346
- tabLabel: tab.label,
347
- })),
348
- ),
349
- [formTabs],
350
- );
351
-
352
- const [activeTab, setActiveTab] = useState<string | undefined>(undefined);
353
- // Hidden link rows never render (desk parity — connections-data skips them).
354
- const showConnections =
355
- !isCreate && !!connection && (meta?.links?.some((link) => !link.hidden) ?? false);
254
+ // Connections render what FormConnections groups (connections-data skips
255
+ // the link rows a doctype hides, desk parity).
256
+ const showConnections = !isCreate && !!connection && groupConnectionLinks(meta).length > 0;
356
257
 
357
258
  // -----------------------------------------------------------------------
358
259
  // Navigation with dirty guard
@@ -360,18 +261,18 @@ export function DocFormScreen({
360
261
  const [pendingNav, setPendingNav] = useState<string | undefined>(undefined);
361
262
  const navigate = useCallback(
362
263
  (href: string) => {
363
- if (engine.isDirty) {
264
+ if (form.isDirty) {
364
265
  setPendingNav(href);
365
266
  return;
366
267
  }
367
268
  navigator.navigate(href);
368
269
  },
369
- [engine.isDirty, navigator],
270
+ [form.isDirty, navigator],
370
271
  );
371
- useBeforeUnloadGuard(engine.isDirty);
272
+ useBeforeUnloadGuard(form.isDirty);
372
273
  // Covers back navigations that skip navigate(): browser back on web,
373
274
  // back gesture/button on native (B7).
374
- const backGuard = useNavigationDirtyGuard(engine.isDirty);
275
+ const backGuard = useNavigationDirtyGuard(form.isDirty);
375
276
 
376
277
  // -----------------------------------------------------------------------
377
278
  // Actions
@@ -389,13 +290,10 @@ export function DocFormScreen({
389
290
  const handleSave = useCallback(async () => {
390
291
  // Pre-check required fields so the failing tab is surfaced — inline
391
292
  // errors on an inactive tab would otherwise fail invisibly.
392
- const validationErrors = engine.validate();
293
+ const validationErrors = form.validate();
393
294
  const errorFields = Object.keys(validationErrors);
394
295
  if (errorFields.length > 0) {
395
- const owner = formTabs.find((tab) =>
396
- tab.schema.fields.some((field) => errorFields.includes(field.name)),
397
- );
398
- if (owner) setActiveTab(owner.key);
296
+ errorFields.some((field) => form.revealField(field));
399
297
  setValidationSummary(
400
298
  t("validationSummary", {
401
299
  count: errorFields.length,
@@ -406,12 +304,12 @@ export function DocFormScreen({
406
304
  } else {
407
305
  setValidationSummary(undefined);
408
306
  }
409
- const savedName = await engine.save();
307
+ const savedName = await form.save();
410
308
  if (!savedName) return;
411
309
  setValidationSummary(undefined);
412
310
  // Explicit save confirmation (desk's green "Saved" toast) — the
413
311
  // "Not Saved" badge clearing alone is too passive a success signal.
414
- // Errors stay on the existing inline path (engine.errors.general).
312
+ // Errors stay on the form's inline path (errors.general).
415
313
  notify({
416
314
  severity: "success",
417
315
  scope: "page",
@@ -419,36 +317,29 @@ export function DocFormScreen({
419
317
  });
420
318
  invalidateDocinfo(doctype, savedName);
421
319
  emitEvent({ type: "doc-saved", doctype, name: savedName, isNew: isCreate });
422
- onSaved?.({ ...engine.doc, name: savedName });
320
+ onSaved?.({ ...form.doc, name: savedName });
423
321
  if (isCreate) {
424
322
  navigator.replace(paths.form(doctype, savedName));
425
323
  } else {
426
324
  reloadDocinfo();
427
325
  }
428
- }, [engine, formTabs, isCreate, navigator, paths, doctype, reloadDocinfo, t, emitEvent, onSaved]);
326
+ }, [form, isCreate, navigator, paths, doctype, reloadDocinfo, t, emitEvent, onSaved]);
429
327
 
430
328
  // Always swallow Cmd/Ctrl+S while the form is editable (desk parity —
431
329
  // the browser save dialog must never appear on a form page); saving
432
330
  // itself only fires when there is something to save.
433
331
  useSaveShortcut(!formReadOnly, () => {
434
- if (engine.isDirty || isCreate) void handleSave();
332
+ if (form.isDirty || isCreate) void handleSave();
435
333
  });
436
334
  useJumpToFieldShortcut(jumpTargets.length > 0 && !jumpOpen, () => setJumpOpen(true));
437
335
 
438
336
  const handleAmend = useCallback(() => {
439
- if (!meta || !docName) return;
440
- setCreatePrefill(doctype, {
441
- ...buildCopyValues(meta.fields, engine.doc),
442
- amended_from: docName,
443
- });
444
- navigator.navigate(paths.newDoc(doctype));
445
- }, [meta, docName, doctype, engine.doc, navigator, paths]);
337
+ if (form.amend()) navigator.navigate(paths.newDoc(doctype));
338
+ }, [form, doctype, navigator, paths]);
446
339
 
447
340
  const handleDuplicate = useCallback(() => {
448
- if (!meta) return;
449
- setCreatePrefill(doctype, buildCopyValues(meta.fields, engine.doc));
450
- navigator.navigate(paths.newDoc(doctype));
451
- }, [meta, doctype, engine.doc, navigator, paths]);
341
+ if (form.duplicate()) navigator.navigate(paths.newDoc(doctype));
342
+ }, [form, doctype, navigator, paths]);
452
343
 
453
344
  const handleRename = useCallback(
454
345
  async (newName: string) => {
@@ -468,7 +359,7 @@ export function DocFormScreen({
468
359
  // list order the user came from — DoctypeListScreen mirrors each resolved
469
360
  // page into the shared listNavContext store (sessionStorage-backed so a
470
361
  // reload keeps paging). No context / not in the last result (deep link,
471
- // renamed doc) → no pager at all: hidden beats dead arrows (LC-40).
362
+ // renamed doc) → no pager at all: no arrows beat dead arrows (LC-40).
472
363
  // -----------------------------------------------------------------------
473
364
  const docPager = useMemo<ListNavNeighbors>(
474
365
  () => (docName ? getListNavNeighbors(doctype, docName) : { inList: false }),
@@ -488,11 +379,11 @@ export function DocFormScreen({
488
379
  );
489
380
 
490
381
  const titleFieldValue =
491
- meta?.title_field && typeof engine.doc[meta.title_field] === "string"
382
+ meta?.title_field && typeof form.doc[meta.title_field] === "string"
492
383
  ? // Title fields can hold rich text (e.g. ToDo.description = "<p>…</p>");
493
384
  // strip to plain text so the breadcrumb + toolbar heading don't show
494
385
  // literal HTML tags.
495
- htmlToText(engine.doc[meta.title_field] as string)
386
+ htmlToText(form.doc[meta.title_field] as string)
496
387
  : undefined;
497
388
  const title = isCreate
498
389
  ? t("newDocTitle", "New {{doctype}}", { doctype })
@@ -506,20 +397,22 @@ export function DocFormScreen({
506
397
  label: t("menuReload", "Reload"),
507
398
  icon: "reload",
508
399
  onSelect: () => {
509
- engine.reload();
400
+ form.reset();
510
401
  setValidationSummary(undefined);
511
402
  refetchMeta();
512
403
  invalidateDocinfo(doctype, name);
513
404
  reloadDocinfo();
514
405
  },
515
406
  },
516
- {
407
+ ];
408
+ if (!metaRefused) {
409
+ items.push({
517
410
  key: "duplicate",
518
411
  label: t("menuDuplicate", "Duplicate"),
519
412
  icon: "duplicate",
520
413
  onSelect: handleDuplicate,
521
- },
522
- ];
414
+ });
415
+ }
523
416
  if (meta?.allow_rename && perms.write) {
524
417
  items.push({
525
418
  key: "rename",
@@ -558,7 +451,7 @@ export function DocFormScreen({
558
451
  key: "links",
559
452
  label: t("menuLinks", "Links"),
560
453
  icon: "links",
561
- onSelect: () => setActiveTab(CONNECTIONS_TAB),
454
+ onSelect: () => form.setActiveTab(CONNECTIONS_TAB),
562
455
  });
563
456
  }
564
457
  if (jumpTargets.length > 0) {
@@ -606,10 +499,11 @@ export function DocFormScreen({
606
499
  }, [
607
500
  isCreate,
608
501
  t,
609
- engine,
502
+ form,
610
503
  refetchMeta,
611
504
  reloadDocinfo,
612
505
  handleDuplicate,
506
+ metaRefused,
613
507
  meta?.allow_rename,
614
508
  perms,
615
509
  connection,
@@ -627,8 +521,8 @@ export function DocFormScreen({
627
521
  // removes built-ins by key (a host can replace "print" by hiding it and
628
522
  // injecting its own).
629
523
  const effectiveMenuItems = useMemo<FormToolbarMenuItem[]>(() => {
630
- const hidden = new Set(actionOverrides?.hide ?? []);
631
- const items = menuItems.filter((item) => !hidden.has(item.key));
524
+ const hiddenKeys = new Set(actionOverrides?.hide ?? []);
525
+ const items = menuItems.filter((item) => !hiddenKeys.has(item.key));
632
526
  const injected: BackofficeAction[] = [
633
527
  ...actionsForDoctype(actions.form, doctype),
634
528
  ...actionsForDoctype(actionOverrides?.extra, doctype),
@@ -643,11 +537,14 @@ export function DocFormScreen({
643
537
  return items;
644
538
  }, [menuItems, actions.form, actionOverrides, doctype, docName]);
645
539
 
646
- const handleJumpToField = useCallback((field: JumpToFieldTarget) => {
647
- setJumpOpen(false);
648
- setActiveTab(field.tabKey);
649
- setPendingJump(field.name);
650
- }, []);
540
+ const handleJumpToField = useCallback(
541
+ (field: JumpToFieldTarget) => {
542
+ setJumpOpen(false);
543
+ form.setActiveTab(field.tabKey);
544
+ setPendingJump(field.name);
545
+ },
546
+ [form],
547
+ );
651
548
 
652
549
  // Desk Jump-to-field: switch tab (lazyMount) then focus the LC-71 field shell.
653
550
  useEffect(() => {
@@ -704,18 +601,53 @@ export function DocFormScreen({
704
601
  );
705
602
  }
706
603
 
707
- if (metaError && !meta) {
604
+ if (metaError && !meta && !metaRefused) {
605
+ return (
606
+ <YStack flex={1}>
607
+ <AsyncBoundary
608
+ error={metaError}
609
+ errorTitle={t("metaError", "Could not load {{doctype}}", { doctype })}
610
+ onRetry={refetchMeta}
611
+ />
612
+ </YStack>
613
+ );
614
+ }
615
+
616
+ if (!isCreate && form.status === "error" && form.docError && isPermissionError(form.docError)) {
708
617
  return (
709
618
  <YStack flex={1}>
710
619
  <EmptyState
711
- title={t("metaError", "Could not load {{doctype}}", { doctype })}
712
- description={metaError.message}
620
+ testID="frappe-form-not-permitted"
621
+ title={t("docNotPermitted", "You can't open {{doctype}} {{name}}", { doctype, name })}
622
+ description={refusalReason(form.docError)}
623
+ action={
624
+ <Button icon={ListBulletsIcon} onPress={() => navigator.navigate(paths.list(doctype))}>
625
+ {t("backToList", "Back to {{doctype}} list", { doctype })}
626
+ </Button>
627
+ }
713
628
  />
714
629
  </YStack>
715
630
  );
716
631
  }
717
632
 
718
- if (!isCreate && engine.notFound) {
633
+ if (!isCreate && form.status === "error" && form.docError) {
634
+ return (
635
+ <YStack flex={1}>
636
+ <EmptyState
637
+ intent="error"
638
+ title={t("docLoadError", "Could not load {{doctype}} {{name}}", { doctype, name })}
639
+ description={form.docError.message}
640
+ action={
641
+ <Button icon={ListBulletsIcon} onPress={() => navigator.navigate(paths.list(doctype))}>
642
+ {t("backToList", "Back to {{doctype}} list", { doctype })}
643
+ </Button>
644
+ }
645
+ />
646
+ </YStack>
647
+ );
648
+ }
649
+
650
+ if (!isCreate && form.status === "notFound") {
719
651
  return (
720
652
  <YStack flex={1}>
721
653
  <EmptyState
@@ -737,7 +669,7 @@ export function DocFormScreen({
737
669
  );
738
670
  }
739
671
 
740
- if (!isCreate && engine.isLoading) {
672
+ if (!isCreate && form.status === "loading") {
741
673
  return (
742
674
  <YStack flex={1} {...knobProps.panelPadding} testID="doc-form-skeleton">
743
675
  <AsyncSkeleton layout="generic" />
@@ -750,25 +682,24 @@ export function DocFormScreen({
750
682
  // -----------------------------------------------------------------------
751
683
  const indicator = resolveIndicator({
752
684
  isCreate,
753
- isDirty: engine.isDirty,
754
- docstatus: engine.docstatus,
685
+ isDirty: form.isDirty,
686
+ docstatus: form.docstatus,
755
687
  isSubmittable,
756
- statusValue: typeof engine.doc.status === "string" ? engine.doc.status : undefined,
688
+ statusValue: typeof form.doc.status === "string" ? form.doc.status : undefined,
757
689
  states: meta?.states,
758
690
  });
759
- const canSave =
760
- !formReadOnly && (isCreate ? perms.create : perms.write && engine.docstatus === 0);
691
+ const canSave = !formReadOnly && (isCreate ? perms.create : perms.write && form.docstatus === 0);
761
692
  const canSubmit =
762
693
  !isCreate &&
763
694
  isSubmittable &&
764
- engine.docstatus === 0 &&
765
- !engine.isDirty &&
695
+ form.docstatus === 0 &&
696
+ !form.isDirty &&
766
697
  perms.submit &&
767
- !engine.wasDeleted;
698
+ !form.wasDeleted;
768
699
  const canCancel =
769
- !isCreate && isSubmittable && engine.docstatus === 1 && perms.cancel && !engine.wasDeleted;
700
+ !isCreate && isSubmittable && form.docstatus === 1 && perms.cancel && !form.wasDeleted;
770
701
  const canAmend =
771
- !isCreate && isSubmittable && engine.docstatus === 2 && perms.amend && !engine.wasDeleted;
702
+ !isCreate && isSubmittable && form.docstatus === 2 && perms.amend && !form.wasDeleted;
772
703
 
773
704
  const breadcrumbs = [
774
705
  { label: t("home", "Home"), href: paths.home() },
@@ -776,91 +707,64 @@ export function DocFormScreen({
776
707
  { label: isCreate ? t("newCrumb", "New") : title },
777
708
  ];
778
709
 
779
- const promptNamed = isCreate && isPromptNamed(meta?.autoname, meta?.naming_rule);
780
710
  // Compact (< 640): the sidebar accordion stacks between form body and
781
711
  // timeline (LC-29 — asides stack, never hide; metadata before history).
782
712
  const sidebarStacked = sizeClass === "compact";
783
713
 
784
- const bodyTabs: TabsItem[] = [
785
- ...formTabs.map((tab) => ({
786
- value: tab.key,
787
- label: tab.label,
788
- content: (
789
- <YStack {...knobProps.gapLg} paddingTop="$3">
790
- {/* Containment at two granularities: each field renders behind its
791
- own boundary (a broken field degrades to an inline error slot;
792
- siblings stay editable), and the whole tab body behind another
793
- (a SchemaForm-level crash costs one tab, not the route). */}
794
- <FormErrorBoundary
795
- errorTitle={t("formTabRenderError", "This form tab failed to render")}
796
- testID={`form-tab-error-${tab.key}`}
797
- >
798
- <SchemaForm
799
- schema={tab.schema}
800
- doc={engine.doc}
801
- setValue={engine.setValue}
802
- errors={engine.errors}
803
- disabled={formReadOnly || engine.isSaving}
804
- sectionHeadingLevel={2}
805
- renderFieldWrapper={wrapFieldWithErrorBoundary}
806
- />
807
- </FormErrorBoundary>
808
- </YStack>
809
- ),
810
- })),
811
- ...(showConnections
812
- ? [
813
- {
814
- value: CONNECTIONS_TAB,
815
- label: t("connectionsTab", "Connections"),
816
- content: (
817
- <YStack paddingTop="$3">
818
- <FormConnections doctype={doctype} name={name} meta={meta} />
819
- </YStack>
820
- ),
821
- },
822
- ]
823
- : []),
824
- ];
714
+ const connectionsTab = showConnections
715
+ ? [
716
+ {
717
+ value: CONNECTIONS_TAB,
718
+ label: t("connectionsTab", "Connections"),
719
+ content: (
720
+ <YStack paddingTop="$3">
721
+ <FormConnections doctype={doctype} name={name} meta={meta} />
722
+ </YStack>
723
+ ),
724
+ },
725
+ ]
726
+ : [];
825
727
 
826
- // Guard against a stale active tab (a Tab Break hidden by depends_on
827
- // while active) — fall back to the first visible tab.
828
- const effectiveTab =
829
- activeTab && bodyTabs.some((tab) => tab.value === activeTab) ? activeTab : bodyTabs[0]?.value;
728
+ // Containment at two granularities: each field renders behind its own
729
+ // boundary (a broken field degrades to an inline error slot; siblings stay
730
+ // editable), and the whole tab body behind another (a crash in the form
731
+ // costs one tab, not the route).
732
+ const renderTab = (tab: FormTab, content: React.ReactNode) => (
733
+ <YStack {...knobProps.gapLg} paddingTop="$3">
734
+ <FormErrorBoundary
735
+ errorTitle={t("formTabRenderError", "This form tab failed to render")}
736
+ testID={`form-tab-error-${tab.key}`}
737
+ >
738
+ {content}
739
+ </FormErrorBoundary>
740
+ </YStack>
741
+ );
830
742
 
831
743
  const formBody = (
832
- // No flex here: formBody now lives inside COLUMN containers (both
833
- // branches below), where `flex={1}` means flex-basis:0 — the body would
834
- // stop contributing height and the timeline/sidebar would paint over it.
835
- <YStack minWidth={0} {...knobProps.gapLg}>
836
- {promptNamed && (
837
- <YStack {...knobProps.gap}>
838
- <Input
839
- label={t("namePrompt", "Name")}
840
- value={typeof engine.doc.name === "string" ? engine.doc.name : ""}
841
- onChangeText={(value) => engine.setValue("name", value)}
842
- placeholder={t("namePromptPlaceholder", "New document name")}
843
- error={engine.errors.name}
844
- />
845
- </YStack>
846
- )}
847
-
848
- {bodyTabs.length > 1 ? (
849
- <Tabs items={bodyTabs} value={effectiveTab} onChange={setActiveTab} lazyMount />
850
- ) : (
851
- (bodyTabs[0]?.content ?? null)
852
- )}
853
-
854
- {engine.errors.general && (
855
- <Text color="$red10" fontSize="$3" role="alert">
856
- {engine.errors.general}
857
- </Text>
858
- )}
744
+ // No flex here: formBody lives inside COLUMN containers (both branches
745
+ // below), where `flex={1}` means flex-basis:0 — the body would stop
746
+ // contributing height and the timeline/sidebar would paint over it.
747
+ <YStack minWidth={0}>
748
+ <FrappeForm<DeskDoc>
749
+ form={form}
750
+ doctype={doctype}
751
+ name={docName}
752
+ disabled={readOnly}
753
+ showToolbar={false}
754
+ showSidebar={false}
755
+ showTimeline={false}
756
+ showConnections={false}
757
+ showBanners={false}
758
+ sectionHeadingLevel={2}
759
+ renderFieldWrapper={wrapFieldWithErrorBoundary}
760
+ renderTab={renderTab}
761
+ extraTabs={connectionsTab}
762
+ />
859
763
  </YStack>
860
764
  );
861
765
 
862
766
  const timeline =
863
- capabilities.timeline.enabled && !isCreate && docName ? (
767
+ capabilities.timeline.enabled && !isCreate && docName && !metaRefused ? (
864
768
  // Composed mode: the screen's shared docinfo (and its refresh) feed
865
769
  // the timeline. Self-fetch mode subscribed the timeline to its OWN
866
770
  // cache entry, which the save path's invalidate+reload orphaned — the
@@ -871,7 +775,7 @@ export function DocFormScreen({
871
775
  name={docName}
872
776
  docInfo={docinfo}
873
777
  refreshDocInfo={refreshDocinfo}
874
- currentUser={engine.currentUser}
778
+ currentUser={currentUser}
875
779
  connection={connection}
876
780
  />
877
781
  ) : null;
@@ -882,9 +786,9 @@ export function DocFormScreen({
882
786
  doctype={doctype}
883
787
  name={docName}
884
788
  meta={meta}
885
- doc={engine.doc}
789
+ doc={form.doc}
886
790
  docinfo={docinfo}
887
- currentUser={engine.currentUser}
791
+ currentUser={currentUser}
888
792
  onRefresh={refreshDocinfo}
889
793
  stacked={sidebarStacked}
890
794
  />
@@ -897,14 +801,14 @@ export function DocFormScreen({
897
801
  title={title}
898
802
  indicator={indicator}
899
803
  showIndicator={!!meta}
900
- isSaving={engine.isSaving}
804
+ isSaving={form.isSubmitting}
901
805
  cluster={
902
- !isCreate && docName ? (
806
+ !isCreate && docName && !metaRefused ? (
903
807
  <FormHeaderCluster
904
808
  doctype={doctype}
905
809
  name={docName}
906
810
  docinfo={docinfo}
907
- currentUser={engine.currentUser}
811
+ currentUser={currentUser}
908
812
  onRefresh={refreshDocinfo}
909
813
  />
910
814
  ) : undefined
@@ -944,9 +848,9 @@ export function DocFormScreen({
944
848
  })
945
849
  : toolbar}
946
850
 
947
- {(engine.wasDeleted || validationSummary || engine.conflict) && (
851
+ {(form.wasDeleted || validationSummary || form.conflict) && (
948
852
  <YStack paddingHorizontal="$3">
949
- {engine.wasDeleted && (
853
+ {form.wasDeleted && (
950
854
  <XStack
951
855
  role="alert"
952
856
  {...knobProps.containerRadius}
@@ -962,7 +866,7 @@ export function DocFormScreen({
962
866
  </XStack>
963
867
  )}
964
868
 
965
- {validationSummary && !engine.wasDeleted && (
869
+ {validationSummary && !form.wasDeleted && (
966
870
  <XStack
967
871
  role="alert"
968
872
  {...knobProps.containerRadius}
@@ -976,7 +880,7 @@ export function DocFormScreen({
976
880
  </XStack>
977
881
  )}
978
882
 
979
- {engine.conflict && !engine.wasDeleted && (
883
+ {form.conflict && !form.wasDeleted && (
980
884
  <XStack
981
885
  role="status"
982
886
  alignItems="center"
@@ -989,12 +893,7 @@ export function DocFormScreen({
989
893
  <Text color="$orange11" fontSize="$3" flex={1}>
990
894
  {t("conflictBanner", "This document changed on the server while you were editing.")}
991
895
  </Text>
992
- <Button
993
- size="$2"
994
- outlined
995
- aria-label={t("reloadDoc", "Reload")}
996
- onPress={engine.reload}
997
- >
896
+ <Button size="$2" outlined aria-label={t("reloadDoc", "Reload")} onPress={form.reset}>
998
897
  {t("reloadDoc", "Reload")}
999
898
  </Button>
1000
899
  </XStack>
@@ -1037,7 +936,7 @@ export function DocFormScreen({
1037
936
  warning
1038
937
  onConfirm={() => {
1039
938
  setConfirmAction(undefined);
1040
- void engine.submit().then((ok) => {
939
+ void form.submitDocument().then((ok) => {
1041
940
  if (ok) {
1042
941
  notify({
1043
942
  severity: "success",
@@ -1061,7 +960,7 @@ export function DocFormScreen({
1061
960
  destructive
1062
961
  onConfirm={() => {
1063
962
  setConfirmAction(undefined);
1064
- void engine.cancel().then((ok) => {
963
+ void form.cancelDocument().then((ok) => {
1065
964
  if (ok) {
1066
965
  notify({
1067
966
  severity: "success",
@@ -1085,7 +984,7 @@ export function DocFormScreen({
1085
984
  destructive
1086
985
  onConfirm={() => {
1087
986
  setConfirmAction(undefined);
1088
- void engine.remove().then((ok) => {
987
+ void form.remove().then((ok) => {
1089
988
  if (ok) {
1090
989
  invalidateDocinfo(doctype, name);
1091
990
  emitEvent({ type: "doc-deleted", doctype, name });