@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
@@ -41,7 +41,6 @@ module.exports = __toCommonJS(DocFormScreen_exports);
41
41
  var import_jsx_runtime = require("react/jsx-runtime");
42
42
  var import_react = __toESM(require("react"));
43
43
  var import_components = require("@multiplatform.one/components");
44
- var import_forms = require("@multiplatform.one/forms");
45
44
  var import_frappe_ui = require("@multiplatform.one/frappe-ui");
46
45
  var import_theme = require("@multiplatform.one/theme");
47
46
  var import_react2 = require("@phosphor-icons/react");
@@ -54,14 +53,11 @@ var import_listNavContext = require("../shared/listNavContext.native.js");
54
53
  var import_useDocinfo = require("../shared/useDocinfo.native.js");
55
54
  var import_useRecentVisit = require("../shared/useRecentVisit.native.js");
56
55
  var import_useDoctypeMeta = require("../shared/useDoctypeMeta.native.js");
57
- var import_useUserRoles = require("../shared/useUserRoles.native.js");
56
+ var import_connections_data = require("./connections-data.native.js");
58
57
  var import_createPrefill = require("./createPrefill.native.js");
59
- var import_docinfo = require("./docinfo.native.js");
60
- var import_fieldPermissions = require("./fieldPermissions.native.js");
61
58
  var import_formActions = require("./formActions.native.js");
62
59
  var import_FormDialogs = require("./FormDialogs.native.js");
63
60
  var import_FormErrorBoundary = require("./FormErrorBoundary.native.js");
64
- var import_formLayout = require("./formLayout.native.js");
65
61
  var import_FormConnections = require("./FormConnections.native.js");
66
62
  var import_FormHeaderCluster = require("./FormHeaderCluster.native.js");
67
63
  var import_FormSidebarPanel = require("./FormSidebarPanel.native.js");
@@ -69,7 +65,6 @@ var import_FormTimeline = require("./FormTimeline.native.js");
69
65
  var import_FormToolbar = require("./FormToolbar.native.js");
70
66
  var import_timeline_utils = require("./timeline-utils.native.js");
71
67
  var import_platformHooks = require("./platformHooks.native.js");
72
- var import_useFormEngine = require("./useFormEngine.native.js");
73
68
  var CONNECTIONS_TAB = "__connections";
74
69
  function DocFormScreen(param) {
75
70
  var {
@@ -83,8 +78,8 @@ function DocFormScreen(param) {
83
78
  onDeleted,
84
79
  actionOverrides
85
80
  } = param;
86
- var _ref, _ref1;
87
- var _engine_baseline, _engine_baseline1, _meta_links, _bodyTabs_, _bodyTabs_1;
81
+ var _form_user;
82
+ var _form_baseline;
88
83
  var {
89
84
  t
90
85
  } = (0, import_react_i18next.useTranslation)(import_i18n.BACKOFFICE_I18N_NAMESPACE);
@@ -120,31 +115,20 @@ function DocFormScreen(param) {
120
115
  name
121
116
  });
122
117
  }, [isCreate, doctype, name, emitEvent]);
123
- var connection = (0, import_react3.useMemo)(function () {
124
- return (config === null || config === void 0 ? void 0 : config.baseURL) ? {
125
- baseURL: config.baseURL,
126
- socketPort: config.socketPort,
127
- siteName: config.siteName,
128
- socketBaseURL: config.socketBaseURL,
129
- auth: config.auth,
130
- syncOptions: config.syncOptions,
131
- fixtures: config.fixtures
132
- } : void 0;
133
- }, [config]);
134
118
  var {
135
119
  meta,
136
120
  loading: isMetaLoading,
137
121
  error: metaError,
138
122
  reload: refetchMeta
139
123
  } = (0, import_useDoctypeMeta.useDoctypeMeta)(doctype);
140
- var engine = (0, import_useFormEngine.useFormEngine)(connection, doctype, docName, meta, t);
141
- (0, import_react3.useEffect)(function () {
142
- if (metaError && !meta) emitEvent({
143
- type: "error",
144
- error: metaError,
145
- context: "form-meta"
146
- });
147
- }, [metaError, meta, emitEvent]);
124
+ var metaSource = (0, import_react3.useMemo)(function () {
125
+ return {
126
+ meta,
127
+ isLoading: isMetaLoading,
128
+ error: metaError
129
+ };
130
+ }, [meta, isMetaLoading, metaError]);
131
+ var metaRefused = !meta && metaError !== void 0 && (0, import_frappe_ui.isPermissionError)(metaError);
148
132
  var {
149
133
  docinfo,
150
134
  reload: reloadDocinfo
@@ -153,7 +137,35 @@ function DocFormScreen(param) {
153
137
  if (docName) (0, import_useDocinfo.invalidateDocinfo)(doctype, docName);
154
138
  reloadDocinfo();
155
139
  }, [doctype, docName, reloadDocinfo]);
