@multiplatform.one/frappe-ui 7.11.0 → 7.16.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 (366) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/FrappeCalendar.cjs +1 -0
  3. package/dist/cjs/FrappeCalendar.native.js +1 -0
  4. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  5. package/dist/cjs/FrappeDashboard.cjs +8 -10
  6. package/dist/cjs/FrappeDashboard.native.js +8 -14
  7. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  8. package/dist/cjs/FrappeForm.cjs +465 -175
  9. package/dist/cjs/FrappeForm.native.js +611 -207
  10. package/dist/cjs/FrappeForm.native.js.map +1 -1
  11. package/dist/cjs/FrappeFormConnections.cjs +125 -0
  12. package/dist/cjs/FrappeFormConnections.native.js +149 -0
  13. package/dist/cjs/FrappeFormConnections.native.js.map +1 -0
  14. package/dist/cjs/FrappeImageView.cjs +7 -9
  15. package/dist/cjs/FrappeImageView.native.js +7 -13
  16. package/dist/cjs/FrappeImageView.native.js.map +1 -1
  17. package/dist/cjs/FrappeList.cjs +29 -4
  18. package/dist/cjs/FrappeList.native.js +37 -5
  19. package/dist/cjs/FrappeList.native.js.map +1 -1
  20. package/dist/cjs/FrappeListView.cjs +102 -29
  21. package/dist/cjs/FrappeListView.native.js +109 -29
  22. package/dist/cjs/FrappeListView.native.js.map +1 -1
  23. package/dist/cjs/FrappeProvider.cjs +7 -2
  24. package/dist/cjs/FrappeProvider.native.js +7 -2
  25. package/dist/cjs/FrappeProvider.native.js.map +1 -1
  26. package/dist/cjs/FrappeReportBuilder.cjs +10 -11
  27. package/dist/cjs/FrappeReportBuilder.native.js +10 -16
  28. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  29. package/dist/cjs/FrappeRowsReader.cjs +49 -0
  30. package/dist/cjs/FrappeRowsReader.native.js +53 -0
  31. package/dist/cjs/FrappeRowsReader.native.js.map +1 -0
  32. package/dist/cjs/FrappeTable.cjs +18 -6
  33. package/dist/cjs/FrappeTable.native.js +24 -6
  34. package/dist/cjs/FrappeTable.native.js.map +1 -1
  35. package/dist/cjs/fieldRegistry.cjs +36 -11
  36. package/dist/cjs/fieldRegistry.native.js +59 -11
  37. package/dist/cjs/fieldRegistry.native.js.map +1 -1
  38. package/dist/cjs/fields/Date/index.native.js +5 -2
  39. package/dist/cjs/fields/Date/index.native.js.map +1 -1
  40. package/dist/cjs/fields/Date/sheetKeyboard.cjs +2 -2
  41. package/dist/cjs/fields/Date/sheetKeyboard.native.js +2 -2
  42. package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +1 -1
  43. package/dist/cjs/fields/DateRange/index.cjs +2 -1
  44. package/dist/cjs/fields/DateRange/index.native.js +4 -1
  45. package/dist/cjs/fields/DateRange/index.native.js.map +1 -1
  46. package/dist/cjs/fields/Password/index.cjs +1 -1
  47. package/dist/cjs/fields/Password/index.native.js +1 -1
  48. package/dist/cjs/formEngine/index.cjs +4 -2
  49. package/dist/cjs/formEngine/index.native.js +3 -1
  50. package/dist/cjs/formEngine/index.native.js.map +1 -1
  51. package/dist/cjs/formEngine/useSessionRoles.cjs +77 -0
  52. package/dist/cjs/formEngine/useSessionRoles.native.js +84 -0
  53. package/dist/cjs/formEngine/useSessionRoles.native.js.map +1 -0
  54. package/dist/cjs/frappeConnections.cjs +41 -0
  55. package/dist/cjs/frappeConnections.native.js +50 -0
  56. package/dist/cjs/frappeConnections.native.js.map +1 -0
  57. package/dist/cjs/frappeNavigation.cjs +107 -0
  58. package/dist/cjs/frappeNavigation.native.js +112 -0
  59. package/dist/cjs/frappeNavigation.native.js.map +1 -0
  60. package/dist/cjs/index.cjs +18 -1
  61. package/dist/cjs/index.native.js +18 -1
  62. package/dist/cjs/index.native.js.map +1 -1
  63. package/dist/cjs/schemaForm/index.cjs +4 -1
  64. package/dist/cjs/schemaForm/index.native.js +4 -1
  65. package/dist/cjs/schemaForm/index.native.js.map +1 -1
  66. package/dist/cjs/useConnectionFilters.cjs +146 -0
  67. package/dist/cjs/useConnectionFilters.native.js +213 -0
  68. package/dist/cjs/useConnectionFilters.native.js.map +1 -0
  69. package/dist/cjs/useFrappePagination.cjs +37 -18
  70. package/dist/cjs/useFrappePagination.native.js +59 -23
  71. package/dist/cjs/useFrappePagination.native.js.map +1 -1
  72. package/dist/cjs/useFrappeRows.native.js.map +1 -1
  73. package/dist/esm/FrappeCalendar.mjs +1 -0
  74. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  75. package/dist/esm/FrappeCalendar.native.js +1 -0
  76. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  77. package/dist/esm/FrappeDashboard.mjs +9 -11
  78. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  79. package/dist/esm/FrappeDashboard.native.js +9 -15
  80. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  81. package/dist/esm/FrappeForm.mjs +471 -181
  82. package/dist/esm/FrappeForm.mjs.map +1 -1
  83. package/dist/esm/FrappeForm.native.js +599 -195
  84. package/dist/esm/FrappeForm.native.js.map +1 -1
  85. package/dist/esm/FrappeFormConnections.mjs +99 -0
  86. package/dist/esm/FrappeFormConnections.mjs.map +1 -0
  87. package/dist/esm/FrappeFormConnections.native.js +120 -0
  88. package/dist/esm/FrappeFormConnections.native.js.map +1 -0
  89. package/dist/esm/FrappeImageView.mjs +8 -10
  90. package/dist/esm/FrappeImageView.mjs.map +1 -1
  91. package/dist/esm/FrappeImageView.native.js +8 -14
  92. package/dist/esm/FrappeImageView.native.js.map +1 -1
  93. package/dist/esm/FrappeList.mjs +31 -6
  94. package/dist/esm/FrappeList.mjs.map +1 -1
  95. package/dist/esm/FrappeList.native.js +39 -7
  96. package/dist/esm/FrappeList.native.js.map +1 -1
  97. package/dist/esm/FrappeListView.mjs +103 -30
  98. package/dist/esm/FrappeListView.mjs.map +1 -1
  99. package/dist/esm/FrappeListView.native.js +110 -30
  100. package/dist/esm/FrappeListView.native.js.map +1 -1
  101. package/dist/esm/FrappeProvider.mjs +7 -2
  102. package/dist/esm/FrappeProvider.mjs.map +1 -1
  103. package/dist/esm/FrappeProvider.native.js +7 -2
  104. package/dist/esm/FrappeProvider.native.js.map +1 -1
  105. package/dist/esm/FrappeReportBuilder.mjs +11 -12
  106. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  107. package/dist/esm/FrappeReportBuilder.native.js +11 -17
  108. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  109. package/dist/esm/FrappeRowsReader.mjs +24 -0
  110. package/dist/esm/FrappeRowsReader.mjs.map +1 -0
  111. package/dist/esm/FrappeRowsReader.native.js +25 -0
  112. package/dist/esm/FrappeRowsReader.native.js.map +1 -0
  113. package/dist/esm/FrappeTable.mjs +18 -6
  114. package/dist/esm/FrappeTable.mjs.map +1 -1
  115. package/dist/esm/FrappeTable.native.js +24 -6
  116. package/dist/esm/FrappeTable.native.js.map +1 -1
  117. package/dist/esm/fieldRegistry.mjs +35 -12
  118. package/dist/esm/fieldRegistry.mjs.map +1 -1
  119. package/dist/esm/fieldRegistry.native.js +58 -12
  120. package/dist/esm/fieldRegistry.native.js.map +1 -1
  121. package/dist/esm/fields/Date/index.native.js +6 -3
  122. package/dist/esm/fields/Date/index.native.js.map +1 -1
  123. package/dist/esm/fields/Date/sheetKeyboard.mjs +2 -2
  124. package/dist/esm/fields/Date/sheetKeyboard.mjs.map +1 -1
  125. package/dist/esm/fields/Date/sheetKeyboard.native.js +2 -2
  126. package/dist/esm/fields/Date/sheetKeyboard.native.js.map +1 -1
  127. package/dist/esm/fields/DateRange/index.mjs +2 -1
  128. package/dist/esm/fields/DateRange/index.mjs.map +1 -1
  129. package/dist/esm/fields/DateRange/index.native.js +4 -1
  130. package/dist/esm/fields/DateRange/index.native.js.map +1 -1
  131. package/dist/esm/fields/Password/index.mjs +1 -1
  132. package/dist/esm/fields/Password/index.mjs.map +1 -1
  133. package/dist/esm/fields/Password/index.native.js +1 -1
  134. package/dist/esm/fields/Password/index.native.js.map +1 -1
  135. package/dist/esm/formEngine/index.mjs +2 -1
  136. package/dist/esm/formEngine/index.mjs.map +1 -1
  137. package/dist/esm/formEngine/index.native.js +2 -1
  138. package/dist/esm/formEngine/index.native.js.map +1 -1
  139. package/dist/esm/formEngine/useSessionRoles.mjs +52 -0
  140. package/dist/esm/formEngine/useSessionRoles.mjs.map +1 -0
  141. package/dist/esm/formEngine/useSessionRoles.native.js +56 -0
  142. package/dist/esm/formEngine/useSessionRoles.native.js.map +1 -0
  143. package/dist/esm/frappeConnections.mjs +15 -0
  144. package/dist/esm/frappeConnections.mjs.map +1 -0
  145. package/dist/esm/frappeConnections.native.js +21 -0
  146. package/dist/esm/frappeConnections.native.js.map +1 -0
  147. package/dist/esm/frappeNavigation.mjs +78 -0
  148. package/dist/esm/frappeNavigation.mjs.map +1 -0
  149. package/dist/esm/frappeNavigation.native.js +80 -0
  150. package/dist/esm/frappeNavigation.native.js.map +1 -0
  151. package/dist/esm/index.mjs +7 -3
  152. package/dist/esm/index.mjs.map +1 -1
  153. package/dist/esm/index.native.js +7 -3
  154. package/dist/esm/index.native.js.map +1 -1
  155. package/dist/esm/schemaForm/index.mjs +4 -1
  156. package/dist/esm/schemaForm/index.mjs.map +1 -1
  157. package/dist/esm/schemaForm/index.native.js +4 -1
  158. package/dist/esm/schemaForm/index.native.js.map +1 -1
  159. package/dist/esm/useConnectionFilters.mjs +121 -0
  160. package/dist/esm/useConnectionFilters.mjs.map +1 -0
  161. package/dist/esm/useConnectionFilters.native.js +185 -0
  162. package/dist/esm/useConnectionFilters.native.js.map +1 -0
  163. package/dist/esm/useFrappePagination.mjs +38 -19
  164. package/dist/esm/useFrappePagination.mjs.map +1 -1
  165. package/dist/esm/useFrappePagination.native.js +60 -24
  166. package/dist/esm/useFrappePagination.native.js.map +1 -1
  167. package/dist/esm/useFrappeRows.mjs.map +1 -1
  168. package/dist/esm/useFrappeRows.native.js.map +1 -1
  169. package/dist/jsx/FrappeCalendar.mjs +1 -0
  170. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  171. package/dist/jsx/FrappeCalendar.native.js +1 -0
  172. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  173. package/dist/jsx/FrappeDashboard.mjs +9 -11
  174. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  175. package/dist/jsx/FrappeDashboard.native.js +8 -14
  176. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  177. package/dist/jsx/FrappeForm.mjs +471 -181
  178. package/dist/jsx/FrappeForm.mjs.map +1 -1
  179. package/dist/jsx/FrappeForm.native.js +611 -207
  180. package/dist/jsx/FrappeForm.native.js.map +1 -1
  181. package/dist/jsx/FrappeFormConnections.mjs +99 -0
  182. package/dist/jsx/FrappeFormConnections.mjs.map +1 -0
  183. package/dist/jsx/FrappeFormConnections.native.js +149 -0
  184. package/dist/jsx/FrappeFormConnections.native.js.map +1 -0
  185. package/dist/jsx/FrappeImageView.mjs +8 -10
  186. package/dist/jsx/FrappeImageView.mjs.map +1 -1
  187. package/dist/jsx/FrappeImageView.native.js +7 -13
  188. package/dist/jsx/FrappeImageView.native.js.map +1 -1
  189. package/dist/jsx/FrappeList.mjs +31 -6
  190. package/dist/jsx/FrappeList.mjs.map +1 -1
  191. package/dist/jsx/FrappeList.native.js +37 -5
  192. package/dist/jsx/FrappeList.native.js.map +1 -1
  193. package/dist/jsx/FrappeListView.mjs +103 -30
  194. package/dist/jsx/FrappeListView.mjs.map +1 -1
  195. package/dist/jsx/FrappeListView.native.js +109 -29
  196. package/dist/jsx/FrappeListView.native.js.map +1 -1
  197. package/dist/jsx/FrappeProvider.mjs +7 -2
  198. package/dist/jsx/FrappeProvider.mjs.map +1 -1
  199. package/dist/jsx/FrappeProvider.native.js +7 -2
  200. package/dist/jsx/FrappeProvider.native.js.map +1 -1
  201. package/dist/jsx/FrappeReportBuilder.mjs +11 -12
  202. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  203. package/dist/jsx/FrappeReportBuilder.native.js +10 -16
  204. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  205. package/dist/jsx/FrappeRowsReader.mjs +24 -0
  206. package/dist/jsx/FrappeRowsReader.mjs.map +1 -0
  207. package/dist/jsx/FrappeRowsReader.native.js +53 -0
  208. package/dist/jsx/FrappeRowsReader.native.js.map +1 -0
  209. package/dist/jsx/FrappeTable.mjs +18 -6
  210. package/dist/jsx/FrappeTable.mjs.map +1 -1
  211. package/dist/jsx/FrappeTable.native.js +24 -6
  212. package/dist/jsx/FrappeTable.native.js.map +1 -1
  213. package/dist/jsx/fieldRegistry.mjs +35 -12
  214. package/dist/jsx/fieldRegistry.mjs.map +1 -1
  215. package/dist/jsx/fieldRegistry.native.js +59 -11
  216. package/dist/jsx/fieldRegistry.native.js.map +1 -1
  217. package/dist/jsx/fields/Date/index.native.js +5 -2
  218. package/dist/jsx/fields/Date/index.native.js.map +1 -1
  219. package/dist/jsx/fields/Date/sheetKeyboard.mjs +2 -2
  220. package/dist/jsx/fields/Date/sheetKeyboard.mjs.map +1 -1
  221. package/dist/jsx/fields/Date/sheetKeyboard.native.js +2 -2
  222. package/dist/jsx/fields/Date/sheetKeyboard.native.js.map +1 -1
  223. package/dist/jsx/fields/DateRange/index.mjs +2 -1
  224. package/dist/jsx/fields/DateRange/index.mjs.map +1 -1
  225. package/dist/jsx/fields/DateRange/index.native.js +4 -1
  226. package/dist/jsx/fields/DateRange/index.native.js.map +1 -1
  227. package/dist/jsx/fields/Password/index.mjs +1 -1
  228. package/dist/jsx/fields/Password/index.mjs.map +1 -1
  229. package/dist/jsx/fields/Password/index.native.js +1 -1
  230. package/dist/jsx/fields/Password/index.native.js.map +1 -1
  231. package/dist/jsx/formEngine/index.mjs +2 -1
  232. package/dist/jsx/formEngine/index.mjs.map +1 -1
  233. package/dist/jsx/formEngine/index.native.js +3 -1
  234. package/dist/jsx/formEngine/index.native.js.map +1 -1
  235. package/dist/jsx/formEngine/useSessionRoles.mjs +52 -0
  236. package/dist/jsx/formEngine/useSessionRoles.mjs.map +1 -0
  237. package/dist/jsx/formEngine/useSessionRoles.native.js +84 -0
  238. package/dist/jsx/formEngine/useSessionRoles.native.js.map +1 -0
  239. package/dist/jsx/frappeConnections.mjs +15 -0
  240. package/dist/jsx/frappeConnections.mjs.map +1 -0
  241. package/dist/jsx/frappeConnections.native.js +50 -0
  242. package/dist/jsx/frappeConnections.native.js.map +1 -0
  243. package/dist/jsx/frappeNavigation.mjs +78 -0
  244. package/dist/jsx/frappeNavigation.mjs.map +1 -0
  245. package/dist/jsx/frappeNavigation.native.js +112 -0
  246. package/dist/jsx/frappeNavigation.native.js.map +1 -0
  247. package/dist/jsx/index.js +7 -3
  248. package/dist/jsx/index.js.map +1 -1
  249. package/dist/jsx/index.mjs +7 -3
  250. package/dist/jsx/index.mjs.map +1 -1
  251. package/dist/jsx/index.native.js +18 -1
  252. package/dist/jsx/index.native.js.map +1 -1
  253. package/dist/jsx/schemaForm/index.mjs +4 -1
  254. package/dist/jsx/schemaForm/index.mjs.map +1 -1
  255. package/dist/jsx/schemaForm/index.native.js +4 -1
  256. package/dist/jsx/schemaForm/index.native.js.map +1 -1
  257. package/dist/jsx/useConnectionFilters.mjs +121 -0
  258. package/dist/jsx/useConnectionFilters.mjs.map +1 -0
  259. package/dist/jsx/useConnectionFilters.native.js +213 -0
  260. package/dist/jsx/useConnectionFilters.native.js.map +1 -0
  261. package/dist/jsx/useFrappePagination.mjs +38 -19
  262. package/dist/jsx/useFrappePagination.mjs.map +1 -1
  263. package/dist/jsx/useFrappePagination.native.js +59 -23
  264. package/dist/jsx/useFrappePagination.native.js.map +1 -1
  265. package/dist/jsx/useFrappeRows.mjs.map +1 -1
  266. package/dist/jsx/useFrappeRows.native.js.map +1 -1
  267. package/package.json +24 -20
  268. package/src/FileBrowser/AttachLibrary.stories.tsx +23 -0
  269. package/src/FrappeCalendar.radius.spec.tsx +55 -0
  270. package/src/FrappeCalendar.tsx +1 -0
  271. package/src/FrappeDashboard.tsx +11 -16
  272. package/src/FrappeForm.connections.spec.tsx +280 -0
  273. package/src/FrappeForm.connections.stories.tsx +93 -0
  274. package/src/FrappeForm.deskSemantics.spec.tsx +284 -0
  275. package/src/FrappeForm.tsx +560 -145
  276. package/src/FrappeFormConnections.tsx +148 -0
  277. package/src/FrappeGuestMeta.spec.tsx +143 -0
  278. package/src/FrappeImageView.tsx +8 -12
  279. package/src/FrappeList.tsx +71 -15
  280. package/src/FrappeListView.cards.spec.tsx +175 -0
  281. package/src/FrappeListView.cards.stories.tsx +131 -0
  282. package/src/FrappeListView.connections.spec.tsx +192 -0
  283. package/src/FrappeListView.connections.stories.tsx +99 -0
  284. package/src/FrappeListView.seed.spec.tsx +228 -0
  285. package/src/FrappeListView.tsx +177 -31
  286. package/src/FrappeProvider.tsx +13 -1
  287. package/src/FrappeReportBuilder.tsx +11 -19
  288. package/src/FrappeRowsReader.tsx +38 -0
  289. package/src/FrappeTable.optionalProps.spec.tsx +249 -0
  290. package/src/FrappeTable.spec.tsx +32 -42
  291. package/src/FrappeTable.stories.spec.tsx +55 -0
  292. package/src/FrappeTable.stories.tsx +28 -37
  293. package/src/FrappeTable.tsx +108 -45
  294. package/src/childTableDependsOn.spec.tsx +85 -0
  295. package/src/desk/DeskFormSidebar.spec.tsx +20 -0
  296. package/src/desk/DeskFormSidebar.stories.tsx +42 -0
  297. package/src/fieldRegistry.spec.tsx +27 -64
  298. package/src/fieldRegistry.ts +71 -14
  299. package/src/fields/Date/index.native.tsx +4 -2
  300. package/src/fields/Date/sheetKeyboard.spec.ts +14 -5
  301. package/src/fields/Date/sheetKeyboard.ts +12 -4
  302. package/src/fields/DateRange/DateRange.spec.tsx +67 -0
  303. package/src/fields/DateRange/index.tsx +5 -1
  304. package/src/fields/LinkTree.spec.tsx +8 -0
  305. package/src/fields/LinkTree.stories.tsx +28 -5
  306. package/src/fields/Password/index.tsx +1 -1
  307. package/src/fields/Select/Select.hydration.spec.tsx +177 -0
  308. package/src/formEngine/doctypeMeta.ts +15 -114
  309. package/src/formEngine/index.ts +2 -0
  310. package/src/formEngine/seam.spec.ts +23 -4
  311. package/src/formEngine/useSessionRoles.ts +73 -0
  312. package/src/frappeConnections.ts +50 -0
  313. package/src/frappeNavigation.tsx +112 -0
  314. package/src/frappeRoutes.spec.tsx +335 -0
  315. package/src/index.ts +28 -1
  316. package/src/schemaForm/index.tsx +1 -0
  317. package/src/useConnectionFilters.tsx +157 -0
  318. package/src/useFrappePagination.ts +70 -26
  319. package/src/useFrappeRows.sharedPath.spec.tsx +206 -0
  320. package/src/useFrappeRows.ts +5 -4
  321. package/types/FrappeCalendar.d.ts.map +1 -1
  322. package/types/FrappeDashboard.d.ts +3 -4
  323. package/types/FrappeDashboard.d.ts.map +1 -1
  324. package/types/FrappeForm.d.ts +57 -5
  325. package/types/FrappeForm.d.ts.map +1 -1
  326. package/types/FrappeFormConnections.d.ts +18 -0
  327. package/types/FrappeFormConnections.d.ts.map +1 -0
  328. package/types/FrappeImageView.d.ts +2 -3
  329. package/types/FrappeImageView.d.ts.map +1 -1
  330. package/types/FrappeList.d.ts +20 -2
  331. package/types/FrappeList.d.ts.map +1 -1
  332. package/types/FrappeListView.d.ts +53 -3
  333. package/types/FrappeListView.d.ts.map +1 -1
  334. package/types/FrappeProvider.d.ts +8 -1
  335. package/types/FrappeProvider.d.ts.map +1 -1
  336. package/types/FrappeReportBuilder.d.ts.map +1 -1
  337. package/types/FrappeRowsReader.d.ts +26 -0
  338. package/types/FrappeRowsReader.d.ts.map +1 -0
  339. package/types/FrappeTable.d.ts +39 -8
  340. package/types/FrappeTable.d.ts.map +1 -1
  341. package/types/fieldRegistry.d.ts +17 -3
  342. package/types/fieldRegistry.d.ts.map +1 -1
  343. package/types/fields/Date/index.native.d.ts.map +1 -1
  344. package/types/fields/Date/sheetKeyboard.d.ts +4 -3
  345. package/types/fields/Date/sheetKeyboard.d.ts.map +1 -1
  346. package/types/fields/DateRange/index.d.ts.map +1 -1
  347. package/types/formEngine/doctypeMeta.d.ts +10 -114
  348. package/types/formEngine/doctypeMeta.d.ts.map +1 -1
  349. package/types/formEngine/index.d.ts +1 -0
  350. package/types/formEngine/index.d.ts.map +1 -1
  351. package/types/formEngine/useSessionRoles.d.ts +19 -0
  352. package/types/formEngine/useSessionRoles.d.ts.map +1 -0
  353. package/types/frappeConnections.d.ts +33 -0
  354. package/types/frappeConnections.d.ts.map +1 -0
  355. package/types/frappeNavigation.d.ts +49 -0
  356. package/types/frappeNavigation.d.ts.map +1 -0
  357. package/types/index.d.ts +7 -3
  358. package/types/index.d.ts.map +1 -1
  359. package/types/schemaForm/index.d.ts.map +1 -1
  360. package/types/useConnectionFilters.d.ts +34 -0
  361. package/types/useConnectionFilters.d.ts.map +1 -0
  362. package/types/useFrappePagination.d.ts +18 -5
  363. package/types/useFrappePagination.d.ts.map +1 -1
  364. package/types/useFrappeRows.d.ts +5 -4
  365. package/types/useFrappeRows.d.ts.map +1 -1
  366. package/src/FileBrowser/AttachLibrary.spec.tsx +0 -74
