@multiplatform.one/backoffice 7.23.2 → 7.25.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 (523) 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.cjs +4 -2
  12. package/dist/cjs/chrome/awesomebar-data.native.js +7 -4
  13. package/dist/cjs/chrome/awesomebar-data.native.js.map +1 -1
  14. package/dist/cjs/chrome/command-palette-model.native.js +1 -1
  15. package/dist/cjs/chrome/command-palette-model.native.js.map +1 -1
  16. package/dist/cjs/chrome/help-about-dialog.cjs +2 -2
  17. package/dist/cjs/chrome/help-about-dialog.native.js +3 -3
  18. package/dist/cjs/chrome/help-about-dialog.native.js.map +1 -1
  19. package/dist/cjs/chrome/help-shortcuts-dialog.cjs +2 -2
  20. package/dist/cjs/chrome/help-shortcuts-dialog.native.js +3 -3
  21. package/dist/cjs/chrome/help-shortcuts-dialog.native.js.map +1 -1
  22. package/dist/cjs/chrome/notifications-data.native.js.map +1 -1
  23. package/dist/cjs/chrome/notifications-panel.cjs +8 -6
  24. package/dist/cjs/chrome/notifications-panel.native.js +9 -7
  25. package/dist/cjs/chrome/notifications-panel.native.js.map +1 -1
  26. package/dist/cjs/chrome/notifications-utils.native.js.map +1 -1
  27. package/dist/cjs/chrome/shortcuts.native.js.map +1 -1
  28. package/dist/cjs/chrome/user-session.native.js.map +1 -1
  29. package/dist/cjs/config/BackofficeProvider.native.js +1 -1
  30. package/dist/cjs/config/BackofficeProvider.native.js.map +1 -1
  31. package/dist/cjs/config/capabilities.native.js.map +1 -1
  32. package/dist/cjs/config/events.native.js.map +1 -1
  33. package/dist/cjs/config/slots.native.js.map +1 -1
  34. package/dist/cjs/desk/Desk.native.js.map +1 -1
  35. package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
  36. package/dist/cjs/desk/resolveDeskPath.native.js.map +1 -1
  37. package/dist/cjs/desk/scope.native.js.map +1 -1
  38. package/dist/cjs/desk/target.native.js.map +1 -1
  39. package/dist/cjs/form/DocFormScreen.cjs +43 -43
  40. package/dist/cjs/form/DocFormScreen.native.js +44 -44
  41. package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
  42. package/dist/cjs/form/FormConnections.native.js +1 -1
  43. package/dist/cjs/form/FormConnections.native.js.map +1 -1
  44. package/dist/cjs/form/FormDialogs.native.js +1 -1
  45. package/dist/cjs/form/FormDialogs.native.js.map +1 -1
  46. package/dist/cjs/form/FormErrorBoundary.native.js +1 -1
  47. package/dist/cjs/form/FormErrorBoundary.native.js.map +1 -1
  48. package/dist/cjs/form/FormHeaderCluster.native.js +1 -1
  49. package/dist/cjs/form/FormHeaderCluster.native.js.map +1 -1
  50. package/dist/cjs/form/FormSidebarPanel.native.js +1 -1
  51. package/dist/cjs/form/FormSidebarPanel.native.js.map +1 -1
  52. package/dist/cjs/form/FormTimeline.native.js +1 -1
  53. package/dist/cjs/form/FormTimeline.native.js.map +1 -1
  54. package/dist/cjs/form/FormToolbar.native.js +1 -1
  55. package/dist/cjs/form/FormToolbar.native.js.map +1 -1
  56. package/dist/cjs/form/connections-data.native.js.map +1 -1
  57. package/dist/cjs/form/createPrefill.native.js.map +1 -1
  58. package/dist/cjs/form/dependsOn.native.js.map +1 -1
  59. package/dist/cjs/form/dirtyTracking.native.js.map +1 -1
  60. package/dist/cjs/form/docinfo.native.js.map +1 -1
  61. package/dist/cjs/form/fetchFrom.native.js.map +1 -1
  62. package/dist/cjs/form/fieldPermissions.native.js.map +1 -1
  63. package/dist/cjs/form/formActions.native.js.map +1 -1
  64. package/dist/cjs/form/formLayout.native.js.map +1 -1
  65. package/dist/cjs/form/platformHooks.native.js.map +1 -1
  66. package/dist/cjs/form/sidebar-attachments.native.js +1 -1
  67. package/dist/cjs/form/sidebar-attachments.native.js.map +1 -1
  68. package/dist/cjs/form/sidebar-dialogs.native.js +1 -1
  69. package/dist/cjs/form/sidebar-dialogs.native.js.map +1 -1
  70. package/dist/cjs/form/sidebar-people.cjs +5 -2
  71. package/dist/cjs/form/sidebar-people.native.js +6 -3
  72. package/dist/cjs/form/sidebar-people.native.js.map +1 -1
  73. package/dist/cjs/form/sidebar-rpc.native.js.map +1 -1
  74. package/dist/cjs/form/sidebar-utils.native.js.map +1 -1
  75. package/dist/cjs/form/timeline-entries.native.js.map +1 -1
  76. package/dist/cjs/form/timeline-utils.native.js.map +1 -1
  77. package/dist/cjs/form/useFormEngine.native.js.map +1 -1
  78. package/dist/cjs/i18n/en.cjs +1 -1
  79. package/dist/cjs/i18n/en.native.js +1 -1
  80. package/dist/cjs/i18n/en.native.js.map +1 -1
  81. package/dist/cjs/i18n/index.native.js.map +1 -1
  82. package/dist/cjs/index.native.js +1 -1
  83. package/dist/cjs/index.native.js.map +1 -1
  84. package/dist/cjs/list/AddTagsDialog.native.js +1 -1
  85. package/dist/cjs/list/AddTagsDialog.native.js.map +1 -1
  86. package/dist/cjs/list/AssignToDialog.native.js +1 -1
  87. package/dist/cjs/list/AssignToDialog.native.js.map +1 -1
  88. package/dist/cjs/list/DoctypeListScreen.native.js +1 -1
  89. package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
  90. package/dist/cjs/list/ListBulkActionsBar.cjs +1 -1
  91. package/dist/cjs/list/ListBulkActionsBar.native.js +2 -3
  92. package/dist/cjs/list/ListBulkActionsBar.native.js.map +1 -1
  93. package/dist/cjs/list/ListFilterBar.native.js +1 -1
  94. package/dist/cjs/list/ListFilterBar.native.js.map +1 -1
  95. package/dist/cjs/list/ListSidebar.native.js +1 -1
  96. package/dist/cjs/list/ListSidebar.native.js.map +1 -1
  97. package/dist/cjs/list/bulk-edit-dialog.native.js +1 -1
  98. package/dist/cjs/list/bulk-edit-dialog.native.js.map +1 -1
  99. package/dist/cjs/list/bulk-export.native.js.map +1 -1
  100. package/dist/cjs/list/bulk-submit-cancel.native.js.map +1 -1
  101. package/dist/cjs/list/bulkActions.native.js.map +1 -1
  102. package/dist/cjs/list/filter-chips.native.js +1 -1
  103. package/dist/cjs/list/filter-chips.native.js.map +1 -1
  104. package/dist/cjs/list/filter-editor.native.js +1 -1
  105. package/dist/cjs/list/filter-editor.native.js.map +1 -1
  106. package/dist/cjs/list/filter-fields.native.js.map +1 -1
  107. package/dist/cjs/list/filter-saved.native.js +1 -1
  108. package/dist/cjs/list/filter-saved.native.js.map +1 -1
  109. package/dist/cjs/list/filter-sort.native.js +1 -1
  110. package/dist/cjs/list/filter-sort.native.js.map +1 -1
  111. package/dist/cjs/list/filter-standard.native.js.map +1 -1
  112. package/dist/cjs/list/filterConversion.native.js.map +1 -1
  113. package/dist/cjs/list/list-tools-sheet.native.js +1 -1
  114. package/dist/cjs/list/list-tools-sheet.native.js.map +1 -1
  115. package/dist/cjs/list/listColumns.native.js.map +1 -1
  116. package/dist/cjs/list/listFields.native.js.map +1 -1
  117. package/dist/cjs/list/listFormat.native.js.map +1 -1
  118. package/dist/cjs/list/listUrlState.native.js.map +1 -1
  119. package/dist/cjs/list/sidebar-section.native.js +1 -1
  120. package/dist/cjs/list/sidebar-section.native.js.map +1 -1
  121. package/dist/cjs/list/sidebar-stats.native.js.map +1 -1
  122. package/dist/cjs/list/statusColors.native.js.map +1 -1
  123. package/dist/cjs/navigation/navigator.native.js.map +1 -1
  124. package/dist/cjs/navigation/paths.native.js.map +1 -1
  125. package/dist/cjs/oneAdapter/index.native.js.map +1 -1
  126. package/dist/cjs/quickEntry/QuickEntryDialog.native.js +1 -1
  127. package/dist/cjs/quickEntry/QuickEntryDialog.native.js.map +1 -1
  128. package/dist/cjs/quickEntry/quickEntryPlan.native.js.map +1 -1
  129. package/dist/cjs/report/DoctypeReportView.native.js +1 -1
  130. package/dist/cjs/report/DoctypeReportView.native.js.map +1 -1
  131. package/dist/cjs/report/QueryReportScreen.native.js +1 -1
  132. package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
  133. package/dist/cjs/report/queryReportColumns.native.js.map +1 -1
  134. package/dist/cjs/report/queryReportFilterBar.native.js +1 -1
  135. package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
  136. package/dist/cjs/report/queryReportUrlState.native.js.map +1 -1
  137. package/dist/cjs/report/report-grid.native.js +1 -1
  138. package/dist/cjs/report/report-grid.native.js.map +1 -1
  139. package/dist/cjs/report/report-toolbar.native.js +1 -1
  140. package/dist/cjs/report/report-toolbar.native.js.map +1 -1
  141. package/dist/cjs/report/reportShapes.native.js.map +1 -1
  142. package/dist/cjs/report/reportViewModel.native.js.map +1 -1
  143. package/dist/cjs/report/savedReports.native.js.map +1 -1
  144. package/dist/cjs/report/useQueryReport.native.js.map +1 -1
  145. package/dist/cjs/shared/deskLinks.native.js.map +1 -1
  146. package/dist/cjs/shared/listNavContext.native.js.map +1 -1
  147. package/dist/cjs/shared/measures.native.js.map +1 -1
  148. package/dist/cjs/shared/types.native.js.map +1 -1
  149. package/dist/cjs/shared/useDocinfo.native.js.map +1 -1
  150. package/dist/cjs/shared/useDoctypeMeta.native.js.map +1 -1
  151. package/dist/cjs/shared/useFrappeApp.native.js.map +1 -1
  152. package/dist/cjs/shared/useRecentVisit.native.js.map +1 -1
  153. package/dist/cjs/shared/useSessionUserId.native.js.map +1 -1
  154. package/dist/cjs/shared/useSlugTarget.native.js.map +1 -1
  155. package/dist/cjs/shared/useUserRoles.native.js.map +1 -1
  156. package/dist/cjs/shell/BackofficeShell.native.js +1 -1
  157. package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
  158. package/dist/cjs/shell/HomeRedirect.native.js +1 -1
  159. package/dist/cjs/shell/HomeRedirect.native.js.map +1 -1
  160. package/dist/cjs/shell/NotFoundScreen.native.js +1 -1
  161. package/dist/cjs/shell/NotFoundScreen.native.js.map +1 -1
  162. package/dist/cjs/shell/SlugScreen.native.js +1 -1
  163. package/dist/cjs/shell/SlugScreen.native.js.map +1 -1
  164. package/dist/cjs/shell/WorkspaceSidebar.cjs +9 -7
  165. package/dist/cjs/shell/WorkspaceSidebar.native.js +10 -8
  166. package/dist/cjs/shell/WorkspaceSidebar.native.js.map +1 -1
  167. package/dist/cjs/shell/useWorkspaces.native.js.map +1 -1
  168. package/dist/cjs/shell/workspaceIcons.native.js.map +1 -1
  169. package/dist/cjs/views/CalendarView.cjs +5 -1
  170. package/dist/cjs/views/CalendarView.native.js +8 -3
  171. package/dist/cjs/views/CalendarView.native.js.map +1 -1
  172. package/dist/cjs/views/DashboardView.cjs +9 -3
  173. package/dist/cjs/views/DashboardView.native.js +10 -4
  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.cjs +5 -2
  179. package/dist/cjs/views/KanbanView.native.js +8 -4
  180. package/dist/cjs/views/KanbanView.native.js.map +1 -1
  181. package/dist/cjs/views/ReportView.cjs +8 -5
  182. package/dist/cjs/views/ReportView.native.js +12 -7
  183. package/dist/cjs/views/ReportView.native.js.map +1 -1
  184. package/dist/cjs/views/TreeView.native.js +1 -1
  185. package/dist/cjs/views/TreeView.native.js.map +1 -1
  186. package/dist/cjs/views/ViewHeader.cjs +8 -1
  187. package/dist/cjs/views/ViewHeader.native.js +9 -2
  188. package/dist/cjs/views/ViewHeader.native.js.map +1 -1
  189. package/dist/cjs/views/ViewStates.native.js +1 -1
  190. package/dist/cjs/views/ViewStates.native.js.map +1 -1
  191. package/dist/cjs/views/ViewSwitcherMenu.native.js +1 -1
  192. package/dist/cjs/views/ViewSwitcherMenu.native.js.map +1 -1
  193. package/dist/cjs/views/calendar-field-selector.native.js +1 -1
  194. package/dist/cjs/views/calendar-field-selector.native.js.map +1 -1
  195. package/dist/cjs/views/connection.native.js.map +1 -1
  196. package/dist/cjs/views/dashboard-data.cjs +17 -11
  197. package/dist/cjs/views/dashboard-data.native.js +20 -13
  198. package/dist/cjs/views/dashboard-data.native.js.map +1 -1
  199. package/dist/cjs/views/deskViewConfigs.native.js.map +1 -1
  200. package/dist/cjs/views/kanban-board-controls.native.js +1 -1
  201. package/dist/cjs/views/kanban-board-controls.native.js.map +1 -1
  202. package/dist/cjs/views/kanban-field-picker.native.js +1 -1
  203. package/dist/cjs/views/kanban-field-picker.native.js.map +1 -1
  204. package/dist/cjs/views/kanbanBoardOps.native.js.map +1 -1
  205. package/dist/cjs/views/report-controls.native.js +1 -1
  206. package/dist/cjs/views/report-controls.native.js.map +1 -1
  207. package/dist/cjs/views/viewAvailability.native.js.map +1 -1
  208. package/dist/cjs/views/viewMeta.native.js.map +1 -1
  209. package/dist/cjs/workspace/WorkspaceChartBlock.native.js +1 -1
  210. package/dist/cjs/workspace/WorkspaceChartBlock.native.js.map +1 -1
  211. package/dist/cjs/workspace/WorkspaceGrid.native.js.map +1 -1
  212. package/dist/cjs/workspace/WorkspaceLinkCard.native.js +1 -1
  213. package/dist/cjs/workspace/WorkspaceLinkCard.native.js.map +1 -1
  214. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js +1 -1
  215. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  216. package/dist/cjs/workspace/WorkspaceNumberCard.native.js +1 -1
  217. package/dist/cjs/workspace/WorkspaceNumberCard.native.js.map +1 -1
  218. package/dist/cjs/workspace/WorkspaceQuickList.native.js +1 -1
  219. package/dist/cjs/workspace/WorkspaceQuickList.native.js.map +1 -1
  220. package/dist/cjs/workspace/WorkspaceRecents.native.js +1 -1
  221. package/dist/cjs/workspace/WorkspaceRecents.native.js.map +1 -1
  222. package/dist/cjs/workspace/WorkspaceScreen.native.js +1 -1
  223. package/dist/cjs/workspace/WorkspaceScreen.native.js.map +1 -1
  224. package/dist/cjs/workspace/WorkspaceShortcut.native.js +1 -1
  225. package/dist/cjs/workspace/WorkspaceShortcut.native.js.map +1 -1
  226. package/dist/cjs/workspace/parseContent.native.js.map +1 -1
  227. package/dist/cjs/workspace/types.native.js.map +1 -1
  228. package/dist/cjs/workspace/useDashboardChart.native.js.map +1 -1
  229. package/dist/cjs/workspace/useWorkspaceDoc.native.js.map +1 -1
  230. package/dist/esm/chrome/BackofficeAwesomebar.native.js.map +1 -1
  231. package/dist/esm/chrome/CommandPalette.native.js.map +1 -1
  232. package/dist/esm/chrome/HelpMenu.native.js.map +1 -1
  233. package/dist/esm/chrome/NotificationsButton.native.js.map +1 -1
  234. package/dist/esm/chrome/UserMenu.native.js.map +1 -1
  235. package/dist/esm/chrome/awesomebar-data.mjs +4 -2
  236. package/dist/esm/chrome/awesomebar-data.mjs.map +1 -1
  237. package/dist/esm/chrome/awesomebar-data.native.js +7 -4
  238. package/dist/esm/chrome/awesomebar-data.native.js.map +1 -1
  239. package/dist/esm/chrome/command-palette-model.native.js.map +1 -1
  240. package/dist/esm/chrome/help-about-dialog.mjs +2 -2
  241. package/dist/esm/chrome/help-about-dialog.mjs.map +1 -1
  242. package/dist/esm/chrome/help-about-dialog.native.js +2 -2
  243. package/dist/esm/chrome/help-about-dialog.native.js.map +1 -1
  244. package/dist/esm/chrome/help-shortcuts-dialog.mjs +2 -2
  245. package/dist/esm/chrome/help-shortcuts-dialog.mjs.map +1 -1
  246. package/dist/esm/chrome/help-shortcuts-dialog.native.js +2 -2
  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.mjs +8 -6
  250. package/dist/esm/chrome/notifications-panel.mjs.map +1 -1
  251. package/dist/esm/chrome/notifications-panel.native.js +8 -6
  252. package/dist/esm/chrome/notifications-panel.native.js.map +1 -1
  253. package/dist/esm/chrome/notifications-utils.native.js.map +1 -1
  254. package/dist/esm/chrome/shortcuts.native.js.map +1 -1
  255. package/dist/esm/chrome/user-session.native.js.map +1 -1
  256. package/dist/esm/config/BackofficeProvider.native.js.map +1 -1
  257. package/dist/esm/config/capabilities.native.js.map +1 -1
  258. package/dist/esm/config/events.native.js.map +1 -1
  259. package/dist/esm/config/slots.native.js.map +1 -1
  260. package/dist/esm/desk/Desk.native.js.map +1 -1
  261. package/dist/esm/desk/DeskSurface.native.js.map +1 -1
  262. package/dist/esm/desk/resolveDeskPath.native.js.map +1 -1
  263. package/dist/esm/desk/scope.native.js.map +1 -1
  264. package/dist/esm/desk/target.native.js.map +1 -1
  265. package/dist/esm/form/DocFormScreen.mjs +43 -43
  266. package/dist/esm/form/DocFormScreen.mjs.map +1 -1
  267. package/dist/esm/form/DocFormScreen.native.js +43 -43
  268. package/dist/esm/form/DocFormScreen.native.js.map +1 -1
  269. package/dist/esm/form/FormConnections.native.js.map +1 -1
  270. package/dist/esm/form/FormDialogs.native.js.map +1 -1
  271. package/dist/esm/form/FormErrorBoundary.native.js.map +1 -1
  272. package/dist/esm/form/FormHeaderCluster.native.js.map +1 -1
  273. package/dist/esm/form/FormSidebarPanel.native.js.map +1 -1
  274. package/dist/esm/form/FormTimeline.native.js.map +1 -1
  275. package/dist/esm/form/FormToolbar.native.js.map +1 -1
  276. package/dist/esm/form/connections-data.native.js.map +1 -1
  277. package/dist/esm/form/createPrefill.native.js.map +1 -1
  278. package/dist/esm/form/dependsOn.native.js.map +1 -1
  279. package/dist/esm/form/dirtyTracking.native.js.map +1 -1
  280. package/dist/esm/form/docinfo.native.js.map +1 -1
  281. package/dist/esm/form/fetchFrom.native.js.map +1 -1
  282. package/dist/esm/form/fieldPermissions.native.js.map +1 -1
  283. package/dist/esm/form/formActions.native.js.map +1 -1
  284. package/dist/esm/form/formLayout.native.js.map +1 -1
  285. package/dist/esm/form/platformHooks.native.js.map +1 -1
  286. package/dist/esm/form/sidebar-attachments.native.js.map +1 -1
  287. package/dist/esm/form/sidebar-dialogs.native.js.map +1 -1
  288. package/dist/esm/form/sidebar-people.mjs +6 -3
  289. package/dist/esm/form/sidebar-people.mjs.map +1 -1
  290. package/dist/esm/form/sidebar-people.native.js +6 -3
  291. package/dist/esm/form/sidebar-people.native.js.map +1 -1
  292. package/dist/esm/form/sidebar-rpc.native.js.map +1 -1
  293. package/dist/esm/form/sidebar-utils.native.js.map +1 -1
  294. package/dist/esm/form/timeline-entries.native.js.map +1 -1
  295. package/dist/esm/form/timeline-utils.native.js.map +1 -1
  296. package/dist/esm/form/useFormEngine.native.js.map +1 -1
  297. package/dist/esm/i18n/en.mjs +1 -1
  298. package/dist/esm/i18n/en.native.js +1 -1
  299. package/dist/esm/i18n/en.native.js.map +1 -1
  300. package/dist/esm/i18n/index.native.js.map +1 -1
  301. package/dist/esm/index.native.js.map +1 -1
  302. package/dist/esm/list/AddTagsDialog.native.js.map +1 -1
  303. package/dist/esm/list/AssignToDialog.native.js.map +1 -1
  304. package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
  305. package/dist/esm/list/ListBulkActionsBar.mjs +2 -2
  306. package/dist/esm/list/ListBulkActionsBar.mjs.map +1 -1
  307. package/dist/esm/list/ListBulkActionsBar.native.js +2 -3
  308. package/dist/esm/list/ListBulkActionsBar.native.js.map +1 -1
  309. package/dist/esm/list/ListFilterBar.native.js.map +1 -1
  310. package/dist/esm/list/ListSidebar.native.js.map +1 -1
  311. package/dist/esm/list/bulk-edit-dialog.native.js.map +1 -1
  312. package/dist/esm/list/bulk-export.native.js.map +1 -1
  313. package/dist/esm/list/bulk-submit-cancel.native.js.map +1 -1
  314. package/dist/esm/list/bulkActions.native.js.map +1 -1
  315. package/dist/esm/list/filter-chips.native.js.map +1 -1
  316. package/dist/esm/list/filter-editor.native.js.map +1 -1
  317. package/dist/esm/list/filter-fields.native.js.map +1 -1
  318. package/dist/esm/list/filter-saved.native.js.map +1 -1
  319. package/dist/esm/list/filter-sort.native.js.map +1 -1
  320. package/dist/esm/list/filter-standard.native.js.map +1 -1
  321. package/dist/esm/list/filterConversion.native.js.map +1 -1
  322. package/dist/esm/list/list-tools-sheet.native.js.map +1 -1
  323. package/dist/esm/list/listColumns.native.js.map +1 -1
  324. package/dist/esm/list/listFields.native.js.map +1 -1
  325. package/dist/esm/list/listFormat.native.js.map +1 -1
  326. package/dist/esm/list/listUrlState.native.js.map +1 -1
  327. package/dist/esm/list/sidebar-section.native.js.map +1 -1
  328. package/dist/esm/list/sidebar-stats.native.js.map +1 -1
  329. package/dist/esm/list/statusColors.native.js.map +1 -1
  330. package/dist/esm/navigation/navigator.native.js.map +1 -1
  331. package/dist/esm/navigation/paths.native.js.map +1 -1
  332. package/dist/esm/oneAdapter/index.native.js.map +1 -1
  333. package/dist/esm/quickEntry/QuickEntryDialog.native.js.map +1 -1
  334. package/dist/esm/quickEntry/quickEntryPlan.native.js.map +1 -1
  335. package/dist/esm/report/DoctypeReportView.native.js.map +1 -1
  336. package/dist/esm/report/QueryReportScreen.native.js.map +1 -1
  337. package/dist/esm/report/queryReportColumns.native.js.map +1 -1
  338. package/dist/esm/report/queryReportFilterBar.native.js.map +1 -1
  339. package/dist/esm/report/queryReportUrlState.native.js.map +1 -1
  340. package/dist/esm/report/report-grid.native.js.map +1 -1
  341. package/dist/esm/report/report-toolbar.native.js.map +1 -1
  342. package/dist/esm/report/reportShapes.native.js.map +1 -1
  343. package/dist/esm/report/reportViewModel.native.js.map +1 -1
  344. package/dist/esm/report/savedReports.native.js.map +1 -1
  345. package/dist/esm/report/useQueryReport.native.js.map +1 -1
  346. package/dist/esm/shared/deskLinks.native.js.map +1 -1
  347. package/dist/esm/shared/listNavContext.native.js.map +1 -1
  348. package/dist/esm/shared/measures.native.js.map +1 -1
  349. package/dist/esm/shared/types.native.js.map +1 -1
  350. package/dist/esm/shared/useDocinfo.native.js.map +1 -1
  351. package/dist/esm/shared/useDoctypeMeta.native.js.map +1 -1
  352. package/dist/esm/shared/useFrappeApp.native.js.map +1 -1
  353. package/dist/esm/shared/useRecentVisit.native.js.map +1 -1
  354. package/dist/esm/shared/useSessionUserId.native.js.map +1 -1
  355. package/dist/esm/shared/useSlugTarget.native.js.map +1 -1
  356. package/dist/esm/shared/useUserRoles.native.js.map +1 -1
  357. package/dist/esm/shell/BackofficeShell.native.js.map +1 -1
  358. package/dist/esm/shell/HomeRedirect.native.js.map +1 -1
  359. package/dist/esm/shell/NotFoundScreen.native.js.map +1 -1
  360. package/dist/esm/shell/SlugScreen.native.js.map +1 -1
  361. package/dist/esm/shell/WorkspaceSidebar.mjs +9 -7
  362. package/dist/esm/shell/WorkspaceSidebar.mjs.map +1 -1
  363. package/dist/esm/shell/WorkspaceSidebar.native.js +9 -7
  364. package/dist/esm/shell/WorkspaceSidebar.native.js.map +1 -1
  365. package/dist/esm/shell/useWorkspaces.native.js.map +1 -1
  366. package/dist/esm/shell/workspaceIcons.native.js.map +1 -1
  367. package/dist/esm/views/CalendarView.mjs +6 -2
  368. package/dist/esm/views/CalendarView.mjs.map +1 -1
  369. package/dist/esm/views/CalendarView.native.js +8 -3
  370. package/dist/esm/views/CalendarView.native.js.map +1 -1
  371. package/dist/esm/views/DashboardView.mjs +9 -3
  372. package/dist/esm/views/DashboardView.mjs.map +1 -1
  373. package/dist/esm/views/DashboardView.native.js +9 -3
  374. package/dist/esm/views/DashboardView.native.js.map +1 -1
  375. package/dist/esm/views/DoctypeViewScreen.native.js.map +1 -1
  376. package/dist/esm/views/ImageView.native.js.map +1 -1
  377. package/dist/esm/views/KanbanView.mjs +6 -3
  378. package/dist/esm/views/KanbanView.mjs.map +1 -1
  379. package/dist/esm/views/KanbanView.native.js +8 -4
  380. package/dist/esm/views/KanbanView.native.js.map +1 -1
  381. package/dist/esm/views/ReportView.mjs +8 -5
  382. package/dist/esm/views/ReportView.mjs.map +1 -1
  383. package/dist/esm/views/ReportView.native.js +11 -6
  384. package/dist/esm/views/ReportView.native.js.map +1 -1
  385. package/dist/esm/views/TreeView.native.js.map +1 -1
  386. package/dist/esm/views/ViewHeader.mjs +8 -1
  387. package/dist/esm/views/ViewHeader.mjs.map +1 -1
  388. package/dist/esm/views/ViewHeader.native.js +8 -1
  389. package/dist/esm/views/ViewHeader.native.js.map +1 -1
  390. package/dist/esm/views/ViewStates.native.js.map +1 -1
  391. package/dist/esm/views/ViewSwitcherMenu.native.js.map +1 -1
  392. package/dist/esm/views/calendar-field-selector.native.js.map +1 -1
  393. package/dist/esm/views/connection.native.js.map +1 -1
  394. package/dist/esm/views/dashboard-data.mjs +17 -11
  395. package/dist/esm/views/dashboard-data.mjs.map +1 -1
  396. package/dist/esm/views/dashboard-data.native.js +20 -13
  397. package/dist/esm/views/dashboard-data.native.js.map +1 -1
  398. package/dist/esm/views/deskViewConfigs.native.js.map +1 -1
  399. package/dist/esm/views/kanban-board-controls.native.js.map +1 -1
  400. package/dist/esm/views/kanban-field-picker.native.js.map +1 -1
  401. package/dist/esm/views/kanbanBoardOps.native.js.map +1 -1
  402. package/dist/esm/views/report-controls.native.js.map +1 -1
  403. package/dist/esm/views/viewAvailability.native.js.map +1 -1
  404. package/dist/esm/views/viewMeta.native.js.map +1 -1
  405. package/dist/esm/workspace/WorkspaceChartBlock.native.js.map +1 -1
  406. package/dist/esm/workspace/WorkspaceGrid.native.js.map +1 -1
  407. package/dist/esm/workspace/WorkspaceLinkCard.native.js.map +1 -1
  408. package/dist/esm/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  409. package/dist/esm/workspace/WorkspaceNumberCard.native.js.map +1 -1
  410. package/dist/esm/workspace/WorkspaceQuickList.native.js.map +1 -1
  411. package/dist/esm/workspace/WorkspaceRecents.native.js.map +1 -1
  412. package/dist/esm/workspace/WorkspaceScreen.native.js.map +1 -1
  413. package/dist/esm/workspace/WorkspaceShortcut.native.js.map +1 -1
  414. package/dist/esm/workspace/parseContent.native.js.map +1 -1
  415. package/dist/esm/workspace/types.native.js.map +1 -1
  416. package/dist/esm/workspace/useDashboardChart.native.js.map +1 -1
  417. package/dist/esm/workspace/useWorkspaceDoc.native.js.map +1 -1
  418. package/dist/jsx/chrome/awesomebar-data.mjs +4 -2
  419. package/dist/jsx/chrome/awesomebar-data.mjs.map +1 -1
  420. package/dist/jsx/chrome/awesomebar-data.native.js +7 -4
  421. package/dist/jsx/chrome/awesomebar-data.native.js.map +1 -1
  422. package/dist/jsx/chrome/help-about-dialog.mjs +2 -2
  423. package/dist/jsx/chrome/help-about-dialog.mjs.map +1 -1
  424. package/dist/jsx/chrome/help-about-dialog.native.js +2 -2
  425. package/dist/jsx/chrome/help-shortcuts-dialog.mjs +2 -2
  426. package/dist/jsx/chrome/help-shortcuts-dialog.mjs.map +1 -1
  427. package/dist/jsx/chrome/help-shortcuts-dialog.native.js +2 -2
  428. package/dist/jsx/chrome/help-shortcuts-dialog.native.js.map +1 -1
  429. package/dist/jsx/chrome/notifications-panel.mjs +8 -6
  430. package/dist/jsx/chrome/notifications-panel.mjs.map +1 -1
  431. package/dist/jsx/chrome/notifications-panel.native.js +8 -6
  432. package/dist/jsx/chrome/notifications-panel.native.js.map +1 -1
  433. package/dist/jsx/form/DocFormScreen.mjs +43 -43
  434. package/dist/jsx/form/DocFormScreen.mjs.map +1 -1
  435. package/dist/jsx/form/DocFormScreen.native.js +43 -43
  436. package/dist/jsx/form/DocFormScreen.native.js.map +1 -1
  437. package/dist/jsx/form/sidebar-people.mjs +6 -3
  438. package/dist/jsx/form/sidebar-people.mjs.map +1 -1
  439. package/dist/jsx/form/sidebar-people.native.js +5 -2
  440. package/dist/jsx/form/sidebar-people.native.js.map +1 -1
  441. package/dist/jsx/i18n/en.mjs +1 -1
  442. package/dist/jsx/i18n/en.native.js +1 -1
  443. package/dist/jsx/i18n/en.native.js.map +1 -1
  444. package/dist/jsx/index.native.js.map +1 -1
  445. package/dist/jsx/list/ListBulkActionsBar.mjs +2 -2
  446. package/dist/jsx/list/ListBulkActionsBar.mjs.map +1 -1
  447. package/dist/jsx/list/ListBulkActionsBar.native.js +1 -2
  448. package/dist/jsx/list/ListBulkActionsBar.native.js.map +1 -1
  449. package/dist/jsx/shell/WorkspaceSidebar.mjs +9 -7
  450. package/dist/jsx/shell/WorkspaceSidebar.mjs.map +1 -1
  451. package/dist/jsx/shell/WorkspaceSidebar.native.js +9 -7
  452. package/dist/jsx/shell/WorkspaceSidebar.native.js.map +1 -1
  453. package/dist/jsx/views/CalendarView.mjs +6 -2
  454. package/dist/jsx/views/CalendarView.mjs.map +1 -1
  455. package/dist/jsx/views/CalendarView.native.js +7 -2
  456. package/dist/jsx/views/CalendarView.native.js.map +1 -1
  457. package/dist/jsx/views/DashboardView.mjs +9 -3
  458. package/dist/jsx/views/DashboardView.mjs.map +1 -1
  459. package/dist/jsx/views/DashboardView.native.js +9 -3
  460. package/dist/jsx/views/DashboardView.native.js.map +1 -1
  461. package/dist/jsx/views/KanbanView.mjs +6 -3
  462. package/dist/jsx/views/KanbanView.mjs.map +1 -1
  463. package/dist/jsx/views/KanbanView.native.js +7 -3
  464. package/dist/jsx/views/KanbanView.native.js.map +1 -1
  465. package/dist/jsx/views/ReportView.mjs +8 -5
  466. package/dist/jsx/views/ReportView.mjs.map +1 -1
  467. package/dist/jsx/views/ReportView.native.js +11 -6
  468. package/dist/jsx/views/ReportView.native.js.map +1 -1
  469. package/dist/jsx/views/ViewHeader.mjs +8 -1
  470. package/dist/jsx/views/ViewHeader.mjs.map +1 -1
  471. package/dist/jsx/views/ViewHeader.native.js +8 -1
  472. package/dist/jsx/views/ViewHeader.native.js.map +1 -1
  473. package/dist/jsx/views/dashboard-data.mjs +17 -11
  474. package/dist/jsx/views/dashboard-data.mjs.map +1 -1
  475. package/dist/jsx/views/dashboard-data.native.js +20 -13
  476. package/dist/jsx/views/dashboard-data.native.js.map +1 -1
  477. package/package.json +12 -12
  478. package/src/chrome/NotificationsButton.screen.spec.tsx +162 -0
  479. package/src/chrome/UserMenu.screen.spec.tsx +107 -0
  480. package/src/chrome/awesomebar-data.auth.spec.ts +56 -0
  481. package/src/chrome/awesomebar-data.tsx +4 -2
  482. package/src/chrome/help-about-dialog.tsx +2 -2
  483. package/src/chrome/help-shortcuts-dialog.tsx +2 -2
  484. package/src/chrome/notifications-panel.tsx +8 -9
  485. package/src/form/DocFormScreen.tsx +54 -45
  486. package/src/form/FormConnections.screen.spec.tsx +153 -0
  487. package/src/form/FormDialogs.screen.spec.tsx +119 -0
  488. package/src/form/FormToolbar.screen.spec.tsx +147 -0
  489. package/src/form/sidebar-people.tsx +7 -5
  490. package/src/i18n/en.ts +1 -1
  491. package/src/list/ListBulkActionsBar.screen.spec.tsx +181 -0
  492. package/src/list/ListBulkActionsBar.tsx +6 -2
  493. package/src/list/ListFilterBar.screen.spec.tsx +176 -0
  494. package/src/list/ListSidebar.screen.spec.tsx +202 -0
  495. package/src/quickEntry/QuickEntryDialog.screen.spec.tsx +143 -0
  496. package/src/report/DoctypeReportView.screen.spec.tsx +154 -0
  497. package/src/shell/WorkspaceSidebar.tsx +10 -9
  498. package/src/views/CalendarView.screen.spec.tsx +241 -0
  499. package/src/views/CalendarView.tsx +11 -3
  500. package/src/views/DashboardView.screen.spec.tsx +144 -0
  501. package/src/views/DashboardView.tsx +7 -3
  502. package/src/views/ImageView.screen.spec.tsx +108 -0
  503. package/src/views/KanbanView.screen.spec.tsx +282 -0
  504. package/src/views/KanbanView.tsx +7 -3
  505. package/src/views/ReportView.screen.spec.tsx +108 -0
  506. package/src/views/ReportView.tsx +10 -5
  507. package/src/views/ViewHeader.screen.spec.tsx +185 -0
  508. package/src/views/ViewHeader.tsx +4 -1
  509. package/src/views/dashboard-data.tsx +21 -12
  510. package/types/chrome/awesomebar-data.d.ts.map +1 -1
  511. package/types/chrome/notifications-panel.d.ts.map +1 -1
  512. package/types/form/DocFormScreen.d.ts.map +1 -1
  513. package/types/form/sidebar-people.d.ts.map +1 -1
  514. package/types/i18n/en.d.ts +1 -1
  515. package/types/list/ListBulkActionsBar.d.ts.map +1 -1
  516. package/types/shell/WorkspaceSidebar.d.ts.map +1 -1
  517. package/types/views/CalendarView.d.ts.map +1 -1
  518. package/types/views/DashboardView.d.ts.map +1 -1
  519. package/types/views/KanbanView.d.ts.map +1 -1
  520. package/types/views/ReportView.d.ts.map +1 -1
  521. package/types/views/ViewHeader.d.ts.map +1 -1
  522. package/types/views/dashboard-data.d.ts +4 -2
  523. package/types/views/dashboard-data.d.ts.map +1 -1
