@multiplatform.one/backoffice 7.28.1 → 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 (269) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
  3. package/dist/cjs/form/DocFormScreen.cjs +167 -224
  4. package/dist/cjs/form/DocFormScreen.native.js +182 -259
  5. package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
  6. package/dist/cjs/i18n/en.cjs +1 -0
  7. package/dist/cjs/i18n/en.native.js +1 -0
  8. package/dist/cjs/i18n/en.native.js.map +1 -1
  9. package/dist/cjs/list/ListBulkActionsBar.cjs +30 -18
  10. package/dist/cjs/list/ListBulkActionsBar.native.js +43 -31
  11. package/dist/cjs/list/ListBulkActionsBar.native.js.map +1 -1
  12. package/dist/cjs/list/sidebar-section.cjs +15 -7
  13. package/dist/cjs/list/sidebar-section.native.js +16 -7
  14. package/dist/cjs/list/sidebar-section.native.js.map +1 -1
  15. package/dist/cjs/report/DoctypeReportView.cjs +20 -374
  16. package/dist/cjs/report/DoctypeReportView.native.js +23 -455
  17. package/dist/cjs/report/DoctypeReportView.native.js.map +1 -1
  18. package/dist/cjs/report/QueryReportScreen.cjs +33 -23
  19. package/dist/cjs/report/QueryReportScreen.native.js +33 -23
  20. package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
  21. package/dist/cjs/report/queryReportColumns.cjs +3 -105
  22. package/dist/cjs/report/queryReportColumns.native.js +2 -129
  23. package/dist/cjs/report/queryReportColumns.native.js.map +1 -1
  24. package/dist/cjs/report/queryReportFilterBar.cjs +3 -4
  25. package/dist/cjs/report/queryReportFilterBar.native.js +3 -4
  26. package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
  27. package/dist/cjs/report/queryReportUrlState.cjs +2 -2
  28. package/dist/cjs/report/queryReportUrlState.native.js +2 -2
  29. package/dist/cjs/report/queryReportUrlState.native.js.map +1 -1
  30. package/dist/cjs/report/report-grid.cjs +2 -426
  31. package/dist/cjs/report/report-grid.native.js +1 -479
  32. package/dist/cjs/report/report-grid.native.js.map +1 -1
  33. package/dist/cjs/report/report-toolbar.cjs +2 -228
  34. package/dist/cjs/report/report-toolbar.native.js +1 -274
  35. package/dist/cjs/report/report-toolbar.native.js.map +1 -1
  36. package/dist/cjs/report/reportShapes.cjs +12 -383
  37. package/dist/cjs/report/reportShapes.native.js +12 -501
  38. package/dist/cjs/report/reportShapes.native.js.map +1 -1
  39. package/dist/cjs/report/reportViewModel.cjs +20 -360
  40. package/dist/cjs/report/reportViewModel.native.js +19 -627
  41. package/dist/cjs/report/reportViewModel.native.js.map +1 -1
  42. package/dist/cjs/report/savedReports.cjs +2 -106
  43. package/dist/cjs/report/savedReports.native.js +1 -132
  44. package/dist/cjs/report/savedReports.native.js.map +1 -1
  45. package/dist/cjs/report/useQueryReport.cjs +11 -219
  46. package/dist/cjs/report/useQueryReport.native.js +11 -244
  47. package/dist/cjs/report/useQueryReport.native.js.map +1 -1
  48. package/dist/cjs/shared/measures.cjs +3 -5
  49. package/dist/cjs/shared/measures.native.js +3 -5
  50. package/dist/cjs/shared/measures.native.js.map +1 -1
  51. package/dist/cjs/views/ReportView.cjs +3 -256
  52. package/dist/cjs/views/ReportView.native.js +3 -382
  53. package/dist/cjs/views/ReportView.native.js.map +1 -1
  54. package/dist/cjs/views/report-controls.cjs +6 -6
  55. package/dist/cjs/views/report-controls.native.js +6 -6
  56. package/dist/cjs/views/report-controls.native.js.map +1 -1
  57. package/dist/esm/desk/DeskSurface.mjs.map +1 -1
  58. package/dist/esm/desk/DeskSurface.native.js.map +1 -1
  59. package/dist/esm/form/DocFormScreen.mjs +169 -226
  60. package/dist/esm/form/DocFormScreen.mjs.map +1 -1
  61. package/dist/esm/form/DocFormScreen.native.js +184 -261
  62. package/dist/esm/form/DocFormScreen.native.js.map +1 -1
  63. package/dist/esm/i18n/en.mjs +1 -0
  64. package/dist/esm/i18n/en.mjs.map +1 -1
  65. package/dist/esm/i18n/en.native.js +1 -0
  66. package/dist/esm/i18n/en.native.js.map +1 -1
  67. package/dist/esm/list/ListBulkActionsBar.mjs +31 -19
  68. package/dist/esm/list/ListBulkActionsBar.mjs.map +1 -1
  69. package/dist/esm/list/ListBulkActionsBar.native.js +37 -25
  70. package/dist/esm/list/ListBulkActionsBar.native.js.map +1 -1
  71. package/dist/esm/list/sidebar-section.mjs +16 -8
  72. package/dist/esm/list/sidebar-section.mjs.map +1 -1
  73. package/dist/esm/list/sidebar-section.native.js +17 -8
  74. package/dist/esm/list/sidebar-section.native.js.map +1 -1
  75. package/dist/esm/report/DoctypeReportView.mjs +21 -375
  76. package/dist/esm/report/DoctypeReportView.mjs.map +1 -1
  77. package/dist/esm/report/DoctypeReportView.native.js +24 -456
  78. package/dist/esm/report/DoctypeReportView.native.js.map +1 -1
  79. package/dist/esm/report/QueryReportScreen.mjs +26 -16
  80. package/dist/esm/report/QueryReportScreen.mjs.map +1 -1
  81. package/dist/esm/report/QueryReportScreen.native.js +26 -16
  82. package/dist/esm/report/QueryReportScreen.native.js.map +1 -1
  83. package/dist/esm/report/queryReportColumns.mjs +1 -103
  84. package/dist/esm/report/queryReportColumns.mjs.map +1 -1
  85. package/dist/esm/report/queryReportColumns.native.js +1 -117
  86. package/dist/esm/report/queryReportColumns.native.js.map +1 -1
  87. package/dist/esm/report/queryReportFilterBar.mjs +1 -2
  88. package/dist/esm/report/queryReportFilterBar.mjs.map +1 -1
  89. package/dist/esm/report/queryReportFilterBar.native.js +1 -2
  90. package/dist/esm/report/queryReportFilterBar.native.js.map +1 -1
  91. package/dist/esm/report/queryReportUrlState.mjs +1 -1
  92. package/dist/esm/report/queryReportUrlState.native.js +1 -1
  93. package/dist/esm/report/report-grid.mjs +1 -425
  94. package/dist/esm/report/report-grid.mjs.map +1 -1
  95. package/dist/esm/report/report-grid.native.js +1 -468
  96. package/dist/esm/report/report-grid.native.js.map +1 -1
  97. package/dist/esm/report/report-toolbar.mjs +2 -228
  98. package/dist/esm/report/report-toolbar.mjs.map +1 -1
  99. package/dist/esm/report/report-toolbar.native.js +2 -264
  100. package/dist/esm/report/report-toolbar.native.js.map +1 -1
  101. package/dist/esm/report/reportShapes.mjs +2 -373
  102. package/dist/esm/report/reportShapes.mjs.map +1 -1
  103. package/dist/esm/report/reportShapes.native.js +2 -491
  104. package/dist/esm/report/reportShapes.native.js.map +1 -1
  105. package/dist/esm/report/reportViewModel.mjs +2 -342
  106. package/dist/esm/report/reportViewModel.mjs.map +1 -1
  107. package/dist/esm/report/reportViewModel.native.js +2 -610
  108. package/dist/esm/report/reportViewModel.native.js.map +1 -1
  109. package/dist/esm/report/savedReports.mjs +1 -105
  110. package/dist/esm/report/savedReports.mjs.map +1 -1
  111. package/dist/esm/report/savedReports.native.js +1 -132
  112. package/dist/esm/report/savedReports.native.js.map +1 -1
  113. package/dist/esm/report/useQueryReport.mjs +2 -210
  114. package/dist/esm/report/useQueryReport.mjs.map +1 -1
  115. package/dist/esm/report/useQueryReport.native.js +2 -235
  116. package/dist/esm/report/useQueryReport.native.js.map +1 -1
  117. package/dist/esm/shared/measures.mjs +1 -3
  118. package/dist/esm/shared/measures.mjs.map +1 -1
  119. package/dist/esm/shared/measures.native.js +1 -3
  120. package/dist/esm/shared/measures.native.js.map +1 -1
  121. package/dist/esm/views/ReportView.mjs +3 -256
  122. package/dist/esm/views/ReportView.mjs.map +1 -1
  123. package/dist/esm/views/ReportView.native.js +3 -382
  124. package/dist/esm/views/ReportView.native.js.map +1 -1
  125. package/dist/esm/views/report-controls.mjs +3 -3
  126. package/dist/esm/views/report-controls.mjs.map +1 -1
  127. package/dist/esm/views/report-controls.native.js +3 -3
  128. package/dist/esm/views/report-controls.native.js.map +1 -1
  129. package/dist/jsx/desk/DeskSurface.mjs.map +1 -1
  130. package/dist/jsx/desk/DeskSurface.native.js.map +1 -1
  131. package/dist/jsx/form/DocFormScreen.mjs +169 -226
  132. package/dist/jsx/form/DocFormScreen.mjs.map +1 -1
  133. package/dist/jsx/form/DocFormScreen.native.js +182 -259
  134. package/dist/jsx/form/DocFormScreen.native.js.map +1 -1
  135. package/dist/jsx/i18n/en.mjs +1 -0
  136. package/dist/jsx/i18n/en.mjs.map +1 -1
  137. package/dist/jsx/i18n/en.native.js +1 -0
  138. package/dist/jsx/i18n/en.native.js.map +1 -1
  139. package/dist/jsx/list/ListBulkActionsBar.mjs +31 -19
  140. package/dist/jsx/list/ListBulkActionsBar.mjs.map +1 -1
  141. package/dist/jsx/list/ListBulkActionsBar.native.js +43 -31
  142. package/dist/jsx/list/ListBulkActionsBar.native.js.map +1 -1
  143. package/dist/jsx/list/sidebar-section.mjs +16 -8
  144. package/dist/jsx/list/sidebar-section.mjs.map +1 -1
  145. package/dist/jsx/list/sidebar-section.native.js +16 -7
  146. package/dist/jsx/list/sidebar-section.native.js.map +1 -1
  147. package/dist/jsx/report/DoctypeReportView.mjs +21 -375
  148. package/dist/jsx/report/DoctypeReportView.mjs.map +1 -1
  149. package/dist/jsx/report/DoctypeReportView.native.js +23 -455
  150. package/dist/jsx/report/DoctypeReportView.native.js.map +1 -1
  151. package/dist/jsx/report/QueryReportScreen.mjs +26 -16
  152. package/dist/jsx/report/QueryReportScreen.mjs.map +1 -1
  153. package/dist/jsx/report/QueryReportScreen.native.js +33 -23
  154. package/dist/jsx/report/QueryReportScreen.native.js.map +1 -1
  155. package/dist/jsx/report/queryReportColumns.mjs +1 -103
  156. package/dist/jsx/report/queryReportColumns.mjs.map +1 -1
  157. package/dist/jsx/report/queryReportColumns.native.js +2 -129
  158. package/dist/jsx/report/queryReportColumns.native.js.map +1 -1
  159. package/dist/jsx/report/queryReportFilterBar.mjs +1 -2
  160. package/dist/jsx/report/queryReportFilterBar.mjs.map +1 -1
  161. package/dist/jsx/report/queryReportFilterBar.native.js +3 -4
  162. package/dist/jsx/report/queryReportFilterBar.native.js.map +1 -1
  163. package/dist/jsx/report/queryReportUrlState.mjs +1 -1
  164. package/dist/jsx/report/queryReportUrlState.native.js +2 -2
  165. package/dist/jsx/report/queryReportUrlState.native.js.map +1 -1
  166. package/dist/jsx/report/report-grid.mjs +1 -425
  167. package/dist/jsx/report/report-grid.mjs.map +1 -1
  168. package/dist/jsx/report/report-grid.native.js +1 -479
  169. package/dist/jsx/report/report-grid.native.js.map +1 -1
  170. package/dist/jsx/report/report-toolbar.mjs +2 -228
  171. package/dist/jsx/report/report-toolbar.mjs.map +1 -1
  172. package/dist/jsx/report/report-toolbar.native.js +1 -274
  173. package/dist/jsx/report/report-toolbar.native.js.map +1 -1
  174. package/dist/jsx/report/reportShapes.mjs +2 -373
  175. package/dist/jsx/report/reportShapes.mjs.map +1 -1
  176. package/dist/jsx/report/reportShapes.native.js +12 -501
  177. package/dist/jsx/report/reportShapes.native.js.map +1 -1
  178. package/dist/jsx/report/reportViewModel.mjs +2 -342
  179. package/dist/jsx/report/reportViewModel.mjs.map +1 -1
  180. package/dist/jsx/report/reportViewModel.native.js +19 -627
  181. package/dist/jsx/report/reportViewModel.native.js.map +1 -1
  182. package/dist/jsx/report/savedReports.mjs +1 -105
  183. package/dist/jsx/report/savedReports.mjs.map +1 -1
  184. package/dist/jsx/report/savedReports.native.js +1 -132
  185. package/dist/jsx/report/savedReports.native.js.map +1 -1
  186. package/dist/jsx/report/useQueryReport.mjs +2 -210
  187. package/dist/jsx/report/useQueryReport.mjs.map +1 -1
  188. package/dist/jsx/report/useQueryReport.native.js +11 -244
  189. package/dist/jsx/report/useQueryReport.native.js.map +1 -1
  190. package/dist/jsx/shared/measures.mjs +1 -3
  191. package/dist/jsx/shared/measures.mjs.map +1 -1
  192. package/dist/jsx/shared/measures.native.js +3 -5
  193. package/dist/jsx/shared/measures.native.js.map +1 -1
  194. package/dist/jsx/views/ReportView.mjs +3 -256
  195. package/dist/jsx/views/ReportView.mjs.map +1 -1
  196. package/dist/jsx/views/ReportView.native.js +3 -382
  197. package/dist/jsx/views/ReportView.native.js.map +1 -1
  198. package/dist/jsx/views/report-controls.mjs +3 -3
  199. package/dist/jsx/views/report-controls.mjs.map +1 -1
  200. package/dist/jsx/views/report-controls.native.js +6 -6
  201. package/dist/jsx/views/report-controls.native.js.map +1 -1
  202. package/package.json +12 -12
  203. package/src/backofficeScreens.designLaw.spec.ts +0 -5
  204. package/src/desk/DeskSurface.tsx +4 -7
  205. package/src/form/DocFormScreen.chrome.spec.ts +77 -0
  206. package/src/form/DocFormScreen.guest.screen.spec.tsx +175 -0
  207. package/src/form/DocFormScreen.rights.spec.tsx +7 -3
  208. package/src/form/DocFormScreen.tsx +214 -315
  209. package/src/i18n/en.ts +1 -0
  210. package/src/list/ListBulkActionsBar.rights.spec.tsx +134 -0
  211. package/src/list/ListBulkActionsBar.screen.spec.tsx +7 -1
  212. package/src/list/ListBulkActionsBar.tsx +76 -57
  213. package/src/list/ListFilterBar.screen.spec.tsx +14 -13
  214. package/src/list/sidebar-section.tsx +11 -3
  215. package/src/report/DoctypeReportView.tsx +28 -550
  216. package/src/report/QueryReportScreen.spec.tsx +75 -1
  217. package/src/report/QueryReportScreen.tsx +38 -22
  218. package/src/report/queryReportColumns.tsx +4 -123
  219. package/src/report/queryReportFilterBar.tsx +3 -5
  220. package/src/report/queryReportUrlState.ts +1 -1
  221. package/src/report/report-grid.tsx +4 -529
  222. package/src/report/report-toolbar.tsx +4 -308
  223. package/src/report/reportShapes.ts +25 -613
  224. package/src/report/reportShim.spec.ts +162 -0
  225. package/src/report/reportViewModel.ts +32 -605
  226. package/src/report/savedReports.ts +4 -161
  227. package/src/report/useQueryReport.ts +9 -347
  228. package/src/shared/measures.ts +3 -11
  229. package/src/views/ReportView.screen.spec.tsx +25 -20
  230. package/src/views/ReportView.tsx +7 -439
  231. package/src/views/report-controls.tsx +12 -20
  232. package/types/desk/DeskSurface.d.ts.map +1 -1
  233. package/types/form/DocFormScreen.d.ts +2 -2
  234. package/types/form/DocFormScreen.d.ts.map +1 -1
  235. package/types/i18n/en.d.ts +1 -0
  236. package/types/i18n/en.d.ts.map +1 -1
  237. package/types/list/ListBulkActionsBar.d.ts.map +1 -1
  238. package/types/list/sidebar-section.d.ts.map +1 -1
  239. package/types/report/DoctypeReportView.d.ts.map +1 -1
  240. package/types/report/QueryReportScreen.d.ts +1 -1
  241. package/types/report/QueryReportScreen.d.ts.map +1 -1
  242. package/types/report/queryReportColumns.d.ts +2 -11
  243. package/types/report/queryReportColumns.d.ts.map +1 -1
  244. package/types/report/queryReportFilterBar.d.ts +1 -1
  245. package/types/report/queryReportFilterBar.d.ts.map +1 -1
  246. package/types/report/queryReportUrlState.d.ts +1 -1
  247. package/types/report/queryReportUrlState.d.ts.map +1 -1
  248. package/types/report/report-grid.d.ts +2 -19
  249. package/types/report/report-grid.d.ts.map +1 -1
  250. package/types/report/report-toolbar.d.ts +2 -29
  251. package/types/report/report-toolbar.d.ts.map +1 -1
  252. package/types/report/reportShapes.d.ts +2 -115
  253. package/types/report/reportShapes.d.ts.map +1 -1
  254. package/types/report/reportViewModel.d.ts +2 -135
  255. package/types/report/reportViewModel.d.ts.map +1 -1
  256. package/types/report/savedReports.d.ts +2 -18
  257. package/types/report/savedReports.d.ts.map +1 -1
  258. package/types/report/useQueryReport.d.ts +2 -35
  259. package/types/report/useQueryReport.d.ts.map +1 -1
  260. package/types/shared/measures.d.ts +1 -2
  261. package/types/shared/measures.d.ts.map +1 -1
  262. package/types/views/ReportView.d.ts +3 -22
  263. package/types/views/ReportView.d.ts.map +1 -1
  264. package/types/views/report-controls.d.ts +2 -5
  265. package/types/views/report-controls.d.ts.map +1 -1
  266. package/src/report/report-grid.spec.tsx +0 -175
  267. package/src/report/report-toolbar.spec.tsx +0 -90
  268. package/src/report/reportShapes.spec.ts +0 -391
  269. package/src/report/reportViewModel.spec.ts +0 -393
