@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
@@ -0,0 +1,284 @@
1
+ /**
2
+ * FrappeForm renders a doctype the way desk does (MPO-15 AC1, MPO-26 AC4).
3
+ *
4
+ * "Asset Loan" is a fixture doctype that uses every key the form engine
5
+ * resolves: mandatory_depends_on, read_only_depends_on,
6
+ * collapsible_depends_on, permlevel, set_only_once, fetch_from and
7
+ * docstatus, plus a Tab Break and prompt naming. Each field is rendered
8
+ * through an override probe that prints the props SchemaForm hands it, so
9
+ * these specs assert FrappeForm's resolution rather than a field renderer.
10
+ */
11
+
12
+ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
13
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
14
+ import { cleanup, fireEvent, screen, waitFor } from "@testing-library/react";
15
+ import i18next from "i18next";
16
+ import { initReactI18next } from "react-i18next";
17
+ import { Text } from "tamagui";
18
+ import { afterEach, beforeAll, describe, expect, it, vi } from "vitest";
19
+ import { FrappeForm } from "./FrappeForm";
20
+ import { FrappeProvider } from "./FrappeProvider";
21
+ import type { FieldOverride } from "./schemaForm";
22
+
23
+ beforeAll(async () => {
24
+ await i18next.use(initReactI18next).init({
25
+ lng: "en",
26
+ interpolation: { escapeValue: false },
27
+ resources: { en: { translation: {} } },
28
+ });
29
+ });
30
+
31
+ afterEach(() => {
32
+ cleanup();
33
+ vi.restoreAllMocks();
34
+ });
35
+
36
+ const APPROVED = 'eval:doc.status=="Approved"';
37
+
38
+ const assetLoanMeta = {
39
+ name: "Asset Loan",
40
+ doctype: "DocType",
41
+ module: "Assets",
42
+ autoname: "Prompt",
43
+ is_submittable: 1,
44
+ fields: [
45
+ { fieldname: "status", fieldtype: "Select", label: "Status", options: "Draft\nApproved" },
46
+ { fieldname: "employee", fieldtype: "Link", label: "Employee", options: "Employee" },
47
+ {
48
+ fieldname: "employee_name",
49
+ fieldtype: "Data",
50
+ label: "Employee Name",
51
+ fetch_from: "employee.employee_name",
52
+ },
53
+ {
54
+ fieldname: "reason",
55
+ fieldtype: "Small Text",
56
+ label: "Reason",
57
+ mandatory_depends_on: APPROVED,
58
+ },
59
+ {
60
+ fieldname: "approver_note",
61
+ fieldtype: "Data",
62
+ label: "Approver Note",
63
+ read_only_depends_on: APPROVED,
64
+ },
65
+ { fieldname: "serial_no", fieldtype: "Data", label: "Serial No", set_only_once: 1 },
66
+ { fieldname: "cost", fieldtype: "Currency", label: "Cost", permlevel: 1 },
67
+ { fieldname: "remarks", fieldtype: "Data", label: "Remarks", allow_on_submit: 1 },
68
+ {
69
+ fieldname: "audit_section",
70
+ fieldtype: "Section Break",
71
+ label: "Audit",
72
+ collapsible: 1,
73
+ collapsible_depends_on: APPROVED,
74
+ },
75
+ { fieldname: "audit_note", fieldtype: "Data", label: "Audit Note" },
76
+ { fieldname: "extra_tab", fieldtype: "Tab Break", label: "Extra" },
77
+ { fieldname: "extra_note", fieldtype: "Data", label: "Extra Note" },
78
+ ],
79
+ permissions: [
80
+ { role: "Loan Officer", permlevel: 0, read: 1, write: 1, create: 1 },
81
+ { role: "Loan Officer", permlevel: 1, read: 1, write: 0 },
82
+ { role: "Finance", permlevel: 0, read: 1, write: 1 },
83
+ { role: "Finance", permlevel: 1, read: 1, write: 1 },
84
+ { role: "Clerk", permlevel: 0, read: 1, write: 1 },
85
+ ],
86
+ };
87
+
88
+ function corpus() {
89
+ return new InMemoryFixtureProvider({
90
+ DocType: [assetLoanMeta],
91
+ Employee: [
92
+ { name: "EMP-1", doctype: "Employee", employee_name: "Ada Lovelace" },
93
+ { name: "EMP-2", doctype: "Employee", employee_name: "Grace Hopper" },
94
+ ],
95
+ "Asset Loan": [
96
+ {
97
+ name: "LOAN-DRAFT",
98
+ doctype: "Asset Loan",
99
+ docstatus: 0,
100
+ status: "Draft",
101
+ employee: "EMP-1",
102
+ employee_name: "Ada Lovelace",
103
+ serial_no: "SN-1",
104
+ cost: 100,
105
+ },
106
+ {
107
+ name: "LOAN-APPROVED",
108
+ doctype: "Asset Loan",
109
+ docstatus: 0,
110
+ status: "Approved",
111
+ serial_no: "SN-2",
112
+ },
113
+ {
114
+ name: "LOAN-SUBMITTED",
115
+ doctype: "Asset Loan",
116
+ docstatus: 1,
117
+ status: "Approved",
118
+ reason: "Field work",
119
+ serial_no: "SN-3",
120
+ },
121
+ ],
122
+ });
123
+ }
124
+
125
+ const probedFields = [
126
+ "status",
127
+ "employee",
128
+ "employee_name",
129
+ "reason",
130
+ "approver_note",
131
+ "serial_no",
132
+ "cost",
133
+ "remarks",
134
+ "audit_note",
135
+ "extra_note",
136
+ ];
137
+
138
+ const probe: FieldOverride = (props) => {
139
+ const name = props.fieldMeta?.name ?? "";
140
+ const value = props.value === undefined || props.value === null ? "" : String(props.value);
141
+ return (
142
+ <>
143
+ <Text testID={`probe-${name}`}>
144
+ {`ro=${!!props.readOnly} req=${!!props.required} val=${value} err=${props.error ?? ""}`}
145
+ </Text>
146
+ <button type="button" data-testid={`set-${name}`} onClick={() => props.onChange("EMP-2")}>
147
+ set
148
+ </button>
149
+ </>
150
+ );
151
+ };
152
+
153
+ const overrides = Object.fromEntries(probedFields.map((field) => [field, probe]));
154
+
155
+ function renderForm(props: { name?: string; roles?: string[] } = {}) {
156
+ return renderWithProviders(
157
+ <FrappeProvider baseURL="http://test" fixtures={corpus()}>
158
+ <FrappeForm
159
+ doctype="Asset Loan"
160
+ name={props.name}
161
+ roles={props.roles}
162
+ overrides={overrides}
163
+ showSidebar={false}
164
+ showTimeline={false}
165
+ />
166
+ </FrappeProvider>,
167
+ );
168
+ }
169
+
170
+ /** The doc lands a render after the form mounts, so every read waits for it. */
171
+ async function expectProbe(field: string, text: string): Promise<void> {
172
+ await waitFor(() => {
173
+ expect(screen.getByTestId(`probe-${field}`).textContent).toContain(text);
174
+ });
175
+ }
176
+
177
+ function isCollapsed(field: string): boolean {
178
+ return screen.getByTestId(`probe-${field}`).closest('[aria-hidden="true"]') !== null;
179
+ }
180
+
181
+ describe("FrappeForm resolves a doctype through the desk form engine", () => {
182
+ it("mandatory_depends_on makes a field required only while it holds", async () => {
183
+ renderForm({ name: "LOAN-APPROVED" });
184
+ await expectProbe("reason", "req=true");
185
+ cleanup();
186
+
187
+ renderForm({ name: "LOAN-DRAFT" });
188
+ await expectProbe("status", "val=Draft");
189
+ await expectProbe("reason", "req=false");
190
+ });
191
+
192
+ it("save refuses an empty field that mandatory_depends_on made required", async () => {
193
+ renderForm({ name: "LOAN-APPROVED" });
194
+ await expectProbe("status", "val=Approved");
195
+ fireEvent.click(screen.getByText("Save"));
196
+ await expectProbe("reason", "err=Reason is required");
197
+ });
198
+
199
+ it("read_only_depends_on locks a field only while it holds", async () => {
200
+ renderForm({ name: "LOAN-APPROVED" });
201
+ await expectProbe("approver_note", "ro=true");
202
+ cleanup();
203
+
204
+ renderForm({ name: "LOAN-DRAFT" });
205
+ await expectProbe("status", "val=Draft");
206
+ await expectProbe("approver_note", "ro=false");
207
+ });
208
+
209
+ it("set_only_once is editable on a new doc and read-only once saved", async () => {
210
+ renderForm();
211
+ await expectProbe("serial_no", "ro=false");
212
+ cleanup();
213
+
214
+ renderForm({ name: "LOAN-DRAFT" });
215
+ await expectProbe("serial_no", "ro=true");
216
+ });
217
+
218
+ it("permlevel hides a level the roles cannot read and locks one they cannot write", async () => {
219
+ renderForm({ name: "LOAN-DRAFT", roles: ["Clerk"] });
220
+ await expectProbe("status", "val=Draft");
221
+ expect(screen.queryByTestId("probe-cost")).toBeNull();
222
+ cleanup();
223
+
224
+ renderForm({ name: "LOAN-DRAFT", roles: ["Loan Officer"] });
225
+ await expectProbe("cost", "ro=true");
226
+ cleanup();
227
+
228
+ renderForm({ name: "LOAN-DRAFT", roles: ["Finance"] });
229
+ await expectProbe("status", "val=Draft");
230
+ await expectProbe("cost", "ro=false");
231
+ });
232
+
233
+ it("permlevel without a role list is read-only, never hidden", async () => {
234
+ renderForm({ name: "LOAN-DRAFT" });
235
+ await expectProbe("cost", "ro=true");
236
+ });
237
+
238
+ it("fetch_from locks the target and fills it when the link changes", async () => {
239
+ renderForm({ name: "LOAN-DRAFT", roles: ["Finance"] });
240
+ await expectProbe("employee_name", "ro=true");
241
+ await expectProbe("employee_name", "val=Ada Lovelace");
242
+
243
+ fireEvent.click(screen.getByTestId("set-employee"));
244
+ await expectProbe("employee_name", "val=Grace Hopper");
245
+ });
246
+
247
+ it("docstatus 1 makes every field read-only except allow_on_submit", async () => {
248
+ renderForm({ name: "LOAN-SUBMITTED", roles: ["Finance"] });
249
+ await expectProbe("status", "ro=true");
250
+ await expectProbe("serial_no", "ro=true");
251
+ await expectProbe("remarks", "ro=false");
252
+ });
253
+
254
+ it("collapsible_depends_on opens its section only while it holds", async () => {
255
+ renderForm({ name: "LOAN-DRAFT" });
256
+ await expectProbe("status", "val=Draft");
257
+ expect(isCollapsed("audit_note")).toBe(true);
258
+ cleanup();
259
+
260
+ renderForm({ name: "LOAN-APPROVED" });
261
+ await expectProbe("status", "val=Approved");
262
+ await waitFor(() => expect(isCollapsed("audit_note")).toBe(false));
263
+ });
264
+
265
+ it("a Tab Break renders as a tab and its fields mount when it opens", async () => {
266
+ renderForm({ name: "LOAN-DRAFT" });
267
+ await screen.findByTestId("probe-status");
268
+ const tabs = screen.getAllByRole("tab").map((tab) => tab.textContent);
269
+ expect(tabs).toEqual(["Details", "Extra"]);
270
+
271
+ fireEvent.click(screen.getByText("Extra"));
272
+ await expectProbe("extra_note", "ro=false");
273
+ });
274
+
275
+ it("a prompt-named doctype asks for the name and will not save without it", async () => {
276
+ renderForm();
277
+ await screen.findByTestId("probe-status");
278
+ expect(screen.getByText("Name")).toBeTruthy();
279
+ fireEvent.click(screen.getByText("Save"));
280
+ await waitFor(() => {
281
+ expect(screen.getByText("Name is required")).toBeTruthy();
282
+ });
283
+ });
284
+ });