156
- var modifiedStamp = typeof ((_engine_baseline = engine.baseline) === null || _engine_baseline === void 0 ? void 0 : _engine_baseline.modified) === "string" ? engine.baseline.modified : void 0;
140
+ var fixtureMode = Boolean(config === null || config === void 0 ? void 0 : config.fixtures);
141
+ var rights = (0, import_react3.useMemo)(function () {
142
+ var _docinfoRights;
143
+ return (_docinfoRights = (0, import_frappe_ui.docinfoRights)(docinfo === null || docinfo === void 0 ? void 0 : docinfo.permissions)) !== null && _docinfoRights !== void 0 ? _docinfoRights : fixtureMode ? (0, import_frappe_ui.fixtureDocRights)(meta) : void 0;
144
+ }, [docinfo === null || docinfo === void 0 ? void 0 : docinfo.permissions, fixtureMode, meta]);
145
+ var form = (0, import_frappe_ui.useFrappeForm)({
146
+ doctype,
147
+ name: docName,
148
+ meta: metaSource,
149
+ rights,
150
+ shares: docinfo === null || docinfo === void 0 ? void 0 : docinfo.shared,
151
+ readShares: false,
152
+ disabled: readOnly,
153
+ hideFields: hiddenFields,
154
+ hideSections: hiddenSections
155
+ });
156
+ var connection = form.connection;
157
+ var currentUser = (_form_user = form.user) !== null && _form_user !== void 0 ? _form_user : "";
158
+ var perms = form.rights;
159
+ (0, import_react3.useEffect)(function () {
160
+ if (metaError && !meta && !metaRefused) {
161
+ emitEvent({
162
+ type: "error",
163
+ error: metaError,
164
+ context: "form-meta"
165
+ });
166
+ }
167
+ }, [metaError, meta, metaRefused, emitEvent]);
168
+ var modifiedStamp = typeof ((_form_baseline = form.baseline) === null || _form_baseline === void 0 ? void 0 : _form_baseline.modified) === "string" ? form.baseline.modified : void 0;
157
169
  var stampRef = (0, import_react3.useRef)(void 0);
158
170
  (0, import_react3.useEffect)(function () {
159
171
  stampRef.current = void 0;
@@ -168,118 +180,20 @@ function DocFormScreen(param) {
168
180
  reloadDocinfo();
169
181
  }
170
182
  }, [modifiedStamp, docName, doctype, reloadDocinfo]);