@@ -0,0 +1,56 @@
1
+ // The awesomebar's document search holds one client per connection. When the
2
+ // provider's connection starts sending its token, or sends it under another
3
+ // scheme, the next search must carry the new credentials instead of going out
4
+ // on a client built for the old ones (MPO-410).
5
+ import { renderHook, waitFor } from "@testing-library/react";
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
+ import { useGlobalSearch } from "./awesomebar-data";
8
+
9
+ const provider = vi.hoisted(() => ({ config: undefined as unknown }));
10
+ vi.mock("@multiplatform.one/frappe-ui", () => ({ useFrappeConfig: () => provider.config }));
11
+
12
+ type Auth = { useToken: boolean; token: string; type: string };
13
+
14
+ const auth = (useToken: boolean, type = "token"): Auth => ({ useToken, token: "key:secret", type });
15
+
16
+ const changes: [string, Auth, Auth, (string | null)[]][] = [
17
+ ["starts sending its token", auth(false), auth(true), [null, "token key:secret"]],
18
+ [
19
+ "switches its token scheme",
20
+ auth(true, "token"),
21
+ auth(true, "Bearer"),
22
+ ["token key:secret", "Bearer key:secret"],
23
+ ],
24
+ ];
25
+
26
+ let run = 0;
27
+ let sent: (string | null)[] = [];
28
+
29
+ beforeEach(() => {
30
+ run += 1;
31
+ sent = [];
32
+ vi.stubGlobal("fetch", async (_input: string | URL | Request, init?: RequestInit) => {
33
+ sent.push(new Headers(init?.headers).get("Authorization"));
34
+ return Response.json({ message: [] });
35
+ });
36
+ });
37
+
38
+ afterEach(() => vi.unstubAllGlobals());
39
+
40
+ describe("useGlobalSearch", () => {
41
+ it.each(changes)(
42
+ "searches with the new credentials when the connection %s",
43
+ async (_, before, after, expected) => {
44
+ const baseURL = `http://global-search-${run}.test`;
45
+ provider.config = { baseURL, realtime: false, auth: before };
46
+ const { rerender } = renderHook(({ query }: { query: string }) => useGlobalSearch(query), {
47
+ initialProps: { query: "pikachu" },
48
+ });
49
+ await waitFor(() => expect(sent).toHaveLength(1));
50
+ provider.config = { baseURL, realtime: false, auth: after };
51
+ rerender({ query: "raichu" });
52
+ await waitFor(() => expect(sent).toHaveLength(2));
53
+ expect(sent).toEqual(expected);
54
+ },
55
+ );
56
+ });
@@ -148,12 +148,14 @@ export function useGlobalSearch(query: string, limit = 10): GlobalSearchState {
148
148
  const config = useFrappeConfig();
149
149
  const baseURL = config?.baseURL;
150
150
  const auth = config?.auth;
151
+ const authKey = `${auth?.useToken ? "t" : ""}:${auth?.token ?? ""}:${auth?.type ?? ""}`;
151
152
 
152
153
  const client = useMemo(
153
154
  () => (baseURL ? new HttpClient(baseURL, auth as AuthConfig | undefined) : undefined),
154
- // Provider auth is session-stable; key the client by baseURL only.
155
+ // Keyed by value: a host may rebuild the auth object and its token
156
+ // getter on every render.
155
157
  // oxlint-disable-next-line exhaustive-deps
156
- [baseURL],
158
+ [baseURL, authKey],
157
159
  );
158
160
 
159
161
  const [hits, setHits] = useState<GlobalSearchHit[]>([]);
@@ -94,7 +94,7 @@ export function HelpAboutDialog({ open, onOpenChange }: HelpAboutDialogProps) {
94
94
  )}
