@multiplatform.one/frappe-ui 7.11.0 → 7.15.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 (341) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/FrappeDashboard.cjs +8 -10
  3. package/dist/cjs/FrappeDashboard.native.js +8 -14
  4. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  5. package/dist/cjs/FrappeForm.cjs +465 -175
  6. package/dist/cjs/FrappeForm.native.js +611 -207
  7. package/dist/cjs/FrappeForm.native.js.map +1 -1
  8. package/dist/cjs/FrappeFormConnections.cjs +125 -0
  9. package/dist/cjs/FrappeFormConnections.native.js +149 -0
  10. package/dist/cjs/FrappeFormConnections.native.js.map +1 -0
  11. package/dist/cjs/FrappeImageView.cjs +7 -9
  12. package/dist/cjs/FrappeImageView.native.js +7 -13
  13. package/dist/cjs/FrappeImageView.native.js.map +1 -1
  14. package/dist/cjs/FrappeList.cjs +29 -4
  15. package/dist/cjs/FrappeList.native.js +37 -5
  16. package/dist/cjs/FrappeList.native.js.map +1 -1
  17. package/dist/cjs/FrappeListView.cjs +102 -29
  18. package/dist/cjs/FrappeListView.native.js +109 -29
  19. package/dist/cjs/FrappeListView.native.js.map +1 -1
  20. package/dist/cjs/FrappeProvider.cjs +7 -2
  21. package/dist/cjs/FrappeProvider.native.js +7 -2
  22. package/dist/cjs/FrappeProvider.native.js.map +1 -1
  23. package/dist/cjs/FrappeReportBuilder.cjs +10 -11
  24. package/dist/cjs/FrappeReportBuilder.native.js +10 -16
  25. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  26. package/dist/cjs/FrappeRowsReader.cjs +49 -0
  27. package/dist/cjs/FrappeRowsReader.native.js +53 -0
  28. package/dist/cjs/FrappeRowsReader.native.js.map +1 -0
  29. package/dist/cjs/FrappeTable.cjs +18 -6
  30. package/dist/cjs/FrappeTable.native.js +24 -6
  31. package/dist/cjs/FrappeTable.native.js.map +1 -1
  32. package/dist/cjs/fieldRegistry.cjs +36 -11
  33. package/dist/cjs/fieldRegistry.native.js +59 -11
  34. package/dist/cjs/fieldRegistry.native.js.map +1 -1
  35. package/dist/cjs/fields/Date/index.native.js +5 -2
  36. package/dist/cjs/fields/Date/index.native.js.map +1 -1
  37. package/dist/cjs/fields/Date/sheetKeyboard.cjs +2 -2
  38. package/dist/cjs/fields/Date/sheetKeyboard.native.js +2 -2
  39. package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +1 -1
  40. package/dist/cjs/fields/DateRange/index.cjs +2 -1
  41. package/dist/cjs/fields/DateRange/index.native.js +4 -1
  42. package/dist/cjs/fields/DateRange/index.native.js.map +1 -1
  43. package/dist/cjs/formEngine/index.cjs +4 -2
  44. package/dist/cjs/formEngine/index.native.js +3 -1
  45. package/dist/cjs/formEngine/index.native.js.map +1 -1
  46. package/dist/cjs/formEngine/useSessionRoles.cjs +77 -0
  47. package/dist/cjs/formEngine/useSessionRoles.native.js +84 -0
  48. package/dist/cjs/formEngine/useSessionRoles.native.js.map +1 -0
  49. package/dist/cjs/frappeConnections.cjs +41 -0
  50. package/dist/cjs/frappeConnections.native.js +50 -0
  51. package/dist/cjs/frappeConnections.native.js.map +1 -0
  52. package/dist/cjs/frappeNavigation.cjs +107 -0
  53. package/dist/cjs/frappeNavigation.native.js +112 -0
  54. package/dist/cjs/frappeNavigation.native.js.map +1 -0
  55. package/dist/cjs/index.cjs +18 -1
  56. package/dist/cjs/index.native.js +18 -1
  57. package/dist/cjs/index.native.js.map +1 -1
  58. package/dist/cjs/schemaForm/index.cjs +4 -1
  59. package/dist/cjs/schemaForm/index.native.js +4 -1
  60. package/dist/cjs/schemaForm/index.native.js.map +1 -1
  61. package/dist/cjs/useConnectionFilters.cjs +146 -0
  62. package/dist/cjs/useConnectionFilters.native.js +213 -0
  63. package/dist/cjs/useConnectionFilters.native.js.map +1 -0
  64. package/dist/cjs/useFrappePagination.cjs +37 -18
  65. package/dist/cjs/useFrappePagination.native.js +59 -23
  66. package/dist/cjs/useFrappePagination.native.js.map +1 -1
  67. package/dist/cjs/useFrappeRows.native.js.map +1 -1
  68. package/dist/esm/FrappeDashboard.mjs +9 -11
  69. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  70. package/dist/esm/FrappeDashboard.native.js +9 -15
  71. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  72. package/dist/esm/FrappeForm.mjs +471 -181
  73. package/dist/esm/FrappeForm.mjs.map +1 -1
  74. package/dist/esm/FrappeForm.native.js +599 -195
  75. package/dist/esm/FrappeForm.native.js.map +1 -1
  76. package/dist/esm/FrappeFormConnections.mjs +99 -0
  77. package/dist/esm/FrappeFormConnections.mjs.map +1 -0
  78. package/dist/esm/FrappeFormConnections.native.js +120 -0
  79. package/dist/esm/FrappeFormConnections.native.js.map +1 -0
  80. package/dist/esm/FrappeImageView.mjs +8 -10
  81. package/dist/esm/FrappeImageView.mjs.map +1 -1
  82. package/dist/esm/FrappeImageView.native.js +8 -14
  83. package/dist/esm/FrappeImageView.native.js.map +1 -1
  84. package/dist/esm/FrappeList.mjs +31 -6
  85. package/dist/esm/FrappeList.mjs.map +1 -1
  86. package/dist/esm/FrappeList.native.js +39 -7
  87. package/dist/esm/FrappeList.native.js.map +1 -1
  88. package/dist/esm/FrappeListView.mjs +103 -30
  89. package/dist/esm/FrappeListView.mjs.map +1 -1
  90. package/dist/esm/FrappeListView.native.js +110 -30
  91. package/dist/esm/FrappeListView.native.js.map +1 -1
  92. package/dist/esm/FrappeProvider.mjs +7 -2
  93. package/dist/esm/FrappeProvider.mjs.map +1 -1
  94. package/dist/esm/FrappeProvider.native.js +7 -2
  95. package/dist/esm/FrappeProvider.native.js.map +1 -1
  96. package/dist/esm/FrappeReportBuilder.mjs +11 -12
  97. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  98. package/dist/esm/FrappeReportBuilder.native.js +11 -17
  99. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  100. package/dist/esm/FrappeRowsReader.mjs +24 -0
  101. package/dist/esm/FrappeRowsReader.mjs.map +1 -0
  102. package/dist/esm/FrappeRowsReader.native.js +25 -0
  103. package/dist/esm/FrappeRowsReader.native.js.map +1 -0
  104. package/dist/esm/FrappeTable.mjs +18 -6
  105. package/dist/esm/FrappeTable.mjs.map +1 -1
  106. package/dist/esm/FrappeTable.native.js +24 -6
  107. package/dist/esm/FrappeTable.native.js.map +1 -1
  108. package/dist/esm/fieldRegistry.mjs +35 -12
  109. package/dist/esm/fieldRegistry.mjs.map +1 -1
  110. package/dist/esm/fieldRegistry.native.js +58 -12
  111. package/dist/esm/fieldRegistry.native.js.map +1 -1
  112. package/dist/esm/fields/Date/index.native.js +6 -3
  113. package/dist/esm/fields/Date/index.native.js.map +1 -1
  114. package/dist/esm/fields/Date/sheetKeyboard.mjs +2 -2
  115. package/dist/esm/fields/Date/sheetKeyboard.mjs.map +1 -1
  116. package/dist/esm/fields/Date/sheetKeyboard.native.js +2 -2
  117. package/dist/esm/fields/Date/sheetKeyboard.native.js.map +1 -1
  118. package/dist/esm/fields/DateRange/index.mjs +2 -1
  119. package/dist/esm/fields/DateRange/index.mjs.map +1 -1
  120. package/dist/esm/fields/DateRange/index.native.js +4 -1
  121. package/dist/esm/fields/DateRange/index.native.js.map +1 -1
  122. package/dist/esm/formEngine/index.mjs +2 -1
  123. package/dist/esm/formEngine/index.mjs.map +1 -1
  124. package/dist/esm/formEngine/index.native.js +2 -1
  125. package/dist/esm/formEngine/index.native.js.map +1 -1
  126. package/dist/esm/formEngine/useSessionRoles.mjs +52 -0
  127. package/dist/esm/formEngine/useSessionRoles.mjs.map +1 -0
  128. package/dist/esm/formEngine/useSessionRoles.native.js +56 -0
  129. package/dist/esm/formEngine/useSessionRoles.native.js.map +1 -0
  130. package/dist/esm/frappeConnections.mjs +15 -0
  131. package/dist/esm/frappeConnections.mjs.map +1 -0
  132. package/dist/esm/frappeConnections.native.js +21 -0
  133. package/dist/esm/frappeConnections.native.js.map +1 -0
  134. package/dist/esm/frappeNavigation.mjs +78 -0
  135. package/dist/esm/frappeNavigation.mjs.map +1 -0
  136. package/dist/esm/frappeNavigation.native.js +80 -0
  137. package/dist/esm/frappeNavigation.native.js.map +1 -0
  138. package/dist/esm/index.mjs +7 -3
  139. package/dist/esm/index.mjs.map +1 -1
  140. package/dist/esm/index.native.js +7 -3
  141. package/dist/esm/index.native.js.map +1 -1
  142. package/dist/esm/schemaForm/index.mjs +4 -1
  143. package/dist/esm/schemaForm/index.mjs.map +1 -1
  144. package/dist/esm/schemaForm/index.native.js +4 -1
  145. package/dist/esm/schemaForm/index.native.js.map +1 -1
  146. package/dist/esm/useConnectionFilters.mjs +121 -0
  147. package/dist/esm/useConnectionFilters.mjs.map +1 -0
  148. package/dist/esm/useConnectionFilters.native.js +185 -0
  149. package/dist/esm/useConnectionFilters.native.js.map +1 -0
  150. package/dist/esm/useFrappePagination.mjs +38 -19
  151. package/dist/esm/useFrappePagination.mjs.map +1 -1
  152. package/dist/esm/useFrappePagination.native.js +60 -24
  153. package/dist/esm/useFrappePagination.native.js.map +1 -1
  154. package/dist/esm/useFrappeRows.mjs.map +1 -1
  155. package/dist/esm/useFrappeRows.native.js.map +1 -1
  156. package/dist/jsx/FrappeDashboard.mjs +9 -11
  157. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  158. package/dist/jsx/FrappeDashboard.native.js +8 -14
  159. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  160. package/dist/jsx/FrappeForm.mjs +471 -181
  161. package/dist/jsx/FrappeForm.mjs.map +1 -1
  162. package/dist/jsx/FrappeForm.native.js +611 -207
  163. package/dist/jsx/FrappeForm.native.js.map +1 -1
  164. package/dist/jsx/FrappeFormConnections.mjs +99 -0
  165. package/dist/jsx/FrappeFormConnections.mjs.map +1 -0
  166. package/dist/jsx/FrappeFormConnections.native.js +149 -0
  167. package/dist/jsx/FrappeFormConnections.native.js.map +1 -0
  168. package/dist/jsx/FrappeImageView.mjs +8 -10
  169. package/dist/jsx/FrappeImageView.mjs.map +1 -1
  170. package/dist/jsx/FrappeImageView.native.js +7 -13
  171. package/dist/jsx/FrappeImageView.native.js.map +1 -1
  172. package/dist/jsx/FrappeList.mjs +31 -6
  173. package/dist/jsx/FrappeList.mjs.map +1 -1
  174. package/dist/jsx/FrappeList.native.js +37 -5
  175. package/dist/jsx/FrappeList.native.js.map +1 -1
  176. package/dist/jsx/FrappeListView.mjs +103 -30
  177. package/dist/jsx/FrappeListView.mjs.map +1 -1
  178. package/dist/jsx/FrappeListView.native.js +109 -29
  179. package/dist/jsx/FrappeListView.native.js.map +1 -1
  180. package/dist/jsx/FrappeProvider.mjs +7 -2
  181. package/dist/jsx/FrappeProvider.mjs.map +1 -1
  182. package/dist/jsx/FrappeProvider.native.js +7 -2
  183. package/dist/jsx/FrappeProvider.native.js.map +1 -1
  184. package/dist/jsx/FrappeReportBuilder.mjs +11 -12
  185. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  186. package/dist/jsx/FrappeReportBuilder.native.js +10 -16
  187. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  188. package/dist/jsx/FrappeRowsReader.mjs +24 -0
  189. package/dist/jsx/FrappeRowsReader.mjs.map +1 -0
  190. package/dist/jsx/FrappeRowsReader.native.js +53 -0
  191. package/dist/jsx/FrappeRowsReader.native.js.map +1 -0
  192. package/dist/jsx/FrappeTable.mjs +18 -6
  193. package/dist/jsx/FrappeTable.mjs.map +1 -1
  194. package/dist/jsx/FrappeTable.native.js +24 -6
  195. package/dist/jsx/FrappeTable.native.js.map +1 -1
  196. package/dist/jsx/fieldRegistry.mjs +35 -12
  197. package/dist/jsx/fieldRegistry.mjs.map +1 -1
  198. package/dist/jsx/fieldRegistry.native.js +59 -11
  199. package/dist/jsx/fieldRegistry.native.js.map +1 -1
  200. package/dist/jsx/fields/Date/index.native.js +5 -2
  201. package/dist/jsx/fields/Date/index.native.js.map +1 -1
  202. package/dist/jsx/fields/Date/sheetKeyboard.mjs +2 -2
  203. package/dist/jsx/fields/Date/sheetKeyboard.mjs.map +1 -1
  204. package/dist/jsx/fields/Date/sheetKeyboard.native.js +2 -2
  205. package/dist/jsx/fields/Date/sheetKeyboard.native.js.map +1 -1
  206. package/dist/jsx/fields/DateRange/index.mjs +2 -1
  207. package/dist/jsx/fields/DateRange/index.mjs.map +1 -1
  208. package/dist/jsx/fields/DateRange/index.native.js +4 -1
  209. package/dist/jsx/fields/DateRange/index.native.js.map +1 -1
  210. package/dist/jsx/formEngine/index.mjs +2 -1
  211. package/dist/jsx/formEngine/index.mjs.map +1 -1
  212. package/dist/jsx/formEngine/index.native.js +3 -1
  213. package/dist/jsx/formEngine/index.native.js.map +1 -1
  214. package/dist/jsx/formEngine/useSessionRoles.mjs +52 -0
  215. package/dist/jsx/formEngine/useSessionRoles.mjs.map +1 -0
  216. package/dist/jsx/formEngine/useSessionRoles.native.js +84 -0
  217. package/dist/jsx/formEngine/useSessionRoles.native.js.map +1 -0
  218. package/dist/jsx/frappeConnections.mjs +15 -0
  219. package/dist/jsx/frappeConnections.mjs.map +1 -0
  220. package/dist/jsx/frappeConnections.native.js +50 -0
  221. package/dist/jsx/frappeConnections.native.js.map +1 -0
  222. package/dist/jsx/frappeNavigation.mjs +78 -0
  223. package/dist/jsx/frappeNavigation.mjs.map +1 -0
  224. package/dist/jsx/frappeNavigation.native.js +112 -0
  225. package/dist/jsx/frappeNavigation.native.js.map +1 -0
  226. package/dist/jsx/index.js +7 -3
  227. package/dist/jsx/index.js.map +1 -1
  228. package/dist/jsx/index.mjs +7 -3
  229. package/dist/jsx/index.mjs.map +1 -1
  230. package/dist/jsx/index.native.js +18 -1
  231. package/dist/jsx/index.native.js.map +1 -1
  232. package/dist/jsx/schemaForm/index.mjs +4 -1
  233. package/dist/jsx/schemaForm/index.mjs.map +1 -1
  234. package/dist/jsx/schemaForm/index.native.js +4 -1
  235. package/dist/jsx/schemaForm/index.native.js.map +1 -1
  236. package/dist/jsx/useConnectionFilters.mjs +121 -0
  237. package/dist/jsx/useConnectionFilters.mjs.map +1 -0
  238. package/dist/jsx/useConnectionFilters.native.js +213 -0
  239. package/dist/jsx/useConnectionFilters.native.js.map +1 -0
  240. package/dist/jsx/useFrappePagination.mjs +38 -19
  241. package/dist/jsx/useFrappePagination.mjs.map +1 -1
  242. package/dist/jsx/useFrappePagination.native.js +59 -23
  243. package/dist/jsx/useFrappePagination.native.js.map +1 -1
  244. package/dist/jsx/useFrappeRows.mjs.map +1 -1
  245. package/dist/jsx/useFrappeRows.native.js.map +1 -1
  246. package/package.json +24 -20
  247. package/src/FileBrowser/AttachLibrary.stories.tsx +23 -0
  248. package/src/FrappeDashboard.tsx +11 -16
  249. package/src/FrappeForm.connections.spec.tsx +280 -0
  250. package/src/FrappeForm.connections.stories.tsx +93 -0
  251. package/src/FrappeForm.deskSemantics.spec.tsx +284 -0
  252. package/src/FrappeForm.tsx +560 -145
  253. package/src/FrappeFormConnections.tsx +148 -0
  254. package/src/FrappeGuestMeta.spec.tsx +143 -0
  255. package/src/FrappeImageView.tsx +8 -12
  256. package/src/FrappeList.tsx +71 -15
  257. package/src/FrappeListView.cards.spec.tsx +175 -0
  258. package/src/FrappeListView.cards.stories.tsx +131 -0
  259. package/src/FrappeListView.connections.spec.tsx +192 -0
  260. package/src/FrappeListView.connections.stories.tsx +99 -0
  261. package/src/FrappeListView.seed.spec.tsx +228 -0
  262. package/src/FrappeListView.tsx +177 -31
  263. package/src/FrappeProvider.tsx +13 -1
  264. package/src/FrappeReportBuilder.tsx +11 -19
  265. package/src/FrappeRowsReader.tsx +38 -0
  266. package/src/FrappeTable.optionalProps.spec.tsx +249 -0
  267. package/src/FrappeTable.spec.tsx +32 -42
  268. package/src/FrappeTable.stories.spec.tsx +55 -0
  269. package/src/FrappeTable.stories.tsx +28 -37
  270. package/src/FrappeTable.tsx +108 -45
  271. package/src/childTableDependsOn.spec.tsx +85 -0
  272. package/src/desk/DeskFormSidebar.spec.tsx +20 -0
  273. package/src/desk/DeskFormSidebar.stories.tsx +42 -0
  274. package/src/fieldRegistry.spec.tsx +27 -64
  275. package/src/fieldRegistry.ts +71 -14
  276. package/src/fields/Date/index.native.tsx +4 -2
  277. package/src/fields/Date/sheetKeyboard.spec.ts +14 -5
  278. package/src/fields/Date/sheetKeyboard.ts +12 -4
  279. package/src/fields/DateRange/DateRange.spec.tsx +67 -0
  280. package/src/fields/DateRange/index.tsx +5 -1
  281. package/src/fields/LinkTree.spec.tsx +8 -0
  282. package/src/fields/LinkTree.stories.tsx +28 -5
  283. package/src/fields/Select/Select.hydration.spec.tsx +177 -0
  284. package/src/formEngine/doctypeMeta.ts +15 -114
  285. package/src/formEngine/index.ts +2 -0
  286. package/src/formEngine/seam.spec.ts +23 -4
  287. package/src/formEngine/useSessionRoles.ts +73 -0
  288. package/src/frappeConnections.ts +50 -0
  289. package/src/frappeNavigation.tsx +112 -0
  290. package/src/frappeRoutes.spec.tsx +335 -0
  291. package/src/index.ts +28 -1
  292. package/src/schemaForm/index.tsx +1 -0
  293. package/src/useConnectionFilters.tsx +157 -0
  294. package/src/useFrappePagination.ts +70 -26
  295. package/src/useFrappeRows.sharedPath.spec.tsx +206 -0
  296. package/src/useFrappeRows.ts +5 -4
  297. package/types/FrappeDashboard.d.ts +3 -4
  298. package/types/FrappeDashboard.d.ts.map +1 -1
  299. package/types/FrappeForm.d.ts +57 -5
  300. package/types/FrappeForm.d.ts.map +1 -1
  301. package/types/FrappeFormConnections.d.ts +18 -0
  302. package/types/FrappeFormConnections.d.ts.map +1 -0
  303. package/types/FrappeImageView.d.ts +2 -3
  304. package/types/FrappeImageView.d.ts.map +1 -1
  305. package/types/FrappeList.d.ts +20 -2
  306. package/types/FrappeList.d.ts.map +1 -1
  307. package/types/FrappeListView.d.ts +53 -3
  308. package/types/FrappeListView.d.ts.map +1 -1
  309. package/types/FrappeProvider.d.ts +8 -1
  310. package/types/FrappeProvider.d.ts.map +1 -1
  311. package/types/FrappeReportBuilder.d.ts.map +1 -1
  312. package/types/FrappeRowsReader.d.ts +26 -0
  313. package/types/FrappeRowsReader.d.ts.map +1 -0
  314. package/types/FrappeTable.d.ts +39 -8
  315. package/types/FrappeTable.d.ts.map +1 -1
  316. package/types/fieldRegistry.d.ts +17 -3
  317. package/types/fieldRegistry.d.ts.map +1 -1
  318. package/types/fields/Date/index.native.d.ts.map +1 -1
  319. package/types/fields/Date/sheetKeyboard.d.ts +4 -3
  320. package/types/fields/Date/sheetKeyboard.d.ts.map +1 -1
  321. package/types/fields/DateRange/index.d.ts.map +1 -1
  322. package/types/formEngine/doctypeMeta.d.ts +10 -114
  323. package/types/formEngine/doctypeMeta.d.ts.map +1 -1
  324. package/types/formEngine/index.d.ts +1 -0
  325. package/types/formEngine/index.d.ts.map +1 -1
  326. package/types/formEngine/useSessionRoles.d.ts +19 -0
  327. package/types/formEngine/useSessionRoles.d.ts.map +1 -0
  328. package/types/frappeConnections.d.ts +33 -0
  329. package/types/frappeConnections.d.ts.map +1 -0
  330. package/types/frappeNavigation.d.ts +49 -0
  331. package/types/frappeNavigation.d.ts.map +1 -0
  332. package/types/index.d.ts +7 -3
  333. package/types/index.d.ts.map +1 -1
  334. package/types/schemaForm/index.d.ts.map +1 -1
  335. package/types/useConnectionFilters.d.ts +34 -0
  336. package/types/useConnectionFilters.d.ts.map +1 -0
  337. package/types/useFrappePagination.d.ts +18 -5
  338. package/types/useFrappePagination.d.ts.map +1 -1
  339. package/types/useFrappeRows.d.ts +5 -4
  340. package/types/useFrappeRows.d.ts.map +1 -1
  341. package/src/FileBrowser/AttachLibrary.spec.tsx +0 -74