171
- var {
172
- roles,
173
- user: sessionUser
174
- } = (0, import_useUserRoles.useUserRoles)();
175
- var fixtureMode = Boolean(config === null || config === void 0 ? void 0 : config.fixtures);
176
- var recordOwner = !isCreate && typeof ((_engine_baseline1 = engine.baseline) === null || _engine_baseline1 === void 0 ? void 0 : _engine_baseline1.owner) === "string" ? engine.baseline.owner : void 0;
177
- var perms = (0, import_react3.useMemo)(function () {
178
- var _ref2;
179
- var docPerms = (0, import_docinfo.normalizeDocPermissions)(docinfo === null || docinfo === void 0 ? void 0 : docinfo.permissions);
180
- if (docPerms) {
181
- return {
182
- write: !!docPerms.write,
183
- create: !!docPerms.create,
184
- delete: !!docPerms.delete,
185
- submit: !!docPerms.submit,
186
- cancel: !!docPerms.cancel,
187
- amend: !!docPerms.amend,
188
- email: !!docPerms.email,
189
- print: !!docPerms.print
190
- };
191
- }
192
- if (!fixtureMode) {
193
- var rights = (0, import_frappe_ui.sessionDocRights)({
194
- fixtures: false,
195
- meta,
196
- roles,
197
- user: sessionUser,
198
- owner: recordOwner,
199
- shares: docinfo === null || docinfo === void 0 ? void 0 : docinfo.shared
200
- });
201
- return {
202
- write: rights.write,
203
- create: rights.create,
204
- delete: rights.delete,
205
- submit: rights.submit,
206
- cancel: rights.cancel,
207
- amend: rights.amend,
208
- email: rights.email,
209
- print: rights.print
210
- };
211
- }
212
- var rules = (_ref2 = meta === null || meta === void 0 ? void 0 : meta.permissions) !== null && _ref2 !== void 0 ? _ref2 : [];
213
- var anyRole = function anyRole2(key) {
214
- return rules.some(function (rule) {
215
- return !rule.permlevel && !!rule[key];
216
- });
217
- };
218
- return {
219
- write: rules.length === 0 || anyRole("write"),
220
- create: rules.length === 0 || anyRole("create"),
221
- delete: anyRole("delete"),
222
- submit: anyRole("submit"),
223
- cancel: anyRole("cancel"),
224
- amend: anyRole("amend"),
225
- email: rules.length === 0 || anyRole("email"),
226
- print: rules.length === 0 || anyRole("print")
227
- };
228
- }, [docinfo === null || docinfo === void 0 ? void 0 : docinfo.permissions, docinfo === null || docinfo === void 0 ? void 0 : docinfo.shared, meta, fixtureMode, roles, sessionUser, recordOwner]);
229
- var isSubmittable = !!(meta === null || meta === void 0 ? void 0 : meta.is_submittable);
230
- var formReadOnly = !!readOnly || !!(meta === null || meta === void 0 ? void 0 : meta.read_only) || engine.wasDeleted || !isCreate && !perms.write || isCreate && !perms.create;
231
- var permLevels = (0, import_react3.useMemo)(function () {
232
- return (0, import_fieldPermissions.buildPermLevelMatrix)(meta === null || meta === void 0 ? void 0 : meta.permissions, roles);
233
- }, [meta === null || meta === void 0 ? void 0 : meta.permissions, roles]);
234
- var formTabs = (0, import_react3.useMemo)(function () {
235
- if (!meta) return [];
236
- return (0, import_formLayout.buildFormTabs)({
237
- fields: meta.fields,
238
- // depends_on evaluates against the doc plus desk's ambient context:
239
- // __islocal (unsaved doc flag) and the session user behind
240
- // `frappe.session.user` references.
241
- doc: {
242
- ...engine.doc,
243
- __islocal: isCreate ? 1 : 0,
244
- ...(engine.currentUser ? {
245
- __session_user: engine.currentUser
246
- } : {})
247
- },
248
- docstatus: engine.docstatus,
249
- formReadOnly,
250
- isCreate,
251
- detailsLabel: t("detailsTab", "Details"),
252
- permLevels,
253
- hiddenFields,
254
- hiddenSections
255
- });
256
- }, [meta, engine.doc, engine.currentUser, engine.docstatus, formReadOnly, isCreate, permLevels, hiddenFields, hiddenSections, t]);
257
- var jumpTargets = (0, import_react3.useMemo)(function () {
258
- return formTabs.flatMap(function (tab) {
259
- return tab.schema.fields.map(function (field) {
260
- return {
261
- name: field.name,
262
- label: field.label || field.name,
263
- tabKey: tab.key,
264
- tabLabel: tab.label
265
- };
266
- });
267
- });
268
- }, [formTabs]);
269
- var [activeTab, setActiveTab] = (0, import_react3.useState)(void 0);
270
- 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) {
271
- return !link.hidden;
272
- })) !== null && _ref !== void 0 ? _ref : false);
183
+ var isSubmittable = form.isSubmittable;
184
+ var formReadOnly = form.readOnly;
185
+ var jumpTargets = form.fieldTargets;
186
+ var showConnections = !isCreate && !!connection && (0, import_connections_data.groupConnectionLinks)(meta).length > 0;
273
187
  var [pendingNav, setPendingNav] = (0, import_react3.useState)(void 0);
274
188
  var navigate = (0, import_react3.useCallback)(function (href) {
275
- if (engine.isDirty) {
189
+ if (form.isDirty) {
276
190
  setPendingNav(href);
277
191
  return;
278
192
  }
279
193
  navigator.navigate(href);
280
- }, [engine.isDirty, navigator]);
281
- (0, import_platformHooks.useBeforeUnloadGuard)(engine.isDirty);
282
- var backGuard = (0, import_platformHooks.useNavigationDirtyGuard)(engine.isDirty);
194
+ }, [form.isDirty, navigator]);
195
+ (0, import_platformHooks.useBeforeUnloadGuard)(form.isDirty);
196
+ var backGuard = (0, import_platformHooks.useNavigationDirtyGuard)(form.isDirty);
283
197
  var [confirmAction, setConfirmAction] = (0, import_react3.useState)(void 0);
284
198
  var [renameOpen, setRenameOpen] = (0, import_react3.useState)(false);