@@ -31,13 +31,14 @@ __export(FrappeForm_exports, {
31
31
  });
32
32
  module.exports = __toCommonJS(FrappeForm_exports);
33
33
  var import_jsx_runtime = require("react/jsx-runtime");
34
+ var import_react = require("react");
34
35
  var import_frappe = require("@multiplatform.one/frappe");
35
36
  var import_components = require("@multiplatform.one/components");
36
37
  var import_schemaForm = require("./schemaForm/index.native.js");
37
38
  var import_FormSidebar = require("./FormSidebar.native.js");
38
39
  var import_db = require("@tanstack/db");
39
- var import_react = require("@phosphor-icons/react");
40
- var import_react2 = require("react");
40
+ var import_react2 = require("@phosphor-icons/react");
41
+ var import_react3 = require("react");
41
42
  var import_react_i18next = require("react-i18next");
42
43
  var import_forms = require("@multiplatform.one/forms");
43
44
  var import_tamagui = require("tamagui");
@@ -46,49 +47,73 @@ var import_FrappeProvider = require("./FrappeProvider.native.js");
46
47
  var import_FrappeReconnectIndicator = require("./FrappeReconnectIndicator.native.js");
47
48
  var import_timeline = require("./components/timeline.native.js");
48
49
  var import_desktop = require("@multiplatform.one/desktop");