@@ -1,8 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
- import { AsyncSkeleton, Button, ConfirmDialog, EmptyState, ScrollView, Tabs, Text, XStack, YStack, notify } from "@multiplatform.one/components";
4
- import { Input } from "@multiplatform.one/forms";
5
- import { SchemaForm, sessionDocRights, useFrappeConfig } from "@multiplatform.one/frappe-ui";
3
+ import { AsyncBoundary, AsyncSkeleton, Button, ConfirmDialog, EmptyState, ScrollView, Text, XStack, YStack, notify } from "@multiplatform.one/components";
4
+ import { FrappeForm, docinfoRights, fixtureDocRights, isPermissionError, refusalReason, useFrappeConfig, useFrappeForm } from "@multiplatform.one/frappe-ui";
6
5
  import { useLayoutSizeClass, useResolvedKnobs } from "@multiplatform.one/theme";
7
6
  import { ListBulletsIcon } from "@phosphor-icons/react";
8
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -14,14 +13,11 @@ import { getListNavNeighbors } from "../shared/listNavContext.native.js";
14
13
  import { invalidateDocinfo, useDocinfo } from "../shared/useDocinfo.native.js";
15
14
  import { useRecentVisit } from "../shared/useRecentVisit.native.js";
16
15
  import { useDoctypeMeta } from "../shared/useDoctypeMeta.native.js";