285
199
  var [emailOpen, setEmailOpen] = (0, import_react3.useState)(false);
@@ -287,15 +201,12 @@ function DocFormScreen(param) {
287
201
  var [pendingJump, setPendingJump] = (0, import_react3.useState)(void 0);
288
202
  var [validationSummary, setValidationSummary] = (0, import_react3.useState)(void 0);
289
203
  var handleSave = (0, import_react3.useCallback)(async function () {
290
- var validationErrors = engine.validate();
204
+ var validationErrors = form.validate();
291
205
  var errorFields = Object.keys(validationErrors);
292
206
  if (errorFields.length > 0) {
293
- var owner = formTabs.find(function (tab) {
294
- return tab.schema.fields.some(function (field) {
295
- return errorFields.includes(field.name);
296
- });
207
+ errorFields.some(function (field) {
208
+ return form.revealField(field);
297
209
  });
298
- if (owner) setActiveTab(owner.key);
299
210
  setValidationSummary(t("validationSummary", {
300
211
  count: errorFields.length,
301
212
  defaultValue_one: "Cannot save \u2014 {{count}} required field is missing.",
@@ -304,7 +215,7 @@ function DocFormScreen(param) {
304
215
  } else {
305
216
  setValidationSummary(void 0);
306
217
  }
307
- var savedName = await engine.save();
218
+ var savedName = await form.save();
308
219
  if (!savedName) return;
309
220
  setValidationSummary(void 0);
310
221
  (0, import_components.notify)({
@@ -320,7 +231,7 @@ function DocFormScreen(param) {
320
231
  isNew: isCreate
321
232
  });
322
233
  onSaved === null || onSaved === void 0 ? void 0 : onSaved({
323
- ...engine.doc,
234
+ ...form.doc,
324
235
  name: savedName
325
236
  });
326
237
  if (isCreate) {
@@ -328,26 +239,19 @@ function DocFormScreen(param) {
328
239
  } else {
329
240
  reloadDocinfo();
330
241
  }
331
- }, [engine, formTabs, isCreate, navigator, paths, doctype, reloadDocinfo, t, emitEvent, onSaved]);
242
+ }, [form, isCreate, navigator, paths, doctype, reloadDocinfo, t, emitEvent, onSaved]);
332
243
  (0, import_platformHooks.useSaveShortcut)(!formReadOnly, function () {
333
- if (engine.isDirty || isCreate) void handleSave();
244
+ if (form.isDirty || isCreate) void handleSave();
334
245
  });
335
246
  (0, import_platformHooks.useJumpToFieldShortcut)(jumpTargets.length > 0 && !jumpOpen, function () {
336
247
  return setJumpOpen(true);
337
248
  });
338
249
  var handleAmend = (0, import_react3.useCallback)(function () {
339
- if (!meta || !docName) return;
340
- (0, import_createPrefill.setCreatePrefill)(doctype, {
341
- ...(0, import_formLayout.buildCopyValues)(meta.fields, engine.doc),
342
- amended_from: docName
343
- });
344
- navigator.navigate(paths.newDoc(doctype));
345
- }, [meta, docName, doctype, engine.doc, navigator, paths]);
250
+ if (form.amend()) navigator.navigate(paths.newDoc(doctype));
251
+ }, [form, doctype, navigator, paths]);
346
252
  var handleDuplicate = (0, import_react3.useCallback)(function () {
347
- if (!meta) return;
348
- (0, import_createPrefill.setCreatePrefill)(doctype, (0, import_formLayout.buildCopyValues)(meta.fields, engine.doc));
349
- navigator.navigate(paths.newDoc(doctype));
350
- }, [meta, doctype, engine.doc, navigator, paths]);
253
+ if (form.duplicate()) navigator.navigate(paths.newDoc(doctype));
254
+ }, [form, doctype, navigator, paths]);
351
255
  var handleRename = (0, import_react3.useCallback)(async function (newName) {
352
256
  if (!connection || !docName) return;
353
257
  try {
@@ -370,11 +274,11 @@ function DocFormScreen(param) {
370
274
  }, function () {
371
275
  return openNeighborDoc(docPager.next);
372
276
  });
373
- var titleFieldValue = (meta === null || meta === void 0 ? void 0 : meta.title_field) && typeof engine.doc[meta.title_field] === "string" ?
277
+ var titleFieldValue = (meta === null || meta === void 0 ? void 0 : meta.title_field) && typeof form.doc[meta.title_field] === "string" ?
374
278
  // Title fields can hold rich text (e.g. ToDo.description = "<p>…</p>");
375
279
  // strip to plain text so the breadcrumb + toolbar heading don't show
376
280
  // literal HTML tags.
377
- (0, import_timeline_utils.htmlToText)(engine.doc[meta.title_field]) : void 0;
281
+ (0, import_timeline_utils.htmlToText)(form.doc[meta.title_field]) : void 0;
378
282
  var title = isCreate ? t("newDocTitle", "New {{doctype}}", {
379
283
  doctype
380
284
  }) : titleFieldValue || name;
@@ -385,18 +289,21 @@ function DocFormScreen(param) {
385
289
  label: t("menuReload", "Reload"),
386
290
  icon: "reload",
387
291
  onSelect: function onSelect() {
388
- engine.reload();
292
+ form.reset();
389
293
  setValidationSummary(void 0);
390
294
  refetchMeta();
391
295
  (0, import_useDocinfo.invalidateDocinfo)(doctype, name);
392
296
  reloadDocinfo();
393
297
  }
394
- }, {
395
- key: "duplicate",
396
- label: t("menuDuplicate", "Duplicate"),
397
- icon: "duplicate",
398
- onSelect: handleDuplicate
399
298
  }];
299
+ if (!metaRefused) {
300
+ items.push({
301
+ key: "duplicate",
302
+ label: t("menuDuplicate", "Duplicate"),
303
+ icon: "duplicate",
304
+ onSelect: handleDuplicate
305
+ });
306
+ }
400
307
  if ((meta === null || meta === void 0 ? void 0 : meta.allow_rename) && perms.write) {
401
308
  items.push({
402
309
  key: "rename",
@@ -434,7 +341,7 @@ function DocFormScreen(param) {
434
341
  label: t("menuLinks", "Links"),
435
342
  icon: "links",
436
343
  onSelect: function onSelect() {
437
- return setActiveTab(CONNECTIONS_TAB);
344
+ return form.setActiveTab(CONNECTIONS_TAB);
438
345
  }
439
346
  });
440
347
  }
@@ -492,12 +399,12 @@ function DocFormScreen(param) {
492
399
  });
493
400
  }
494
401
  return items;
495
- }, [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]);
402
+ }, [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]);
496
403
  var effectiveMenuItems = (0, import_react3.useMemo)(function () {
497
- var _ref2;
498
- var hidden = new Set((_ref2 = actionOverrides === null || actionOverrides === void 0 ? void 0 : actionOverrides.hide) !== null && _ref2 !== void 0 ? _ref2 : []);
404
+ var _ref;
405
+ var hiddenKeys = new Set((_ref = actionOverrides === null || actionOverrides === void 0 ? void 0 : actionOverrides.hide) !== null && _ref !== void 0 ? _ref : []);
499
406
  var items = menuItems.filter(function (item) {
500
- return !hidden.has(item.key);
407
+ return !hiddenKeys.has(item.key);
501
408
  });
502
409
  var injected = [...(0, import_BackofficeProvider.actionsForDoctype)(actions.form, doctype), ...(0, import_BackofficeProvider.actionsForDoctype)(actionOverrides === null || actionOverrides === void 0 ? void 0 : actionOverrides.extra, doctype)];
503
410
  var _iteratorNormalCompletion = true,
@@ -538,9 +445,9 @@ function DocFormScreen(param) {
538
445
  }, [menuItems, actions.form, actionOverrides, doctype, docName]);
539
446
  var handleJumpToField = (0, import_react3.useCallback)(function (field) {
540
447
  setJumpOpen(false);
541
- setActiveTab(field.tabKey);
448
+ form.setActiveTab(field.tabKey);
542
449
  setPendingJump(field.name);
543
- }, []);
450
+ }, [form]);
544
451
  (0, import_react3.useEffect)(function () {
545
452
  if (!pendingJump) return;
546
453
  if (typeof document === "undefined") {
@@ -587,18 +494,63 @@ function DocFormScreen(param) {
587
494
  })
588
495
  });