49
- var LAYOUT_FIELDTYPES = /* @__PURE__ */new Set(["Section Break", "Column Break", "Tab Break"]);
50
+ var import_fetchFrom = require("./formEngine/fetchFrom.native.js");
51
+ var import_fieldPermissions = require("./formEngine/fieldPermissions.native.js");
52
+ var import_formActions = require("./formEngine/formActions.native.js");
53
+ var import_formLayout = require("./formEngine/formLayout.native.js");
54
+ var import_useSessionRoles = require("./formEngine/useSessionRoles.native.js");
55
+ var import_frappeConnections = require("./frappeConnections.native.js");
56
+ var import_FrappeFormConnections = require("./FrappeFormConnections.native.js");
57
+ var import_FrappeRowsReader = require("./FrappeRowsReader.native.js");
58
+ var import_frappeNavigation = require("./frappeNavigation.native.js");
59
+ function _instanceof(left, right) {
60
+ "@swc/helpers - instanceof";
61
+
62
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
63
+ return !!right[Symbol.hasInstance](left);
64
+ } else {
65
+ return left instanceof right;
66
+ }
67
+ }
50
68
  function isEmptyFieldValue(value) {
51
69
  if (value === void 0 || value === null) return true;
52
70
  if (typeof value === "string" && value.trim() === "") return true;
53
71
  if (Array.isArray(value) && value.length === 0) return true;
54
72
  return false;
55
73
  }