95
95
  </Paragraph>
96
96
  </Dialog.Description>
97
- <YStack gap="$2" marginTop="$2">
97
+ <YStack gap="$2" paddingTop="$2">
98
98
  <SizableText size="$2" fontWeight="400" color="$color10" textTransform="uppercase">
99
99
  {t("help.installedApps", "Installed Apps")}
100
100
  </SizableText>
@@ -122,7 +122,7 @@ export function HelpAboutDialog({ open, onOpenChange }: HelpAboutDialogProps) {
122
122
  </XStack>
123
123
  ))}
124
124
  </YStack>
125
- <XStack justifyContent="flex-end" marginTop="$4">
125
+ <XStack justifyContent="flex-end" paddingTop="$4">
126
126
  <Dialog.Close asChild>
127
127
  <Button size="$3">{t("help.close", "Close")}</Button>
128
128
  </Dialog.Close>
@@ -140,12 +140,12 @@ export function HelpShortcutsDialog({ open, onOpenChange }: HelpShortcutsDialogP
140
140
  {t("help.shortcutsIntro", "Shortcuts available across the backoffice (web).")}
141
141
  </Paragraph>
142
142
  </Dialog.Description>
143
- <YStack gap="$3" marginTop="$2">
143
+ <YStack gap="$3" paddingTop="$2">
144
144
  {rows.map((row) => (
145
145
  <ShortcutRow key={row.description} {...row} />
146
146
  ))}
147
147
  </YStack>
148
- <XStack justifyContent="flex-end" marginTop="$4">
148
+ <XStack justifyContent="flex-end" paddingTop="$4">
149
149
  <Dialog.Close asChild>
150
150
  <Button size="$3">{t("help.close", "Close")}</Button>
151
151
  </Dialog.Close>
@@ -86,15 +86,14 @@ function NotificationRow({ item, onPress }: { item: NotificationItem; onPress: (
86
86
  ) : null}
87
87
  </YStack>
88
88
  {item.unread && (
89
- <View
90
- width="$0.75"
91
- height="$0.75"
92
- borderRadius={1000}
93
- backgroundColor="$accentBackground"
94
- marginTop="$1.5"
95
- flexShrink={0}
96
- aria-hidden
97
- />
89
+ <View paddingTop="$1.5" flexShrink={0} aria-hidden>
90
+ <View
91
+ width="$0.75"
92
+ height="$0.75"
93
+ borderRadius={1000}
94
+ backgroundColor="$accentBackground"
95
+ />
96
+ </View>
98
97
  )}
99
98
  </XStack>
100
99
  );
@@ -944,53 +944,62 @@ export function DocFormScreen({
944
944
  })
945
945
  : toolbar}