589
496
  }
590
- if (metaError && !meta) {
497
+ if (metaError && !meta && !metaRefused) {
591
498
  return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
592
499
  flex: 1,
593
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
594
- title: t("metaError", "Could not load {{doctype}}", {
500
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncBoundary, {
501
+ error: metaError,
502
+ errorTitle: t("metaError", "Could not load {{doctype}}", {
595
503
  doctype
596
504
  }),
597
- description: metaError.message
505
+ onRetry: refetchMeta
506
+ })
507
+ });
508
+ }
509
+ if (!isCreate && form.status === "error" && form.docError && (0, import_frappe_ui.isPermissionError)(form.docError)) {
510
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
511
+ flex: 1,
512
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
513
+ testID: "frappe-form-not-permitted",
514
+ title: t("docNotPermitted", "You can't open {{doctype}} {{name}}", {
515
+ doctype,
516
+ name
517
+ }),
518
+ description: (0, import_frappe_ui.refusalReason)(form.docError),
519
+ action: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Button, {
520
+ icon: import_react2.ListBulletsIcon,
521
+ onPress: function onPress() {
522
+ return navigator.navigate(paths.list(doctype));
523
+ },
524
+ children: t("backToList", "Back to {{doctype}} list", {
525
+ doctype
526
+ })
527
+ })
598
528
  })