56
- function mapFieldToGenericSchema(field) {
57
- return {
58
- type: field.fieldtype,
59
- name: field.fieldname,
60
- label: field.label,
61
- options: field.options,
62
- required: !!field.reqd,
63
- hidden: !!field.hidden,
64
- readOnly: !!field.read_only,
65
- precision: field.precision,
66
- depends_on: field.depends_on,
67
- // Pass through additional Frappe-specific metadata
68
- fieldtype: field.fieldtype,
69
- fieldname: field.fieldname,
70
- in_list_view: field.in_list_view,
71
- in_standard_filter: field.in_standard_filter
72
- };
74
+ function sectionsToLayoutFields(sections) {
75
+ var fields = [];
76
+ sections.forEach(function (section, sectionIndex) {
77
+ fields.push({
78
+ fieldname: `__section_${sectionIndex}`,
79
+ fieldtype: section.tab ? "Tab Break" : "Section Break",
80
+ label: section.label,
81
+ collapsible: section.collapsible ? 1 : 0
82
+ });
83
+ section.columns.forEach(function (column, columnIndex) {
84
+ if (columnIndex > 0) {
85
+ fields.push({
86
+ fieldname: `__column_${sectionIndex}_${columnIndex}`,
87
+ fieldtype: "Column Break"
88
+ });
89
+ }
90
+ fields.push(...column.fields);
91
+ });
92
+ });
93
+ return fields;
73
94
  }
74
- function mapMetaToFormSchema(meta, sectionOverrides) {
75
- var sections = sectionOverrides !== null && sectionOverrides !== void 0 ? sectionOverrides : meta.sections;
76
- var genericSections = sections.map(function (section) {
95
+ var documentBookkeeping = /* @__PURE__ */new Set(["name", "owner", "creation", "modified", "modified_by", "docstatus", "idx", "doctype", "_user_tags", "_comments", "_assign", "_liked_by", "_seen"]);
96
+ function fieldsFromDocument(doc) {
97
+ return Object.entries(doc).filter(function (param) {
98
+ var [key, value] = param;
99
+ return !key.startsWith("$") && !documentBookkeeping.has(key) && (value === null || typeof value === "string" || typeof value === "number");
100
+ }).map(function (param) {
101
+ var [key, value] = param;
77
102
  return {
78
- label: section.label,
79
- collapsible: section.collapsible,
80
- columns: section.columns.map(function (col) {
81
- return {
82
- fields: col.fields.map(mapFieldToGenericSchema)
83
- };
84
- })
103
+ name: key,
104
+ label: key.replace(/_/g, " ").replace(/(^|\s)\S/g, function (c) {
105
+ return c.toUpperCase();
106
+ }),
107
+ type: typeof value === "number" ? Number.isInteger(value) ? "Int" : "Float" : "Data",
108
+ readOnly: true
85
109
  };
86
110
  });
87
- var allFields = meta.fields.map(mapFieldToGenericSchema);
88
- return {
89
- sections: genericSections,
90
- fields: allFields
91
- };
111
+ }
112
+ function hasRestrictedPermLevel(meta) {
113
+ return !!(meta === null || meta === void 0 ? void 0 : meta.fields.some(function (field) {
114
+ var _field_permlevel;
115
+ return Number((_field_permlevel = field.permlevel) !== null && _field_permlevel !== void 0 ? _field_permlevel : 0) > 0;
116
+ }));
92
117
  }
93
118
  function resolveFileUrl(value, baseURL) {
94
119
  if (!value || typeof value !== "string") return void 0;
@@ -163,7 +188,85 @@ function mapDocToSidebarMetadata(doc, t) {
163
188
  }
164
189
  return metadata;
165
190
  }
166
- function FrappeForm(param) {
191
+ function FrappeForm(props) {
192
+ var {
193
+ route,
194
+ ...formProps
195
+ } = props;
196
+ if (route === void 0) return /* @__PURE__ */(0, import_jsx_runtime.jsx)(FrappeFormBody, {
197
+ ...formProps
198
+ });
199
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(FrappeFormRoute, {
200
+ ...formProps,
201
+ route
202
+ });
203
+ }
204
+ function FrappeFormRoute(param) {
205
+ var {
206
+ route,
207
+ name: nameProp,
208
+ onSave,
209
+ onCancel,
210
+ onDelete,
211
+ onEdit,
212
+ ...props
213
+ } = param;
214
+ var router = (0, import_frappeNavigation.useFrappeRouter)();
215
+ var fromPath = router ? (0, import_frappeNavigation.frappeRouteTarget)(route, router.pathname) : void 0;
216
+ var target = nameProp ? {
217
+ mode: (fromPath === null || fromPath === void 0 ? void 0 : fromPath.mode) === "view" ? "view" : "edit",
218
+ name: nameProp
219
+ } : (fromPath === null || fromPath === void 0 ? void 0 : fromPath.mode) === "view" || (fromPath === null || fromPath === void 0 ? void 0 : fromPath.mode) === "edit" ? fromPath : {
220
+ mode: "create"
221
+ };
222
+ var go = function go2(next) {
223
+ return router === null || router === void 0 ? void 0 : router.navigate((0, import_frappeNavigation.frappeRouteHref)(route, next));
224
+ };
225
+ var name = target.mode === "view" || target.mode === "edit" ? target.name : void 0;
226
+ return /* @__PURE__ */(0, import_react.createElement)(FrappeFormBody, {
227
+ ...props,
228
+ // A new target is a new page: no state carries over from the last one.
229
+ key: `${target.mode}:${name !== null && name !== void 0 ? name : ""}`,
230
+ name,
231
+ routePage: {
232
+ onBack: function onBack() {
233
+ return go({
234
+ mode: "list"
235
+ });
236
+ }
237
+ },
238
+ onEdit: target.mode === "view" ? onEdit !== null && onEdit !== void 0 ? onEdit : function () {
239
+ return go({
240
+ mode: "edit",
241
+ name: target.name
242
+ });
243
+ } : void 0,
244
+ onSave: onSave !== null && onSave !== void 0 ? onSave : function (doc) {
245
+ var _doc_name;
246
+ var saved = (_doc_name = doc.name) !== null && _doc_name !== void 0 ? _doc_name : name;
247
+ go(saved ? {
248
+ mode: "view",
249
+ name: saved
250
+ } : {
251
+ mode: "list"
252
+ });
253
+ },
254
+ onCancel: onCancel !== null && onCancel !== void 0 ? onCancel : function () {
255
+ return go(name ? {
256
+ mode: "view",
257
+ name
258
+ } : {
259
+ mode: "list"
260
+ });
261
+ },
262
+ onDelete: onDelete !== null && onDelete !== void 0 ? onDelete : function () {
263
+ return go({
264
+ mode: "list"
265
+ });
266
+ }
267
+ });
268
+ }
269
+ function FrappeFormBody(param) {
167
270
  var {
168
271
  baseURL,
169
272
  auth,
@@ -177,15 +280,26 @@ function FrappeForm(param) {
177
280
  readOnlyFields,
178
281
  sections,
179
282
  order,
283
+ roles,
180
284
  onSave,
181
285
  onCancel,
182
286
  onDelete,
287
+ onEdit,
183
288
  showToolbar = true,
184
289
  showSidebar = true,
185
290
  showTimeline = true,
186
291
  disabled = false,
187
- sectionHeadingLevel
292
+ sectionHeadingLevel,
293
+ connections,
294
+ showConnections = true,
295
+ initialDoc,
296
+ loadingFallback,
297
+ notFoundFallback,
298
+ errorFallback,
299
+ routePage
188
300
  } = param;
301
+ var _ref, _ref1;
302
+ var _tabItems_, _tabItems_1;
189
303
  var config = (0, import_FrappeProvider.useFrappeConfig)();
190
304
  var {
191
305
  knobProps
@@ -193,16 +307,25 @@ function FrappeForm(param) {
193
307
  var {
194
308
  t
195
309
  } = (0, import_react_i18next.useTranslation)();
196
- var [localDoc, setLocalDoc] = (0, import_react2.useState)({});
197
- var [baselineDoc, setBaselineDoc] = (0, import_react2.useState)(void 0);
198
- var [conflictFields, setConflictFields] = (0, import_react2.useState)([]);
199
- var [wasDeleted, setWasDeleted] = (0, import_react2.useState)(false);
200
- var [isSubmitting, setIsSubmitting] = (0, import_react2.useState)(false);
201
- var [errors, setErrors] = (0, import_react2.useState)({});
202
- var everLoadedRef = (0, import_react2.useRef)(false);
203
- var localDocRef = (0, import_react2.useRef)(localDoc);
310
+ var seedDoc = name && initialDoc && initialDoc.name === name ? initialDoc : void 0;
311
+ var seedRef = (0, import_react3.useRef)(seedDoc);
312
+ seedRef.current = seedDoc;
313
+ var [localDoc, setLocalDoc] = (0, import_react3.useState)(function () {
314
+ return seedDoc !== null && seedDoc !== void 0 ? seedDoc : {};
315
+ });
316
+ var [baselineDoc, setBaselineDoc] = (0, import_react3.useState)(function () {
317
+ return seedDoc;
318
+ });
319
+ var [docError, setDocError] = (0, import_react3.useState)(null);
320
+ var [conflictFields, setConflictFields] = (0, import_react3.useState)([]);
321
+ var [wasDeleted, setWasDeleted] = (0, import_react3.useState)(false);
322
+ var [isSubmitting, setIsSubmitting] = (0, import_react3.useState)(false);
323
+ var [errors, setErrors] = (0, import_react3.useState)({});
324
+ var [activeTab, setActiveTab] = (0, import_react3.useState)(void 0);
325
+ var everLoadedRef = (0, import_react3.useRef)(false);
326
+ var localDocRef = (0, import_react3.useRef)(localDoc);
204
327
  localDocRef.current = localDoc;
205
- var baselineRef = (0, import_react2.useRef)(baselineDoc);
328
+ var baselineRef = (0, import_react3.useRef)(baselineDoc);
206
329
  baselineRef.current = baselineDoc;
207
330
  var finalBaseURL = baseURL !== null && baseURL !== void 0 ? baseURL : config === null || config === void 0 ? void 0 : config.baseURL;
208
331
  var finalAuth = auth !== null && auth !== void 0 ? auth : config === null || config === void 0 ? void 0 : config.auth;
@@ -210,7 +333,7 @@ function FrappeForm(param) {
210
333
  if (!finalBaseURL) {
211
334
  throw new Error("FrappeForm requires baseURL prop or FrappeProvider with baseURL");
212
335
  }
213
- var frappeConfig = (0, import_react2.useMemo)(function () {
336
+ var frappeConfig = (0, import_react3.useMemo)(function () {
214
337
  return {
215
338
  baseURL: finalBaseURL,
216
339
  socketPort: config === null || config === void 0 ? void 0 : config.socketPort,
@@ -227,18 +350,63 @@ function FrappeForm(param) {
227
350
  isLoading: isMetaLoading,
228
351
  error: metaError
229
352
  } = (0, import_frappe.useDocTypeMeta)(frappeConfig, doctype);
230
- var formSchema = (0, import_react2.useMemo)(function () {
353
+ var sessionRoles = (0, import_useSessionRoles.useSessionRoles)(!roles && hasRestrictedPermLevel(meta) ? frappeConfig : void 0);
354
+ var effectiveRoles = roles !== null && roles !== void 0 ? roles : sessionRoles;
355
+ var permLevels = (0, import_react3.useMemo)(function () {
356
+ return (0, import_fieldPermissions.buildPermLevelMatrix)(meta === null || meta === void 0 ? void 0 : meta.permissions, effectiveRoles);
357
+ }, [meta === null || meta === void 0 ? void 0 : meta.permissions, effectiveRoles]);
358
+ var isCreate = !name;
359
+ var docstatus = Number((_ref = baselineDoc === null || baselineDoc === void 0 ? void 0 : baselineDoc.docstatus) !== null && _ref !== void 0 ? _ref : 0);
360
+ var layoutFields = (0, import_react3.useMemo)(function () {
231
361
  if (!meta) return void 0;
232
- return mapMetaToFormSchema(meta, sections);
362
+ return sections ? sectionsToLayoutFields(sections) : meta.fields;
233
363
  }, [meta, sections]);
234
- var hideFieldSet = (0, import_react2.useMemo)(function () {
235
- return new Set(hideFields !== null && hideFields !== void 0 ? hideFields : []);
236
- }, [hideFields]);
364
+ var formTabs = (0, import_react3.useMemo)(function () {
365
+ if (!layoutFields) return void 0;
366
+ return (0, import_formLayout.buildFormTabs)({
367
+ fields: layoutFields,
368
+ doc: {
369
+ ...localDoc,
370
+ __islocal: isCreate ? 1 : 0
371
+ },
372
+ docstatus,
373
+ formReadOnly: !!(meta === null || meta === void 0 ? void 0 : meta.read_only),
374
+ isCreate,
375
+ detailsLabel: t("Details"),
376
+ permLevels,
377
+ hiddenFields: hideFields
378
+ });
379
+ }, [layoutFields, localDoc, docstatus, meta === null || meta === void 0 ? void 0 : meta.read_only, isCreate, permLevels, hideFields, t]);
380
+ var readsWithoutMeta = !children && !meta && Boolean(metaError) && Boolean(name);
381
+ var recordTabs = (0, import_react3.useMemo)(function () {
382
+ if (!readsWithoutMeta || !baselineDoc) return void 0;
383
+ var recordFields = fieldsFromDocument(baselineDoc);
384
+ return [{
385
+ key: "__details",
386
+ label: t("Details"),
387
+ schema: {
388
+ sections: [{
389
+ columns: [{
390
+ fields: recordFields
391
+ }]
392
+ }],
393
+ fields: recordFields
394
+ }
395
+ }];
396
+ }, [readsWithoutMeta, baselineDoc, t]);
397
+ var promptNamed = isCreate && !!meta && (0, import_formLayout.isPromptNamed)(meta.autoname, meta.naming_rule);
398
+ var fetchMap = (0, import_react3.useMemo)(function () {
399
+ return meta ? (0, import_fetchFrom.buildFetchMap)(meta.fields) : void 0;
400
+ }, [meta]);
401
+ var handleDocSyncError = (0, import_react3.useCallback)(function (err) {
402
+ setDocError(_instanceof(err, Error) ? err : new Error(String(err)));
403
+ }, []);
237
404
  var docCollection = (0, import_frappe.useFrappeCollection)(name ? frappeConfig : void 0, doctype, {
238
405
  fields,
239
406
  filters: name ? {
240
407
  name
241
- } : void 0
408
+ } : void 0,
409
+ onSyncError: handleDocSyncError
242
410
  });
243
411
  var {
244
412
  data: rawDocData,
@@ -255,7 +423,7 @@ function FrappeForm(param) {
255
423
  return (0, import_db.eq)(_doc.name, name);
256
424
  });
257
425
  }, [docCollection, name]);
258
- var liveDoc = (0, import_react2.useMemo)(function () {
426
+ var liveDoc = (0, import_react3.useMemo)(function () {
259
427
  var _arr_;
260
428
  var arr = Array.isArray(rawDocData) ? rawDocData : rawDocData ? [rawDocData] : [];
261
429
  var doc = (_arr_ = arr[0]) !== null && _arr_ !== void 0 ? _arr_ : null;
@@ -284,7 +452,7 @@ function FrappeForm(param) {
284
452
  _share: shareCollection
285
453
  }) : null;
286
454
  }, [shareCollection]);
287
- var shareRows = (0, import_react2.useMemo)(function () {
455
+ var shareRows = (0, import_react3.useMemo)(function () {
288
456
  return shareCollection ? rawShareRows !== null && rawShareRows !== void 0 ? rawShareRows : [] : void 0;
289
457
  }, [shareCollection, rawShareRows]);
290
458
  var assignmentCollection = (0, import_frappe.useFrappeCollection)(showSidebar && name && !frappeConfig.fixtures ? frappeConfig : void 0, "ToDo", {
@@ -302,21 +470,91 @@ function FrappeForm(param) {
302
470
  _assignment: assignmentCollection
303
471
  }) : null;
304
472
  }, [assignmentCollection]);
305
- var assignmentRows = (0, import_react2.useMemo)(function () {
473
+ var assignmentRows = (0, import_react3.useMemo)(function () {
306
474
  return assignmentCollection ? rawAssignmentRows !== null && rawAssignmentRows !== void 0 ? rawAssignmentRows : [] : void 0;
307
475
  }, [assignmentCollection, rawAssignmentRows]);
308
- (0, import_react2.useEffect)(function () {
476
+ (0, import_react3.useEffect)(function () {
309
477
  everLoadedRef.current = false;
310
478
  setWasDeleted(false);
311
479
  setConflictFields([]);
312
- setBaselineDoc(void 0);
480
+ setDocError(null);
481
+ var seed = seedRef.current;
482
+ setBaselineDoc(seed);
483
+ if (seed) setLocalDoc(seed);
313
484
  }, [doctype, name]);
485
+ var effectiveConnections = (0, import_react3.useMemo)(function () {
486
+ return connections !== null && connections !== void 0 ? connections : (0, import_frappeConnections.connectionsFromMeta)(meta);
487
+ }, [connections, meta]);
488
+ var readsConnections = Boolean(children) && Boolean(name) && effectiveConnections.length > 0;
489
+ var [connectionSnapshots, setConnectionSnapshots] = (0, import_react3.useState)({});
490
+ (0, import_react3.useEffect)(function () {
491
+ setConnectionSnapshots({});
492
+ }, [doctype, name]);
493
+ var connectionReads = (0, import_react3.useMemo)(function () {
494
+ return readsConnections && name ? effectiveConnections.map(function (link) {
495
+ var _link_limit;
496
+ return {
497
+ link,
498
+ options: {
499
+ fields: (0, import_frappeConnections.connectionFields)(link),
500
+ filters: [[link.fieldname, "=", name]],
501
+ limit: (_link_limit = link.limit) !== null && _link_limit !== void 0 ? _link_limit : 0
502
+ },
503
+ onChange: function onChange(snapshot) {
504
+ return setConnectionSnapshots(function (prev) {
505
+ return {
506
+ ...prev,
507
+ [link.doctype]: snapshot
508
+ };
509
+ });
510
+ }
511
+ };
512
+ }) : [];
513
+ }, [readsConnections, effectiveConnections, name]);
514
+ var connectionRows = (0, import_react3.useMemo)(function () {
515
+ var rows = {};
516
+ var _iteratorNormalCompletion = true,
517
+ _didIteratorError = false,
518
+ _iteratorError = void 0;
519
+ try {
520
+ for (var _iterator = connectionReads[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
521
+ var {
522
+ link
523
+ } = _step.value;
524
+ var _ref2;
525
+ var _connectionSnapshots_link_doctype;
526
+ rows[link.doctype] = (_ref2 = (_connectionSnapshots_link_doctype = connectionSnapshots[link.doctype]) === null || _connectionSnapshots_link_doctype === void 0 ? void 0 : _connectionSnapshots_link_doctype.rows) !== null && _ref2 !== void 0 ? _ref2 : [];
527
+ }
528
+ } catch (err) {
529
+ _didIteratorError = true;
530
+ _iteratorError = err;
531
+ } finally {
532
+ try {
533
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
534
+ _iterator.return();
535
+ }
536
+ } finally {
537
+ if (_didIteratorError) {
538
+ throw _iteratorError;
539
+ }
540
+ }
541
+ }
542
+ return rows;
543
+ }, [connectionReads, connectionSnapshots]);
544
+ var connectionsLoading = connectionReads.some(function (param2) {
545
+ var {
546
+ link
547
+ } = param2;
548
+ var _ref2;
549
+ var _connectionSnapshots_link_doctype;
550
+ 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;
551
+ });
314
552
  (0, import_frappe.useFrappeDoctypeEvents)(name ? frappeConfig : void 0, doctype, function (event) {
315
553
  if (event.type !== "doc_deleted") return;
316
554
  var payload = event.payload;
317
555
  if ((payload === null || payload === void 0 ? void 0 : payload.name) === name) setWasDeleted(true);
318
556
  }, Boolean(name));
319
- (0, import_react2.useEffect)(function () {
557
+ (0, import_react3.useEffect)(function () {
320
558
  var incoming = liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data;
321
559
  if (incoming) {
322
560
  everLoadedRef.current = true;
@@ -373,7 +611,7 @@ function FrappeForm(param) {
373
611
  });
374
612
  }
375
613
  }, [liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data, liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.isLoading, doctype, name]);
376
- var dirtyFieldNames = (0, import_react2.useMemo)(function () {
614
+ var dirtyFieldNames = (0, import_react3.useMemo)(function () {
377
615
  var local = localDoc;
378
616
  var base = baselineDoc;
379
617
  var dirty = [];
@@ -403,6 +641,40 @@ function FrappeForm(param) {
403
641
  return dirty;
404
642
  }, [localDoc, baselineDoc]);
405
643
  var hasUnsavedChanges = dirtyFieldNames.length > 0;
644
+ var runFetchFrom = function runFetchFrom2(field, value) {
645
+ var rules = fetchMap === null || fetchMap === void 0 ? void 0 : fetchMap.get(field);
646
+ if (!rules || rules.length === 0) return;
647
+ var applyPatch = function applyPatch2(fetched2) {
648
+ setLocalDoc(function (prev) {
649
+ var current = prev;
650
+ if (current[field] !== value) return prev;
651
+ var patch = (0, import_fetchFrom.applyFetchedValues)(rules, fetched2, current);
652
+ return Object.keys(patch).length > 0 ? {
653
+ ...current,
654
+ ...patch
655
+ } : prev;
656
+ });
657
+ };
658
+ if (isEmptyFieldValue(value)) {
659
+ applyPatch({});
660
+ return;
661
+ }
662
+ var linkField = meta === null || meta === void 0 ? void 0 : meta.fields.find(function (metaField) {
663
+ return metaField.fieldname === field;
664
+ });
665
+ var targetDoctype = typeof (linkField === null || linkField === void 0 ? void 0 : linkField.options) === "string" ? linkField.options : "";
666
+ if (!targetDoctype) return;
667
+ var sources = Array.from(new Set(rules.map(function (rule) {
668
+ return rule.source;
669
+ })));
670
+ var fixtures = frappeConfig.fixtures;
671
+ var fetched = fixtures ? fixtures.getDoc(targetDoctype, String(value), sources).then(function (doc) {
672
+ return doc !== null && doc !== void 0 ? doc : {};
673
+ }) : (0, import_formActions.validateLink)((0, import_formActions.createHttpClient)(frappeConfig), targetDoctype, String(value), sources);
674
+ fetched.then(applyPatch).catch(function () {
675
+ return void 0;
676
+ });
677
+ };
406
678
  var setValue = function setValue2(field, value) {
407
679
  setLocalDoc(function (prev) {
408
680
  return {
@@ -417,24 +689,47 @@ function FrappeForm(param) {
417
689
  delete newErrors[String(field)];
418
690
  return newErrors;
419
691
  });
692
+ runFetchFrom(String(field), value);
420
693
  };
421
694
  var validateRequiredFields = function validateRequiredFields2() {
422
- if (!meta) return {};
695
+ if (!formTabs) return {};
423
696
  var validationErrors = {};
424
697
  var doc = localDoc;
698
+ if (promptNamed && isEmptyFieldValue(doc.name)) {
699
+ validationErrors.name = t("Name is required");
700
+ }
425
701
  var _iteratorNormalCompletion = true,
426
702
  _didIteratorError = false,
427
703
  _iteratorError = void 0;
428
704
  try {
429
- for (var _iterator = meta.fields[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
430
- var field = _step.value;
431
- if (!field.reqd) continue;
432
- if (field.hidden || LAYOUT_FIELDTYPES.has(field.fieldtype)) continue;
433
- if (hideFieldSet.has(field.fieldname)) continue;
434
- if (isEmptyFieldValue(doc[field.fieldname])) {
435
- validationErrors[field.fieldname] = t("{{label}} is required", {
436
- label: field.label || field.fieldname
437
- });
705
+ for (var _iterator = formTabs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
706
+ var tab = _step.value;
707
+ var _iteratorNormalCompletion1 = true,
708
+ _didIteratorError1 = false,
709
+ _iteratorError1 = void 0;
710
+ try {
711
+ for (var _iterator1 = tab.schema.fields[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
712
+ var field = _step1.value;
713
+ if (!field.required) continue;
714
+ if (isEmptyFieldValue(doc[field.name])) {
715
+ validationErrors[field.name] = t("{{label}} is required", {
716
+ label: field.label || field.name
717
+ });
718
+ }
719
+ }
720
+ } catch (err) {
721
+ _didIteratorError1 = true;
722
+ _iteratorError1 = err;
723
+ } finally {
724
+ try {
725
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
726
+ _iterator1.return();
727
+ }
728
+ } finally {
729
+ if (_didIteratorError1) {
730
+ throw _iteratorError1;
731
+ }
732
+ }
438
733
  }
439
734
  }
440
735
  } catch (err) {
@@ -496,15 +791,23 @@ function FrappeForm(param) {
496
791
  }
497
792
  setConflictFields([]);
498
793
  } else {
499
- var _localDoc_name;
794
+ var _localDoc_name, _ref2;
795
+ var _getFrappeSyncModule;
500
796
  if (!collection) return;
797
+ var temporaryName = (_localDoc_name = localDoc.name) !== null && _localDoc_name !== void 0 ? _localDoc_name : `new-${Date.now()}`;
501
798
  var docToInsert = {
502
799
  ...localDoc,
503
800
  doctype,
504
- name: (_localDoc_name = localDoc.name) !== null && _localDoc_name !== void 0 ? _localDoc_name : `new-${Date.now()}`
801
+ name: temporaryName
505
802
  };
506
803
  var tx1 = collection.insert(docToInsert);
507
804
  await tx1.isPersisted.promise;
805
+ var createdName = (_ref2 = (_getFrappeSyncModule = (0, import_frappe.getFrappeSyncModule)(frappeConfig)) === null || _getFrappeSyncModule === void 0 ? void 0 : _getFrappeSyncModule.createdName(temporaryName)) !== null && _ref2 !== void 0 ? _ref2 : temporaryName;
806
+ onSave === null || onSave === void 0 ? void 0 : onSave({
807
+ ...localDoc,
808
+ name: createdName
809
+ });
810
+ return;
508
811
  }
509
812
  onSave === null || onSave === void 0 ? void 0 : onSave(localDoc);
510
813
  } catch (err1) {
@@ -586,17 +889,47 @@ function FrappeForm(param) {
586
889
  setIsSubmitting(false);
587
890
  }
588
891
  };
892
+ var titleField = meta === null || meta === void 0 ? void 0 : meta.title_field;
893
+ var titleValue = titleField ? localDoc[titleField] : void 0;
894
+ var pageTitle = isCreate ? t("New {{doctype}}", {
895
+ doctype
896
+ }) : String(titleValue || name);
897
+ var frame = function frame2(content, aside) {
898
+ return routePage ?
899
+ // flexBasis auto: see DeskFormPage (react-native-web's min-height:0
900
+ // reset would cap the scroll page at viewport height).
901
+ /* @__PURE__ */
902
+ (0, import_jsx_runtime.jsx)(import_components.DetailPageLayout, {
903
+ flexBasis: "auto",
904
+ toolbarLeading: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
905
+ size: "$3",
906
+ chromeless: true,
907
+ icon: import_react2.ArrowLeftIcon,
908
+ onPress: routePage.onBack,
909
+ "aria-label": t("Back to {{doctype}} list", {
910
+ doctype
911
+ }),
912
+ children: doctype
913
+ }),
914
+ header: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.PageHeader, {
915
+ title: pageTitle,
916
+ divider: false
917
+ }),
918
+ aside,
919
+ children: content
920
+ }) : content;
921
+ };
589
922
  if (!children && isMetaLoading && !meta) {
590
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.YStack, {
923
+ return frame(/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.YStack, {
591
924
  ...knobProps.panelPadding,
592
925
  testID: "frappe-form-skeleton",
593
926
  children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncSkeleton, {
594
927
  layout: "generic"
595
928
  })
596
- });
929
+ }));
597
930
  }
598
- if (!children && metaError && !meta) {
599
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
931
+ if (!children && metaError && !meta && !name) {
932
+ return frame(/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
600
933
  ...knobProps.panelPadding,
601
934
  alignItems: "center",
602
935
  ...knobProps.gap,
@@ -611,19 +944,33 @@ function FrappeForm(param) {
611
944
  ...knobProps.body,
612
945
  children: metaError.message
613
946
  })]
614
- });
947
+ }));
615
948
  }
616
- if (name && (liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.isLoading) && !wasDeleted) {
617
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.YStack, {
949
+ var isDocReading = Boolean(name) && (!docCollection || Boolean(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.isLoading));
950
+ var showsSeed = Boolean(seedDoc) && isDocReading;
951
+ if (name && docError && !(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data) && !wasDeleted) {
952
+ if (errorFallback !== void 0) return frame(errorFallback);
953
+ return frame(/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncBoundary, {
954
+ ...knobProps.panelPadding,
955
+ error: docError,
956
+ errorTitle: t("Failed to load {{doctype}}", {
957
+ doctype
958
+ })
959
+ }));
960
+ }
961
+ if (name && isDocReading && !showsSeed && !wasDeleted) {
962
+ if (loadingFallback !== void 0) return frame(loadingFallback);
963
+ return frame(/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.YStack, {
618
964
  ...knobProps.panelPadding,
619
965
  testID: "frappe-form-skeleton",
620
966
  children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncSkeleton, {
621
967
  layout: "generic"
622
968
  })
623
- });
969
+ }));
624
970
  }
625
- if (name && !(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.isLoading) && !(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data) && !wasDeleted) {
626
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
971
+ if (name && !isDocReading && !(liveDoc === null || liveDoc === void 0 ? void 0 : liveDoc.data) && !wasDeleted) {
972
+ if (notFoundFallback !== void 0) return frame(notFoundFallback);
973
+ return frame(/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
627
974
  ...knobProps.panelPadding,
628
975
  alignItems: "center",
629
976
  ...knobProps.gap,
@@ -640,9 +987,12 @@ function FrappeForm(param) {
640
987
  name
641
988
  })
642
989
  })]
643
- });
990
+ }));
644
991
  }
645
992
  var effectiveDisabled = disabled || wasDeleted;
993
+ var readOnlyView = Boolean(onEdit) || readsWithoutMeta;
994
+ var fieldsDisabled = effectiveDisabled || readOnlyView;
995
+ var shownTabs = formTabs !== null && formTabs !== void 0 ? formTabs : recordTabs;
646
996
  var imageFieldName = meta === null || meta === void 0 ? void 0 : meta.image_field;
647
997
  var sidebarImageUrl = imageFieldName ? resolveFileUrl(localDoc[imageFieldName], finalBaseURL) : void 0;
648
998
  var conflictLabels = conflictFields.map(function (fieldname) {
@@ -651,138 +1001,192 @@ function FrappeForm(param) {
651
1001
  });
652
1002
  return (field === null || field === void 0 ? void 0 : field.label) || fieldname;
653
1003
  }).join(", ");
654
- return (
655
- // flexBasis auto (not the flex:1 shorthand's 0%): inside scroll-flow page
656
- // scaffolds (LC-29 templates) the parent is auto-height, and a 0% basis
657
- // collapses this stack to zero height on web — content then paints over
658
- // whatever follows. Bounded parents still fill (grow 1) exactly as before.
1004
+ var formTabItems = (shownTabs !== null && shownTabs !== void 0 ? shownTabs : []).map(function (tab) {
1005
+ return {
1006
+ value: tab.key,
1007
+ label: tab.label,
1008
+ content: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_schemaForm.SchemaForm, {
1009
+ schema: tab.schema,
1010
+ doc: localDoc,
1011
+ setValue: function setValue1(field, value) {
1012
+ return setValue(field, value);
1013
+ },
1014
+ errors,
1015
+ disabled: fieldsDisabled,
1016
+ overrides,
1017
+ readOnlyFields,
1018
+ sectionHeadingLevel,
1019
+ order
1020
+ })
1021
+ };
1022
+ });
1023
+ var tabItems = showConnections && name && effectiveConnections.length > 0 ? [...formTabItems, {
1024
+ value: "__connections",
1025
+ label: t("Connections"),
1026
+ content: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeFormConnections.FrappeFormConnections, {
1027
+ connection: frappeConfig,
1028
+ connections: effectiveConnections,
1029
+ name
1030
+ })
1031
+ }] : formTabItems;
1032
+ var effectiveTab = activeTab && tabItems.some(function (tab) {
1033
+ return tab.value === activeTab;
1034
+ }) ? activeTab : (_tabItems_ = tabItems[0]) === null || _tabItems_ === void 0 ? void 0 : _tabItems_.value;
1035
+ var localName = localDoc.name;
1036
+ var sidebar = showSidebar && name && meta ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormSidebar.FormSidebar, {
1037
+ imageUrl: sidebarImageUrl,
1038
+ sections: buildSidebarSections(localDoc, shareRows, t, assignmentRows),
1039
+ metadata: mapDocToSidebarMetadata(localDoc, t)
1040
+ }) : void 0;
1041
+ return frame(
1042
+ // flexBasis auto (not the flex:1 shorthand's 0%): inside scroll-flow page
1043
+ // scaffolds (LC-29 templates) the parent is auto-height, and a 0% basis
1044
+ // collapses this stack to zero height on web — content then paints over
1045
+ // whatever follows. Bounded parents still fill (grow 1) exactly as before.
1046
+ /* @__PURE__ */
1047
+ (0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
1048
+ ...knobProps.gapLg,
1049
+ flexGrow: 1,
1050
+ flexShrink: 1,
1051
+ flexBasis: "auto",
1052
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeReconnectIndicator.FrappeReconnectIndicator, {
1053
+ config: frappeConfig
1054
+ }), connectionReads.map(function (read) {
1055
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeRowsReader.FrappeRowsReader, {
1056
+ connection: frappeConfig,
1057
+ doctype: read.link.doctype,
1058
+ options: read.options,
1059
+ onChange: read.onChange
1060
+ }, read.link.doctype);
1061
+ }), wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.XStack, {
1062
+ role: "alert",
1063
+ alignItems: "center",
1064
+ ...knobProps.containerRadius,
1065
+ ...knobProps.panelPadding,
1066
+ backgroundColor: "$red3",
1067
+ testID: "frappe-form-deleted-banner",
1068
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
1069
+ color: import_forms.formCommonColors.error,
1070
+ ...knobProps.body,
1071
+ children: hasUnsavedChanges ? t("This {{doctype}} was deleted on the server. Fields are read-only and your unsaved edits can no longer be saved.", {
1072
+ doctype
1073
+ }) : t("This {{doctype}} was deleted on the server. Fields are read-only.", {
1074
+ doctype
1075
+ })
1076
+ })
1077
+ }), !wasDeleted && conflictFields.length > 0 && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.XStack, {
1078
+ role: "status",
1079
+ alignItems: "center",
1080
+ ...knobProps.containerRadius,
1081
+ ...knobProps.panelPadding,
1082
+ backgroundColor: "$orange3",
1083
+ testID: "frappe-form-conflict-banner",
1084
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
1085
+ color: "$orange11",
1086
+ ...knobProps.body,
1087
+ children: t("Changed elsewhere while you were editing: {{fields}}. Your edits are kept \u2014 saving will overwrite the newer server values.", {
1088
+ fields: conflictLabels
1089
+ })
1090
+ })
1091
+ }),
1092
+ /* flexBasis auto — see the root stack note (zero-height collapse in
1093
+ auto-height scroll flows would paint the Timeline over the form). */
659
1094
  /* @__PURE__ */
