@multiplatform.one/frappe-ui 7.28.1 → 7.29.1

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 (325) hide show
  1. package/dist/cjs/FrappeCalendar.cjs +3 -2
  2. package/dist/cjs/FrappeCalendar.native.js +3 -2
  3. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  4. package/dist/cjs/FrappeForm.cjs +148 -464
  5. package/dist/cjs/FrappeForm.native.js +152 -633
  6. package/dist/cjs/FrappeForm.native.js.map +1 -1
  7. package/dist/cjs/FrappeListView.cjs +5 -27
  8. package/dist/cjs/FrappeListView.native.js +11 -32
  9. package/dist/cjs/FrappeListView.native.js.map +1 -1
  10. package/dist/cjs/FrappeReportBuilder.cjs +523 -309
  11. package/dist/cjs/FrappeReportBuilder.native.js +658 -353
  12. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  13. package/dist/cjs/FrappeReportView.cjs +35 -234
  14. package/dist/cjs/FrappeReportView.native.js +39 -283
  15. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  16. package/dist/cjs/dependsOn.cjs +2 -2
  17. package/dist/cjs/dependsOn.native.js +1 -2
  18. package/dist/cjs/dependsOn.native.js.map +1 -1
  19. package/dist/cjs/fields/shared/EditorPreviewPanes.cjs +2 -2
  20. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js +2 -2
  21. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  22. package/dist/cjs/formEngine/docPermissions.cjs +20 -0
  23. package/dist/cjs/formEngine/docPermissions.native.js +69 -0
  24. package/dist/cjs/formEngine/docPermissions.native.js.map +1 -1
  25. package/dist/cjs/formEngine/index.cjs +2 -0
  26. package/dist/cjs/formEngine/index.native.js +2 -0
  27. package/dist/cjs/formEngine/index.native.js.map +1 -1
  28. package/dist/cjs/index.cjs +67 -7
  29. package/dist/cjs/index.native.js +67 -7
  30. package/dist/cjs/index.native.js.map +1 -1
  31. package/dist/cjs/liveErrors.cjs +8 -2
  32. package/dist/cjs/liveErrors.native.js +8 -2
  33. package/dist/cjs/liveErrors.native.js.map +1 -1
  34. package/dist/cjs/measures.cjs +31 -0
  35. package/dist/cjs/measures.native.js +34 -0
  36. package/dist/cjs/measures.native.js.map +1 -0
  37. package/dist/cjs/recordShape.cjs +103 -0
  38. package/dist/cjs/recordShape.native.js +115 -0
  39. package/dist/cjs/recordShape.native.js.map +1 -0
  40. package/dist/cjs/report/ReportGrid.cjs +453 -0
  41. package/dist/cjs/report/ReportGrid.native.js +510 -0
  42. package/dist/cjs/report/ReportGrid.native.js.map +1 -0
  43. package/dist/cjs/report/ReportViewToolbar.cjs +253 -0
  44. package/dist/cjs/report/ReportViewToolbar.native.js +303 -0
  45. package/dist/cjs/report/ReportViewToolbar.native.js.map +1 -0
  46. package/dist/cjs/report/queryReport.cjs +444 -0
  47. package/dist/cjs/report/queryReport.native.js +588 -0
  48. package/dist/cjs/report/queryReport.native.js.map +1 -0
  49. package/dist/cjs/report/queryReportColumns.cjs +131 -0
  50. package/dist/cjs/report/queryReportColumns.native.js +159 -0
  51. package/dist/cjs/report/queryReportColumns.native.js.map +1 -0
  52. package/dist/cjs/report/reportViewModel.cjs +386 -0
  53. package/dist/cjs/report/reportViewModel.native.js +657 -0
  54. package/dist/cjs/report/reportViewModel.native.js.map +1 -0
  55. package/dist/cjs/report/savedReports.cjs +137 -0
  56. package/dist/cjs/report/savedReports.native.js +169 -0
  57. package/dist/cjs/report/savedReports.native.js.map +1 -0
  58. package/dist/cjs/report/useFrappeReport.cjs +184 -0
  59. package/dist/cjs/report/useFrappeReport.native.js +214 -0
  60. package/dist/cjs/report/useFrappeReport.native.js.map +1 -0
  61. package/dist/cjs/report/useQueryReport.cjs +201 -0
  62. package/dist/cjs/report/useQueryReport.native.js +233 -0
  63. package/dist/cjs/report/useQueryReport.native.js.map +1 -0
  64. package/dist/cjs/useFrappeForm.cjs +558 -0
  65. package/dist/cjs/useFrappeForm.native.js +714 -0
  66. package/dist/cjs/useFrappeForm.native.js.map +1 -0
  67. package/dist/esm/FrappeCalendar.mjs +4 -3
  68. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  69. package/dist/esm/FrappeCalendar.native.js +4 -3
  70. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  71. package/dist/esm/FrappeForm.mjs +151 -467
  72. package/dist/esm/FrappeForm.mjs.map +1 -1
  73. package/dist/esm/FrappeForm.native.js +155 -636
  74. package/dist/esm/FrappeForm.native.js.map +1 -1
  75. package/dist/esm/FrappeListView.mjs +6 -28
  76. package/dist/esm/FrappeListView.mjs.map +1 -1
  77. package/dist/esm/FrappeListView.native.js +12 -33
  78. package/dist/esm/FrappeListView.native.js.map +1 -1
  79. package/dist/esm/FrappeReportBuilder.mjs +526 -312
  80. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  81. package/dist/esm/FrappeReportBuilder.native.js +661 -356
  82. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  83. package/dist/esm/FrappeReportView.mjs +30 -229
  84. package/dist/esm/FrappeReportView.mjs.map +1 -1
  85. package/dist/esm/FrappeReportView.native.js +34 -278
  86. package/dist/esm/FrappeReportView.native.js.map +1 -1
  87. package/dist/esm/dependsOn.mjs +2 -2
  88. package/dist/esm/dependsOn.mjs.map +1 -1
  89. package/dist/esm/dependsOn.native.js +1 -2
  90. package/dist/esm/dependsOn.native.js.map +1 -1
  91. package/dist/esm/fields/shared/EditorPreviewPanes.mjs +2 -2
  92. package/dist/esm/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  93. package/dist/esm/fields/shared/EditorPreviewPanes.native.js +2 -2
  94. package/dist/esm/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  95. package/dist/esm/formEngine/docPermissions.mjs +19 -1
  96. package/dist/esm/formEngine/docPermissions.mjs.map +1 -1
  97. package/dist/esm/formEngine/docPermissions.native.js +68 -1
  98. package/dist/esm/formEngine/docPermissions.native.js.map +1 -1
  99. package/dist/esm/formEngine/index.mjs +2 -2
  100. package/dist/esm/formEngine/index.mjs.map +1 -1
  101. package/dist/esm/formEngine/index.native.js +2 -2
  102. package/dist/esm/formEngine/index.native.js.map +1 -1
  103. package/dist/esm/index.mjs +16 -4
  104. package/dist/esm/index.mjs.map +1 -1
  105. package/dist/esm/index.native.js +16 -4
  106. package/dist/esm/index.native.js.map +1 -1
  107. package/dist/esm/liveErrors.mjs +8 -3
  108. package/dist/esm/liveErrors.mjs.map +1 -1
  109. package/dist/esm/liveErrors.native.js +8 -3
  110. package/dist/esm/liveErrors.native.js.map +1 -1
  111. package/dist/esm/measures.mjs +5 -0
  112. package/dist/esm/measures.mjs.map +1 -0
  113. package/dist/esm/measures.native.js +5 -0
  114. package/dist/esm/measures.native.js.map +1 -0
  115. package/dist/esm/recordShape.mjs +74 -0
  116. package/dist/esm/recordShape.mjs.map +1 -0
  117. package/dist/esm/recordShape.native.js +83 -0
  118. package/dist/esm/recordShape.native.js.map +1 -0
  119. package/dist/esm/report/ReportGrid.mjs +428 -0
  120. package/dist/esm/report/ReportGrid.mjs.map +1 -0
  121. package/dist/esm/report/ReportGrid.native.js +471 -0
  122. package/dist/esm/report/ReportGrid.native.js.map +1 -0
  123. package/dist/esm/report/ReportViewToolbar.mjs +228 -0
  124. package/dist/esm/report/ReportViewToolbar.mjs.map +1 -0
  125. package/dist/esm/report/ReportViewToolbar.native.js +264 -0
  126. package/dist/esm/report/ReportViewToolbar.native.js.map +1 -0
  127. package/dist/esm/report/queryReport.mjs +404 -0
  128. package/dist/esm/report/queryReport.mjs.map +1 -0
  129. package/dist/esm/report/queryReport.native.js +545 -0
  130. package/dist/esm/report/queryReport.native.js.map +1 -0
  131. package/dist/esm/report/queryReportColumns.mjs +105 -0
  132. package/dist/esm/report/queryReportColumns.mjs.map +1 -0
  133. package/dist/esm/report/queryReportColumns.native.js +119 -0
  134. package/dist/esm/report/queryReportColumns.native.js.map +1 -0
  135. package/dist/esm/report/reportViewModel.mjs +343 -0
  136. package/dist/esm/report/reportViewModel.mjs.map +1 -0
  137. package/dist/esm/report/reportViewModel.native.js +611 -0
  138. package/dist/esm/report/reportViewModel.native.js.map +1 -0
  139. package/dist/esm/report/savedReports.mjs +112 -0
  140. package/dist/esm/report/savedReports.mjs.map +1 -0
  141. package/dist/esm/report/savedReports.native.js +141 -0
  142. package/dist/esm/report/savedReports.native.js.map +1 -0
  143. package/dist/esm/report/useFrappeReport.mjs +158 -0
  144. package/dist/esm/report/useFrappeReport.mjs.map +1 -0
  145. package/dist/esm/report/useFrappeReport.native.js +185 -0
  146. package/dist/esm/report/useFrappeReport.native.js.map +1 -0
  147. package/dist/esm/report/useQueryReport.mjs +176 -0
  148. package/dist/esm/report/useQueryReport.mjs.map +1 -0
  149. package/dist/esm/report/useQueryReport.native.js +205 -0
  150. package/dist/esm/report/useQueryReport.native.js.map +1 -0
  151. package/dist/esm/useFrappeForm.mjs +533 -0
  152. package/dist/esm/useFrappeForm.mjs.map +1 -0
  153. package/dist/esm/useFrappeForm.native.js +686 -0
  154. package/dist/esm/useFrappeForm.native.js.map +1 -0
  155. package/dist/jsx/FrappeCalendar.mjs +4 -3
  156. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  157. package/dist/jsx/FrappeCalendar.native.js +3 -2
  158. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  159. package/dist/jsx/FrappeForm.mjs +151 -467
  160. package/dist/jsx/FrappeForm.mjs.map +1 -1
  161. package/dist/jsx/FrappeForm.native.js +152 -633
  162. package/dist/jsx/FrappeForm.native.js.map +1 -1
  163. package/dist/jsx/FrappeListView.mjs +6 -28
  164. package/dist/jsx/FrappeListView.mjs.map +1 -1
  165. package/dist/jsx/FrappeListView.native.js +11 -32
  166. package/dist/jsx/FrappeListView.native.js.map +1 -1
  167. package/dist/jsx/FrappeReportBuilder.mjs +526 -312
  168. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  169. package/dist/jsx/FrappeReportBuilder.native.js +658 -353
  170. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  171. package/dist/jsx/FrappeReportView.mjs +30 -229
  172. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  173. package/dist/jsx/FrappeReportView.native.js +39 -283
  174. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  175. package/dist/jsx/dependsOn.mjs +2 -2
  176. package/dist/jsx/dependsOn.mjs.map +1 -1
  177. package/dist/jsx/dependsOn.native.js +1 -2
  178. package/dist/jsx/dependsOn.native.js.map +1 -1
  179. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs +2 -2
  180. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  181. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js +2 -2
  182. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  183. package/dist/jsx/formEngine/docPermissions.mjs +19 -1
  184. package/dist/jsx/formEngine/docPermissions.mjs.map +1 -1
  185. package/dist/jsx/formEngine/docPermissions.native.js +69 -0
  186. package/dist/jsx/formEngine/docPermissions.native.js.map +1 -1
  187. package/dist/jsx/formEngine/index.mjs +2 -2
  188. package/dist/jsx/formEngine/index.mjs.map +1 -1
  189. package/dist/jsx/formEngine/index.native.js +2 -0
  190. package/dist/jsx/formEngine/index.native.js.map +1 -1
  191. package/dist/jsx/index.js +16 -4
  192. package/dist/jsx/index.js.map +1 -1
  193. package/dist/jsx/index.mjs +16 -4
  194. package/dist/jsx/index.mjs.map +1 -1
  195. package/dist/jsx/index.native.js +67 -7
  196. package/dist/jsx/index.native.js.map +1 -1
  197. package/dist/jsx/liveErrors.mjs +8 -3
  198. package/dist/jsx/liveErrors.mjs.map +1 -1
  199. package/dist/jsx/liveErrors.native.js +8 -2
  200. package/dist/jsx/liveErrors.native.js.map +1 -1
  201. package/dist/jsx/measures.mjs +5 -0
  202. package/dist/jsx/measures.mjs.map +1 -0
  203. package/dist/jsx/measures.native.js +34 -0
  204. package/dist/jsx/measures.native.js.map +1 -0
  205. package/dist/jsx/recordShape.mjs +74 -0
  206. package/dist/jsx/recordShape.mjs.map +1 -0
  207. package/dist/jsx/recordShape.native.js +115 -0
  208. package/dist/jsx/recordShape.native.js.map +1 -0
  209. package/dist/jsx/report/ReportGrid.mjs +428 -0
  210. package/dist/jsx/report/ReportGrid.mjs.map +1 -0
  211. package/dist/jsx/report/ReportGrid.native.js +510 -0
  212. package/dist/jsx/report/ReportGrid.native.js.map +1 -0
  213. package/dist/jsx/report/ReportViewToolbar.mjs +228 -0
  214. package/dist/jsx/report/ReportViewToolbar.mjs.map +1 -0
  215. package/dist/jsx/report/ReportViewToolbar.native.js +303 -0
  216. package/dist/jsx/report/ReportViewToolbar.native.js.map +1 -0
  217. package/dist/jsx/report/queryReport.mjs +404 -0
  218. package/dist/jsx/report/queryReport.mjs.map +1 -0
  219. package/dist/jsx/report/queryReport.native.js +588 -0
  220. package/dist/jsx/report/queryReport.native.js.map +1 -0
  221. package/dist/jsx/report/queryReportColumns.mjs +105 -0
  222. package/dist/jsx/report/queryReportColumns.mjs.map +1 -0
  223. package/dist/jsx/report/queryReportColumns.native.js +159 -0
  224. package/dist/jsx/report/queryReportColumns.native.js.map +1 -0
  225. package/dist/jsx/report/reportViewModel.mjs +343 -0
  226. package/dist/jsx/report/reportViewModel.mjs.map +1 -0
  227. package/dist/jsx/report/reportViewModel.native.js +657 -0
  228. package/dist/jsx/report/reportViewModel.native.js.map +1 -0
  229. package/dist/jsx/report/savedReports.mjs +112 -0
  230. package/dist/jsx/report/savedReports.mjs.map +1 -0
  231. package/dist/jsx/report/savedReports.native.js +169 -0
  232. package/dist/jsx/report/savedReports.native.js.map +1 -0
  233. package/dist/jsx/report/useFrappeReport.mjs +158 -0
  234. package/dist/jsx/report/useFrappeReport.mjs.map +1 -0
  235. package/dist/jsx/report/useFrappeReport.native.js +214 -0
  236. package/dist/jsx/report/useFrappeReport.native.js.map +1 -0
  237. package/dist/jsx/report/useQueryReport.mjs +176 -0
  238. package/dist/jsx/report/useQueryReport.mjs.map +1 -0
  239. package/dist/jsx/report/useQueryReport.native.js +233 -0
  240. package/dist/jsx/report/useQueryReport.native.js.map +1 -0
  241. package/dist/jsx/useFrappeForm.mjs +533 -0
  242. package/dist/jsx/useFrappeForm.mjs.map +1 -0
  243. package/dist/jsx/useFrappeForm.native.js +714 -0
  244. package/dist/jsx/useFrappeForm.native.js.map +1 -0
  245. package/package.json +16 -16
  246. package/src/FrappeCalendar.tsx +8 -2
  247. package/src/FrappeForm.stories.tsx +52 -0
  248. package/src/FrappeForm.tsx +176 -565
  249. package/src/FrappeListView.cards.stories.tsx +3 -6
  250. package/src/FrappeListView.tsx +15 -55
  251. package/src/FrappeReportBuilder.stories.tsx +34 -7
  252. package/src/FrappeReportBuilder.tsx +790 -380
  253. package/src/FrappeReportView.spec.tsx +10 -6
  254. package/src/FrappeReportView.stories.tsx +20 -1
  255. package/src/FrappeReportView.tsx +89 -415
  256. package/src/dependsOn.ts +4 -1
  257. package/src/fields/shared/EditorPreviewPanes.tsx +2 -2
  258. package/src/formEngine/docPermissions.spec.ts +36 -1
  259. package/src/formEngine/docPermissions.ts +34 -0
  260. package/src/formEngine/index.ts +8 -1
  261. package/src/frappeRemainder.designLaw.spec.ts +9 -1
  262. package/src/frappeRoutes.spec.tsx +9 -0
  263. package/src/frappeViews.designLaw.spec.ts +15 -2
  264. package/src/guestFallback.spec.tsx +236 -0
  265. package/src/index.ts +117 -16
  266. package/src/liveErrors.spec.ts +10 -0
  267. package/src/liveErrors.ts +16 -3
  268. package/src/measures.ts +11 -0
  269. package/src/recordShape.spec.ts +100 -0
  270. package/src/recordShape.ts +133 -0
  271. package/src/report/ReportGrid.spec.tsx +175 -0
  272. package/src/report/ReportGrid.tsx +530 -0
  273. package/src/report/ReportViewToolbar.spec.tsx +90 -0
  274. package/src/report/ReportViewToolbar.tsx +314 -0
  275. package/src/report/queryReport.spec.ts +483 -0
  276. package/src/report/queryReport.ts +722 -0
  277. package/src/report/queryReportColumns.tsx +123 -0
  278. package/src/report/reportViewModel.spec.ts +393 -0
  279. package/src/report/reportViewModel.ts +617 -0
  280. package/src/report/savedReports.ts +172 -0
  281. package/src/report/seam.spec.ts +216 -0
  282. package/src/report/useFrappeReport.ts +241 -0
  283. package/src/report/useQueryReport.spec.tsx +131 -0
  284. package/src/report/useQueryReport.ts +309 -0
  285. package/src/useFrappeForm.spec.tsx +209 -0
  286. package/src/useFrappeForm.ts +778 -0
  287. package/types/FrappeCalendar.d.ts.map +1 -1
  288. package/types/FrappeForm.d.ts +21 -1
  289. package/types/FrappeForm.d.ts.map +1 -1
  290. package/types/FrappeListView.d.ts.map +1 -1
  291. package/types/FrappeReportBuilder.d.ts +66 -16
  292. package/types/FrappeReportBuilder.d.ts.map +1 -1
  293. package/types/FrappeReportView.d.ts +9 -127
  294. package/types/FrappeReportView.d.ts.map +1 -1
  295. package/types/dependsOn.d.ts.map +1 -1
  296. package/types/formEngine/docPermissions.d.ts +14 -0
  297. package/types/formEngine/docPermissions.d.ts.map +1 -1
  298. package/types/formEngine/index.d.ts +1 -1
  299. package/types/formEngine/index.d.ts.map +1 -1
  300. package/types/index.d.ts +15 -3
  301. package/types/index.d.ts.map +1 -1
  302. package/types/liveErrors.d.ts +9 -1
  303. package/types/liveErrors.d.ts.map +1 -1
  304. package/types/measures.d.ts +3 -0
  305. package/types/measures.d.ts.map +1 -0
  306. package/types/recordShape.d.ts +45 -0
  307. package/types/recordShape.d.ts.map +1 -0
  308. package/types/report/ReportGrid.d.ts +20 -0
  309. package/types/report/ReportGrid.d.ts.map +1 -0
  310. package/types/report/ReportViewToolbar.d.ts +31 -0
  311. package/types/report/ReportViewToolbar.d.ts.map +1 -0
  312. package/types/report/queryReport.d.ts +181 -0
  313. package/types/report/queryReport.d.ts.map +1 -0
  314. package/types/report/queryReportColumns.d.ts +12 -0
  315. package/types/report/queryReportColumns.d.ts.map +1 -0
  316. package/types/report/reportViewModel.d.ts +146 -0
  317. package/types/report/reportViewModel.d.ts.map +1 -0
  318. package/types/report/savedReports.d.ts +27 -0
  319. package/types/report/savedReports.d.ts.map +1 -0
  320. package/types/report/useFrappeReport.d.ts +60 -0
  321. package/types/report/useFrappeReport.d.ts.map +1 -0
  322. package/types/report/useQueryReport.d.ts +37 -0
  323. package/types/report/useQueryReport.d.ts.map +1 -0
  324. package/types/useFrappeForm.d.ts +142 -0
  325. package/types/useFrappeForm.d.ts.map +1 -0