599
529
  });
600
530
  }
601
- if (!isCreate && engine.notFound) {
531
+ if (!isCreate && form.status === "error" && form.docError) {
532
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
533
+ flex: 1,
534
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
535
+ intent: "error",
536
+ title: t("docLoadError", "Could not load {{doctype}} {{name}}", {
537
+ doctype,
538
+ name
539
+ }),
540
+ description: form.docError.message,
541
+ action: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Button, {
542
+ icon: import_react2.ListBulletsIcon,
543
+ onPress: function onPress() {
544
+ return navigator.navigate(paths.list(doctype));
545
+ },
546
+ children: t("backToList", "Back to {{doctype}} list", {
547
+ doctype
548
+ })
549
+ })
550
+ })
551
+ });
552
+ }
553
+ if (!isCreate && form.status === "notFound") {
602
554
  return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
603
555
  flex: 1,
604
556
  children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
@@ -619,7 +571,7 @@ function DocFormScreen(param) {
619
571
  })
620
572
  });
621
573
  }
622
- if (!isCreate && engine.isLoading) {
574
+ if (!isCreate && form.status === "loading") {
623
575
  return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
624
576
  flex: 1,
625
577
  ...knobProps.panelPadding,
@@ -631,16 +583,16 @@ function DocFormScreen(param) {
631
583
  }
632
584
  var indicator = (0, import_FormToolbar.resolveIndicator)({
633
585
  isCreate,
634
- isDirty: engine.isDirty,
635
- docstatus: engine.docstatus,
586
+ isDirty: form.isDirty,
587
+ docstatus: form.docstatus,
636
588
  isSubmittable,
637
- statusValue: typeof engine.doc.status === "string" ? engine.doc.status : void 0,
589
+ statusValue: typeof form.doc.status === "string" ? form.doc.status : void 0,
638
590
  states: meta === null || meta === void 0 ? void 0 : meta.states
639
591
  });
640
- var canSave = !formReadOnly && (isCreate ? perms.create : perms.write && engine.docstatus === 0);
641
- var canSubmit = !isCreate && isSubmittable && engine.docstatus === 0 && !engine.isDirty && perms.submit && !engine.wasDeleted;
642
- var canCancel = !isCreate && isSubmittable && engine.docstatus === 1 && perms.cancel && !engine.wasDeleted;
643
- var canAmend = !isCreate && isSubmittable && engine.docstatus === 2 && perms.amend && !engine.wasDeleted;
592
+ var canSave = !formReadOnly && (isCreate ? perms.create : perms.write && form.docstatus === 0);
593
+ var canSubmit = !isCreate && isSubmittable && form.docstatus === 0 && !form.isDirty && perms.submit && !form.wasDeleted;
594
+ var canCancel = !isCreate && isSubmittable && form.docstatus === 1 && perms.cancel && !form.wasDeleted;
595
+ var canAmend = !isCreate && isSubmittable && form.docstatus === 2 && perms.amend && !form.wasDeleted;
644
596
  var breadcrumbs = [{
645
597
  label: t("home", "Home"),
646
598
  href: paths.home()
@@ -650,37 +602,8 @@ function DocFormScreen(param) {
650
602
  }, {
651
603
  label: isCreate ? t("newCrumb", "New") : title
652
604
  }];
653
- var promptNamed = isCreate && (0, import_formLayout.isPromptNamed)(meta === null || meta === void 0 ? void 0 : meta.autoname, meta === null || meta === void 0 ? void 0 : meta.naming_rule);
654
605
  var sidebarStacked = sizeClass === "compact";
655
- var bodyTabs = [...formTabs.map(function (tab) {
656
- return {
657
- value: tab.key,
658
- label: tab.label,
659
- content: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
660
- ...knobProps.gapLg,
661
- paddingTop: "$3",
662
- children: (
663
- /* Containment at two granularities: each field renders behind its
664
- own boundary (a broken field degrades to an inline error slot;
665
- siblings stay editable), and the whole tab body behind another
666
- (a SchemaForm-level crash costs one tab, not the route). */
667
- /* @__PURE__ */
668
- (0, import_jsx_runtime.jsx)(import_FormErrorBoundary.FormErrorBoundary, {
669
- errorTitle: t("formTabRenderError", "This form tab failed to render"),
670
- testID: `form-tab-error-${tab.key}`,
671
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_frappe_ui.SchemaForm, {
672
- schema: tab.schema,
673
- doc: engine.doc,
674
- setValue: engine.setValue,
675
- errors: engine.errors,
676
- disabled: formReadOnly || engine.isSaving,
677
- sectionHeadingLevel: 2,
678
- renderFieldWrapper: import_FormErrorBoundary.wrapFieldWithErrorBoundary
679
- })
680
- }))
681
- })
682
- };
683
- }), ...(showConnections ? [{
606
+ var connectionsTab = showConnections ? [{
684
607
  value: CONNECTIONS_TAB,
685
608
  label: t("connectionsTab", "Connections"),
686
609
  content: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
@@ -691,42 +614,42 @@ function DocFormScreen(param) {
691
614
  meta
692
615
  })
693
616
  })
694
- }] : [])];
695
- var effectiveTab = activeTab && bodyTabs.some(function (tab) {
696
- return tab.value === activeTab;
697
- }) ? activeTab : (_bodyTabs_ = bodyTabs[0]) === null || _bodyTabs_ === void 0 ? void 0 : _bodyTabs_.value;
617
+ }] : [];
618
+ var renderTab = function renderTab2(tab, content) {
619
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
620
+ ...knobProps.gapLg,
621
+ paddingTop: "$3",
622
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormErrorBoundary.FormErrorBoundary, {
623
+ errorTitle: t("formTabRenderError", "This form tab failed to render"),
624
+ testID: `form-tab-error-${tab.key}`,
625
+ children: content
626
+ })
627
+ });
628
+ };
698
629
  var formBody =