660
- (0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
661
- ...knobProps.gapLg,
1095
+ (0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
662
1096
  flexGrow: 1,
663
1097
  flexShrink: 1,
664
1098
  flexBasis: "auto",
665
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeReconnectIndicator.FrappeReconnectIndicator, {
666
- config: frappeConfig
667
- }), wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.XStack, {
668
- role: "alert",
669
- alignItems: "center",
670
- ...knobProps.containerRadius,
671
- ...knobProps.panelPadding,
672
- backgroundColor: "$red3",
673
- testID: "frappe-form-deleted-banner",
674
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
675
- color: import_forms.formCommonColors.error,
676
- ...knobProps.body,
677
- children: hasUnsavedChanges ? t("This {{doctype}} was deleted on the server. Fields are read-only and your unsaved edits can no longer be saved.", {
678
- doctype
679
- }) : t("This {{doctype}} was deleted on the server. Fields are read-only.", {
680
- doctype
681
- })
682
- })
683
- }), !wasDeleted && conflictFields.length > 0 && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.XStack, {
684
- role: "status",
685
- alignItems: "center",
686
- ...knobProps.containerRadius,
687
- ...knobProps.panelPadding,
688
- backgroundColor: "$orange3",
689
- testID: "frappe-form-conflict-banner",
690
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
691
- color: "$orange11",
692
- ...knobProps.body,
693
- children: t("Changed elsewhere while you were editing: {{fields}}. Your edits are kept \u2014 saving will overwrite the newer server values.", {
694
- fields: conflictLabels
695
- })
696
- })
697
- }),
698
- /* flexBasis auto — see the root stack note (zero-height collapse in
699
- auto-height scroll flows would paint the Timeline over the form). */
700
- /* @__PURE__ */
701
- (0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
702
- flexGrow: 1,
703
- flexShrink: 1,
704
- flexBasis: "auto",
1099
+ ...knobProps.gapLg,
1100
+ children: [
1101
+ /* Sidebar (edit mode only) — assignments/shares/image are live.
1102
+ A routed page carries it in the template's aside instead. */
1103
+ routePage ? null : sidebar, /* Form body */
1104
+ /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
1105
+ flex: 1,
705
1106
  ...knobProps.gapLg,
706
- children: [/* Sidebar (edit mode only) — assignments/shares/image are live */
707
- showSidebar && name && meta && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormSidebar.FormSidebar, {
708
- imageUrl: sidebarImageUrl,
709
- sections: buildSidebarSections(localDoc, shareRows, t, assignmentRows),
710
- metadata: mapDocToSidebarMetadata(localDoc, t)
711
- }), /* Form body */
712
- /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
713
- flex: 1,
1107
+ children: [children ?
1108
+ // Render-prop mode
1109
+ children({
1110
+ doc: localDoc,
1111
+ setValue,
1112
+ isSubmitting,
1113
+ errors,
1114
+ meta,
1115
+ disabled: fieldsDisabled,
1116
+ connections: connectionRows,
1117
+ connectionsLoading
1118
+ }) : shownTabs ? /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
714
1119
  ...knobProps.gapLg,
715
- children: [children ?
716
- // Render-prop mode
717
- children({
718
- doc: localDoc,
719
- setValue,
720
- isSubmitting,
721
- errors,
722
- meta,
723
- disabled: effectiveDisabled
724
- }) : formSchema ?
725
- // Schema-driven mode using generic SchemaForm from @multiplatform.one/forms
726
- /* @__PURE__ */
727
- (0, import_jsx_runtime.jsx)(import_schemaForm.SchemaForm, {
728
- schema: formSchema,
729
- doc: localDoc,
730
- setValue: function setValue1(field, value) {
731
- return setValue(field, value);
1120
+ children: [promptNamed && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Input, {
1121
+ label: t("Name"),
1122
+ value: typeof localName === "string" ? localName : "",
1123
+ onChangeText: function onChangeText(value) {
1124
+ return setValue("name", value);
732
1125
  },
733
- errors,
734
- disabled: effectiveDisabled,
735
- overrides,
736
- hideFields,
737
- readOnlyFields,
738
- sectionHeadingLevel,
739
- order
740
- }) :
741
- // Metadata unavailable (should be covered by metaError branch above)
742
- /* @__PURE__ */
743
- (0, import_jsx_runtime.jsx)(import_tamagui.YStack, {
744
- ...knobProps.panelPadding,
745
- alignItems: "center",
746
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
747
- color: import_forms.formCommonColors.muted,
748
- ...knobProps.body,
749
- children: t("Form schema unavailable")
750
- })
751
- }), errors.general && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
752
- color: import_forms.formCommonColors.error,
1126
+ placeholder: t("New document name"),
1127
+ error: errors.name,
1128
+ disabled: effectiveDisabled
1129
+ }), tabItems.length > 1 ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Tabs, {
1130
+ items: tabItems,
1131
+ value: effectiveTab,
1132
+ onChange: setActiveTab,
1133
+ lazyMount: true
1134
+ }) : (_ref1 = (_tabItems_1 = tabItems[0]) === null || _tabItems_1 === void 0 ? void 0 : _tabItems_1.content) !== null && _ref1 !== void 0 ? _ref1 : null]
1135
+ }) :
1136
+ // Metadata unavailable (should be covered by metaError branch above)
1137
+ /* @__PURE__ */
1138
+ (0, import_jsx_runtime.jsx)(import_tamagui.YStack, {
1139
+ ...knobProps.panelPadding,
1140
+ alignItems: "center",
1141
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
1142
+ color: import_forms.formCommonColors.muted,
753
1143
  ...knobProps.body,
754
- children: errors.general
755
- }), showToolbar && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
756
- ...knobProps.gap,
757
- justifyContent: "flex-end",
758
- alignItems: "center",
759
- paddingTop: "$3",
760
- children: [hasUnsavedChanges && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
761
- color: "$orange11",
762
- marginInlineEnd: "auto",
763
- ...knobProps.body,
764
- children: t("Not Saved")
765
- }), name && onDelete && !wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
766
- outlined: true,
767
- error: true,
768
- icon: import_react.TrashIcon,
769
- loading: isSubmitting,
770
- disabled: effectiveDisabled,
771
- disabledReason: t("Form is read-only"),
772
- disabledReasonPlacement: "inline",
773
- onPress: handleDelete,
774
- children: t("Delete")
775
- }), onCancel && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
1144
+ children: t("Form schema unavailable")
1145
+ })
1146
+ }), errors.general && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
1147
+ color: import_forms.formCommonColors.error,
1148
+ ...knobProps.body,
1149
+ children: errors.general
1150
+ }), showToolbar && !readsWithoutMeta && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
1151
+ ...knobProps.gap,
1152
+ justifyContent: "flex-end",
1153
+ alignItems: "center",
1154
+ paddingTop: "$3",
1155
+ children: [hasUnsavedChanges && !onEdit && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
1156
+ color: "$orange11",
1157
+ marginInlineEnd: "auto",
1158
+ ...knobProps.body,
1159
+ children: t("Not Saved")
1160
+ }), name && onDelete && !wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
1161
+ outlined: true,
1162
+ error: true,
1163
+ icon: import_react2.TrashIcon,
1164
+ loading: isSubmitting,
1165
+ disabled: effectiveDisabled,
1166
+ disabledReason: t("Form is read-only"),
1167
+ disabledReasonPlacement: "inline",
1168
+ onPress: handleDelete,
1169
+ children: t("Delete")
1170
+ }), onEdit ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
1171
+ accent: true,
1172
+ icon: import_react2.PencilSimpleIcon,
1173
+ disabled: effectiveDisabled,
1174
+ disabledReason: t("Form is read-only"),
1175
+ disabledReasonPlacement: "inline",
1176
+ onPress: onEdit,
1177
+ children: t("Edit")
1178
+ }) : /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
1179
+ children: [onCancel && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
776
1180
  outlined: true,
777
- icon: import_react.XIcon,
778
- disabled: isSubmitting || disabled,
1181
+ icon: import_react2.XIcon,
1182
+ disabled,
779
1183
  disabledReason: t("Form is read-only"),
780
1184
  disabledReasonPlacement: "inline",
781
1185
  onPress: handleCancel,
782
1186
  children: t("Cancel")
783
1187
  }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
784
1188
  accent: true,
785
- icon: import_react.FloppyDiskIcon,
1189
+ icon: import_react2.FloppyDiskIcon,
786
1190
  loading: isSubmitting,
787
1191
  disabled: effectiveDisabled,
788
1192
  disabledReason: t("Form is read-only"),
@@ -792,13 +1196,13 @@ function FrappeForm(param) {
792
1196
  })]
793
1197
  })]
794
1198
  })]
795
- }), /* Timeline (edit mode only) — live Comment/Version via useFrappeCollection */
796
- showTimeline && name && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_timeline.Timeline, {
797
- doctype,
798
- docname: name,
799
- label: t("Activity")
800
1199
  })]
801
- })
802
- );
1200
+ }), /* Timeline (edit mode only) — live Comment/Version via useFrappeCollection */
1201
+ showTimeline && name && !readsWithoutMeta && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_timeline.Timeline, {
1202
+ doctype,
1203
+ docname: name,
1204
+ label: t("Activity")
1205
+ })]
1206
+ }), routePage ? sidebar : void 0);
803
1207
  }
804
1208
  //# sourceMappingURL=FrappeForm.native.js.map