17
- import { useUserRoles } from "../shared/useUserRoles.native.js";
16
+ import { groupConnectionLinks } from "./connections-data.native.js";
18
17
  import { setCreatePrefill } from "./createPrefill.native.js";
19
- import { normalizeDocPermissions } from "./docinfo.native.js";
20
- import { buildPermLevelMatrix } from "./fieldPermissions.native.js";
21
18
  import { createHttpClient, renameDoc, sendEmail } from "./formActions.native.js";
22
19
  import { EmailDialog, JumpToFieldDialog, RenameDialog } from "./FormDialogs.native.js";
23
20
  import { FormErrorBoundary, wrapFieldWithErrorBoundary } from "./FormErrorBoundary.native.js";
24
- import { buildCopyValues, buildFormTabs, isPromptNamed } from "./formLayout.native.js";
25
21
  import { FormConnections } from "./FormConnections.native.js";
26
22
  import { FormHeaderCluster } from "./FormHeaderCluster.native.js";
27
23
  import { FormSidebarPanel } from "./FormSidebarPanel.native.js";
@@ -29,7 +25,6 @@ import { FormTimeline } from "./FormTimeline.native.js";
29
25
  import { FormToolbar, resolveIndicator } from "./FormToolbar.native.js";
30
26
  import { htmlToText } from "./timeline-utils.native.js";