699
- // No flex here: formBody now lives inside COLUMN containers (both
700
- // branches below), where `flex={1}` means flex-basis:0 — the body would
701
- // stop contributing height and the timeline/sidebar would paint over it.
630
+ // No flex here: formBody lives inside COLUMN containers (both branches
631
+ // below), where `flex={1}` means flex-basis:0 — the body would stop
632
+ // contributing height and the timeline/sidebar would paint over it.
702
633
  /* @__PURE__ */
703
- (0, import_jsx_runtime.jsxs)(import_components.YStack, {
634
+ (0, import_jsx_runtime.jsx)(import_components.YStack, {
704
635
  minWidth: 0,
705
- ...knobProps.gapLg,
706
- children: [promptNamed && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
707
- ...knobProps.gap,
708
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Input, {
709
- label: t("namePrompt", "Name"),
710
- value: typeof engine.doc.name === "string" ? engine.doc.name : "",
711
- onChangeText: function onChangeText(value) {
712
- return engine.setValue("name", value);
713
- },
714
- placeholder: t("namePromptPlaceholder", "New document name"),
715
- error: engine.errors.name
716
- })
717
- }), bodyTabs.length > 1 ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Tabs, {
718
- items: bodyTabs,
719
- value: effectiveTab,
720
- onChange: setActiveTab,
721
- lazyMount: true
722
- }) : (_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__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
723
- color: "$red10",
724
- fontSize: "$3",
725
- role: "alert",
726
- children: engine.errors.general
727
- })]
636
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_frappe_ui.FrappeForm, {
637
+ form,
638
+ doctype,
639
+ name: docName,
640
+ disabled: readOnly,
641
+ showToolbar: false,
642
+ showSidebar: false,
643
+ showTimeline: false,
644
+ showConnections: false,
645
+ showBanners: false,
646
+ sectionHeadingLevel: 2,
647
+ renderFieldWrapper: import_FormErrorBoundary.wrapFieldWithErrorBoundary,
648
+ renderTab,
649
+ extraTabs: connectionsTab
650
+ })
728
651
  });
729
- var timeline = capabilities.timeline.enabled && !isCreate && docName ?
652
+ var timeline = capabilities.timeline.enabled && !isCreate && docName && !metaRefused ?
730
653
  // Composed mode: the screen's shared docinfo (and its refresh) feed
731
654
  // the timeline. Self-fetch mode subscribed the timeline to its OWN
732
655
  // cache entry, which the save path's invalidate+reload orphaned — the