946
946
 
947
- {engine.wasDeleted && (
948
- <XStack
949
- role="alert"
950
- {...knobProps.containerRadius}
951
- {...knobProps.panelPadding}
952
- marginHorizontal="$3"
953
- backgroundColor="$red3"
954
- >
955
- <Text color="$red11" fontSize="$3">
956
- {t("deletedBanner", "This document was deleted on the server. Fields are read-only.")}
957
- </Text>
958
- </XStack>
959
- )}
947
+ {(engine.wasDeleted || validationSummary || engine.conflict) && (
948
+ <YStack paddingHorizontal="$3">
949
+ {engine.wasDeleted && (
950
+ <XStack
951
+ role="alert"
952
+ {...knobProps.containerRadius}
953
+ {...knobProps.panelPadding}
954
+ backgroundColor="$red3"
955
+ >
956
+ <Text color="$red11" fontSize="$3">
957
+ {t(
958
+ "deletedBanner",
959
+ "This document was deleted on the server. Fields are read-only.",
960
+ )}
961
+ </Text>
962
+ </XStack>
963
+ )}
960
964
 
961
- {validationSummary && !engine.wasDeleted && (
962
- <XStack
963
- role="alert"
964
- {...knobProps.containerRadius}
965
- {...knobProps.panelPadding}
966
- marginHorizontal="$3"
967
- backgroundColor="$red3"
968
- testID="doc-form-validation-summary"
969
- >
970
- <Text color="$red11" fontSize="$3">
971
- {validationSummary}
972
- </Text>
973
- </XStack>
974
- )}
965
+ {validationSummary && !engine.wasDeleted && (
966
+ <XStack
967
+ role="alert"
968
+ {...knobProps.containerRadius}
969
+ {...knobProps.panelPadding}
970
+ backgroundColor="$red3"
971
+ testID="doc-form-validation-summary"
972
+ >
973
+ <Text color="$red11" fontSize="$3">
974
+ {validationSummary}
975
+ </Text>
976
+ </XStack>
977
+ )}
975
978
 
976
- {engine.conflict && !engine.wasDeleted && (
977
- <XStack
978
- role="status"
979
- alignItems="center"
980
- justifyContent="space-between"
981
- {...knobProps.containerRadius}
982
- {...knobProps.panelPadding}
983
- marginHorizontal="$3"
984
- backgroundColor="$orange3"
985
- gap="$3"
986
- >
987
- <Text color="$orange11" fontSize="$3" flex={1}>
988
- {t("conflictBanner", "This document changed on the server while you were editing.")}
989
- </Text>
990
- <Button size="$2" outlined aria-label={t("reloadDoc", "Reload")} onPress={engine.reload}>
991
- {t("reloadDoc", "Reload")}
992
- </Button>
993
- </XStack>
979
+ {engine.conflict && !engine.wasDeleted && (
980
+ <XStack
981
+ role="status"
982
+ alignItems="center"
983
+ justifyContent="space-between"
984
+ {...knobProps.containerRadius}
985
+ {...knobProps.panelPadding}
986
+ backgroundColor="$orange3"
987
+ gap="$3"
988
+ >
989
+ <Text color="$orange11" fontSize="$3" flex={1}>
990
+ {t("conflictBanner", "This document changed on the server while you were editing.")}
991
+ </Text>
992
+ <Button
993
+ size="$2"
994
+ outlined
995
+ aria-label={t("reloadDoc", "Reload")}
996
+ onPress={engine.reload}
997
+ >
998
+ {t("reloadDoc", "Reload")}
999
+ </Button>
1000
+ </XStack>
1001
+ )}
1002
+ </YStack>
994
1003
  )}
995
1004
 
996
1005
  <ScrollView flex={1}>
@@ -0,0 +1,153 @@
1
+ // The desk Connections tab (MPO-414): meta.links grouped with get_open_count
2
+ // badges, rows open the filtered target list, + opens a prefilled new doc,
3
+ // and a failed get_open_count falls back to get_count per external link.
4
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
5
+ import { fireEvent, screen, waitFor, within } from "@testing-library/react";
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
+ import { BackofficeProvider } from "../config/BackofficeProvider";
8
+ import { createMemoryNavigator } from "../navigation/navigator";
9
+ import type { DoctypeMeta } from "../shared/useDoctypeMeta";
10
+ import { FormConnections } from "./FormConnections";
11
+
12
+ const projectMeta: DoctypeMeta = {
13
+ name: "QA Project",
14
+ fields: [],
15
+ links: [
16
+ { link_doctype: "Contact", link_fieldname: "project", group: "Profile" },
17
+ { link_doctype: "Blogger", link_fieldname: "project", group: "Profile" },
18
+ { link_doctype: "Access Log", link_fieldname: "project", group: "Logs" },
19
+ { link_doctype: "ToDo", link_fieldname: "project" },
20
+ { link_doctype: "Note", link_fieldname: "project", group: "Logs", hidden: 1 },
21
+ {
22
+ link_doctype: "QA Invoice Item",
23
+ link_fieldname: "qa_invoice",
24
+ parent_doctype: "QA Invoice",
25
+ table_fieldname: "items",
26
+ is_child_table: 1,
27
+ group: "Billing",
28
+ },
29
+ ],
30
+ };
31
+
32
+ const openCount = {
33
+ message: {
34
+ count: {
35
+ external_links_found: [
36
+ { doctype: "Contact", count: 3, open_count: 1 },
37
+ { doctype: "Blogger", count: 0, open_count: 0 },
38
+ { doctype: "Access Log", count: 120, open_count: 0 },
39
+ { doctype: "ToDo", count: 5, open_count: 2 },
40
+ ],
41
+ internal_links_found: [
42
+ { doctype: "QA Invoice", count: 2, open_count: 0, names: ["QA-INV-001", "QA-INV-002"] },
43
+ ],
44
+ },
45
+ },
46
+ };
47
+
48
+ let host = 0;
49
+ let openCountFails = false;
50
+ let requests: URL[] = [];
51
+
52
+ function json(body: unknown, status = 200) {
53
+ return new Response(JSON.stringify(body), {
54
+ status,
55
+ headers: { "content-type": "application/json" },
56
+ });
57
+ }
58
+
59
+ beforeEach(() => {
60
+ host += 1;
61
+ openCountFails = false;
62
+ requests = [];
63
+ vi.stubGlobal("fetch", async (input: string | URL | Request) => {
64
+ const url = new URL(String(input instanceof Request ? input.url : input));
65
+ requests.push(url);
66
+ if (url.pathname === "/api/method/frappe.desk.notifications.get_open_count") {
67
+ return openCountFails ? json({ exc_type: "PermissionError" }, 403) : json(openCount);
68
+ }
69
+ if (url.pathname === "/api/method/frappe.client.get_count") {
70
+ return json({ message: url.searchParams.get("doctype") === "Contact" ? 4 : 0 });
71
+ }
72
+ return json({ message: null });
73
+ });
74
+ });
75
+
76
+ afterEach(() => {
77
+ vi.restoreAllMocks();
78
+ vi.unstubAllGlobals();
79
+ });
80
+
81
+ function renderConnections(meta: DoctypeMeta = projectMeta) {
82
+ const navigation = createMemoryNavigator("/backoffice/qa-project/QA-PROJ-0001");
83
+ renderWithProviders(
84
+ <BackofficeProvider
85
+ frappe={{ baseURL: `https://connections-${host}.screen.spec.test` }}
86
+ navigation={navigation}
87
+ >
88
+ <FormConnections doctype="QA Project" name="QA-PROJ-0001" meta={meta} />
89
+ </BackofficeProvider>,
90
+ );
91
+ return navigation;
92
+ }
93
+
94
+ function row(doctype: string): HTMLElement {
95
+ return screen.getByRole("link", { name: doctype });
96
+ }
97
+
98
+ describe("FormConnections", () => {
99
+ it("groups visible links and badges their counts", async () => {
100
+ renderConnections();
101
+ await waitFor(() => expect(within(row("Contact")).getByText("3")).toBeTruthy());
102
+ for (const heading of ["Profile", "Logs", "Reference", "Billing"]) {
103
+ expect(screen.getByText(heading)).toBeTruthy();
104
+ }
105
+ expect(screen.queryByRole("link", { name: "Note" })).toBeNull();
106
+ expect(within(row("Contact")).getByText("1")).toBeTruthy();
107
+ expect(within(row("Access Log")).getByText("99+")).toBeTruthy();
108
+ expect(row("Blogger").textContent).toBe("Blogger");
109
+ });
110
+
111
+ it("opens the target list filtered to this document", async () => {
112
+ const navigation = renderConnections();
113
+ await waitFor(() => expect(within(row("Contact")).getByText("3")).toBeTruthy());
114
+ fireEvent.click(row("Contact"));
115
+ const location = navigation.getLocation();
116
+ expect(location.path).toBe("/backoffice/contact");
117
+ expect(JSON.parse(String(location.params.f))).toEqual([["project", "=", "QA-PROJ-0001"]]);
118
+ fireEvent.click(row("QA Invoice"));
119
+ expect(JSON.parse(String(navigation.getLocation().params.f))).toEqual([
120
+ ["name", "in", ["QA-INV-001", "QA-INV-002"]],
121
+ ]);
122
+ });
123
+
124
+ it("creates a linked document with the back-reference prefilled", async () => {
125
+ const navigation = renderConnections();
126
+ await waitFor(() => expect(within(row("Contact")).getByText("3")).toBeTruthy());
127
+ fireEvent.click(screen.getByLabelText("New Contact"));
128
+ const location = navigation.getLocation();
129
+ expect(location.path).toBe("/backoffice/contact/new");
130
+ expect(JSON.parse(String(location.params.d))).toEqual({ project: "QA-PROJ-0001" });
131
+ });
132
+
133
+ it("falls back to get_count and disables the uncounted internal link", async () => {
134
+ openCountFails = true;
135
+ const navigation = renderConnections();
136
+ await waitFor(() => expect(within(row("Contact")).getByText("4")).toBeTruthy(), {
137
+ timeout: 5000,
138
+ });
139
+ const counted = requests
140
+ .filter((url) => url.pathname === "/api/method/frappe.client.get_count")
141
+ .map((url) => url.searchParams.get("doctype"))
142
+ .sort();
143
+ expect(counted).toEqual(["Access Log", "Blogger", "Contact", "ToDo"]);
144
+ fireEvent.click(row("QA Invoice"));
145
+ expect(navigation.getLocation().path).toBe("/backoffice/qa-project/QA-PROJ-0001");
146
+ });
147
+
148
+ it("says so when the doctype links nowhere", async () => {
149
+ renderConnections({ name: "QA Loner", fields: [], links: [] });
150
+ expect(await screen.findByText("No connections")).toBeTruthy();
151
+ expect(requests).toHaveLength(0);
152
+ });
153
+ });
@@ -0,0 +1,119 @@
1
+ // The form menu's input dialogs (MPO-414): each confirm stays gated until
2
+ // its input is usable, then hands the trimmed value to the caller.
3
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
4
+ import { fireEvent, screen } from "@testing-library/react";
5
+ import { afterEach, describe, expect, it, vi } from "vitest";
6
+ import { BackofficeProvider } from "../config/BackofficeProvider";
7
+ import { createMemoryNavigator } from "../navigation/navigator";
8
+ import { AssignDialog, EmailDialog, JumpToFieldDialog, RenameDialog } from "./FormDialogs";
9
+
10
+ afterEach(() => {
11
+ vi.restoreAllMocks();
12
+ });
13
+
14
+ function button(label: string): HTMLElement {
15
+ const found = Array.from(document.body.querySelectorAll('[role="button"], button')).find((node) =>
16
+ node.textContent?.trim().startsWith(label),
17
+ );
18
+ if (!found) throw new Error(`no button ${label}`);
19
+ return found as HTMLElement;
20
+ }
21
+
22
+ function input(label: string): HTMLInputElement | HTMLTextAreaElement {
23
+ const field = screen.getByLabelText(label);
24
+ return (
25
+ field instanceof HTMLInputElement || field instanceof HTMLTextAreaElement
26
+ ? field
27
+ : field.querySelector("input, textarea")
28
+ ) as HTMLInputElement;
29
+ }
30
+
31
+ function gated(label: string): boolean {
32
+ return button(label).getAttribute("aria-disabled") === "true";
33
+ }
34
+
35
+ describe("RenameDialog", () => {
36
+ it("renames only to a different, trimmed name", () => {
37
+ const onRename = vi.fn();
38
+ renderWithProviders(
39
+ <RenameDialog open onOpenChange={() => {}} currentName="TODO-0001" onRename={onRename} />,
40
+ );
41
+ expect(gated("Rename")).toBe(true);
42
+ fireEvent.change(input("New name"), { target: { value: " TODO-0001 " } });
43
+ expect(gated("Rename")).toBe(true);
44
+ fireEvent.change(input("New name"), { target: { value: " TODO-0042 " } });
45
+ expect(gated("Rename")).toBe(false);
46
+ fireEvent.click(button("Rename"));
47
+ expect(onRename).toHaveBeenCalledWith("TODO-0042");
48
+ });
49
+ });
50
+
51
+ describe("EmailDialog", () => {
52
+ it("sends only with recipients and a subject", () => {
53
+ const onSend = vi.fn();
54
+ renderWithProviders(
55
+ <EmailDialog open onOpenChange={() => {}} defaultSubject="ToDo TODO-0001" onSend={onSend} />,
56
+ );
57
+ expect(input("Subject").value).toBe("ToDo TODO-0001");
58
+ expect(gated("Send")).toBe(true);
59
+ fireEvent.change(input("To (comma-separated emails)"), {
60
+ target: { value: " jane@example.com " },
61
+ });
62
+ fireEvent.change(input("Message"), { target: { value: "See attached." } });
63
+ fireEvent.click(button("Send"));
64
+ expect(onSend).toHaveBeenCalledWith({
65
+ recipients: "jane@example.com",
66
+ subject: "ToDo TODO-0001",
67
+ content: "See attached.",
68
+ });
69
+ });
70
+ });
71
+
72
+ describe("AssignDialog", () => {
73
+ it("will not assign before a user is picked", () => {
74
+ const onAssign = vi.fn();
75
+ renderWithProviders(
76
+ <BackofficeProvider
77
+ frappe={{ baseURL: "https://form-dialogs.screen.spec.test" }}
78
+ navigation={createMemoryNavigator("/backoffice")}
79
+ >
80
+ <AssignDialog open onOpenChange={() => {}} onAssign={onAssign} />
81
+ </BackofficeProvider>,
82
+ );
83
+ expect(screen.getByText("Assign to")).toBeTruthy();
84
+ expect(gated("Assign")).toBe(true);
85
+ fireEvent.click(button("Assign"));
86
+ expect(onAssign).not.toHaveBeenCalled();
87
+ });
88
+ });
89
+
90
+ describe("JumpToFieldDialog", () => {
91
+ const fields = [
92
+ { name: "customer", label: "Customer", tabKey: "details", tabLabel: "Details" },
93
+ { name: "due_date", label: "Due Date", tabKey: "details", tabLabel: "Details" },
94
+ { name: "terms", label: "Payment Terms", tabKey: "terms", tabLabel: "Terms" },
95
+ ];
96
+
97
+ it("filters fields by label or fieldname and jumps to a picked one", () => {
98
+ const onJump = vi.fn();
99
+ renderWithProviders(
100
+ <JumpToFieldDialog open onOpenChange={() => {}} fields={fields} onJump={onJump} />,
101
+ );
102
+ fireEvent.change(input("Search fields…"), { target: { value: "due" } });
103
+ expect(screen.queryByText("Customer")).toBeNull();
104
+ fireEvent.click(screen.getByText("Due Date"));
105
+ expect(onJump).toHaveBeenCalledWith(fields[1]);
106
+ });
107
+
108
+ it("jumps to the first match on confirm and gates an empty result", () => {
109
+ const onJump = vi.fn();
110
+ renderWithProviders(
111
+ <JumpToFieldDialog open onOpenChange={() => {}} fields={fields} onJump={onJump} />,
112
+ );
113
+ fireEvent.change(input("Search fields…"), { target: { value: "terms" } });
114
+ fireEvent.click(button("Jump"));
115
+ expect(onJump).toHaveBeenCalledWith(fields[2]);
116
+ fireEvent.change(input("Search fields…"), { target: { value: "nothing like it" } });
117
+ expect(gated("Jump")).toBe(true);
118
+ });
119
+ });
@@ -0,0 +1,147 @@
1
+ // The desk form toolbar (MPO-414): one lifecycle primary per docstatus, no
2
+ // primary the session's rights withhold (MPO-390), the status pill, the ⋯
3
+ // menu and the prev/next pager.
4
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
5
+ import { fireEvent, screen, waitFor } from "@testing-library/react";
6
+ import { describe, expect, it, vi } from "vitest";
7
+ import {
8
+ FormToolbar,
9
+ resolveIndicator,
10
+ type FormToolbarMenuItem,
11
+ type FormToolbarProps,
12
+ } from "./FormToolbar";
13
+
14
+ function props(overrides: Partial<FormToolbarProps> = {}): FormToolbarProps {
15
+ return {
16
+ breadcrumbs: [
17
+ { label: "Home", href: "/backoffice" },
18
+ { label: "Sales Order", href: "/backoffice/sales-order" },
19
+ { label: "SO-0001" },
20
+ ],
21
+ onNavigate: vi.fn(),
22
+ title: "SO-0001",
23
+ indicator: "draft",
24
+ isSaving: false,
25
+ canSave: true,
26
+ canSubmit: true,
27
+ canCancel: false,
28
+ canAmend: false,
29
+ onSave: vi.fn(),
30
+ onSubmit: vi.fn(),
31
+ onCancel: vi.fn(),
32
+ onAmend: vi.fn(),
33
+ menuItems: [],
34
+ ...overrides,
35
+ };
36
+ }
37
+
38
+ const primaries = ["save", "submit", "cancel", "amend"] as const;
39
+
40
+ function visiblePrimaries(): string[] {
41
+ return primaries.filter((action) => screen.queryByTestId(`form-toolbar-${action}`));
42
+ }
43
+
44
+ describe("FormToolbar", () => {
45
+ it("offers Save on a dirty draft and Submit once it is saved", () => {
46
+ const onSave = vi.fn();
47
+ const onSubmit = vi.fn();
48
+ const { rerender } = renderWithProviders(
49
+ <FormToolbar {...props({ indicator: "notSaved", onSave, onSubmit })} />,
50
+ );
51
+ expect(visiblePrimaries()).toEqual(["save"]);
52
+ fireEvent.click(screen.getByTestId("form-toolbar-save"));
53
+ expect(onSave).toHaveBeenCalledTimes(1);
54
+ rerender(<FormToolbar {...props({ indicator: "draft", onSave, onSubmit })} />);
55
+ expect(visiblePrimaries()).toEqual(["submit"]);
56
+ fireEvent.click(screen.getByTestId("form-toolbar-submit"));
57
+ expect(onSubmit).toHaveBeenCalledTimes(1);
58
+ });
59
+
60
+ it("offers Cancel on a submitted doc and Amend on a cancelled one", () => {
61
+ const onCancel = vi.fn();
62
+ const { rerender } = renderWithProviders(
63
+ <FormToolbar
64
+ {...props({ indicator: "submitted", canSave: false, canSubmit: false, canCancel: true })}
65
+ onCancel={onCancel}
66
+ />,
67
+ );
68
+ expect(visiblePrimaries()).toEqual(["cancel"]);
69
+ fireEvent.click(screen.getByTestId("form-toolbar-cancel"));
70
+ expect(onCancel).toHaveBeenCalledTimes(1);
71
+ rerender(
72
+ <FormToolbar
73
+ {...props({ indicator: "cancelled", canSave: false, canSubmit: false, canAmend: true })}
74
+ />,
75
+ );
76
+ expect(visiblePrimaries()).toEqual(["amend"]);
77
+ });
78
+
79
+ it("draws no primary a reader's rights withhold", () => {
80
+ renderWithProviders(
81
+ <FormToolbar {...props({ indicator: "notSaved", canSave: false, canSubmit: false })} />,
82
+ );
83
+ expect(visiblePrimaries()).toEqual([]);
84
+ });
85
+
86
+ it("pills the status from meta.states before guessing a color", () => {
87
+ const { rerender } = renderWithProviders(<FormToolbar {...props({ indicator: "new" })} />);
88
+ expect(screen.getByText("Not Saved")).toBeTruthy();
89
+ const approved = resolveIndicator({
90
+ isCreate: false,
91
+ isDirty: false,
92
+ docstatus: 1,
93
+ isSubmittable: true,
94
+ statusValue: "Approved",
95
+ states: [{ title: "Approved", color: "Green" }],
96
+ });
97
+ expect(approved).toEqual({ label: "Approved", color: "green" });
98
+ rerender(<FormToolbar {...props({ indicator: approved })} />);
99
+ expect(screen.getByText("Approved")).toBeTruthy();
100
+ expect(screen.queryByText("Submitted")).toBeNull();
101
+ rerender(<FormToolbar {...props({ indicator: "saved" })} />);
102
+ for (const label of ["Not Saved", "Draft", "Submitted", "Cancelled", "Approved"]) {
103
+ expect(screen.queryByText(label)).toBeNull();
104
+ }
105
+ });
106
+
107
+ it("runs ⋯ menu items and holds the disabled ones", async () => {
108
+ const onDuplicate = vi.fn();
109
+ const onDelete = vi.fn();
110
+ const menuItems: FormToolbarMenuItem[] = [
111
+ { key: "duplicate", label: "Duplicate", icon: "duplicate", onSelect: onDuplicate },
112
+ {
113
+ key: "delete",
114
+ label: "Delete",
115
+ icon: "delete",
116
+ destructive: true,
117
+ disabled: true,
118
+ disabledReason: "No delete permission",
119
+ onSelect: onDelete,
120
+ },
121
+ ];
122
+ renderWithProviders(<FormToolbar {...props({ menuItems })} />);
123
+ fireEvent.click(screen.getByTestId("form-toolbar-menu"));
124
+ const item = (label: string) =>
125
+ Array.from(document.querySelectorAll('[role="menuitem"]')).find((node) =>
126
+ node.textContent?.startsWith(label),
127
+ ) as HTMLElement;
128
+ await waitFor(() => expect(item("Delete")).toBeTruthy());
129
+ expect(item("Delete").getAttribute("aria-disabled")).toBe("true");
130
+ fireEvent.click(item("Delete"));
131
+ expect(onDelete).not.toHaveBeenCalled();
132
+ fireEvent.click(item("Duplicate"));
133
+ expect(onDuplicate).toHaveBeenCalledTimes(1);
134
+ });
135
+
136
+ it("pages prev/next and disables the boundary arrow instead of hiding it", () => {
137
+ const onPrevDoc = vi.fn();
138
+ const onNextDoc = vi.fn();
139
+ const { rerender } = renderWithProviders(<FormToolbar {...props()} />);
140
+ expect(screen.queryByTestId("form-toolbar-prev")).toBeNull();
141
+ rerender(<FormToolbar {...props({ onPrevDoc, onNextDoc, prevDocDisabled: true })} />);
142
+ fireEvent.click(screen.getByTestId("form-toolbar-prev"));
143
+ fireEvent.click(screen.getByTestId("form-toolbar-next"));
144
+ expect(onPrevDoc).not.toHaveBeenCalled();
145
+ expect(onNextDoc).toHaveBeenCalledTimes(1);
146
+ });
147
+ });