31
27
  import { canOpenNewTab, openInNewTab, useBeforeUnloadGuard, useDocPagerShortcuts, useJumpToFieldShortcut, useNavigationDirtyGuard, useSaveShortcut } from "./platformHooks.native.js";
32
- import { useFormEngine } from "./useFormEngine.native.js";
33
28
  var CONNECTIONS_TAB = "__connections";
34
29
  function DocFormScreen(param) {
35
30
  var {
@@ -43,8 +38,8 @@ function DocFormScreen(param) {
43
38
  onDeleted,
44
39
  actionOverrides
45
40
  } = param;
46
- var _ref, _ref1;
47
- var _engine_baseline, _engine_baseline1, _meta_links, _bodyTabs_, _bodyTabs_1;
41
+ var _form_user;
42
+ var _form_baseline;
48
43
  var {
49
44
  t
50
45
  } = useTranslation(BACKOFFICE_I18N_NAMESPACE);
@@ -80,31 +75,20 @@ function DocFormScreen(param) {
80
75
  name
81
76
  });
82
77
  }, [isCreate, doctype, name, emitEvent]);
83
- var connection = useMemo(function () {
84
- return (config === null || config === void 0 ? void 0 : config.baseURL) ? {
85
- baseURL: config.baseURL,
86
- socketPort: config.socketPort,
87
- siteName: config.siteName,
88
- socketBaseURL: config.socketBaseURL,
89
- auth: config.auth,
90
- syncOptions: config.syncOptions,
91
- fixtures: config.fixtures
92
- } : void 0;
93
- }, [config]);
94
78
  var {
95
79
  meta,
96
80
  loading: isMetaLoading,
97
81
  error: metaError,
98
82
  reload: refetchMeta
99
83
  } = useDoctypeMeta(doctype);
100
- var engine = useFormEngine(connection, doctype, docName, meta, t);
101
- useEffect(function () {
102
- if (metaError && !meta) emitEvent({
103
- type: "error",
104
- error: metaError,
105
- context: "form-meta"
106
- });
107
- }, [metaError, meta, emitEvent]);
84
+ var metaSource = useMemo(function () {
85
+ return {
86
+ meta,
87
+ isLoading: isMetaLoading,
88
+ error: metaError
89
+ };
90
+ }, [meta, isMetaLoading, metaError]);
91
+ var metaRefused = !meta && metaError !== void 0 && isPermissionError(metaError);
108
92
  var {
109
93
  docinfo,
110
94
  reload: reloadDocinfo
@@ -113,7 +97,35 @@ function DocFormScreen(param) {
113
97
  if (docName) invalidateDocinfo(doctype, docName);
114
98
  reloadDocinfo();
115
99
  }, [doctype, docName, reloadDocinfo]);
116
- var modifiedStamp = typeof ((_engine_baseline = engine.baseline) === null || _engine_baseline === void 0 ? void 0 : _engine_baseline.modified) === "string" ? engine.baseline.modified : void 0;
100
+ var fixtureMode = Boolean(config === null || config === void 0 ? void 0 : config.fixtures);
101
+ var rights = useMemo(function () {
102
+ var _docinfoRights;
103
+ return (_docinfoRights = docinfoRights(docinfo === null || docinfo === void 0 ? void 0 : docinfo.permissions)) !== null && _docinfoRights !== void 0 ? _docinfoRights : fixtureMode ? fixtureDocRights(meta) : void 0;
104
+ }, [docinfo === null || docinfo === void 0 ? void 0 : docinfo.permissions, fixtureMode, meta]);
105
+ var form = useFrappeForm({
106
+ doctype,
107
+ name: docName,
108
+ meta: metaSource,
109
+ rights,
110
+ shares: docinfo === null || docinfo === void 0 ? void 0 : docinfo.shared,
111
+ readShares: false,
112
+ disabled: readOnly,
113
+ hideFields: hiddenFields,
114
+ hideSections: hiddenSections
115
+ });
116
+ var connection = form.connection;
117
+ var currentUser = (_form_user = form.user) !== null && _form_user !== void 0 ? _form_user : "";
118
+ var perms = form.rights;
119
+ useEffect(function () {
120
+ if (metaError && !meta && !metaRefused) {
121
+ emitEvent({
122
+ type: "error",
123
+ error: metaError,
124
+ context: "form-meta"
125
+ });
126
+ }
127
+ }, [metaError, meta, metaRefused, emitEvent]);
128
+ var modifiedStamp = typeof ((_form_baseline = form.baseline) === null || _form_baseline === void 0 ? void 0 : _form_baseline.modified) === "string" ? form.baseline.modified : void 0;
117
129
  var stampRef = useRef(void 0);
118
130
  useEffect(function () {
119
131
  stampRef.current = void 0;
@@ -128,118 +140,20 @@ function DocFormScreen(param) {
128
140
  reloadDocinfo();
129
141
  }
130
142
  }, [modifiedStamp, docName, doctype, reloadDocinfo]);