@@ -738,16 +661,16 @@ function DocFormScreen(param) {
738
661
  name: docName,
739
662
  docInfo: docinfo,
740
663
  refreshDocInfo: refreshDocinfo,
741
- currentUser: engine.currentUser,
664
+ currentUser,
742
665
  connection
743
666
  }) : null;
744
667
  var sidebar = !isCreate && docName && meta ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormSidebarPanel.FormSidebarPanel, {
745
668
  doctype,
746
669
  name: docName,
747
670
  meta,
748
- doc: engine.doc,
671
+ doc: form.doc,
749
672
  docinfo,
750
- currentUser: engine.currentUser,
673
+ currentUser,
751
674
  onRefresh: refreshDocinfo,
752
675
  stacked: sidebarStacked
753
676
  }) : null;
@@ -757,12 +680,12 @@ function DocFormScreen(param) {
757
680
  title,
758
681
  indicator,
759
682
  showIndicator: !!meta,
760
- isSaving: engine.isSaving,
761
- cluster: !isCreate && docName ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormHeaderCluster.FormHeaderCluster, {
683
+ isSaving: form.isSubmitting,
684
+ cluster: !isCreate && docName && !metaRefused ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormHeaderCluster.FormHeaderCluster, {
762
685
  doctype,
763
686
  name: docName,
764
687
  docinfo,
765
- currentUser: engine.currentUser,
688
+ currentUser,
766
689
  onRefresh: refreshDocinfo
767
690
  }) : void 0,
768
691
  canSave,
@@ -802,9 +725,9 @@ function DocFormScreen(param) {
802
725
  name: docName
803
726
  } : {}),
804
727
  defaultContent: toolbar
805
- }) : toolbar, (engine.wasDeleted || validationSummary || engine.conflict) && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.YStack, {
728
+ }) : toolbar, (form.wasDeleted || validationSummary || form.conflict) && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.YStack, {
806
729
  paddingHorizontal: "$3",
807
- children: [engine.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.XStack, {
730
+ children: [form.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.XStack, {
808
731
  role: "alert",
809
732
  ...knobProps.containerRadius,
810
733
  ...knobProps.panelPadding,
@@ -814,7 +737,7 @@ function DocFormScreen(param) {
814
737
  fontSize: "$3",
815
738
  children: t("deletedBanner", "This document was deleted on the server. Fields are read-only.")
816
739
  })
817
- }), validationSummary && !engine.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.XStack, {
740
+ }), validationSummary && !form.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.XStack, {
818
741
  role: "alert",
819
742
  ...knobProps.containerRadius,
820
743
  ...knobProps.panelPadding,
@@ -825,7 +748,7 @@ function DocFormScreen(param) {
825
748
  fontSize: "$3",
826
749
  children: validationSummary
827
750
  })
828
- }), engine.conflict && !engine.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
751
+ }), form.conflict && !form.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
829
752
  role: "status",
830
753
  alignItems: "center",
831
754
  justifyContent: "space-between",
@@ -842,7 +765,7 @@ function DocFormScreen(param) {
842
765
  size: "$2",
843
766
  outlined: true,
844
767
  "aria-label": t("reloadDoc", "Reload"),
845
- onPress: engine.reload,
768
+ onPress: form.reset,
846
769
  children: t("reloadDoc", "Reload")
847
770
  })]
848
771
  })]
@@ -885,7 +808,7 @@ function DocFormScreen(param) {
885
808
  warning: true,
886
809
  onConfirm: function onConfirm() {
887
810
  setConfirmAction(void 0);
888
- void engine.submit().then(function (ok) {
811
+ void form.submitDocument().then(function (ok) {
889
812
  if (ok) {
890
813
  (0, import_components.notify)({
891
814
  severity: "success",
@@ -909,7 +832,7 @@ function DocFormScreen(param) {
909
832
  destructive: true,
910
833
  onConfirm: function onConfirm() {
911
834
  setConfirmAction(void 0);
912
- void engine.cancel().then(function (ok) {
835
+ void form.cancelDocument().then(function (ok) {
913
836
  if (ok) {
914
837
  (0, import_components.notify)({
915
838
  severity: "success",
@@ -934,7 +857,7 @@ function DocFormScreen(param) {
934
857
  destructive: true,
935
858
  onConfirm: function onConfirm() {
936
859
  setConfirmAction(void 0);
937
- void engine.remove().then(function (ok) {
860
+ void form.remove().then(function (ok) {
938
861
  if (ok) {
939
862
  (0, import_useDocinfo.invalidateDocinfo)(doctype, name);
940
863
  emitEvent({