@@ -45,10 +45,18 @@ function FrappeList(param) {
45
45
  doctype,
46
46
  fields,
47
47
  filters,
48
+ limit,
49
+ orderBy,
50
+ initialRows,
48
51
  pageSize,
49
52
  renderItem,
53
+ layout = "list",
54
+ gridProps,
55
+ emptyState,
56
+ onRetry,
50
57
  ...listProps
51
58
  } = param;
59
+ var _listProps_emptyMessage;
52
60
  var config = (0, import_FrappeProvider.useFrappeConfig)();
53
61
  var {
54
62
  knobProps
@@ -83,12 +91,25 @@ function FrappeList(param) {
83
91
  } = (0, import_useFrappePagination.useFrappePagination)(connectionConfig, doctype, {
84
92
  fields,
85
93
  filters,
86
- pageSize
94
+ pageSize,
95
+ limit,
96
+ orderBy,
97
+ initialRows
87
98
  });
99
+ var itemIndex = (0, import_react.useMemo)(function () {
100
+ return new Map(items.map(function (item, index) {
101
+ return [item, index];
102
+ }));
103
+ }, [items]);
104
+ var renderCard = (0, import_react.useCallback)(function (item) {
105
+ var _itemIndex_get;
106
+ return renderItem(item, (_itemIndex_get = itemIndex.get(item)) !== null && _itemIndex_get !== void 0 ? _itemIndex_get : 0);
107
+ }, [renderItem, itemIndex]);
88
108
  if (error) {
89
109
  return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncBoundary, {
90
- layout: "list",
110
+ layout: layout === "grid" ? "generic" : "list",
91
111
  error,
112
+ onRetry,
92
113
  errorTitle: (0, import_liveErrors.isPermissionError)(error) ? t("You do not have permission to view {{doctype}}", {
93
114
  doctype
94
115
  }) : t("Error loading {{doctype}}", {
@@ -98,7 +119,7 @@ function FrappeList(param) {
98
119
  }
99
120
  return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
100
121
  ...knobProps.gap,
101
- flex: 1,
122
+ flex: layout === "grid" ? void 0 : 1,
102
123
  children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeReconnectIndicator.FrappeReconnectIndicator, {
103
124
  config: connectionConfig
104
125
  }),
@@ -109,8 +130,19 @@ function FrappeList(param) {
109
130
  clip. Rows and the error/empty panels own their own chrome; the error
110
131
  branch above renders a bare AsyncBoundary, so both paths now match.
111
132
  */
112
- /* @__PURE__ */
113
- (0, import_jsx_runtime.jsx)(import_components.List, {
133
+ !isLoading && items.length === 0 && emptyState ? emptyState : layout === "grid" ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.ImageGrid, {
134
+ items,
135
+ isLoading,
136
+ renderItem: renderCard,
137
+ onItemClick: listProps.onItemClick,
138
+ onLoadMore,
139
+ hasMore,
140
+ emptyMessage: (_listProps_emptyMessage = listProps.emptyMessage) !== null && _listProps_emptyMessage !== void 0 ? _listProps_emptyMessage : t("No {{doctype}} records found", {
141
+ doctype
142
+ }),
143
+ testID: listProps.testID,
144
+ ...gridProps
145
+ }) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.List, {
114
146
  items,
115
147
  isLoading,
116
148
  renderItem,
@@ -1 +1 @@
1
- {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","FrappeList_exports","__export","FrappeList","module","exports","import_jsx_runtime","require","import_components","import_theme","import_react","import_react_i18next","import_tamagui","import_FrappeProvider","import_FrappeReconnectIndicator","import_liveErrors","import_useFrappePagination","param","baseURL","auth","syncOptions","doctype","fields","filters","pageSize","renderItem","listProps","config","useFrappeConfig","knobProps","useResolvedKnobs","t","useTranslation","finalBaseURL","finalAuth","finalSyncOptions","fixtures","Error","connectionConfig","useMemo","socketPort","siteName","socketBaseURL","realtime","items","isLoading","onLoadMore","hasMore","error","useFrappePagination","jsx","AsyncBoundary","layout","errorTitle","isPermissionError","jsxs","YStack","gap","flex","children","FrappeReconnectIndicator","List","emptyMessage"],"sources":["../../src/FrappeList.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","FrappeList_exports","__export","FrappeList","module","exports","import_jsx_runtime","require","import_components","import_theme","import_react","import_react_i18next","import_tamagui","import_FrappeProvider","import_FrappeReconnectIndicator","import_liveErrors","import_useFrappePagination","param","baseURL","auth","syncOptions","doctype","fields","filters","limit","orderBy","initialRows","pageSize","renderItem","layout","gridProps","emptyState","onRetry","listProps","_listProps_emptyMessage","config","useFrappeConfig","knobProps","useResolvedKnobs","t","useTranslation","finalBaseURL","finalAuth","finalSyncOptions","fixtures","Error","connectionConfig","useMemo","socketPort","siteName","socketBaseURL","realtime","items","isLoading","onLoadMore","hasMore","error","useFrappePagination","itemIndex","Map","map","item","index","renderCard","useCallback","_itemIndex_get","get","jsx","AsyncBoundary","errorTitle","isPermissionError","jsxs","YStack","gap","flex","children","FrappeReconnectIndicator","length","ImageGrid","onItemClick","emptyMessage","testID","List"],"sources":["../../src/FrappeList.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -49,6 +49,10 @@ var import_store = require("@multiplatform.one/store");
49
49
  var import_FrappeProvider = require("./FrappeProvider.cjs");
50
50
  var import_FrappeList = require("./FrappeList.cjs");
51
51
  var import_FrappeTable = require("./FrappeTable.cjs");
52
+ var import_frappeNavigation = require("./frappeNavigation.cjs");
53
+ var import_frappeConnections = require("./frappeConnections.cjs");
54
+ var import_liveErrors = require("./liveErrors.cjs");
55
+ var import_useConnectionFilters = require("./useConnectionFilters.cjs");
52
56
  var import_jsx_runtime = require("react/jsx-runtime");
53
57
  const storageKeyPrefix = "frappe-listview-";
54
58
  const internalDocKeys = /* @__PURE__ */new Set(["name", "owner", "creation", "modified", "modified_by", "docstatus", "idx", "doctype", "_user_tags", "_comments", "_assign", "_liked_by", "_seen"]);
@@ -65,7 +69,7 @@ function resolveImageUrl(value, baseURL) {
65
69
  async function getStoredViewMode(doctype) {
66
70
  try {
67
71
  const stored = await Promise.resolve(import_store.storage.getItem(`${storageKeyPrefix}${doctype}`));
68
- if (stored === "list" || stored === "table") return stored;
72
+ if (stored === "list" || stored === "table" || stored === "grid") return stored;
69
73
  } catch {}
70
74
  return null;
71
75
  }
@@ -77,12 +81,26 @@ async function setStoredViewMode(doctype, mode) {
77
81
  function FrappeListView({
78
82
  doctype,
79
83
  fields,
84
+ connections,
80
85
  filters,
81
86
  defaultViewMode = "list",
82
- onItemClick,
83
- onAdd,
87
+ viewMode: controlledViewMode,
88
+ onViewModeChange,
89
+ onItemClick: onItemClickProp,
90
+ onAdd: onAddProp,
91
+ route,
92
+ orderBy,
93
+ limit,
94
+ initialRows,
84
95
  columns,
85
96
  displayFields,
97
+ renderCard,
98
+ gridProps,
99
+ emptyState,
100
+ onRetry,
101
+ pageSize,
102
+ showSearch = true,
103
+ surface = true,
86
104
  showToolbar = true,
87
105
  showFilterSidebar = false,
88
106
  // deprecated: switcher always renders; destructured so it stays out of stackProps
@@ -93,6 +111,7 @@ function FrappeListView({
93
111
  ...stackProps
94
112
  }) {
95
113
  const config = (0, import_FrappeProvider.useFrappeConfig)();
114
+ const navigate = (0, import_frappeNavigation.useFrappeRouter)()?.navigate;
96
115
  const {
97
116
  knobProps
98
117
  } = (0, import_theme.useResolvedKnobs)();
@@ -116,7 +135,9 @@ function FrappeListView({
116
135
  realtime: config?.realtime,
117
136
  fixtures: config?.fixtures
118
137
  };
119
- const [viewMode, setViewModeState] = (0, import_react2.useState)(defaultViewMode);
138
+ const [storedViewMode, setViewModeState] = (0, import_react2.useState)(defaultViewMode);
139
+ const requestedViewMode = controlledViewMode ?? storedViewMode;
140
+ const viewMode = requestedViewMode === "grid" && !renderCard ? "list" : requestedViewMode;
120
141
  (0, import_react2.useEffect)(() => {
121
142
  let cancelled = false;
122
143
  setViewModeState(defaultViewMode);
@@ -131,14 +152,33 @@ function FrappeListView({
131
152
  };
132
153
  }, [doctype, defaultViewMode]);
133
154
  const setViewMode = (0, import_react2.useCallback)(mode => {
155
+ onViewModeChange?.(mode);
156
+ if (controlledViewMode !== void 0) return;
134
157
  setViewModeState(mode);
135
158
  void setStoredViewMode(doctype, mode);
136
- }, [doctype]);
159
+ }, [doctype, controlledViewMode, onViewModeChange]);
137
160
  const {
138
161
  meta,
139
162
  isLoading: isMetaLoading,
140
163
  error: metaError
141
164
  } = (0, import_frappe.useDocTypeMeta)(connectionConfig, doctype);
165
+ const onItemClick = onItemClickProp ?? (route !== void 0 && navigate ? doc => {
166
+ if (doc.name) navigate((0, import_frappeNavigation.frappeRouteHref)(route, {
167
+ mode: "view",
168
+ name: doc.name
169
+ }));
170
+ } : void 0);
171
+ const onAdd = onAddProp ?? (route !== void 0 && navigate && meta ? () => navigate((0, import_frappeNavigation.frappeRouteHref)(route, {
172
+ mode: "create"
173
+ })) : void 0);
174
+ const asPage = view => route === void 0 ? view : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.ListPageLayout, {
175
+ scroll: false,
176
+ header: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.PageHeader, {
177
+ title: doctype,
178
+ divider: false
179
+ }),
180
+ children: view
181
+ });
142
182
  const [peekedFields, setPeekedFields] = (0, import_react2.useState)(null);
143
183
  (0, import_react2.useEffect)(() => {
144
184
  if (meta || isMetaLoading || !metaError || !finalBaseURL) return;
@@ -275,6 +315,9 @@ function FrappeListView({
275
315
  (0, import_react2.useEffect)(() => {
276
316
  setActiveFilters(filters);
277
317
  }, [filters]);
318
+ const effectiveConnections = (0, import_react2.useMemo)(() => connections ?? (isMetaLoading ? void 0 : (0, import_frappeConnections.connectionsFromMeta)(meta)), [connections, isMetaLoading, meta]);
319
+ const linkFilters = (0, import_useConnectionFilters.useConnectionFilters)(connectionConfig, doctype, activeFilters, effectiveConnections);
320
+ const resolvedFilters = linkFilters.filters;
278
321
  const [searchText, setSearchText] = (0, import_react2.useState)("");
279
322
  const [debouncedSearch, setDebouncedSearch] = (0, import_react2.useState)("");
280
323
  const searchField = (0, import_react2.useMemo)(() => {
@@ -285,12 +328,12 @@ function FrappeListView({
285
328
  }, [meta, metaListFields, peekedFields]);
286
329
  const listFilters = (0, import_react2.useMemo)(() => {
287
330
  const query = debouncedSearch.trim();
288
- if (!query) return activeFilters;
331
+ if (!query) return resolvedFilters;
289
332
  const searchFilter = [searchField, "like", `%${query}%`];
290
- if (!activeFilters) return [searchFilter];
291
- if (Array.isArray(activeFilters)) return [...activeFilters, searchFilter];
292
- return [...Object.entries(activeFilters).map(([key, value]) => [key, "=", value]), searchFilter];
293
- }, [activeFilters, debouncedSearch, searchField]);
333
+ if (!resolvedFilters) return [searchFilter];
334
+ if (Array.isArray(resolvedFilters)) return [...resolvedFilters, searchFilter];
335
+ return [...Object.entries(resolvedFilters).map(([key, value]) => [key, "=", value]), searchFilter];
336
+ }, [resolvedFilters, debouncedSearch, searchField]);
294
337
  const hasProvidedFilters = (0, import_react2.useMemo)(() => {
295
338
  if (!activeFilters) return false;
296
339
  return Array.isArray(activeFilters) ? activeFilters.length > 0 : Object.keys(activeFilters).length > 0;
@@ -316,8 +359,8 @@ function FrappeListView({
316
359
  const handleDeleteFilter = (0, import_react2.useCallback)(async name => {
317
360
  await savedFiltersHook.deleteFilter(name);
318
361
  }, [savedFiltersHook]);
319
- if (isMetaLoading) {
320
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
362
+ if (isMetaLoading && !fields) {
363
+ return asPage(/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
321
364
  ...knobProps.panelPadding,
322
365
  alignItems: "center",
323
366
  justifyContent: "center",
@@ -332,7 +375,7 @@ function FrappeListView({
332
375
  doctype
333
376
  })
334
377
  })]
335
- });
378
+ }));
336
379
  }
337
380
  const renderToolbar = () => {
338
381
  if (!showToolbar) return null;
@@ -347,7 +390,10 @@ function FrappeListView({
347
390
  alignItems: "center",
348
391
  ...knobProps.gap,
349
392
  children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.ViewSwitcher, {
350
- views: [{
393
+ views: [...(renderCard ? [{
394
+ type: "grid",
395
+ label: t("Cards")
396
+ }] : []), {
351
397
  type: "list",
352
398
  label: t("List")
353
399
  }, {
@@ -452,28 +498,37 @@ function FrappeListView({
452
498
  })
453
499
  });
454
500
  const renderContent = () => {
455
- if (viewMode === "list") {
501
+ if (viewMode === "list" || viewMode === "grid") {
502
+ const isGrid = viewMode === "grid";
456
503
  return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
457
- flex: 1,
458
- children: [renderListSearch(), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeList.FrappeList, {
504
+ flex: isGrid ? void 0 : 1,
505
+ children: [showSearch ? renderListSearch() : null, /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeList.FrappeList, {
506
+ layout: isGrid ? "grid" : "list",
507
+ gridProps,
508
+ emptyState,
509
+ pageSize,
510
+ onRetry: onRetry ?? handleRefresh,
459
511
  doctype,
460
512
  fields: effectiveFields,
461
513
  filters: listFilters,
462
- renderItem: renderListItem,
514
+ renderItem: isGrid && renderCard ? renderCard : renderListItem,
463
515
  onItemClick,
464
516
  baseURL: finalBaseURL,
465
517
  auth: finalAuth,
466
518
  syncOptions: finalSyncOptions,
519
+ orderBy,
520
+ limit,
521
+ initialRows,
467
522
  ...(noResultsMessage ? {
468
523
  emptyMessage: noResultsMessage
469
524
  } : {})
470
- }, `list-${refreshKey}`)]
525
+ }, `${viewMode}-${refreshKey}`)]
471
526
  });
472
527
  }
473
528
  return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeTable.FrappeTable, {
474
529
  doctype,
475
530
  fields: effectiveFields,
476
- filters: activeFilters,
531
+ filters: resolvedFilters,
477
532
  columns: effectiveColumns,
478
533
  onRowClick: onItemClick,
479
534
  baseURL: finalBaseURL,
@@ -481,19 +536,37 @@ function FrappeListView({
481
536
  syncOptions: finalSyncOptions
482
537
  }, `table-${refreshKey}`);
483
538
  };
484
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
485
- flex: 1,
486
- ...knobProps.surface,
487
- ...knobProps.containerRadius,
488
- overflow: "hidden",
539
+ const renderResolvedContent = () => {
540
+ if (linkFilters.error) {
541
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncBoundary, {
542
+ layout: "list",
543
+ error: linkFilters.error,
544
+ errorTitle: (0, import_liveErrors.isPermissionError)(linkFilters.error) ? t("You do not have permission to view {{doctype}}", {
545
+ doctype
546
+ }) : t("Error loading {{doctype}}", {
547
+ doctype
548
+ })
549
+ });
550
+ }
551
+ if (linkFilters.pending) return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncBoundary, {
552
+ layout: "list",
553
+ loading: true
554
+ });
555
+ return renderContent();
556
+ };
557
+ return asPage(/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
558
+ flex: viewMode === "grid" ? void 0 : 1,
559
+ ...(surface ? knobProps.surface : {}),
560
+ ...(surface ? knobProps.containerRadius : {}),
561
+ overflow: surface ? "hidden" : void 0,
489
562
  testID: `${doctype.toLowerCase()}-list`,
490
563
  ...stackProps,
491
- children: [renderToolbar(), showFilterSidebar ? /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
564
+ children: [renderToolbar(), linkFilters.readers, showFilterSidebar ? /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
492
565
  flex: 1,
493
566
  children: [renderFilterSidebar(), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.YStack, {
494
567
  flex: 1,
495
- children: renderContent()
568
+ children: renderResolvedContent()
496
569
  })]
497
- }) : renderContent()]
498
- });
570
+ }) : renderResolvedContent()]
571
+ }));
499
572
  }
@@ -52,6 +52,10 @@ var import_store = require("@multiplatform.one/store");
52
52
  var import_FrappeProvider = require("./FrappeProvider.native.js");
53
53
  var import_FrappeList = require("./FrappeList.native.js");
54
54
  var import_FrappeTable = require("./FrappeTable.native.js");
55
+ var import_frappeNavigation = require("./frappeNavigation.native.js");
56
+ var import_frappeConnections = require("./frappeConnections.native.js");
57
+ var import_liveErrors = require("./liveErrors.native.js");
58
+ var import_useConnectionFilters = require("./useConnectionFilters.native.js");
55
59
  var storageKeyPrefix = "frappe-listview-";
56
60
  var internalDocKeys = /* @__PURE__ */new Set(["name", "owner", "creation", "modified", "modified_by", "docstatus", "idx", "doctype", "_user_tags", "_comments", "_assign", "_liked_by", "_seen"]);
57
61
  var layoutFieldtypes = /* @__PURE__ */new Set(["Column Break", "Section Break", "Tab Break", "HTML", "Heading", "Fold", "Button"]);
@@ -69,7 +73,7 @@ function resolveImageUrl(value, baseURL) {
69
73
  async function getStoredViewMode(doctype) {
70
74
  try {
71
75
  var stored = await Promise.resolve(import_store.storage.getItem(`${storageKeyPrefix}${doctype}`));
72
- if (stored === "list" || stored === "table") return stored;
76
+ if (stored === "list" || stored === "table" || stored === "grid") return stored;
73
77
  } catch (unused) {}
74
78
  return null;
75
79
  }
@@ -82,12 +86,26 @@ function FrappeListView(param) {
82
86
  var {
83
87
  doctype,
84
88
  fields,
89
+ connections,
85
90
  filters,
86
91
  defaultViewMode = "list",
87
- onItemClick,
88
- onAdd,
92
+ viewMode: controlledViewMode,
93
+ onViewModeChange,
94
+ onItemClick: onItemClickProp,
95
+ onAdd: onAddProp,
96
+ route,
97
+ orderBy,
98
+ limit,
99
+ initialRows,
89
100
  columns,
90
101
  displayFields,
102
+ renderCard,
103
+ gridProps,
104
+ emptyState,
105
+ onRetry,
106
+ pageSize,
107
+ showSearch = true,
108
+ surface = true,
91
109
  showToolbar = true,
92
110
  showFilterSidebar = false,
93
111
  // deprecated: switcher always renders; destructured so it stays out of stackProps
@@ -97,7 +115,9 @@ function FrappeListView(param) {
97
115
  syncOptions,
98
116
  ...stackProps
99
117
  } = param;
118
+ var _useFrappeRouter;
100
119
  var config = (0, import_FrappeProvider.useFrappeConfig)();
120
+ var navigate = (_useFrappeRouter = (0, import_frappeNavigation.useFrappeRouter)()) === null || _useFrappeRouter === void 0 ? void 0 : _useFrappeRouter.navigate;
101
121
  var {
102
122
  knobProps
103
123
  } = (0, import_theme.useResolvedKnobs)();
@@ -121,7 +141,9 @@ function FrappeListView(param) {
121
141
  realtime: config === null || config === void 0 ? void 0 : config.realtime,
122
142
  fixtures: config === null || config === void 0 ? void 0 : config.fixtures
123
143
  };
124
- var [viewMode, setViewModeState] = (0, import_react2.useState)(defaultViewMode);
144
+ var [storedViewMode, setViewModeState] = (0, import_react2.useState)(defaultViewMode);
145
+ var requestedViewMode = controlledViewMode !== null && controlledViewMode !== void 0 ? controlledViewMode : storedViewMode;
146
+ var viewMode = requestedViewMode === "grid" && !renderCard ? "list" : requestedViewMode;
125
147
  (0, import_react2.useEffect)(function () {
126
148
  var cancelled = false;
127
149
  setViewModeState(defaultViewMode);
@@ -136,14 +158,37 @@ function FrappeListView(param) {
136
158
  };
137
159
  }, [doctype, defaultViewMode]);
138
160
  var setViewMode = (0, import_react2.useCallback)(function (mode) {
161
+ onViewModeChange === null || onViewModeChange === void 0 ? void 0 : onViewModeChange(mode);
162
+ if (controlledViewMode !== void 0) return;
139
163
  setViewModeState(mode);
140
164
  void setStoredViewMode(doctype, mode);
141
- }, [doctype]);
165
+ }, [doctype, controlledViewMode, onViewModeChange]);
142
166
  var {
143
167
  meta,
144
168
  isLoading: isMetaLoading,
145
169
  error: metaError
146
170
  } = (0, import_frappe.useDocTypeMeta)(connectionConfig, doctype);
171
+ var onItemClick = onItemClickProp !== null && onItemClickProp !== void 0 ? onItemClickProp : route !== void 0 && navigate ? function (doc) {
172
+ if (doc.name) navigate((0, import_frappeNavigation.frappeRouteHref)(route, {
173
+ mode: "view",
174
+ name: doc.name
175
+ }));
176
+ } : void 0;
177
+ var onAdd = onAddProp !== null && onAddProp !== void 0 ? onAddProp : route !== void 0 && navigate && meta ? function () {
178
+ return navigate((0, import_frappeNavigation.frappeRouteHref)(route, {
179
+ mode: "create"
180
+ }));
181
+ } : void 0;
182
+ var asPage = function asPage2(view) {
183
+ return route === void 0 ? view : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.ListPageLayout, {
184
+ scroll: false,
185
+ header: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.PageHeader, {
186
+ title: doctype,
187
+ divider: false
188
+ }),
189
+ children: view
190
+ });
191
+ };
147
192
  var [peekedFields, setPeekedFields] = (0, import_react2.useState)(null);
148
193
  (0, import_react2.useEffect)(function () {
149
194
  if (meta || isMetaLoading || !metaError || !finalBaseURL) return;
@@ -316,6 +361,11 @@ function FrappeListView(param) {
316
361
  (0, import_react2.useEffect)(function () {
317
362
  setActiveFilters(filters);
318
363
  }, [filters]);
364
+ var effectiveConnections = (0, import_react2.useMemo)(function () {
365
+ return connections !== null && connections !== void 0 ? connections : isMetaLoading ? void 0 : (0, import_frappeConnections.connectionsFromMeta)(meta);
366
+ }, [connections, isMetaLoading, meta]);
367
+ var linkFilters = (0, import_useConnectionFilters.useConnectionFilters)(connectionConfig, doctype, activeFilters, effectiveConnections);
368
+ var resolvedFilters = linkFilters.filters;
319
369
  var [searchText, setSearchText] = (0, import_react2.useState)("");
320
370
  var [debouncedSearch, setDebouncedSearch] = (0, import_react2.useState)("");
321
371
  var searchField = (0, import_react2.useMemo)(function () {
@@ -326,15 +376,15 @@ function FrappeListView(param) {
326
376
  }, [meta, metaListFields, peekedFields]);
327
377
  var listFilters = (0, import_react2.useMemo)(function () {
328
378
  var query = debouncedSearch.trim();
329
- if (!query) return activeFilters;
379
+ if (!query) return resolvedFilters;
330
380
  var searchFilter = [searchField, "like", `%${query}%`];
331
- if (!activeFilters) return [searchFilter];
332
- if (Array.isArray(activeFilters)) return [...activeFilters, searchFilter];
333
- return [...Object.entries(activeFilters).map(function (param2) {
381
+ if (!resolvedFilters) return [searchFilter];
382
+ if (Array.isArray(resolvedFilters)) return [...resolvedFilters, searchFilter];
383
+ return [...Object.entries(resolvedFilters).map(function (param2) {
334
384
  var [key, value] = param2;
335
385
  return [key, "=", value];
336
386
  }), searchFilter];
337
- }, [activeFilters, debouncedSearch, searchField]);
387
+ }, [resolvedFilters, debouncedSearch, searchField]);
338
388
  var hasProvidedFilters = (0, import_react2.useMemo)(function () {
339
389
  if (!activeFilters) return false;
340
390
  return Array.isArray(activeFilters) ? activeFilters.length > 0 : Object.keys(activeFilters).length > 0;
@@ -362,8 +412,8 @@ function FrappeListView(param) {
362
412
  var handleDeleteFilter = (0, import_react2.useCallback)(async function (name) {
363
413
  await savedFiltersHook.deleteFilter(name);
364
414
  }, [savedFiltersHook]);
365
- if (isMetaLoading) {
366
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
415
+ if (isMetaLoading && !fields) {
416
+ return asPage(/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
367
417
  ...knobProps.panelPadding,
368
418
  alignItems: "center",
369
419
  justifyContent: "center",
@@ -378,7 +428,7 @@ function FrappeListView(param) {
378
428
  doctype
379
429
  })
380
430
  })]
381
- });
431
+ }));
382
432
  }
383
433
  var renderToolbar = function renderToolbar2() {
384
434
  if (!showToolbar) return null;
@@ -395,7 +445,10 @@ function FrappeListView(param) {
395
445
  alignItems: "center",
396
446
  ...knobProps.gap,
397
447
  children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.ViewSwitcher, {
398
- views: [{
448
+ views: [...(renderCard ? [{
449
+ type: "grid",
450
+ label: t("Cards")
451
+ }] : []), {
399
452
  type: "list",
400
453
  label: t("List")
401
454
  }, {
@@ -518,30 +571,39 @@ function FrappeListView(param) {
518
571
  });
519
572
  };
520
573
  var renderContent = function renderContent2() {
521
- if (viewMode === "list") {
574
+ if (viewMode === "list" || viewMode === "grid") {
575
+ var isGrid = viewMode === "grid";
522
576
  return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
523
- flex: 1,
524
- children: [renderListSearch(), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeList.FrappeList, {
577
+ flex: isGrid ? void 0 : 1,
578
+ children: [showSearch ? renderListSearch() : null, /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeList.FrappeList, {
579
+ layout: isGrid ? "grid" : "list",
580
+ gridProps,
581
+ emptyState,
582
+ pageSize,
583
+ onRetry: onRetry !== null && onRetry !== void 0 ? onRetry : handleRefresh,
525
584
  doctype,
526
585
  fields: effectiveFields,
527
586
  filters: listFilters,
528
- renderItem: renderListItem,
587
+ renderItem: isGrid && renderCard ? renderCard : renderListItem,
529
588
  onItemClick,
530
589
  baseURL: finalBaseURL,
531
590
  auth: finalAuth,
532
591
  syncOptions: finalSyncOptions,
592
+ orderBy,
593
+ limit,
594
+ initialRows,
533
595
  // Only override when narrowing is active: FrappeList's own
534
596
  // "No {doctype} records found" stays the true-empty message.
535
597
  ...(noResultsMessage ? {
536
598
  emptyMessage: noResultsMessage
537
599
  } : {})
538
- }, `list-${refreshKey}`)]
600
+ }, `${viewMode}-${refreshKey}`)]
539
601
  });
540
602
  }
541
603
  return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeTable.FrappeTable, {
542
604
  doctype,
543
605
  fields: effectiveFields,
544
- filters: activeFilters,
606
+ filters: resolvedFilters,
545
607
  columns: effectiveColumns,
546
608
  onRowClick: onItemClick,
547
609
  baseURL: finalBaseURL,
@@ -549,20 +611,38 @@ function FrappeListView(param) {
549
611
  syncOptions: finalSyncOptions
550
612
  }, `table-${refreshKey}`);
551
613
  };
552
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
553
- flex: 1,
554
- ...knobProps.surface,
555
- ...knobProps.containerRadius,
556
- overflow: "hidden",
614
+ var renderResolvedContent = function renderResolvedContent2() {
615
+ if (linkFilters.error) {
616
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncBoundary, {
617
+ layout: "list",
618
+ error: linkFilters.error,
619
+ errorTitle: (0, import_liveErrors.isPermissionError)(linkFilters.error) ? t("You do not have permission to view {{doctype}}", {
620
+ doctype
621
+ }) : t("Error loading {{doctype}}", {
622
+ doctype
623
+ })
624
+ });
625
+ }
626
+ if (linkFilters.pending) return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncBoundary, {
627
+ layout: "list",
628
+ loading: true
629
+ });
630
+ return renderContent();
631
+ };
632
+ return asPage(/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
633
+ flex: viewMode === "grid" ? void 0 : 1,
634
+ ...(surface ? knobProps.surface : {}),
635
+ ...(surface ? knobProps.containerRadius : {}),
636
+ overflow: surface ? "hidden" : void 0,
557
637
  testID: `${doctype.toLowerCase()}-list`,
558
638
  ...stackProps,
559
- children: [renderToolbar(), showFilterSidebar ? /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
639
+ children: [renderToolbar(), linkFilters.readers, showFilterSidebar ? /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
560
640
  flex: 1,
561
641
  children: [renderFilterSidebar(), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.YStack, {
562
642
  flex: 1,
563
- children: renderContent()
643
+ children: renderResolvedContent()
564
644
  })]
565
- }) : renderContent()]
566
- });
645
+ }) : renderResolvedContent()]
646
+ }));
567
647
  }
568
648
  //# sourceMappingURL=FrappeListView.native.js.map