131
- var {
132
- roles,
133
- user: sessionUser
134
- } = useUserRoles();
135
- var fixtureMode = Boolean(config === null || config === void 0 ? void 0 : config.fixtures);
136
- var recordOwner = !isCreate && typeof ((_engine_baseline1 = engine.baseline) === null || _engine_baseline1 === void 0 ? void 0 : _engine_baseline1.owner) === "string" ? engine.baseline.owner : void 0;
137
- var perms = useMemo(function () {
138
- var _ref2;
139
- var docPerms = normalizeDocPermissions(docinfo === null || docinfo === void 0 ? void 0 : docinfo.permissions);
140
- if (docPerms) {
141
- return {
142
- write: !!docPerms.write,
143
- create: !!docPerms.create,
144
- delete: !!docPerms.delete,
145
- submit: !!docPerms.submit,
146
- cancel: !!docPerms.cancel,
147
- amend: !!docPerms.amend,
148
- email: !!docPerms.email,
149
- print: !!docPerms.print
150
- };
151
- }
152
- if (!fixtureMode) {
153
- var rights = sessionDocRights({
154
- fixtures: false,
155
- meta,
156
- roles,
157
- user: sessionUser,
158
- owner: recordOwner,
159
- shares: docinfo === null || docinfo === void 0 ? void 0 : docinfo.shared
160
- });
161
- return {
162
- write: rights.write,
163
- create: rights.create,
164
- delete: rights.delete,
165
- submit: rights.submit,
166
- cancel: rights.cancel,
167
- amend: rights.amend,
168
- email: rights.email,
169
- print: rights.print
170
- };
171
- }
172
- var rules = (_ref2 = meta === null || meta === void 0 ? void 0 : meta.permissions) !== null && _ref2 !== void 0 ? _ref2 : [];
173
- var anyRole = function anyRole2(key) {
174
- return rules.some(function (rule) {
175
- return !rule.permlevel && !!rule[key];
176
- });
177
- };
178
- return {
179
- write: rules.length === 0 || anyRole("write"),
180
- create: rules.length === 0 || anyRole("create"),
181
- delete: anyRole("delete"),
182
- submit: anyRole("submit"),
183
- cancel: anyRole("cancel"),
184
- amend: anyRole("amend"),
185
- email: rules.length === 0 || anyRole("email"),
186
- print: rules.length === 0 || anyRole("print")
187
- };
188
- }, [docinfo === null || docinfo === void 0 ? void 0 : docinfo.permissions, docinfo === null || docinfo === void 0 ? void 0 : docinfo.shared, meta, fixtureMode, roles, sessionUser, recordOwner]);
189
- var isSubmittable = !!(meta === null || meta === void 0 ? void 0 : meta.is_submittable);
190
- var formReadOnly = !!readOnly || !!(meta === null || meta === void 0 ? void 0 : meta.read_only) || engine.wasDeleted || !isCreate && !perms.write || isCreate && !perms.create;
191
- var permLevels = useMemo(function () {
192
- return buildPermLevelMatrix(meta === null || meta === void 0 ? void 0 : meta.permissions, roles);
193
- }, [meta === null || meta === void 0 ? void 0 : meta.permissions, roles]);
194
- var formTabs = useMemo(function () {
195
- if (!meta) return [];
196
- return buildFormTabs({
197
- fields: meta.fields,
198
- // depends_on evaluates against the doc plus desk's ambient context:
199
- // __islocal (unsaved doc flag) and the session user behind
200
- // `frappe.session.user` references.
201
- doc: {
202
- ...engine.doc,
203
- __islocal: isCreate ? 1 : 0,
204
- ...(engine.currentUser ? {
205
- __session_user: engine.currentUser
206
- } : {})
207
- },
208
- docstatus: engine.docstatus,
209
- formReadOnly,
210
- isCreate,
211
- detailsLabel: t("detailsTab", "Details"),
212
- permLevels,
213
- hiddenFields,
214
- hiddenSections
215
- });
216
- }, [meta, engine.doc, engine.currentUser, engine.docstatus, formReadOnly, isCreate, permLevels, hiddenFields, hiddenSections, t]);
217
- var jumpTargets = useMemo(function () {
218
- return formTabs.flatMap(function (tab) {
219
- return tab.schema.fields.map(function (field) {
220
- return {
221
- name: field.name,
222
- label: field.label || field.name,
223
- tabKey: tab.key,
224
- tabLabel: tab.label
225
- };
226
- });
227
- });
228
- }, [formTabs]);
229
- var [activeTab, setActiveTab] = useState(void 0);
230
- var showConnections = !isCreate && !!connection && ((_ref = meta === null || meta === void 0 ? void 0 : (_meta_links = meta.links) === null || _meta_links === void 0 ? void 0 : _meta_links.some(function (link) {
231
- return !link.hidden;
232
- })) !== null && _ref !== void 0 ? _ref : false);
143
+ var isSubmittable = form.isSubmittable;
144
+ var formReadOnly = form.readOnly;
145
+ var jumpTargets = form.fieldTargets;
146
+ var showConnections = !isCreate && !!connection && groupConnectionLinks(meta).length > 0;
233
147
  var [pendingNav, setPendingNav] = useState(void 0);
234
148
  var navigate = useCallback(function (href) {
235
- if (engine.isDirty) {
149
+ if (form.isDirty) {
236
150
  setPendingNav(href);
237
151
  return;
238
152
  }
239
153
  navigator.navigate(href);
240
- }, [engine.isDirty, navigator]);
241
- useBeforeUnloadGuard(engine.isDirty);
242
- var backGuard = useNavigationDirtyGuard(engine.isDirty);
154
+ }, [form.isDirty, navigator]);
155
+ useBeforeUnloadGuard(form.isDirty);
156
+ var backGuard = useNavigationDirtyGuard(form.isDirty);
243
157
  var [confirmAction, setConfirmAction] = useState(void 0);
244
158
  var [renameOpen, setRenameOpen] = useState(false);
245
159
  var [emailOpen, setEmailOpen] = useState(false);