@@ -1,12 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { createElement as _createElement } from "react";
3
- import { getFrappeSyncModule, useFrappeCollection, useFrappeDoctypeEvents, useLiveQuery, useDocTypeMeta } from "@multiplatform.one/frappe";
3
+ import { useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
4
4
  import { AsyncBoundary, AsyncSkeleton, DetailPageLayout, EmptyState, PageHeader, Tabs } from "@multiplatform.one/components";
5
5
  import { SchemaForm } from "./schemaForm/index.native.js";
6
6
  import { FormSidebar } from "./FormSidebar.native.js";
7
- import { eq } from "@tanstack/db";
8
7
  import { ArrowLeftIcon } from "@phosphor-icons/react";
9
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
+ import { useEffect, useMemo, useState } from "react";
10
9
  import { useTranslation } from "react-i18next";
11
10
  import { Button, Input, formCommonColors } from "@multiplatform.one/forms";
12
11
  import { Text, XStack, YStack } from "tamagui";
@@ -15,70 +14,22 @@ import { useFrappeConfig } from "./FrappeProvider.native.js";
15
14
  import { FrappeReconnectIndicator } from "./FrappeReconnectIndicator.native.js";
16
15
  import { Timeline } from "./components/timeline.native.js";
17
16
  import { dialog } from "@multiplatform.one/desktop";
18
- import { applyFetchedValues, buildFetchMap } from "./formEngine/fetchFrom.native.js";
19
- import { buildPermLevelMatrix } from "./formEngine/fieldPermissions.native.js";
20
- import { createHttpClient, validateLink } from "./formEngine/formActions.native.js";
21
- import { buildFormTabs, isPromptNamed } from "./formEngine/formLayout.native.js";
22
- import { setCreatePrefill, takeCreatePrefill } from "./formEngine/createPrefill.native.js";
23
- import { buildAmendValues, canDeleteDoc, canEditDoc, isAmendable, resolveDocAction, resolveDocIndicator } from "./formEngine/docLifecycle.native.js";
24
- import { useAmendedAs } from "./formEngine/useAmendedAs.native.js";
25
- import { useDocRights } from "./formEngine/useDocRights.native.js";
26
- import { extractServerError } from "./formEngine/useFormEngine.native.js";
17
+ import { canDeleteDoc, canEditDoc, isAmendable, resolveDocAction, resolveDocIndicator } from "./formEngine/docLifecycle.native.js";
27
18
  import { FrappeFormActions } from "./FrappeFormActions.native.js";
28
19
  import { connectionFields, connectionsFromMeta } from "./frappeConnections.native.js";
29
20
  import { FrappeFormConnections } from "./FrappeFormConnections.native.js";
30
21
  import { FrappeNotConfigured } from "./FrappeNotConfigured.native.js";
31
22
  import { FrappeRowsReader } from "./FrappeRowsReader.native.js";
23
+ import { isPermissionError } from "./liveErrors.native.js";
24
+ import { fieldsFromRecord } from "./recordShape.native.js";
32
25
  import { frappeRouteHref, frappeRouteTarget, useFrappeRouter } from "./frappeNavigation.native.js";
33
- function _instanceof(left, right) {
34
- "@swc/helpers - instanceof";
35
-
36
- if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
37
- return !!right[Symbol.hasInstance](left);
38
- } else {
39
- return left instanceof right;
40
- }
41
- }
42
- function isEmptyFieldValue(value) {
43
- if (value === void 0 || value === null) return true;
44
- if (typeof value === "string" && value.trim() === "") return true;
45
- if (Array.isArray(value) && value.length === 0) return true;
46
- return false;
47
- }
48
- function sectionsToLayoutFields(sections) {
49
- var fields = [];
50
- sections.forEach(function (section, sectionIndex) {
51
- fields.push({
52
- fieldname: `__section_${sectionIndex}`,
53
- fieldtype: section.tab ? "Tab Break" : "Section Break",
54
- label: section.label,
55
- collapsible: section.collapsible ? 1 : 0
56
- });
57
- section.columns.forEach(function (column, columnIndex) {
58
- if (columnIndex > 0) {
59
- fields.push({
60
- fieldname: `__column_${sectionIndex}_${columnIndex}`,
61
- fieldtype: "Column Break"
62
- });
63
- }
64
- fields.push(...column.fields);
65
- });
66
- });
67
- return fields;
68
- }
69
- var documentBookkeeping = /* @__PURE__ */new Set(["name", "owner", "creation", "modified", "modified_by", "docstatus", "idx", "doctype", "_user_tags", "_comments", "_assign", "_liked_by", "_seen"]);
70
- function fieldsFromDocument(doc) {
71
- return Object.entries(doc).filter(function (param) {
72
- var [key, value] = param;
73
- return !key.startsWith("$") && !documentBookkeeping.has(key) && (value === null || typeof value === "string" || typeof value === "number");
74
- }).map(function (param) {
75
- var [key, value] = param;
26
+ import { useFrappeForm } from "./useFrappeForm.native.js";
27
+ function schemaFieldsFromRecord(doc) {
28
+ return fieldsFromRecord(doc).map(function (field) {
76
29
  return {
77
- name: key,
78
- label: key.replace(/_/g, " ").replace(/(^|\s)\S/g, function (c) {
79
- return c.toUpperCase();
80
- }),
81
- type: typeof value === "number" ? Number.isInteger(value) ? "Int" : "Float" : "Data",
30
+ name: field.fieldname,
31
+ label: field.label,
32
+ type: field.fieldtype,
82
33
  readOnly: true
83
34
  };
84
35
  });
@@ -248,21 +199,50 @@ function FrappeFormRoute(param) {
248
199
  }
249
200
  });
250
201
  }
251
- function FrappeFormBody(param) {
202
+ function FrappeFormBody(props) {
203
+ if (props.form) return /* @__PURE__ */_jsx(FrappeFormView, {
204
+ ...props,
205
+ form: props.form
206
+ });
207
+ return /* @__PURE__ */_jsx(FrappeFormOwned, {
208
+ ...props
209
+ });
210
+ }
211
+ function FrappeFormOwned(props) {
212
+ var _props_baseURL, _props_showSidebar;
213
+ var config = useFrappeConfig();
214
+ if (!((_props_baseURL = props.baseURL) !== null && _props_baseURL !== void 0 ? _props_baseURL : config === null || config === void 0 ? void 0 : config.baseURL)) {
215
+ throw new Error("FrappeForm requires baseURL prop or FrappeProvider with baseURL");
216
+ }
217
+ var form = useFrappeForm({
218
+ doctype: props.doctype,
219
+ name: props.name,
220
+ baseURL: props.baseURL,
221
+ auth: props.auth,
222
+ syncOptions: props.syncOptions,
223
+ fields: props.fields,
224
+ sections: props.sections,
225
+ hideFields: props.hideFields,
226
+ hideSections: props.hideSections,
227
+ roles: props.roles,
228
+ readShares: (_props_showSidebar = props.showSidebar) !== null && _props_showSidebar !== void 0 ? _props_showSidebar : true,
229
+ disabled: props.disabled,
230
+ initialDoc: props.initialDoc
231
+ });
232
+ return /* @__PURE__ */_jsx(FrappeFormView, {
233
+ ...props,
234
+ form
235
+ });
236
+ }
237
+ function FrappeFormView(param) {
252
238
  var {
253
- baseURL,
254
- auth,
255
- syncOptions,
239
+ form,
256
240
  doctype,
257
241
  name,
258
- fields,
259
242
  children,
260
243
  overrides,
261
- hideFields,
262
244
  readOnlyFields,
263
- sections,
264
245
  order,
265
- roles,
266
246
  onSave,
267
247
  onCancel,
268
248
  onDelete,
@@ -271,81 +251,57 @@ function FrappeFormBody(param) {
271
251
  showToolbar = true,
272
252
  showSidebar = true,
273
253
  showTimeline = true,
254
+ showBanners = true,
274
255
  disabled = false,
275
256
  sectionHeadingLevel,
276
257
  connections,
277
258
  showConnections = true,
278
- initialDoc,
259
+ extraTabs,
260
+ renderFieldWrapper,
261
+ renderTab,
279
262
  loadingFallback,
280
263
  notFoundFallback,
281
264
  errorFallback,
282
265
  routePage
283
266
  } = param;
284
- var _ref, _ref1;
267
+ var _ref;
285
268
  var _tabItems_, _tabItems_1;
286
- var config = useFrappeConfig();
287
269
  var {
288
270
  knobProps
289
271
  } = useResolvedKnobs();
290
272
  var {
291
273
  t
292
274
  } = useTranslation();
293
- var seedDoc = name && initialDoc && initialDoc.name === name ? initialDoc : void 0;
294
- var seedRef = useRef(seedDoc);
295
- seedRef.current = seedDoc;
296
- var [localDoc, setLocalDoc] = useState(function () {
297
- return seedDoc !== null && seedDoc !== void 0 ? seedDoc : {};
298
- });
299
- var [baselineDoc, setBaselineDoc] = useState(function () {
300
- return seedDoc;
301
- });
302
- var [docError, setDocError] = useState(null);
303
- var [conflictFields, setConflictFields] = useState([]);
304
- var [wasDeleted, setWasDeleted] = useState(false);
305
- var [isSubmitting, setIsSubmitting] = useState(false);
306
- var [errors, setErrors] = useState({});
307
- var [activeTab, setActiveTab] = useState(void 0);
308
- var everLoadedRef = useRef(false);
309
- var localDocRef = useRef(localDoc);
310
- localDocRef.current = localDoc;
311
- var baselineRef = useRef(baselineDoc);
312
- baselineRef.current = baselineDoc;
313
- var createDraftRef = useRef(void 0);
314
- var finalBaseURL = baseURL !== null && baseURL !== void 0 ? baseURL : config === null || config === void 0 ? void 0 : config.baseURL;
315
- var finalAuth = auth !== null && auth !== void 0 ? auth : config === null || config === void 0 ? void 0 : config.auth;
316
- var finalSyncOptions = syncOptions !== null && syncOptions !== void 0 ? syncOptions : config === null || config === void 0 ? void 0 : config.syncOptions;
317
- if (!finalBaseURL) {
318
- throw new Error("FrappeForm requires baseURL prop or FrappeProvider with baseURL");
319
- }
320
- var frappeConfig = useMemo(function () {
321
- return {
322
- baseURL: finalBaseURL,
323
- socketPort: config === null || config === void 0 ? void 0 : config.socketPort,
324
- siteName: config === null || config === void 0 ? void 0 : config.siteName,
325
- socketBaseURL: config === null || config === void 0 ? void 0 : config.socketBaseURL,
326
- auth: finalAuth,
327
- syncOptions: finalSyncOptions,
328
- realtime: config === null || config === void 0 ? void 0 : config.realtime,
329
- fixtures: config === null || config === void 0 ? void 0 : config.fixtures
330
- };
331
- }, [finalBaseURL, config === null || config === void 0 ? void 0 : config.socketPort, config === null || config === void 0 ? void 0 : config.siteName, config === null || config === void 0 ? void 0 : config.socketBaseURL, config === null || config === void 0 ? void 0 : config.realtime, finalAuth, finalSyncOptions, config === null || config === void 0 ? void 0 : config.fixtures]);
332
275
  var {
333
276
  meta,
334
- isLoading: isMetaLoading,
335
- error: metaError
336
- } = useDocTypeMeta(frappeConfig, doctype);
337
- var isSubmittable = !!(meta === null || meta === void 0 ? void 0 : meta.is_submittable);
277
+ metaLoading: isMetaLoading,
278
+ metaError,
279
+ doc: localDoc,
280
+ baseline: baselineDoc,
281
+ setValue,
282
+ errors,
283
+ isSubmitting,
284
+ docstatus,
285
+ isSubmittable,
286
+ rights,
287
+ rightsPending,
288
+ canWrite: canWriteRecord,
289
+ wasDeleted,
290
+ conflictFields,
291
+ docError,
292
+ tabs: formTabs,
293
+ promptNamed,
294
+ activeTab,
295
+ setActiveTab,
296
+ amendedAs
297
+ } = form;
298
+ var frappeConfig = form.connection;
338
299
  var isCreate = !name;
339
- var docstatus = Number((_ref = baselineDoc === null || baselineDoc === void 0 ? void 0 : baselineDoc.docstatus) !== null && _ref !== void 0 ? _ref : 0);
340
- var layoutFields = useMemo(function () {
341
- if (!meta) return void 0;
342
- return sections ? sectionsToLayoutFields(sections) : meta.fields;
343
- }, [meta, sections]);
344
- var amendedAs = useAmendedAs(isSubmittable && docstatus === 2 ? frappeConfig : void 0, doctype, name);
300
+ var hasUnsavedChanges = form.isDirty;
345
301
  var readsWithoutMeta = !children && !meta && Boolean(metaError) && Boolean(name);
346
302
  var recordTabs = useMemo(function () {
347
303
  if (!readsWithoutMeta || !baselineDoc) return void 0;
348
- var recordFields = fieldsFromDocument(baselineDoc);
304
+ var recordFields = schemaFieldsFromRecord(baselineDoc);
349
305
  return [{
350
306
  key: "__details",
351
307
  label: t("Details"),
@@ -359,97 +315,7 @@ function FrappeFormBody(param) {
359
315
  }
360
316
  }];
361
317
  }, [readsWithoutMeta, baselineDoc, t]);
362
- var promptNamed = isCreate && !!meta && isPromptNamed(meta.autoname, meta.naming_rule);
363
- var fetchMap = useMemo(function () {
364
- return meta ? buildFetchMap(meta.fields) : void 0;
365
- }, [meta]);
366
- var handleDocSyncError = useCallback(function (err) {
367
- setDocError(_instanceof(err, Error) ? err : new Error(String(err)));
368
- }, []);
369
- var docCollection = useFrappeCollection(name ? frappeConfig : void 0, doctype, {
370
- fields,
371
- filters: name ? {
372
- name
373
- } : void 0,
374
- onSyncError: handleDocSyncError
375
- });
376
- var {
377
- data: rawDocData,
378
- isLoading: isDocLoading
379
- } = useLiveQuery(function (q) {
380
- if (!docCollection || !name) return null;
381
- return q.from({
382
- _doc: docCollection
383
- }).where(function (param2) {
384
- var {
385
- _doc
386
- } = param2;
387
- if (!_doc) return eq(name, name);
388
- return eq(_doc.name, name);
389
- });
390
- }, [docCollection, name]);
391
- var liveDoc = useMemo(function () {
392
- var _arr_;
393
- var arr = Array.isArray(rawDocData) ? rawDocData : rawDocData ? [rawDocData] : [];
394
- var doc = (_arr_ = arr[0]) !== null && _arr_ !== void 0 ? _arr_ : null;
395
- return doc ? {
396
- data: doc,
397
- isLoading: isDocLoading
398
- } : name ? {
399
- data: null,
400
- isLoading: isDocLoading
401
- } : null;
402
- }, [rawDocData, isDocLoading, name]);
403
- var collection = useFrappeCollection(name ? void 0 : frappeConfig, doctype, {
404
- fields
405
- });
406
- var shareCollection = useFrappeCollection(showSidebar && name ? frappeConfig : void 0, "DocShare", {
407
- fields: ["name", "user", "everyone", "read", "write", "share"],
408
- filters: {
409
- share_doctype: doctype,
410
- share_name: name
411
- }
412
- });
413
- var {
414
- data: rawShareRows
415
- } = useLiveQuery(function (q) {
416
- return shareCollection ? q.from({
417
- _share: shareCollection
418
- }) : null;
419
- }, [shareCollection]);
420
- var shareRows = useMemo(function () {
421
- return shareCollection ? rawShareRows !== null && rawShareRows !== void 0 ? rawShareRows : [] : void 0;
422
- }, [shareCollection, rawShareRows]);
423
- var owner = baselineDoc === null || baselineDoc === void 0 ? void 0 : baselineDoc.owner;
424
- var {
425
- rights,
426
- pending: rightsPending,
427
- roles: effectiveRoles
428
- } = useDocRights(frappeConfig, meta, {
429
- roles,
430
- owner: typeof owner === "string" ? owner : void 0,
431
- shares: shareRows
432
- });
433
- var permLevels = useMemo(function () {
434
- return buildPermLevelMatrix(meta === null || meta === void 0 ? void 0 : meta.permissions, effectiveRoles);
435
- }, [meta === null || meta === void 0 ? void 0 : meta.permissions, effectiveRoles]);
436
- var formTabs = useMemo(function () {
437
- if (!layoutFields) return void 0;
438
- return buildFormTabs({
439
- fields: layoutFields,
440
- doc: {
441
- ...localDoc,
442
- __islocal: isCreate ? 1 : 0
443
- },
444
- docstatus,
445
- formReadOnly: !!(meta === null || meta === void 0 ? void 0 : meta.read_only),
446
- isCreate,
447
- detailsLabel: t("Details"),
448
- permLevels,
449
- hiddenFields: hideFields
450
- });
451
- }, [layoutFields, localDoc, docstatus, meta === null || meta === void 0 ? void 0 : meta.read_only, isCreate, permLevels, hideFields, t]);
452
- var assignmentCollection = useFrappeCollection(showSidebar && name && !frappeConfig.fixtures ? frappeConfig : void 0, "ToDo", {
318
+ var assignmentCollection = useFrappeCollection(showSidebar && name && frappeConfig && !frappeConfig.fixtures ? frappeConfig : void 0, "ToDo", {
453
319
  fields: ["name", "allocated_to", "status", "reference_type", "reference_name"],
454
320
  filters: {
455
321
  reference_type: doctype,
@@ -467,16 +333,6 @@ function FrappeFormBody(param) {
467
333
  var assignmentRows = useMemo(function () {
468
334
  return assignmentCollection ? rawAssignmentRows !== null && rawAssignmentRows !== void 0 ? rawAssignmentRows : [] : void 0;
469
335
  }, [assignmentCollection, rawAssignmentRows]);
470
- useEffect(function () {
471
- everLoadedRef.current = false;
472
- if (name) createDraftRef.current = void 0;
473
- setWasDeleted(false);
474
- setConflictFields([]);
475
- setDocError(null);
476
- var seed = seedRef.current;
477
- setBaselineDoc(seed);
478
- if (seed) setLocalDoc(seed);
479
- }, [doctype, name]);
480
336
  var effectiveConnections = useMemo(function () {
481
337
  return connections !== null && connections !== void 0 ? connections : connectionsFromMeta(meta);
482
338
  }, [connections, meta]);
@@ -544,395 +400,48 @@ function FrappeFormBody(param) {
544
400
  var _connectionSnapshots_link_doctype;
545
401
  return (_ref2 = (_connectionSnapshots_link_doctype = connectionSnapshots[link.doctype]) === null || _connectionSnapshots_link_doctype === void 0 ? void 0 : _connectionSnapshots_link_doctype.isLoading) !== null && _ref2 !== void 0 ? _ref2 : true;
546
402
  });
547
- useFrappeDoctypeEvents(name ? frappeConfig : void 0, doctype, function (event) {
548
- if (event.type !== "doc_deleted") return;
549
- var payload = event.payload;
550
- if ((payload === null || payload === void 0 ? void 0 : payload.name) === name) setWasDeleted(true);
551
- }, Boolean(name));
552
- useEffect(function () {
553
- var incoming = liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data;
554
- if (incoming) {
555
- everLoadedRef.current = true;
556
- setWasDeleted(false);
557
- var baseline = baselineRef.current;
558
- if (!baseline) {
559
- setBaselineDoc(incoming);
560
- setLocalDoc(incoming);
561
- return;
562
- }
563
- var local = localDocRef.current;
564
- var merged = {
565
- ...incoming
566
- };
567
- var newConflicts = [];
568
- var _iteratorNormalCompletion = true,
569
- _didIteratorError = false,
570
- _iteratorError = void 0;
571
- try {
572
- for (var _iterator = Object.keys(local)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
573
- var key = _step.value;
574
- var localValue = local[key];
575
- if (localValue === baseline[key]) continue;
576
- merged[key] = localValue;
577
- var remote = incoming[key];
578
- if (remote !== baseline[key] && remote !== localValue) newConflicts.push(key);
579
- }
580
- } catch (err) {
581
- _didIteratorError = true;
582
- _iteratorError = err;
583
- } finally {
584
- try {
585
- if (!_iteratorNormalCompletion && _iterator.return != null) {
586
- _iterator.return();
587
- }
588
- } finally {
589
- if (_didIteratorError) {
590
- throw _iteratorError;
591
- }
592
- }
593
- }
594
- setBaselineDoc(incoming);
595
- setLocalDoc(merged);
596
- if (newConflicts.length > 0) {
597
- setConflictFields(function (prev) {
598
- return Array.from(/* @__PURE__ */new Set([...prev, ...newConflicts]));
599
- });
600
- }
601
- } else if (name && everLoadedRef.current && !(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.isLoading)) {
602
- setWasDeleted(true);
603
- } else if (!name) {
604
- var _createDraftRef_current;
605
- if (((_createDraftRef_current = createDraftRef.current) === null || _createDraftRef_current === void 0 ? void 0 : _createDraftRef_current.doctype) !== doctype) {
606
- createDraftRef.current = {
607
- doctype,
608
- values: takeCreatePrefill(doctype)
609
- };
610
- }
611
- setLocalDoc({
612
- ...createDraftRef.current.values,
613
- doctype
614
- });
615
- }
616
- }, [liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data, liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.isLoading, doctype, name]);
617
- var dirtyFieldNames = useMemo(function () {
618
- var local = localDoc;
619
- var base = baselineDoc;
620
- var dirty = [];
621
- var _iteratorNormalCompletion = true,
622
- _didIteratorError = false,
623
- _iteratorError = void 0;
624
- try {
625
- for (var _iterator = Object.keys(local)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
626
- var key = _step.value;
627
- if (key === "doctype" || key === "name") continue;
628
- if (base ? local[key] !== base[key] : local[key] !== void 0) dirty.push(key);
629
- }
630
- } catch (err) {
631
- _didIteratorError = true;
632
- _iteratorError = err;
633
- } finally {
634
- try {
635
- if (!_iteratorNormalCompletion && _iterator.return != null) {
636
- _iterator.return();
637
- }
638
- } finally {
639
- if (_didIteratorError) {
640
- throw _iteratorError;
641
- }
642
- }
643
- }
644
- return dirty;
645
- }, [localDoc, baselineDoc]);
646
- var hasUnsavedChanges = dirtyFieldNames.length > 0;
647
- var runFetchFrom = function runFetchFrom2(field, value) {
648
- var rules = fetchMap === null || fetchMap === void 0 ? void 0 : fetchMap.get(field);
649
- if (!rules || rules.length === 0) return;
650
- var applyPatch = function applyPatch2(fetched2) {
651
- setLocalDoc(function (prev) {
652
- var current = prev;
653
- if (current[field] !== value) return prev;
654
- var patch = applyFetchedValues(rules, fetched2, current);
655
- return Object.keys(patch).length > 0 ? {
656
- ...current,
657
- ...patch
658
- } : prev;
659
- });
660
- };
661
- if (isEmptyFieldValue(value)) {
662
- applyPatch({});
663
- return;
664
- }
665
- var linkField = meta === null || meta === void 0 ? void 0 : meta.fields.find(function (metaField) {
666
- return metaField.fieldname === field;
667
- });
668
- var targetDoctype = typeof (linkField === null || linkField === void 0 ? void 0 : linkField.options) === "string" ? linkField.options : "";
669
- if (!targetDoctype) return;
670
- var sources = Array.from(new Set(rules.map(function (rule) {
671
- return rule.source;
672
- })));
673
- var fixtures = frappeConfig.fixtures;
674
- var fetched = fixtures ? fixtures.getDoc(targetDoctype, String(value), sources).then(function (doc) {
675
- return doc !== null && doc !== void 0 ? doc : {};
676
- }) : validateLink(createHttpClient(frappeConfig), targetDoctype, String(value), sources);
677
- fetched.then(applyPatch).catch(function () {
678
- return void 0;
679
- });
680
- };
681
- var setValue = function setValue2(field, value) {
682
- setLocalDoc(function (prev) {
683
- return {
684
- ...prev,
685
- [field]: value
686
- };
687
- });
688
- setErrors(function (prev) {
689
- var newErrors = {
690
- ...prev
691
- };
692
- delete newErrors[String(field)];
693
- return newErrors;
694
- });
695
- runFetchFrom(String(field), value);
696
- };
697
- var validateRequiredFields = function validateRequiredFields2() {
698
- if (!formTabs) return {};
699
- var validationErrors = {};
700
- var doc = localDoc;
701
- if (promptNamed && isEmptyFieldValue(doc.name)) {
702
- validationErrors.name = t("Name is required");
703
- }
704
- var _iteratorNormalCompletion = true,
705
- _didIteratorError = false,
706
- _iteratorError = void 0;
707
- try {
708
- for (var _iterator = formTabs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
709
- var tab = _step.value;
710
- var _iteratorNormalCompletion1 = true,
711
- _didIteratorError1 = false,
712
- _iteratorError1 = void 0;
713
- try {
714
- for (var _iterator1 = tab.schema.fields[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
715
- var field = _step1.value;
716
- if (!field.required) continue;
717
- if (isEmptyFieldValue(doc[field.name])) {
718
- validationErrors[field.name] = t("{{label}} is required", {
719
- label: field.label || field.name
720
- });
721
- }
722
- }
723
- } catch (err) {
724
- _didIteratorError1 = true;
725
- _iteratorError1 = err;
726
- } finally {
727
- try {
728
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
729
- _iterator1.return();
730
- }
731
- } finally {
732
- if (_didIteratorError1) {
733
- throw _iteratorError1;
734
- }
735
- }
736
- }
737
- }
738
- } catch (err) {
739
- _didIteratorError = true;
740
- _iteratorError = err;
741
- } finally {
742
- try {
743
- if (!_iteratorNormalCompletion && _iterator.return != null) {
744
- _iterator.return();
745
- }
746
- } finally {
747
- if (_didIteratorError) {
748
- throw _iteratorError;
749
- }
750
- }
751
- }
752
- return validationErrors;
753
- };
754
- var canWriteRecord = isCreate ? rights.create : rights.write;
755
403
  var handleSave = async function handleSave2() {
756
- if (wasDeleted || !canWriteRecord) return;
757
- var requiredErrors = validateRequiredFields();
758
- if (Object.keys(requiredErrors).length > 0) {
759
- setErrors(requiredErrors);
760
- return;
761
- }
762
- setIsSubmitting(true);
763
- setErrors({});
764
- try {
765
- if (name) {
766
- if (!docCollection) return;
767
- var changedFields = dirtyFieldNames;
768
- if (changedFields.length > 0) {
769
- var local = localDoc;
770
- var tx = docCollection.update(name, function (draft) {
771
- var _iteratorNormalCompletion2 = true,
772
- _didIteratorError2 = false,
773
- _iteratorError2 = void 0;
774
- try {
775
- for (var _iterator2 = changedFields[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
776
- var key = _step2.value;
777
- draft[key] = local[key];
778
- }
779
- } catch (err) {
780
- _didIteratorError2 = true;
781
- _iteratorError2 = err;
782
- } finally {
783
- try {
784
- if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
785
- _iterator2.return();
786
- }
787
- } finally {
788
- if (_didIteratorError2) {
789
- throw _iteratorError2;
790
- }
791
- }
792
- }
793
- });
794
- await tx.isPersisted.promise;
795
- }
796
- setConflictFields([]);
797
- } else {
798
- var _localDoc_name, _ref2;
799
- var _getFrappeSyncModule;
800
- if (!collection) return;
801
- var temporaryName = (_localDoc_name = localDoc.name) !== null && _localDoc_name !== void 0 ? _localDoc_name : `new-${Date.now()}`;
802
- var docToInsert = {
803
- ...localDoc,
804
- doctype,
805
- name: temporaryName
806
- };
807
- var tx1 = collection.insert(docToInsert);
808
- await tx1.isPersisted.promise;
809
- var createdName = (_ref2 = (_getFrappeSyncModule = getFrappeSyncModule(frappeConfig)) === null || _getFrappeSyncModule === void 0 ? void 0 : _getFrappeSyncModule.createdName(temporaryName)) !== null && _ref2 !== void 0 ? _ref2 : temporaryName;
810
- onSave === null || onSave === void 0 ? void 0 : onSave({
811
- ...localDoc,
812
- name: createdName
813
- });
814
- return;
815
- }
816
- onSave === null || onSave === void 0 ? void 0 : onSave(localDoc);
817
- } catch (err1) {
818
- var e = err1;
819
- if ((e === null || e === void 0 ? void 0 : e.exc_type) === "ValidationError") {
820
- var validationErrors = {};
821
- if (e._server_messages) {
822
- try {
823
- var messages = JSON.parse(e._server_messages);
824
- var _iteratorNormalCompletion = true,
825
- _didIteratorError = false,
826
- _iteratorError = void 0;
827
- try {
828
- for (var _iterator = messages[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
829
- var msg = _step.value;
830
- var parsed = typeof msg === "string" ? JSON.parse(msg) : msg;
831
- if (parsed.message) {
832
- validationErrors.general = parsed.message;
833
- }
834
- }
835
- } catch (err) {
836
- _didIteratorError = true;
837
- _iteratorError = err;
838
- } finally {
839
- try {
840
- if (!_iteratorNormalCompletion && _iterator.return != null) {
841
- _iterator.return();
842
- }
843
- } finally {
844
- if (_didIteratorError) {
845
- throw _iteratorError;
846
- }
847
- }
848
- }
849
- } catch (unused) {
850
- validationErrors.general = t("Validation error occurred");
851
- }
852
- }
853
- setErrors(validationErrors);
854
- } else {
855
- setErrors({
856
- general: (e === null || e === void 0 ? void 0 : e.message) || t("Failed to save document")
857
- });
858
- }
859
- } finally {
860
- setIsSubmitting(false);
861
- }
404
+ var saved = await form.save();
405
+ if (!saved) return;
406
+ onSave === null || onSave === void 0 ? void 0 : onSave(isCreate ? {
407
+ ...localDoc,
408
+ name: saved
409
+ } : localDoc);
862
410
  };
863
411
  var handleCancel = function handleCancel2() {
864
- if (baselineDoc) {
865
- setLocalDoc(baselineDoc);
866
- } else if (liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data) {
867
- setLocalDoc(liveDoc.data);
868
- } else {
869
- setLocalDoc({
870
- doctype
871
- });
872
- }
873
- setConflictFields([]);
874
- setErrors({});
412
+ form.reset();
875
413
  onCancel === null || onCancel === void 0 ? void 0 : onCancel();
876
414
  };
877
415
  var handleDelete = async function handleDelete2() {
878
- if (!docCollection || !name || wasDeleted || !rights.delete) return;
416
+ if (!name || wasDeleted || !rights.delete) return;
879
417
  if (!(await dialog.confirm(t("Delete this {{doctype}}?", {
880
418
  doctype
881
419
  })))) return;
882
- setIsSubmitting(true);
883
- setErrors({});
884
- try {
885
- var tx = docCollection.delete(name);
886
- await tx.isPersisted.promise;
887
- onDelete === null || onDelete === void 0 ? void 0 : onDelete(localDoc);
888
- } catch (err) {
889
- setErrors({
890
- general: (err === null || err === void 0 ? void 0 : err.message) || t("Failed to delete")
891
- });
892
- } finally {
893
- setIsSubmitting(false);
894
- }
420
+ if (await form.remove()) onDelete === null || onDelete === void 0 ? void 0 : onDelete(localDoc);
895
421
  };
896
- var transitionDocstatus = async function transitionDocstatus2(to, question, failure) {
897
- if (!docCollection || !name || wasDeleted || !rights[to === 1 ? "submit" : "cancel"]) return;
898
- if (to === 1) {
899
- var requiredErrors = validateRequiredFields();
900
- if (Object.keys(requiredErrors).length > 0) {
901
- setErrors(requiredErrors);
902
- return;
903
- }
904
- }
905
- if (!(await dialog.confirm(question))) return;
906
- setIsSubmitting(true);
907
- setErrors({});
908
- try {
909
- var tx = docCollection.update(name, function (draft) {
910
- draft.docstatus = to;
911
- });
912
- await tx.isPersisted.promise;
913
- } catch (err) {
914
- setErrors({
915
- general: extractServerError(err, failure)
916
- });
917
- } finally {
918
- setIsSubmitting(false);
422
+ var handleSubmitDocument = async function handleSubmitDocument2() {
423
+ if (!name || wasDeleted || !rights.submit) return;
424
+ var requiredErrors = form.validate();
425
+ if (Object.keys(requiredErrors).length > 0) {
426
+ form.setErrors(requiredErrors);
427
+ return;
919
428
  }
920
- };
921
- var handleSubmitDocument = function handleSubmitDocument2() {
922
- return transitionDocstatus(1, t("Permanently Submit {{name}}?", {
429
+ if (!(await dialog.confirm(t("Permanently Submit {{name}}?", {
923
430
  name
924
- }), t("Failed to submit"));
431
+ })))) return;
432
+ await form.submitDocument();
925
433
  };
926
- var handleCancelDocument = function handleCancelDocument2() {
927
- return transitionDocstatus(2, t("Permanently Cancel {{name}}?", {
434
+ var handleCancelDocument = async function handleCancelDocument2() {
435
+ if (!name || wasDeleted || !rights.cancel) return;
436
+ if (!(await dialog.confirm(t("Permanently Cancel {{name}}?", {
928
437
  name
929
- }), t("Failed to cancel"));
438
+ })))) return;
439
+ await form.cancelDocument();
930
440
  };
931
441
  var handleAmend = function handleAmend2() {
932
- if (!meta || !name || !onAmend || !rights.amend) return;
933
- var draft = buildAmendValues(meta.fields, localDoc, name);
934
- setCreatePrefill(doctype, draft);
935
- onAmend(draft);
442
+ if (!onAmend) return;
443
+ var draft = form.amend();
444
+ if (draft) onAmend(draft);
936
445
  };
937
446
  var titleField = meta === null || meta === void 0 ? void 0 : meta.title_field;
938
447
  var titleValue = titleField ? localDoc[titleField] : void 0;
@@ -994,27 +503,34 @@ function FrappeFormBody(param) {
994
503
  }));
995
504
  }
996
505
  if (!children && metaError && !meta && !name) {
997
- return frame(/* @__PURE__ */_jsxs(YStack, {
506
+ return frame(isPermissionError(metaError) ? /* @__PURE__ */_jsx(EmptyState, {
507
+ testID: "frappe-form-not-permitted",
508
+ title: t("You can't create {{doctype}}", {
509
+ doctype
510
+ }),
511
+ description: metaError.message
512
+ }) : /* @__PURE__ */_jsx(AsyncBoundary, {
998
513
  ...knobProps.panelPadding,
999
- alignItems: "center",
1000
- ...knobProps.gap,
1001
- children: [/* @__PURE__ */_jsx(Text, {
1002
- color: formCommonColors.error,
1003
- ...knobProps.body,
1004
- children: t("Failed to load {{doctype}} form", {
1005
- doctype
1006
- })
1007
- }), /* @__PURE__ */_jsx(Text, {
1008
- color: formCommonColors.muted,
1009
- ...knobProps.body,
1010
- children: metaError.message
1011
- })]
514
+ error: metaError,
515
+ errorTitle: t("Failed to load {{doctype}} form", {
516
+ doctype
517
+ })
1012
518
  }));
1013
519
  }
1014
- var isDocReading = Boolean(name) && (!docCollection || Boolean(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.isLoading));
1015
- var showsSeed = Boolean(seedDoc) && isDocReading;
1016
- if (name && docError && !(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data) && !wasDeleted) {
520
+ if (name && form.status === "error" && docError) {
1017
521
  if (errorFallback !== void 0) return frame(errorFallback);
522
+ if (isPermissionError(docError)) {
523
+ return frame(/* @__PURE__ */_jsx(EmptyState, {
524
+ testID: "frappe-form-not-permitted",
525
+ title: t("You can't open {{doctype}} {{name}}", {
526
+ doctype,
527
+ name
528
+ }),
529
+ description: t("Your session can't read this {{doctype}}.", {
530
+ doctype
531
+ })
532
+ }));
533
+ }
1018
534
  return frame(/* @__PURE__ */_jsx(AsyncBoundary, {
1019
535
  ...knobProps.panelPadding,
1020
536
  error: docError,
@@ -1023,7 +539,7 @@ function FrappeFormBody(param) {
1023
539
  })
1024
540
  }));
1025
541
  }
1026
- if (name && isDocReading && !showsSeed && !wasDeleted) {
542
+ if (name && form.status === "loading") {
1027
543
  if (loadingFallback !== void 0) return frame(loadingFallback);
1028
544
  return frame(/* @__PURE__ */_jsx(YStack, {
1029
545
  ...knobProps.panelPadding,
@@ -1033,7 +549,7 @@ function FrappeFormBody(param) {
1033
549
  })
1034
550
  }));
1035
551
  }
1036
- if (name && !isDocReading && !(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data) && !wasDeleted) {
552
+ if (name && form.status === "notFound") {
1037
553
  if (notFoundFallback !== void 0) return frame(notFoundFallback);
1038
554
  return frame(/* @__PURE__ */_jsxs(YStack, {
1039
555
  ...knobProps.panelPadding,
@@ -1083,7 +599,7 @@ function FrappeFormBody(param) {
1083
599
  var toolbarShown = showToolbar && !readsWithoutMeta && Boolean(indicator || docAction || showDelete || showEdit || showClose);
1084
600
  var shownTabs = formTabs !== null && formTabs !== void 0 ? formTabs : recordTabs;
1085
601
  var imageFieldName = meta === null || meta === void 0 ? void 0 : meta.image_field;
1086
- var sidebarImageUrl = imageFieldName ? resolveFileUrl(localDoc[imageFieldName], finalBaseURL) : void 0;
602
+ var sidebarImageUrl = imageFieldName ? resolveFileUrl(localDoc[imageFieldName], frappeConfig === null || frappeConfig === void 0 ? void 0 : frappeConfig.baseURL) : void 0;
1087
603
  var conflictLabels = conflictFields.map(function (fieldname) {
1088
604
  var field = meta === null || meta === void 0 ? void 0 : meta.fields.find(function (metaField) {
1089
605
  return metaField.fieldname === fieldname;
@@ -1091,25 +607,27 @@ function FrappeFormBody(param) {
1091
607
  return (field === null || field === void 0 ? void 0 : field.label) || fieldname;
1092
608
  }).join(", ");
1093
609
  var formTabItems = (shownTabs !== null && shownTabs !== void 0 ? shownTabs : []).map(function (tab) {
610
+ var content = /* @__PURE__ */_jsx(SchemaForm, {
611
+ schema: tab.schema,
612
+ doc: localDoc,
613
+ setValue: function setValue1(field, value) {
614
+ return setValue(field, value);
615
+ },
616
+ errors,
617
+ disabled: fieldsDisabled,
618
+ overrides,
619
+ readOnlyFields,
620
+ sectionHeadingLevel,
621
+ order,
622
+ renderFieldWrapper
623
+ });
1094
624
  return {
1095
625
  value: tab.key,
1096
626
  label: tab.label,
1097
- content: /* @__PURE__ */_jsx(SchemaForm, {
1098
- schema: tab.schema,
1099
- doc: localDoc,
1100
- setValue: function setValue1(field, value) {
1101
- return setValue(field, value);
1102
- },
1103
- errors,
1104
- disabled: fieldsDisabled,
1105
- overrides,
1106
- readOnlyFields,
1107
- sectionHeadingLevel,
1108
- order
1109
- })
627
+ content: renderTab ? renderTab(tab, content) : content
1110
628
  };
1111
629
  });
1112
- var tabItems = showConnections && name && effectiveConnections.length > 0 ? [...formTabItems, {
630
+ var tabItems = [...formTabItems, ...(showConnections && name && frappeConfig && effectiveConnections.length > 0 ? [{
1113
631
  value: "__connections",
1114
632
  label: t("Connections"),
1115
633
  content: /* @__PURE__ */_jsx(FrappeFormConnections, {
@@ -1117,14 +635,14 @@ function FrappeFormBody(param) {
1117
635
  connections: effectiveConnections,
1118
636
  name
1119
637
  })
1120
- }] : formTabItems;
638
+ }] : []), ...(extraTabs !== null && extraTabs !== void 0 ? extraTabs : [])];
1121
639
  var effectiveTab = activeTab && tabItems.some(function (tab) {
1122
640
  return tab.value === activeTab;
1123
641
  }) ? activeTab : (_tabItems_ = tabItems[0]) === null || _tabItems_ === void 0 ? void 0 : _tabItems_.value;
1124
642
  var localName = localDoc.name;
1125
643
  var sidebar = showSidebar && name && meta ? /* @__PURE__ */_jsx(FormSidebar, {
1126
644
  imageUrl: sidebarImageUrl,
1127
- sections: buildSidebarSections(localDoc, shareRows, t, assignmentRows),
645
+ sections: buildSidebarSections(localDoc, form.shareRows, t, assignmentRows),
1128
646
  metadata: mapDocToSidebarMetadata(localDoc, t)
1129
647
  }) : void 0;
1130
648
  return frame(
@@ -1138,16 +656,16 @@ function FrappeFormBody(param) {
1138
656
  flexGrow: 1,
1139
657
  flexShrink: 1,
1140
658
  flexBasis: "auto",
1141
- children: [/* @__PURE__ */_jsx(FrappeReconnectIndicator, {
659
+ children: [frappeConfig ? /* @__PURE__ */_jsx(FrappeReconnectIndicator, {
1142
660
  config: frappeConfig
1143
- }), connectionReads.map(function (read) {
661
+ }) : null, frappeConfig ? connectionReads.map(function (read) {
1144
662
  return /* @__PURE__ */_jsx(FrappeRowsReader, {
1145
663
  connection: frappeConfig,
1146
664
  doctype: read.link.doctype,
1147
665
  options: read.options,
1148
666
  onChange: read.onChange
1149
667
  }, read.link.doctype);
1150
- }), wasDeleted && /* @__PURE__ */_jsx(XStack, {
668
+ }) : null, showBanners && wasDeleted && /* @__PURE__ */_jsx(XStack, {
1151
669
  role: "alert",
1152
670
  alignItems: "center",
1153
671
  ...knobProps.containerRadius,
@@ -1163,7 +681,7 @@ function FrappeFormBody(param) {
1163
681
  doctype
1164
682
  })
1165
683
  })
1166
- }), !wasDeleted && conflictFields.length > 0 && /* @__PURE__ */_jsx(XStack, {
684
+ }), showBanners && !wasDeleted && conflictFields.length > 0 && /* @__PURE__ */_jsx(XStack, {
1167
685
  role: "status",
1168
686
  alignItems: "center",
1169
687
  ...knobProps.containerRadius,
@@ -1220,7 +738,7 @@ function FrappeFormBody(param) {
1220
738
  value: effectiveTab,
1221
739
  onChange: setActiveTab,
1222
740
  lazyMount: true
1223
- }) : (_ref1 = (_tabItems_1 = tabItems[0]) === null || _tabItems_1 === void 0 ? void 0 : _tabItems_1.content) !== null && _ref1 !== void 0 ? _ref1 : null]
741
+ }) : (_ref = (_tabItems_1 = tabItems[0]) === null || _tabItems_1 === void 0 ? void 0 : _tabItems_1.content) !== null && _ref !== void 0 ? _ref : null]
1224
742
  }) :
1225
743
  // Metadata unavailable (should be covered by metaError branch above)
1226
744
  /* @__PURE__ */
@@ -1235,6 +753,7 @@ function FrappeFormBody(param) {
1235
753
  }), errors.general && /* @__PURE__ */_jsx(Text, {
1236
754
  color: formCommonColors.error,
1237
755
  ...knobProps.body,
756
+ role: "alert",
1238
757
  children: errors.general
1239
758
  }), toolbarShown && /* @__PURE__ */_jsx(FrappeFormActions, {
1240
759
  indicator,