@@ -247,15 +161,12 @@ function DocFormScreen(param) {
247
161
  var [pendingJump, setPendingJump] = useState(void 0);
248
162
  var [validationSummary, setValidationSummary] = useState(void 0);
249
163
  var handleSave = useCallback(async function () {
250
- var validationErrors = engine.validate();
164
+ var validationErrors = form.validate();
251
165
  var errorFields = Object.keys(validationErrors);
252
166
  if (errorFields.length > 0) {
253
- var owner = formTabs.find(function (tab) {
254
- return tab.schema.fields.some(function (field) {
255
- return errorFields.includes(field.name);
256
- });
167
+ errorFields.some(function (field) {
168
+ return form.revealField(field);
257
169
  });
258
- if (owner) setActiveTab(owner.key);
259
170
  setValidationSummary(t("validationSummary", {
260
171
  count: errorFields.length,
261
172
  defaultValue_one: "Cannot save \u2014 {{count}} required field is missing.",
@@ -264,7 +175,7 @@ function DocFormScreen(param) {
264
175
  } else {
265
176
  setValidationSummary(void 0);
266
177
  }
267
- var savedName = await engine.save();
178
+ var savedName = await form.save();
268
179
  if (!savedName) return;
269
180
  setValidationSummary(void 0);
270
181
  notify({
@@ -280,7 +191,7 @@ function DocFormScreen(param) {
280
191
  isNew: isCreate
281
192
  });
282
193
  onSaved === null || onSaved === void 0 ? void 0 : onSaved({
283
- ...engine.doc,
194
+ ...form.doc,
284
195
  name: savedName
285
196
  });
286
197
  if (isCreate) {
@@ -288,26 +199,19 @@ function DocFormScreen(param) {
288
199
  } else {
289
200
  reloadDocinfo();
290
201
  }
291
- }, [engine, formTabs, isCreate, navigator, paths, doctype, reloadDocinfo, t, emitEvent, onSaved]);
202
+ }, [form, isCreate, navigator, paths, doctype, reloadDocinfo, t, emitEvent, onSaved]);
292
203
  useSaveShortcut(!formReadOnly, function () {
293
- if (engine.isDirty || isCreate) void handleSave();
204
+ if (form.isDirty || isCreate) void handleSave();
294
205
  });
295
206
  useJumpToFieldShortcut(jumpTargets.length > 0 && !jumpOpen, function () {
296
207
  return setJumpOpen(true);
297
208
  });
298
209
  var handleAmend = useCallback(function () {
299
- if (!meta || !docName) return;
300
- setCreatePrefill(doctype, {
301
- ...buildCopyValues(meta.fields, engine.doc),
302
- amended_from: docName
303
- });
304
- navigator.navigate(paths.newDoc(doctype));
305
- }, [meta, docName, doctype, engine.doc, navigator, paths]);
210
+ if (form.amend()) navigator.navigate(paths.newDoc(doctype));
211
+ }, [form, doctype, navigator, paths]);
306
212
  var handleDuplicate = useCallback(function () {
307
- if (!meta) return;
308
- setCreatePrefill(doctype, buildCopyValues(meta.fields, engine.doc));
309
- navigator.navigate(paths.newDoc(doctype));
310
- }, [meta, doctype, engine.doc, navigator, paths]);
213
+ if (form.duplicate()) navigator.navigate(paths.newDoc(doctype));
214
+ }, [form, doctype, navigator, paths]);
311
215
  var handleRename = useCallback(async function (newName) {
312
216
  if (!connection || !docName) return;
313
217
  try {
@@ -330,11 +234,11 @@ function DocFormScreen(param) {
330
234
  }, function () {
331
235
  return openNeighborDoc(docPager.next);
332
236
  });
333
- var titleFieldValue = (meta === null || meta === void 0 ? void 0 : meta.title_field) && typeof engine.doc[meta.title_field] === "string" ?
237
+ var titleFieldValue = (meta === null || meta === void 0 ? void 0 : meta.title_field) && typeof form.doc[meta.title_field] === "string" ?
334
238
  // Title fields can hold rich text (e.g. ToDo.description = "<p>…</p>");
335
239
  // strip to plain text so the breadcrumb + toolbar heading don't show
336
240
  // literal HTML tags.
337
- htmlToText(engine.doc[meta.title_field]) : void 0;
241
+ htmlToText(form.doc[meta.title_field]) : void 0;
338
242
  var title = isCreate ? t("newDocTitle", "New {{doctype}}", {
339
243
  doctype
340
244
  }) : titleFieldValue || name;
@@ -345,18 +249,21 @@ function DocFormScreen(param) {
345
249
  label: t("menuReload", "Reload"),
346
250
  icon: "reload",
347
251
  onSelect: function onSelect() {
348
- engine.reload();
252
+ form.reset();
349
253
  setValidationSummary(void 0);
350
254
  refetchMeta();
351
255
  invalidateDocinfo(doctype, name);
352
256
  reloadDocinfo();
353
257
  }
354
- }, {
355
- key: "duplicate",
356
- label: t("menuDuplicate", "Duplicate"),
357
- icon: "duplicate",
358
- onSelect: handleDuplicate
359
258
  }];
259
+ if (!metaRefused) {
260
+ items.push({
261
+ key: "duplicate",
262
+ label: t("menuDuplicate", "Duplicate"),
263
+ icon: "duplicate",
264
+ onSelect: handleDuplicate
265
+ });
266
+ }
360
267
  if ((meta === null || meta === void 0 ? void 0 : meta.allow_rename) && perms.write) {
361
268
  items.push({
362
269
  key: "rename",
@@ -394,7 +301,7 @@ function DocFormScreen(param) {
394
301
  label: t("menuLinks", "Links"),
395
302
  icon: "links",
396
303
  onSelect: function onSelect() {
397
- return setActiveTab(CONNECTIONS_TAB);
304
+ return form.setActiveTab(CONNECTIONS_TAB);
398
305
  }
399
306
  });
400
307
  }
@@ -452,12 +359,12 @@ function DocFormScreen(param) {
452
359
  });
453
360
  }
454
361
  return items;
455
- }, [isCreate, t, engine, refetchMeta, reloadDocinfo, handleDuplicate, meta === null || meta === void 0 ? void 0 : meta.allow_rename, perms, connection, doctype, name, showConnections, jumpTargets, navigate, paths, capabilities]);
362
+ }, [isCreate, t, form, refetchMeta, reloadDocinfo, handleDuplicate, metaRefused, meta === null || meta === void 0 ? void 0 : meta.allow_rename, perms, connection, doctype, name, showConnections, jumpTargets, navigate, paths, capabilities]);
456
363
  var effectiveMenuItems = useMemo(function () {
457
- var _ref2;
458
- var hidden = new Set((_ref2 = actionOverrides === null || actionOverrides === void 0 ? void 0 : actionOverrides.hide) !== null && _ref2 !== void 0 ? _ref2 : []);
364
+ var _ref;
365
+ var hiddenKeys = new Set((_ref = actionOverrides === null || actionOverrides === void 0 ? void 0 : actionOverrides.hide) !== null && _ref !== void 0 ? _ref : []);
459
366
  var items = menuItems.filter(function (item) {
460
- return !hidden.has(item.key);
367
+ return !hiddenKeys.has(item.key);
461
368
  });
462
369
  var injected = [...actionsForDoctype(actions.form, doctype), ...actionsForDoctype(actionOverrides === null || actionOverrides === void 0 ? void 0 : actionOverrides.extra, doctype)];
463
370
  var _iteratorNormalCompletion = true,
@@ -498,9 +405,9 @@ function DocFormScreen(param) {
498
405
  }, [menuItems, actions.form, actionOverrides, doctype, docName]);
499
406
  var handleJumpToField = useCallback(function (field) {
500
407
  setJumpOpen(false);
501
- setActiveTab(field.tabKey);
408
+ form.setActiveTab(field.tabKey);
502
409
  setPendingJump(field.name);
503
- }, []);
410
+ }, [form]);
504
411
  useEffect(function () {
505
412
  if (!pendingJump) return;
506
413
  if (typeof document === "undefined") {
@@ -547,18 +454,63 @@ function DocFormScreen(param) {
547
454
  })
548
455
  });
549
456
  }
550
- if (metaError && !meta) {
457
+ if (metaError && !meta && !metaRefused) {
551
458
  return /* @__PURE__ */_jsx(YStack, {
552
459
  flex: 1,
553
- children: /* @__PURE__ */_jsx(EmptyState, {
554
- title: t("metaError", "Could not load {{doctype}}", {
460
+ children: /* @__PURE__ */_jsx(AsyncBoundary, {
461
+ error: metaError,
462
+ errorTitle: t("metaError", "Could not load {{doctype}}", {
555
463
  doctype
556
464
  }),
557
- description: metaError.message
465
+ onRetry: refetchMeta
466
+ })
467
+ });
468
+ }
469
+ if (!isCreate && form.status === "error" && form.docError && isPermissionError(form.docError)) {
470
+ return /* @__PURE__ */_jsx(YStack, {
471
+ flex: 1,
472
+ children: /* @__PURE__ */_jsx(EmptyState, {
473
+ testID: "frappe-form-not-permitted",
474
+ title: t("docNotPermitted", "You can't open {{doctype}} {{name}}", {
475
+ doctype,
476
+ name
477
+ }),
478
+ description: refusalReason(form.docError),
479
+ action: /* @__PURE__ */_jsx(Button, {
480
+ icon: ListBulletsIcon,
481
+ onPress: function onPress() {
482
+ return navigator.navigate(paths.list(doctype));
483
+ },
484
+ children: t("backToList", "Back to {{doctype}} list", {
485
+ doctype
486
+ })
487
+ })
558
488
  })
559
489
  });
560
490
  }
561
- if (!isCreate && engine.notFound) {
491
+ if (!isCreate && form.status === "error" && form.docError) {
492
+ return /* @__PURE__ */_jsx(YStack, {
493
+ flex: 1,
494
+ children: /* @__PURE__ */_jsx(EmptyState, {
495
+ intent: "error",
496
+ title: t("docLoadError", "Could not load {{doctype}} {{name}}", {
497
+ doctype,
498
+ name
499
+ }),
500
+ description: form.docError.message,
501
+ action: /* @__PURE__ */_jsx(Button, {
502
+ icon: ListBulletsIcon,
503
+ onPress: function onPress() {
504
+ return navigator.navigate(paths.list(doctype));
505
+ },
506
+ children: t("backToList", "Back to {{doctype}} list", {
507
+ doctype
508
+ })
509
+ })
510
+ })
511
+ });
512
+ }
513
+ if (!isCreate && form.status === "notFound") {
562
514
  return /* @__PURE__ */_jsx(YStack, {
563
515
  flex: 1,
564
516
  children: /* @__PURE__ */_jsx(EmptyState, {
@@ -579,7 +531,7 @@ function DocFormScreen(param) {
579
531
  })
580
532
  });
581
533
  }
582
- if (!isCreate && engine.isLoading) {
534
+ if (!isCreate && form.status === "loading") {
583
535
  return /* @__PURE__ */_jsx(YStack, {
584
536
  flex: 1,
585
537
  ...knobProps.panelPadding,
@@ -591,16 +543,16 @@ function DocFormScreen(param) {
591
543
  }
592
544
  var indicator = resolveIndicator({
593
545
  isCreate,
594
- isDirty: engine.isDirty,
595
- docstatus: engine.docstatus,
546
+ isDirty: form.isDirty,
547
+ docstatus: form.docstatus,
596
548
  isSubmittable,
597
- statusValue: typeof engine.doc.status === "string" ? engine.doc.status : void 0,
549
+ statusValue: typeof form.doc.status === "string" ? form.doc.status : void 0,
598
550
  states: meta === null || meta === void 0 ? void 0 : meta.states
599
551
  });
600
- var canSave = !formReadOnly && (isCreate ? perms.create : perms.write && engine.docstatus === 0);
601
- var canSubmit = !isCreate && isSubmittable && engine.docstatus === 0 && !engine.isDirty && perms.submit && !engine.wasDeleted;
602
- var canCancel = !isCreate && isSubmittable && engine.docstatus === 1 && perms.cancel && !engine.wasDeleted;
603
- var canAmend = !isCreate && isSubmittable && engine.docstatus === 2 && perms.amend && !engine.wasDeleted;
552
+ var canSave = !formReadOnly && (isCreate ? perms.create : perms.write && form.docstatus === 0);
553
+ var canSubmit = !isCreate && isSubmittable && form.docstatus === 0 && !form.isDirty && perms.submit && !form.wasDeleted;
554
+ var canCancel = !isCreate && isSubmittable && form.docstatus === 1 && perms.cancel && !form.wasDeleted;
555
+ var canAmend = !isCreate && isSubmittable && form.docstatus === 2 && perms.amend && !form.wasDeleted;
604
556
  var breadcrumbs = [{
605
557
  label: t("home", "Home"),
606
558
  href: paths.home()
@@ -610,37 +562,8 @@ function DocFormScreen(param) {
610
562
  }, {
611
563
  label: isCreate ? t("newCrumb", "New") : title
612
564
  }];
613
- var promptNamed = isCreate && isPromptNamed(meta === null || meta === void 0 ? void 0 : meta.autoname, meta === null || meta === void 0 ? void 0 : meta.naming_rule);
614
565
  var sidebarStacked = sizeClass === "compact";
615
- var bodyTabs = [...formTabs.map(function (tab) {
616
- return {
617
- value: tab.key,
618
- label: tab.label,
619
- content: /* @__PURE__ */_jsx(YStack, {
620
- ...knobProps.gapLg,
621
- paddingTop: "$3",
622
- children: (
623
- /* Containment at two granularities: each field renders behind its
624
- own boundary (a broken field degrades to an inline error slot;
625
- siblings stay editable), and the whole tab body behind another
626
- (a SchemaForm-level crash costs one tab, not the route). */
627
- /* @__PURE__ */
628
- _jsx(FormErrorBoundary, {
629
- errorTitle: t("formTabRenderError", "This form tab failed to render"),
630
- testID: `form-tab-error-${tab.key}`,
631
- children: /* @__PURE__ */_jsx(SchemaForm, {
632
- schema: tab.schema,
633
- doc: engine.doc,
634
- setValue: engine.setValue,
635
- errors: engine.errors,
636
- disabled: formReadOnly || engine.isSaving,
637
- sectionHeadingLevel: 2,
638
- renderFieldWrapper: wrapFieldWithErrorBoundary
639
- })
640
- }))
641
- })
642
- };
643
- }), ...(showConnections ? [{
566
+ var connectionsTab = showConnections ? [{
644
567
  value: CONNECTIONS_TAB,
645
568
  label: t("connectionsTab", "Connections"),
646
569
  content: /* @__PURE__ */_jsx(YStack, {
@@ -651,42 +574,42 @@ function DocFormScreen(param) {
651
574
  meta
652
575
  })
653
576
  })
654
- }] : [])];
655
- var effectiveTab = activeTab && bodyTabs.some(function (tab) {
656
- return tab.value === activeTab;
657
- }) ? activeTab : (_bodyTabs_ = bodyTabs[0]) === null || _bodyTabs_ === void 0 ? void 0 : _bodyTabs_.value;
577
+ }] : [];
578
+ var renderTab = function renderTab2(tab, content) {
579
+ return /* @__PURE__ */_jsx(YStack, {
580
+ ...knobProps.gapLg,
581
+ paddingTop: "$3",
582
+ children: /* @__PURE__ */_jsx(FormErrorBoundary, {
583
+ errorTitle: t("formTabRenderError", "This form tab failed to render"),
584
+ testID: `form-tab-error-${tab.key}`,
585
+ children: content
586
+ })
587
+ });
588
+ };
658
589
  var formBody =
659
- // No flex here: formBody now lives inside COLUMN containers (both
660
- // branches below), where `flex={1}` means flex-basis:0 — the body would
661
- // stop contributing height and the timeline/sidebar would paint over it.
590
+ // No flex here: formBody lives inside COLUMN containers (both branches
591
+ // below), where `flex={1}` means flex-basis:0 — the body would stop
592
+ // contributing height and the timeline/sidebar would paint over it.
662
593
  /* @__PURE__ */
663
- _jsxs(YStack, {
594
+ _jsx(YStack, {
664
595
  minWidth: 0,
665
- ...knobProps.gapLg,
666
- children: [promptNamed && /* @__PURE__ */_jsx(YStack, {
667
- ...knobProps.gap,
668
- children: /* @__PURE__ */_jsx(Input, {
669
- label: t("namePrompt", "Name"),
670
- value: typeof engine.doc.name === "string" ? engine.doc.name : "",
671
- onChangeText: function onChangeText(value) {
672
- return engine.setValue("name", value);
673
- },
674
- placeholder: t("namePromptPlaceholder", "New document name"),
675
- error: engine.errors.name
676
- })
677
- }), bodyTabs.length > 1 ? /* @__PURE__ */_jsx(Tabs, {
678
- items: bodyTabs,
679
- value: effectiveTab,
680
- onChange: setActiveTab,
681
- lazyMount: true
682
- }) : (_ref1 = (_bodyTabs_1 = bodyTabs[0]) === null || _bodyTabs_1 === void 0 ? void 0 : _bodyTabs_1.content) !== null && _ref1 !== void 0 ? _ref1 : null, engine.errors.general && /* @__PURE__ */_jsx(Text, {
683
- color: "$red10",
684
- fontSize: "$3",
685
- role: "alert",
686
- children: engine.errors.general
687
- })]
596
+ children: /* @__PURE__ */_jsx(FrappeForm, {
597
+ form,
598
+ doctype,
599
+ name: docName,
600
+ disabled: readOnly,
601
+ showToolbar: false,
602
+ showSidebar: false,
603
+ showTimeline: false,
604
+ showConnections: false,
605
+ showBanners: false,
606
+ sectionHeadingLevel: 2,
607
+ renderFieldWrapper: wrapFieldWithErrorBoundary,
608
+ renderTab,
609
+ extraTabs: connectionsTab
610
+ })
688
611
  });
689
- var timeline = capabilities.timeline.enabled && !isCreate && docName ?
612
+ var timeline = capabilities.timeline.enabled && !isCreate && docName && !metaRefused ?
690
613
  // Composed mode: the screen's shared docinfo (and its refresh) feed
691
614
  // the timeline. Self-fetch mode subscribed the timeline to its OWN
692
615
  // cache entry, which the save path's invalidate+reload orphaned — the
@@ -698,16 +621,16 @@ function DocFormScreen(param) {
698
621
  name: docName,
699
622
  docInfo: docinfo,
700
623
  refreshDocInfo: refreshDocinfo,
701
- currentUser: engine.currentUser,
624
+ currentUser,
702
625
  connection
703
626
  }) : null;
704
627
  var sidebar = !isCreate && docName && meta ? /* @__PURE__ */_jsx(FormSidebarPanel, {
705
628
  doctype,
706
629
  name: docName,
707
630
  meta,
708
- doc: engine.doc,
631
+ doc: form.doc,
709
632
  docinfo,
710
- currentUser: engine.currentUser,
633
+ currentUser,
711
634
  onRefresh: refreshDocinfo,
712
635
  stacked: sidebarStacked
713
636
  }) : null;
@@ -717,12 +640,12 @@ function DocFormScreen(param) {
717
640
  title,
718
641
  indicator,
719
642
  showIndicator: !!meta,
720
- isSaving: engine.isSaving,
721
- cluster: !isCreate && docName ? /* @__PURE__ */_jsx(FormHeaderCluster, {
643
+ isSaving: form.isSubmitting,
644
+ cluster: !isCreate && docName && !metaRefused ? /* @__PURE__ */_jsx(FormHeaderCluster, {
722
645
  doctype,
723
646
  name: docName,
724
647
  docinfo,
725
- currentUser: engine.currentUser,
648
+ currentUser,
726
649
  onRefresh: refreshDocinfo
727
650
  }) : void 0,
728
651
  canSave,
@@ -762,9 +685,9 @@ function DocFormScreen(param) {
762
685
  name: docName
763
686
  } : {}),
764
687
  defaultContent: toolbar
765
- }) : toolbar, (engine.wasDeleted || validationSummary || engine.conflict) && /* @__PURE__ */_jsxs(YStack, {
688
+ }) : toolbar, (form.wasDeleted || validationSummary || form.conflict) && /* @__PURE__ */_jsxs(YStack, {
766
689
  paddingHorizontal: "$3",
767
- children: [engine.wasDeleted && /* @__PURE__ */_jsx(XStack, {
690
+ children: [form.wasDeleted && /* @__PURE__ */_jsx(XStack, {
768
691
  role: "alert",
769
692
  ...knobProps.containerRadius,
770
693
  ...knobProps.panelPadding,
@@ -774,7 +697,7 @@ function DocFormScreen(param) {
774
697
  fontSize: "$3",
775
698
  children: t("deletedBanner", "This document was deleted on the server. Fields are read-only.")
776
699
  })
777
- }), validationSummary && !engine.wasDeleted && /* @__PURE__ */_jsx(XStack, {
700
+ }), validationSummary && !form.wasDeleted && /* @__PURE__ */_jsx(XStack, {
778
701
  role: "alert",
779
702
  ...knobProps.containerRadius,
780
703
  ...knobProps.panelPadding,
@@ -785,7 +708,7 @@ function DocFormScreen(param) {
785
708
  fontSize: "$3",
786
709
  children: validationSummary
787
710
  })
788
- }), engine.conflict && !engine.wasDeleted && /* @__PURE__ */_jsxs(XStack, {
711
+ }), form.conflict && !form.wasDeleted && /* @__PURE__ */_jsxs(XStack, {
789
712
  role: "status",
790
713
  alignItems: "center",
791
714
  justifyContent: "space-between",
@@ -802,7 +725,7 @@ function DocFormScreen(param) {
802
725
  size: "$2",
803
726
  outlined: true,
804
727
  "aria-label": t("reloadDoc", "Reload"),
805
- onPress: engine.reload,
728
+ onPress: form.reset,
806
729
  children: t("reloadDoc", "Reload")
807
730
  })]
808
731
  })]
@@ -845,7 +768,7 @@ function DocFormScreen(param) {
845
768
  warning: true,
846
769
  onConfirm: function onConfirm() {
847
770
  setConfirmAction(void 0);
848
- void engine.submit().then(function (ok) {
771
+ void form.submitDocument().then(function (ok) {
849
772
  if (ok) {
850
773
  notify({
851
774
  severity: "success",
@@ -869,7 +792,7 @@ function DocFormScreen(param) {
869
792
  destructive: true,
870
793
  onConfirm: function onConfirm() {
871
794
  setConfirmAction(void 0);
872
- void engine.cancel().then(function (ok) {
795
+ void form.cancelDocument().then(function (ok) {
873
796
  if (ok) {
874
797
  notify({
875
798
  severity: "success",
@@ -894,7 +817,7 @@ function DocFormScreen(param) {
894
817
  destructive: true,
895
818
  onConfirm: function onConfirm() {
896
819
  setConfirmAction(void 0);
897
- void engine.remove().then(function (ok) {
820
+ void form.remove().then(function (ok) {
898
821
  if (ok) {
899
822
  invalidateDocinfo(doctype, name);
900
823
  emitEvent({