@multiplatform.one/frappe-ui 7.28.1 → 7.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/dist/cjs/FrappeCalendar.cjs +3 -2
  2. package/dist/cjs/FrappeCalendar.native.js +3 -2
  3. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  4. package/dist/cjs/FrappeForm.cjs +148 -464
  5. package/dist/cjs/FrappeForm.native.js +152 -633
  6. package/dist/cjs/FrappeForm.native.js.map +1 -1
  7. package/dist/cjs/FrappeListView.cjs +5 -27
  8. package/dist/cjs/FrappeListView.native.js +11 -32
  9. package/dist/cjs/FrappeListView.native.js.map +1 -1
  10. package/dist/cjs/FrappeReportBuilder.cjs +523 -309
  11. package/dist/cjs/FrappeReportBuilder.native.js +658 -353
  12. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  13. package/dist/cjs/FrappeReportView.cjs +35 -234
  14. package/dist/cjs/FrappeReportView.native.js +39 -283
  15. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  16. package/dist/cjs/dependsOn.cjs +2 -2
  17. package/dist/cjs/dependsOn.native.js +1 -2
  18. package/dist/cjs/dependsOn.native.js.map +1 -1
  19. package/dist/cjs/fields/shared/EditorPreviewPanes.cjs +2 -2
  20. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js +2 -2
  21. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  22. package/dist/cjs/formEngine/docPermissions.cjs +20 -0
  23. package/dist/cjs/formEngine/docPermissions.native.js +69 -0
  24. package/dist/cjs/formEngine/docPermissions.native.js.map +1 -1
  25. package/dist/cjs/formEngine/index.cjs +2 -0
  26. package/dist/cjs/formEngine/index.native.js +2 -0
  27. package/dist/cjs/formEngine/index.native.js.map +1 -1
  28. package/dist/cjs/index.cjs +67 -7
  29. package/dist/cjs/index.native.js +67 -7
  30. package/dist/cjs/index.native.js.map +1 -1
  31. package/dist/cjs/liveErrors.cjs +8 -2
  32. package/dist/cjs/liveErrors.native.js +8 -2
  33. package/dist/cjs/liveErrors.native.js.map +1 -1
  34. package/dist/cjs/measures.cjs +31 -0
  35. package/dist/cjs/measures.native.js +34 -0
  36. package/dist/cjs/measures.native.js.map +1 -0
  37. package/dist/cjs/recordShape.cjs +103 -0
  38. package/dist/cjs/recordShape.native.js +115 -0
  39. package/dist/cjs/recordShape.native.js.map +1 -0
  40. package/dist/cjs/report/ReportGrid.cjs +453 -0
  41. package/dist/cjs/report/ReportGrid.native.js +510 -0
  42. package/dist/cjs/report/ReportGrid.native.js.map +1 -0
  43. package/dist/cjs/report/ReportViewToolbar.cjs +253 -0
  44. package/dist/cjs/report/ReportViewToolbar.native.js +303 -0
  45. package/dist/cjs/report/ReportViewToolbar.native.js.map +1 -0
  46. package/dist/cjs/report/queryReport.cjs +444 -0
  47. package/dist/cjs/report/queryReport.native.js +588 -0
  48. package/dist/cjs/report/queryReport.native.js.map +1 -0
  49. package/dist/cjs/report/queryReportColumns.cjs +131 -0
  50. package/dist/cjs/report/queryReportColumns.native.js +159 -0
  51. package/dist/cjs/report/queryReportColumns.native.js.map +1 -0
  52. package/dist/cjs/report/reportViewModel.cjs +386 -0
  53. package/dist/cjs/report/reportViewModel.native.js +657 -0
  54. package/dist/cjs/report/reportViewModel.native.js.map +1 -0
  55. package/dist/cjs/report/savedReports.cjs +137 -0
  56. package/dist/cjs/report/savedReports.native.js +169 -0
  57. package/dist/cjs/report/savedReports.native.js.map +1 -0
  58. package/dist/cjs/report/useFrappeReport.cjs +184 -0
  59. package/dist/cjs/report/useFrappeReport.native.js +214 -0
  60. package/dist/cjs/report/useFrappeReport.native.js.map +1 -0
  61. package/dist/cjs/report/useQueryReport.cjs +201 -0
  62. package/dist/cjs/report/useQueryReport.native.js +233 -0
  63. package/dist/cjs/report/useQueryReport.native.js.map +1 -0
  64. package/dist/cjs/useFrappeForm.cjs +558 -0
  65. package/dist/cjs/useFrappeForm.native.js +714 -0
  66. package/dist/cjs/useFrappeForm.native.js.map +1 -0
  67. package/dist/esm/FrappeCalendar.mjs +4 -3
  68. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  69. package/dist/esm/FrappeCalendar.native.js +4 -3
  70. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  71. package/dist/esm/FrappeForm.mjs +151 -467
  72. package/dist/esm/FrappeForm.mjs.map +1 -1
  73. package/dist/esm/FrappeForm.native.js +155 -636
  74. package/dist/esm/FrappeForm.native.js.map +1 -1
  75. package/dist/esm/FrappeListView.mjs +6 -28
  76. package/dist/esm/FrappeListView.mjs.map +1 -1
  77. package/dist/esm/FrappeListView.native.js +12 -33
  78. package/dist/esm/FrappeListView.native.js.map +1 -1
  79. package/dist/esm/FrappeReportBuilder.mjs +526 -312
  80. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  81. package/dist/esm/FrappeReportBuilder.native.js +661 -356
  82. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  83. package/dist/esm/FrappeReportView.mjs +30 -229
  84. package/dist/esm/FrappeReportView.mjs.map +1 -1
  85. package/dist/esm/FrappeReportView.native.js +34 -278
  86. package/dist/esm/FrappeReportView.native.js.map +1 -1
  87. package/dist/esm/dependsOn.mjs +2 -2
  88. package/dist/esm/dependsOn.mjs.map +1 -1
  89. package/dist/esm/dependsOn.native.js +1 -2
  90. package/dist/esm/dependsOn.native.js.map +1 -1
  91. package/dist/esm/fields/shared/EditorPreviewPanes.mjs +2 -2
  92. package/dist/esm/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  93. package/dist/esm/fields/shared/EditorPreviewPanes.native.js +2 -2
  94. package/dist/esm/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  95. package/dist/esm/formEngine/docPermissions.mjs +19 -1
  96. package/dist/esm/formEngine/docPermissions.mjs.map +1 -1
  97. package/dist/esm/formEngine/docPermissions.native.js +68 -1
  98. package/dist/esm/formEngine/docPermissions.native.js.map +1 -1
  99. package/dist/esm/formEngine/index.mjs +2 -2
  100. package/dist/esm/formEngine/index.mjs.map +1 -1
  101. package/dist/esm/formEngine/index.native.js +2 -2
  102. package/dist/esm/formEngine/index.native.js.map +1 -1
  103. package/dist/esm/index.mjs +16 -4
  104. package/dist/esm/index.mjs.map +1 -1
  105. package/dist/esm/index.native.js +16 -4
  106. package/dist/esm/index.native.js.map +1 -1
  107. package/dist/esm/liveErrors.mjs +8 -3
  108. package/dist/esm/liveErrors.mjs.map +1 -1
  109. package/dist/esm/liveErrors.native.js +8 -3
  110. package/dist/esm/liveErrors.native.js.map +1 -1
  111. package/dist/esm/measures.mjs +5 -0
  112. package/dist/esm/measures.mjs.map +1 -0
  113. package/dist/esm/measures.native.js +5 -0
  114. package/dist/esm/measures.native.js.map +1 -0
  115. package/dist/esm/recordShape.mjs +74 -0
  116. package/dist/esm/recordShape.mjs.map +1 -0
  117. package/dist/esm/recordShape.native.js +83 -0
  118. package/dist/esm/recordShape.native.js.map +1 -0
  119. package/dist/esm/report/ReportGrid.mjs +428 -0
  120. package/dist/esm/report/ReportGrid.mjs.map +1 -0
  121. package/dist/esm/report/ReportGrid.native.js +471 -0
  122. package/dist/esm/report/ReportGrid.native.js.map +1 -0
  123. package/dist/esm/report/ReportViewToolbar.mjs +228 -0
  124. package/dist/esm/report/ReportViewToolbar.mjs.map +1 -0
  125. package/dist/esm/report/ReportViewToolbar.native.js +264 -0
  126. package/dist/esm/report/ReportViewToolbar.native.js.map +1 -0
  127. package/dist/esm/report/queryReport.mjs +404 -0
  128. package/dist/esm/report/queryReport.mjs.map +1 -0
  129. package/dist/esm/report/queryReport.native.js +545 -0
  130. package/dist/esm/report/queryReport.native.js.map +1 -0
  131. package/dist/esm/report/queryReportColumns.mjs +105 -0
  132. package/dist/esm/report/queryReportColumns.mjs.map +1 -0
  133. package/dist/esm/report/queryReportColumns.native.js +119 -0
  134. package/dist/esm/report/queryReportColumns.native.js.map +1 -0
  135. package/dist/esm/report/reportViewModel.mjs +343 -0
  136. package/dist/esm/report/reportViewModel.mjs.map +1 -0
  137. package/dist/esm/report/reportViewModel.native.js +611 -0
  138. package/dist/esm/report/reportViewModel.native.js.map +1 -0
  139. package/dist/esm/report/savedReports.mjs +112 -0
  140. package/dist/esm/report/savedReports.mjs.map +1 -0
  141. package/dist/esm/report/savedReports.native.js +141 -0
  142. package/dist/esm/report/savedReports.native.js.map +1 -0
  143. package/dist/esm/report/useFrappeReport.mjs +158 -0
  144. package/dist/esm/report/useFrappeReport.mjs.map +1 -0
  145. package/dist/esm/report/useFrappeReport.native.js +185 -0
  146. package/dist/esm/report/useFrappeReport.native.js.map +1 -0
  147. package/dist/esm/report/useQueryReport.mjs +176 -0
  148. package/dist/esm/report/useQueryReport.mjs.map +1 -0
  149. package/dist/esm/report/useQueryReport.native.js +205 -0
  150. package/dist/esm/report/useQueryReport.native.js.map +1 -0
  151. package/dist/esm/useFrappeForm.mjs +533 -0
  152. package/dist/esm/useFrappeForm.mjs.map +1 -0
  153. package/dist/esm/useFrappeForm.native.js +686 -0
  154. package/dist/esm/useFrappeForm.native.js.map +1 -0
  155. package/dist/jsx/FrappeCalendar.mjs +4 -3
  156. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  157. package/dist/jsx/FrappeCalendar.native.js +3 -2
  158. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  159. package/dist/jsx/FrappeForm.mjs +151 -467
  160. package/dist/jsx/FrappeForm.mjs.map +1 -1
  161. package/dist/jsx/FrappeForm.native.js +152 -633
  162. package/dist/jsx/FrappeForm.native.js.map +1 -1
  163. package/dist/jsx/FrappeListView.mjs +6 -28
  164. package/dist/jsx/FrappeListView.mjs.map +1 -1
  165. package/dist/jsx/FrappeListView.native.js +11 -32
  166. package/dist/jsx/FrappeListView.native.js.map +1 -1
  167. package/dist/jsx/FrappeReportBuilder.mjs +526 -312
  168. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  169. package/dist/jsx/FrappeReportBuilder.native.js +658 -353
  170. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  171. package/dist/jsx/FrappeReportView.mjs +30 -229
  172. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  173. package/dist/jsx/FrappeReportView.native.js +39 -283
  174. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  175. package/dist/jsx/dependsOn.mjs +2 -2
  176. package/dist/jsx/dependsOn.mjs.map +1 -1
  177. package/dist/jsx/dependsOn.native.js +1 -2
  178. package/dist/jsx/dependsOn.native.js.map +1 -1
  179. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs +2 -2
  180. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  181. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js +2 -2
  182. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  183. package/dist/jsx/formEngine/docPermissions.mjs +19 -1
  184. package/dist/jsx/formEngine/docPermissions.mjs.map +1 -1
  185. package/dist/jsx/formEngine/docPermissions.native.js +69 -0
  186. package/dist/jsx/formEngine/docPermissions.native.js.map +1 -1
  187. package/dist/jsx/formEngine/index.mjs +2 -2
  188. package/dist/jsx/formEngine/index.mjs.map +1 -1
  189. package/dist/jsx/formEngine/index.native.js +2 -0
  190. package/dist/jsx/formEngine/index.native.js.map +1 -1
  191. package/dist/jsx/index.js +16 -4
  192. package/dist/jsx/index.js.map +1 -1
  193. package/dist/jsx/index.mjs +16 -4
  194. package/dist/jsx/index.mjs.map +1 -1
  195. package/dist/jsx/index.native.js +67 -7
  196. package/dist/jsx/index.native.js.map +1 -1
  197. package/dist/jsx/liveErrors.mjs +8 -3
  198. package/dist/jsx/liveErrors.mjs.map +1 -1
  199. package/dist/jsx/liveErrors.native.js +8 -2
  200. package/dist/jsx/liveErrors.native.js.map +1 -1
  201. package/dist/jsx/measures.mjs +5 -0
  202. package/dist/jsx/measures.mjs.map +1 -0
  203. package/dist/jsx/measures.native.js +34 -0
  204. package/dist/jsx/measures.native.js.map +1 -0
  205. package/dist/jsx/recordShape.mjs +74 -0
  206. package/dist/jsx/recordShape.mjs.map +1 -0
  207. package/dist/jsx/recordShape.native.js +115 -0
  208. package/dist/jsx/recordShape.native.js.map +1 -0
  209. package/dist/jsx/report/ReportGrid.mjs +428 -0
  210. package/dist/jsx/report/ReportGrid.mjs.map +1 -0
  211. package/dist/jsx/report/ReportGrid.native.js +510 -0
  212. package/dist/jsx/report/ReportGrid.native.js.map +1 -0
  213. package/dist/jsx/report/ReportViewToolbar.mjs +228 -0
  214. package/dist/jsx/report/ReportViewToolbar.mjs.map +1 -0
  215. package/dist/jsx/report/ReportViewToolbar.native.js +303 -0
  216. package/dist/jsx/report/ReportViewToolbar.native.js.map +1 -0
  217. package/dist/jsx/report/queryReport.mjs +404 -0
  218. package/dist/jsx/report/queryReport.mjs.map +1 -0
  219. package/dist/jsx/report/queryReport.native.js +588 -0
  220. package/dist/jsx/report/queryReport.native.js.map +1 -0
  221. package/dist/jsx/report/queryReportColumns.mjs +105 -0
  222. package/dist/jsx/report/queryReportColumns.mjs.map +1 -0
  223. package/dist/jsx/report/queryReportColumns.native.js +159 -0
  224. package/dist/jsx/report/queryReportColumns.native.js.map +1 -0
  225. package/dist/jsx/report/reportViewModel.mjs +343 -0
  226. package/dist/jsx/report/reportViewModel.mjs.map +1 -0
  227. package/dist/jsx/report/reportViewModel.native.js +657 -0
  228. package/dist/jsx/report/reportViewModel.native.js.map +1 -0
  229. package/dist/jsx/report/savedReports.mjs +112 -0
  230. package/dist/jsx/report/savedReports.mjs.map +1 -0
  231. package/dist/jsx/report/savedReports.native.js +169 -0
  232. package/dist/jsx/report/savedReports.native.js.map +1 -0
  233. package/dist/jsx/report/useFrappeReport.mjs +158 -0
  234. package/dist/jsx/report/useFrappeReport.mjs.map +1 -0
  235. package/dist/jsx/report/useFrappeReport.native.js +214 -0
  236. package/dist/jsx/report/useFrappeReport.native.js.map +1 -0
  237. package/dist/jsx/report/useQueryReport.mjs +176 -0
  238. package/dist/jsx/report/useQueryReport.mjs.map +1 -0
  239. package/dist/jsx/report/useQueryReport.native.js +233 -0
  240. package/dist/jsx/report/useQueryReport.native.js.map +1 -0
  241. package/dist/jsx/useFrappeForm.mjs +533 -0
  242. package/dist/jsx/useFrappeForm.mjs.map +1 -0
  243. package/dist/jsx/useFrappeForm.native.js +714 -0
  244. package/dist/jsx/useFrappeForm.native.js.map +1 -0
  245. package/package.json +16 -16
  246. package/src/FrappeCalendar.tsx +8 -2
  247. package/src/FrappeForm.stories.tsx +52 -0
  248. package/src/FrappeForm.tsx +176 -565
  249. package/src/FrappeListView.cards.stories.tsx +3 -6
  250. package/src/FrappeListView.tsx +15 -55
  251. package/src/FrappeReportBuilder.stories.tsx +34 -7
  252. package/src/FrappeReportBuilder.tsx +790 -380
  253. package/src/FrappeReportView.spec.tsx +10 -6
  254. package/src/FrappeReportView.stories.tsx +20 -1
  255. package/src/FrappeReportView.tsx +89 -415
  256. package/src/dependsOn.ts +4 -1
  257. package/src/fields/shared/EditorPreviewPanes.tsx +2 -2
  258. package/src/formEngine/docPermissions.spec.ts +36 -1
  259. package/src/formEngine/docPermissions.ts +34 -0
  260. package/src/formEngine/index.ts +8 -1
  261. package/src/frappeRemainder.designLaw.spec.ts +9 -1
  262. package/src/frappeRoutes.spec.tsx +9 -0
  263. package/src/frappeViews.designLaw.spec.ts +15 -2
  264. package/src/guestFallback.spec.tsx +236 -0
  265. package/src/index.ts +117 -16
  266. package/src/liveErrors.spec.ts +10 -0
  267. package/src/liveErrors.ts +16 -3
  268. package/src/measures.ts +11 -0
  269. package/src/recordShape.spec.ts +100 -0
  270. package/src/recordShape.ts +133 -0
  271. package/src/report/ReportGrid.spec.tsx +175 -0
  272. package/src/report/ReportGrid.tsx +530 -0
  273. package/src/report/ReportViewToolbar.spec.tsx +90 -0
  274. package/src/report/ReportViewToolbar.tsx +314 -0
  275. package/src/report/queryReport.spec.ts +483 -0
  276. package/src/report/queryReport.ts +722 -0
  277. package/src/report/queryReportColumns.tsx +123 -0
  278. package/src/report/reportViewModel.spec.ts +393 -0
  279. package/src/report/reportViewModel.ts +617 -0
  280. package/src/report/savedReports.ts +172 -0
  281. package/src/report/seam.spec.ts +216 -0
  282. package/src/report/useFrappeReport.ts +241 -0
  283. package/src/report/useQueryReport.spec.tsx +131 -0
  284. package/src/report/useQueryReport.ts +309 -0
  285. package/src/useFrappeForm.spec.tsx +209 -0
  286. package/src/useFrappeForm.ts +778 -0
  287. package/types/FrappeCalendar.d.ts.map +1 -1
  288. package/types/FrappeForm.d.ts +21 -1
  289. package/types/FrappeForm.d.ts.map +1 -1
  290. package/types/FrappeListView.d.ts.map +1 -1
  291. package/types/FrappeReportBuilder.d.ts +66 -16
  292. package/types/FrappeReportBuilder.d.ts.map +1 -1
  293. package/types/FrappeReportView.d.ts +9 -127
  294. package/types/FrappeReportView.d.ts.map +1 -1
  295. package/types/dependsOn.d.ts.map +1 -1
  296. package/types/formEngine/docPermissions.d.ts +14 -0
  297. package/types/formEngine/docPermissions.d.ts.map +1 -1
  298. package/types/formEngine/index.d.ts +1 -1
  299. package/types/formEngine/index.d.ts.map +1 -1
  300. package/types/index.d.ts +15 -3
  301. package/types/index.d.ts.map +1 -1
  302. package/types/liveErrors.d.ts +9 -1
  303. package/types/liveErrors.d.ts.map +1 -1
  304. package/types/measures.d.ts +3 -0
  305. package/types/measures.d.ts.map +1 -0
  306. package/types/recordShape.d.ts +45 -0
  307. package/types/recordShape.d.ts.map +1 -0
  308. package/types/report/ReportGrid.d.ts +20 -0
  309. package/types/report/ReportGrid.d.ts.map +1 -0
  310. package/types/report/ReportViewToolbar.d.ts +31 -0
  311. package/types/report/ReportViewToolbar.d.ts.map +1 -0
  312. package/types/report/queryReport.d.ts +181 -0
  313. package/types/report/queryReport.d.ts.map +1 -0
  314. package/types/report/queryReportColumns.d.ts +12 -0
  315. package/types/report/queryReportColumns.d.ts.map +1 -0
  316. package/types/report/reportViewModel.d.ts +146 -0
  317. package/types/report/reportViewModel.d.ts.map +1 -0
  318. package/types/report/savedReports.d.ts +27 -0
  319. package/types/report/savedReports.d.ts.map +1 -0
  320. package/types/report/useFrappeReport.d.ts +60 -0
  321. package/types/report/useFrappeReport.d.ts.map +1 -0
  322. package/types/report/useQueryReport.d.ts +37 -0
  323. package/types/report/useQueryReport.d.ts.map +1 -0
  324. package/types/useFrappeForm.d.ts +142 -0
  325. package/types/useFrappeForm.d.ts.map +1 -0
@@ -39,231 +39,425 @@ __export(FrappeReportBuilder_exports, {
39
39
  });
40
40
  module.exports = __toCommonJS(FrappeReportBuilder_exports);
41
41
  var import_jsx_runtime = require("react/jsx-runtime");
42
- var import_frappe = require("@multiplatform.one/frappe");
43
- var import_platform = require("@multiplatform.one/platform");
44
42
  var import_components = require("@multiplatform.one/components");
43
+ var import_frappe = require("@multiplatform.one/frappe");
45
44
  var import_forms = require("@multiplatform.one/forms");
45
+ var import_platform = require("@multiplatform.one/platform");
46
46
  var import_store = require("@multiplatform.one/store");
47
+ var import_table = require("@multiplatform.one/table");
48
+ var import_theme = require("@multiplatform.one/theme");
47
49
  var import_react = __toESM(require("react"));
48
50
  var import_react_i18next = require("react-i18next");
49
- var import_tamagui = require("tamagui");
50
- var import_react2 = require("@phosphor-icons/react");
51
- var import_theme = require("@multiplatform.one/theme");
51
+ var import_FrappeNotConfigured = require("./FrappeNotConfigured.native.js");
52
52
  var import_FrappeProvider = require("./FrappeProvider.native.js");
53
+ var import_liveErrors = require("./liveErrors.native.js");
54
+ var import_recordShape = require("./recordShape.native.js");
55
+ var import_ReportGrid = require("./report/ReportGrid.native.js");
56
+ var import_ReportViewToolbar = require("./report/ReportViewToolbar.native.js");
57
+ var import_reportViewModel = require("./report/reportViewModel.native.js");
58
+ var import_savedReports = require("./report/savedReports.native.js");
53
59
  var import_useFrappeRows = require("./useFrappeRows.native.js");
54
- function getSavedReportsKey(doctype) {
55
- return `frappe-report-${doctype}`;
60
+ function _instanceof(left, right) {
61
+ "@swc/helpers - instanceof";
62
+
63
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
64
+ return !!right[Symbol.hasInstance](left);
65
+ } else {
66
+ return left instanceof right;
67
+ }
68
+ }
69
+ function _type_of(obj) {
70
+ "@swc/helpers - typeof";
71
+
72
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
73
+ }
74
+ var EMPTY_FILTERS = [];
75
+ var COLUMN_FILTER_DEBOUNCE_MS = 350;
76
+ function columnsStorageKey(doctype) {
77
+ return `backoffice.report.columns.${doctype}`;
56
78
  }
57
- async function loadSavedReports(doctype) {
79
+ async function readStoredColumns(doctype) {
58
80
  try {
59
- var raw = await Promise.resolve(import_store.storage.getItem(getSavedReportsKey(doctype)));
60
- if (raw) return JSON.parse(raw);
81
+ var raw = await Promise.resolve(import_store.storage.getItem(columnsStorageKey(doctype)));
82
+ if (!raw) return void 0;
83
+ var parsed = JSON.parse(raw);
84
+ if (Array.isArray(parsed) && parsed.every(function (entry) {
85
+ return typeof entry === "string";
86
+ })) {
87
+ return parsed;
88
+ }
61
89
  } catch (unused) {}
62
- return [];
90
+ return void 0;
63
91
  }
64
- async function persistSavedReports(doctype, reports) {
92
+ function persistStoredColumns(doctype, fieldnames) {
65
93
  try {
66
- await Promise.resolve(import_store.storage.setItem(getSavedReportsKey(doctype), JSON.stringify(reports)));
94
+ void Promise.resolve(import_store.storage.setItem(columnsStorageKey(doctype), JSON.stringify(fieldnames)));
67
95
  } catch (unused) {}
68
96
  }
97
+ function toReportFilters(filters) {
98
+ if (!filters) return void 0;
99
+ if (Array.isArray(filters)) return filters.length > 0 ? filters : void 0;
100
+ var tuples = Object.entries(filters).map(function (param) {
101
+ var [field, value] = param;
102
+ return [field, "=", value];
103
+ });
104
+ return tuples.length > 0 ? tuples : void 0;
105
+ }
106
+ function initialFieldnames(columns) {
107
+ if (!columns) return null;
108
+ var fieldnames = columns.flatMap(function (column) {
109
+ return typeof column === "string" ? [column] : column.enabled ? [column.fieldname] : [];
110
+ });
111
+ return fieldnames.length > 0 ? fieldnames : null;
112
+ }
113
+ function asFieldType(fieldtype) {
114
+ var _frappeFieldTypes_find;
115
+ return (_frappeFieldTypes_find = import_frappe.frappeFieldTypes.find(function (known) {
116
+ return known === fieldtype;
117
+ })) !== null && _frappeFieldTypes_find !== void 0 ? _frappeFieldTypes_find : "Data";
118
+ }
119
+ function refusedMetaFields(initialColumns, recordFields) {
120
+ var declared = (initialColumns !== null && initialColumns !== void 0 ? initialColumns : []).map(function (column) {
121
+ return typeof column === "string" ? {
122
+ fieldname: column,
123
+ label: (0, import_recordShape.recordKeyLabel)(column),
124
+ fieldtype: "Data"
125
+ } : {
126
+ fieldname: column.fieldname,
127
+ label: column.label,
128
+ fieldtype: asFieldType(column.fieldtype)
129
+ };
130
+ });
131
+ return (declared.length > 0 ? declared : recordFields !== null && recordFields !== void 0 ? recordFields : []).filter(function (field) {
132
+ return field.fieldname !== "name";
133
+ }).map(function (field) {
134
+ return {
135
+ ...field,
136
+ read_only: 1,
137
+ in_list_view: 1
138
+ };
139
+ });
140
+ }
141
+ function asError(error) {
142
+ return _instanceof(error, Error) ? error : new Error(String(error));
143
+ }
144
+ function groupField(groupBy) {
145
+ if (!groupBy) return null;
146
+ return typeof groupBy === "string" ? groupBy : groupBy.field;
147
+ }
148
+ function aggregateGroups(rows, field, config) {
149
+ var groups = /* @__PURE__ */new Map();
150
+ var _iteratorNormalCompletion = true,
151
+ _didIteratorError = false,
152
+ _iteratorError = void 0;
153
+ try {
154
+ for (var _iterator = rows[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
155
+ var row = _step.value;
156
+ var key = row[field] === null || row[field] === void 0 ? "" : String(row[field]);
157
+ var bucket = groups.get(key);
158
+ if (bucket) bucket.push(row);else groups.set(key, [row]);
159
+ }
160
+ } catch (err) {
161
+ _didIteratorError = true;
162
+ _iteratorError = err;
163
+ } finally {
164
+ try {
165
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
166
+ _iterator.return();
167
+ }
168
+ } finally {
169
+ if (_didIteratorError) {
170
+ throw _iteratorError;
171
+ }
172
+ }
173
+ }
174
+ var numbers = function numbers2(group) {
175
+ return group.map(function (row2) {
176
+ return Number((config === null || config === void 0 ? void 0 : config.aggregationField) ? row2[config.aggregationField] : 0) || 0;
177
+ });
178
+ };
179
+ return [...groups.entries()].map(function (param) {
180
+ var [label, group] = param;
181
+ switch ((config === null || config === void 0 ? void 0 : config.aggregationField) ? config.aggregation : "count") {
182
+ case "sum":
183
+ return {
184
+ label,
185
+ value: numbers(group).reduce(function (sum, value) {
186
+ return sum + value;
187
+ }, 0)
188
+ };
189
+ case "avg":
190
+ return {
191
+ label,
192
+ value: numbers(group).reduce(function (sum, value) {
193
+ return sum + value;
194
+ }, 0) / group.length
195
+ };
196
+ case "min":
197
+ return {
198
+ label,
199
+ value: Math.min(...numbers(group))
200
+ };
201
+ case "max":
202
+ return {
203
+ label,
204
+ value: Math.max(...numbers(group))
205
+ };
206
+ default:
207
+ return {
208
+ label,
209
+ value: group.length
210
+ };
211
+ }
212
+ });
213
+ }
69
214
  function canDownloadCsv() {
70
215
  return typeof document !== "undefined" && typeof document.createElement === "function" && typeof Blob !== "undefined" && typeof URL !== "undefined" && typeof URL.createObjectURL === "function";
71
216
  }
72
- function FrappeReportBuilder(param) {
217
+ function FrappeReportBuilder(props) {
218
+ var _props_baseURL;
219
+ var config = (0, import_FrappeProvider.useFrappeConfig)();
220
+ if (!((_props_baseURL = props.baseURL) !== null && _props_baseURL !== void 0 ? _props_baseURL : config === null || config === void 0 ? void 0 : config.baseURL) && !(config === null || config === void 0 ? void 0 : config.fixtures)) {
221
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FrappeNotConfigured.FrappeNotConfigured, {
222
+ doctype: props.doctype
223
+ });
224
+ }
225
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(FrappeReportBuilderBody, {
226
+ ...props
227
+ });
228
+ }
229
+ function FrappeReportBuilderBody(param) {
73
230
  var {
74
231
  doctype,
232
+ filters,
233
+ scopeFilters,
234
+ onClearFilters,
75
235
  initialColumns,
76
236
  initialGroupBy,
77
- filters,
78
237
  showChart = false,
79
- onExport,
238
+ onOpenRow,
80
239
  onRowPress,
240
+ onOpenLink,
241
+ report: reportProp,
242
+ onReportChange,
243
+ onExport,
244
+ loading: loadingFallback,
245
+ error: errorFallback,
81
246
  baseURL,
82
247
  auth,
83
248
  syncOptions,
84
249
  ...stackProps
85
250
  } = param;
86
- var config = (0, import_FrappeProvider.useFrappeConfig)();
87
- var {
88
- knobProps
89
- } = (0, import_theme.useResolvedKnobs)();
251
+ var _ref, _ref1, _ref2;
90
252
  var {
91
253
  t
92
254
  } = (0, import_react_i18next.useTranslation)();
255
+ var {
256
+ knobProps
257
+ } = (0, import_theme.useResolvedKnobs)();
258
+ var config = (0, import_FrappeProvider.useFrappeConfig)();
93
259
  var finalBaseURL = baseURL !== null && baseURL !== void 0 ? baseURL : config === null || config === void 0 ? void 0 : config.baseURL;
94
260
  var finalAuth = auth !== null && auth !== void 0 ? auth : config === null || config === void 0 ? void 0 : config.auth;
95
261
  var finalSyncOptions = syncOptions !== null && syncOptions !== void 0 ? syncOptions : config === null || config === void 0 ? void 0 : config.syncOptions;
96
- if (!finalBaseURL && !(config === null || config === void 0 ? void 0 : config.fixtures)) {
97
- throw new Error("FrappeReportBuilder requires baseURL prop or FrappeProvider with baseURL or fixtures");
98
- }
99
- var connectionConfig = {
100
- baseURL: finalBaseURL,
101
- socketPort: config === null || config === void 0 ? void 0 : config.socketPort,
102
- siteName: config === null || config === void 0 ? void 0 : config.siteName,
103
- socketBaseURL: config === null || config === void 0 ? void 0 : config.socketBaseURL,
104
- auth: finalAuth,
105
- syncOptions: finalSyncOptions,
106
- realtime: config === null || config === void 0 ? void 0 : config.realtime,
107
- fixtures: config === null || config === void 0 ? void 0 : config.fixtures
108
- };
262
+ var fixtureMode = Boolean(config === null || config === void 0 ? void 0 : config.fixtures);
263
+ var connection = (0, import_react.useMemo)(function () {
264
+ return {
265
+ baseURL: finalBaseURL,
266
+ socketPort: config === null || config === void 0 ? void 0 : config.socketPort,
267
+ siteName: config === null || config === void 0 ? void 0 : config.siteName,
268
+ socketBaseURL: config === null || config === void 0 ? void 0 : config.socketBaseURL,
269
+ auth: finalAuth,
270
+ syncOptions: finalSyncOptions,
271
+ realtime: config === null || config === void 0 ? void 0 : config.realtime,
272
+ fixtures: config === null || config === void 0 ? void 0 : config.fixtures
273
+ };
274
+ }, [finalBaseURL, config === null || config === void 0 ? void 0 : config.socketPort, config === null || config === void 0 ? void 0 : config.siteName, config === null || config === void 0 ? void 0 : config.socketBaseURL, finalAuth, finalSyncOptions, config === null || config === void 0 ? void 0 : config.realtime, config === null || config === void 0 ? void 0 : config.fixtures]);
109
275
  var {
110
276
  meta,
111
- isLoading: isMetaLoading,
277
+ isLoading: metaLoading,
112
278
  error: metaError
113
- } = (0, import_frappe.useDocTypeMeta)(connectionConfig, doctype);
279
+ } = (0, import_frappe.useDocTypeMeta)(connection, doctype);
280
+ var metaRefused = !meta && metaError !== void 0 && (0, import_liveErrors.isPermissionError)(metaError);
281
+ var initialColumnsJson = JSON.stringify(initialColumns !== null && initialColumns !== void 0 ? initialColumns : []);
282
+ var declaresColumns = initialColumnsJson !== "[]";
283
+ var recordShape = (0, import_recordShape.useRecordShape)(connection, doctype, metaRefused && !declaresColumns);
284
+ var layoutMeta = (0, import_react.useMemo)(function () {
285
+ if (meta) return meta;
286
+ if (!metaRefused) return void 0;
287
+ var fields = refusedMetaFields(JSON.parse(initialColumnsJson), recordShape.fields);
288
+ return fields.length > 0 ? {
289
+ fields
290
+ } : void 0;
291
+ }, [meta, metaRefused, initialColumnsJson, recordShape.fields]);
292
+ var readsWithoutMeta = !meta && layoutMeta !== void 0;
293
+ var savedReports = (0, import_savedReports.useSavedReports)(doctype, (0, import_react.useMemo)(function () {
294
+ var _connection_baseURL;
295
+ return {
296
+ baseURL: metaRefused ? "" : (_connection_baseURL = connection.baseURL) !== null && _connection_baseURL !== void 0 ? _connection_baseURL : "",
297
+ auth: connection.auth,
298
+ fixtures: connection.fixtures
299
+ };
300
+ }, [metaRefused, connection.baseURL, connection.auth, connection.fixtures]));
301
+ var [internalReport, setInternalReport] = (0, import_react.useState)(null);
302
+ var currentReport = reportProp !== void 0 ? reportProp : internalReport;
114
303
  var allColumns = (0, import_react.useMemo)(function () {
115
- if (initialColumns) return initialColumns;
116
- if (!meta) return [];
117
- return meta.fields.filter(function (f) {
118
- return f.fieldtype !== "Section Break" && f.fieldtype !== "Column Break" && f.fieldtype !== "Tab Break";
119
- }).map(function (f) {
120
- return {
121
- fieldname: f.fieldname,
122
- label: f.label || f.fieldname,
123
- fieldtype: f.fieldtype,
124
- enabled: !!f.in_list_view
125
- };
304
+ var columns = (0, import_reportViewModel.reportColumnsFromMeta)(layoutMeta);
305
+ if (!readsWithoutMeta || !layoutMeta) return columns;
306
+ var own = new Set(layoutMeta.fields.map(function (field) {
307
+ return field.fieldname;
308
+ }));
309
+ return columns.filter(function (column) {
310
+ return column.fieldname === "name" || own.has(column.fieldname);
126
311
  });
127
- }, [initialColumns, meta]);
128
- var fetchFields = (0, import_react.useMemo)(function () {
129
- var fieldNames = allColumns.map(function (c) {
130
- return c.fieldname;
312
+ }, [layoutMeta, readsWithoutMeta]);
313
+ var defaultFieldnames = (0, import_react.useMemo)(function () {
314
+ return readsWithoutMeta && layoutMeta ? ["name", ...layoutMeta.fields.map(function (field) {
315
+ return field.fieldname;
316
+ })] : (0, import_reportViewModel.defaultReportFieldnames)(layoutMeta);
317
+ }, [layoutMeta, readsWithoutMeta]);
318
+ var initialColumnsKey = JSON.stringify(initialFieldnames(initialColumns));
319
+ var startFieldnames = (0, import_react.useMemo)(function () {
320
+ return JSON.parse(initialColumnsKey);
321
+ }, [initialColumnsKey]);
322
+ var [storedColumns, setStoredColumns] = (0, import_react.useState)(void 0);
323
+ var [selectedOverride, setSelectedOverride] = (0, import_react.useState)(null);
324
+ (0, import_react.useEffect)(function () {
325
+ if (fixtureMode) return;
326
+ var cancelled = false;
327
+ void readStoredColumns(doctype).then(function (stored) {
328
+ if (!cancelled) setStoredColumns(stored);
131
329
  });
132
- if (!fieldNames.includes("name")) {
133
- fieldNames.unshift("name");
134
- }
135
- return fieldNames;
136
- }, [allColumns]);
137
- var {
138
- rows,
139
- isQueryLoading: isLoading,
140
- isError
141
- } = (0, import_useFrappeRows.useFrappeRows)(connectionConfig, doctype, {
142
- fields: fetchFields,
143
- filters,
144
- limit: null
145
- });
146
- var data = rows;
147
- var [isLiveStale, setIsLiveStale] = (0, import_react.useState)(false);
148
- var staleTimerRef = (0, import_react.useRef)(void 0);
149
- var clearStaleTimer = (0, import_react.useCallback)(function () {
150
- if (staleTimerRef.current) {
151
- clearTimeout(staleTimerRef.current);
152
- staleTimerRef.current = void 0;
153
- }
154
- }, []);
155
- (0, import_frappe.useFrappeDoctypeEvents)(connectionConfig, doctype, function (event) {
156
- if (event.type !== "doc_update" && event.type !== "list_update" && event.type !== "doc_deleted" && event.type !== "doc_changed") {
157
- return;
158
- }
159
- setIsLiveStale(true);
160
- clearStaleTimer();
161
- staleTimerRef.current = setTimeout(function () {
162
- return setIsLiveStale(false);
163
- }, 2500);
164
- });
165
- var isFirstData = (0, import_react.useRef)(true);
330
+ return function () {
331
+ cancelled = true;
332
+ };
333
+ }, [doctype, fixtureMode]);
334
+ var selectedFieldnames = (_ref = (_ref1 = selectedOverride !== null && selectedOverride !== void 0 ? selectedOverride : startFieldnames) !== null && _ref1 !== void 0 ? _ref1 : storedColumns) !== null && _ref !== void 0 ? _ref : defaultFieldnames;
335
+ var selectedColumns = (0, import_react.useMemo)(function () {
336
+ return (0, import_reportViewModel.resolveSelectedColumns)(allColumns, selectedFieldnames);
337
+ }, [allColumns, selectedFieldnames]);
338
+ var filtersKey = JSON.stringify(filters !== null && filters !== void 0 ? filters : null);
339
+ var propFilters = (0, import_react.useMemo)(function () {
340
+ return toReportFilters(JSON.parse(filtersKey));
341
+ }, [filtersKey]);
342
+ var [filtersCleared, setFiltersCleared] = (0, import_react.useState)(false);
343
+ var [reportFilters, setReportFilters] = (0, import_react.useState)(null);
344
+ var baseFilters = filtersCleared ? EMPTY_FILTERS : (_ref2 = reportFilters !== null && reportFilters !== void 0 ? reportFilters : propFilters) !== null && _ref2 !== void 0 ? _ref2 : EMPTY_FILTERS;
345
+ var [filterDrafts, setFilterDrafts] = (0, import_react.useState)({});
346
+ var [committedFilters, setCommittedFilters] = (0, import_react.useState)({});
166
347
  (0, import_react.useEffect)(function () {
167
- if (isFirstData.current) {
168
- isFirstData.current = false;
169
- return;
170
- }
171
- setIsLiveStale(false);
172
- clearStaleTimer();
173
- }, [data, clearStaleTimer]);
348
+ var handle = setTimeout(function () {
349
+ setCommittedFilters(function (previous) {
350
+ return JSON.stringify(previous) === JSON.stringify(filterDrafts) ? previous : filterDrafts;
351
+ });
352
+ }, COLUMN_FILTER_DEBOUNCE_MS);
353
+ return function () {
354
+ return clearTimeout(handle);
355
+ };
356
+ }, [filterDrafts]);
357
+ var columnTuples = (0, import_react.useMemo)(function () {
358
+ return (0, import_reportViewModel.columnFilterTuples)(selectedColumns, committedFilters);
359
+ }, [selectedColumns, committedFilters]);
360
+ var scopeKey = JSON.stringify(scopeFilters !== null && scopeFilters !== void 0 ? scopeFilters : []);
361
+ var scope = (0, import_react.useMemo)(function () {
362
+ return JSON.parse(scopeKey);
363
+ }, [scopeKey]);
364
+ var effectiveFilters = (0, import_react.useMemo)(function () {
365
+ return [...scope, ...baseFilters, ...columnTuples];
366
+ }, [scope, baseFilters, columnTuples]);
367
+ var metaSort = (0, import_react.useMemo)(function () {
368
+ return {
369
+ field: ((meta === null || meta === void 0 ? void 0 : meta.sort_field) || "modified").split(" ")[0],
370
+ order: ((meta === null || meta === void 0 ? void 0 : meta.sort_order) || "DESC").toLowerCase() === "asc" ? "asc" : "desc"
371
+ };
372
+ }, [meta === null || meta === void 0 ? void 0 : meta.sort_field, meta === null || meta === void 0 ? void 0 : meta.sort_order]);
373
+ var [sortOverride, setSortOverride] = (0, import_react.useState)(null);
374
+ var sort = sortOverride !== null && sortOverride !== void 0 ? sortOverride : metaSort;
375
+ var startGroupBy = groupField(initialGroupBy);
376
+ var chartConfig = (typeof initialGroupBy === "undefined" ? "undefined" : _type_of(initialGroupBy)) === "object" ? initialGroupBy : void 0;
377
+ var [groupBy, setGroupBy] = (0, import_react.useState)(startGroupBy);
378
+ var [pageSize, setPageSize] = (0, import_react.useState)(import_reportViewModel.DEFAULT_REPORT_PAGE_SIZE);
379
+ var [page, setPage] = (0, import_react.useState)(0);
174
380
  (0, import_react.useEffect)(function () {
175
- return clearStaleTimer;
176
- }, [clearStaleTimer]);
177
- var [groupBy, setGroupBy] = (0, import_react.useState)(initialGroupBy !== null && initialGroupBy !== void 0 ? initialGroupBy : null);
178
- var [enabledColumns, setEnabledColumns] = (0, import_react.useState)([]);
381
+ setSelectedOverride(null);
382
+ setStoredColumns(void 0);
383
+ setSortOverride(null);
384
+ setGroupBy(startGroupBy);
385
+ setPage(0);
386
+ setPageSize(import_reportViewModel.DEFAULT_REPORT_PAGE_SIZE);
387
+ setFilterDrafts({});
388
+ setCommittedFilters({});
389
+ setFiltersCleared(false);
390
+ setReportFilters(null);
391
+ },
392
+ // startGroupBy is the mount-time seed; only a doctype swap re-seeds.
393
+ // eslint-disable-next-line react-hooks/exhaustive-deps
394
+ [doctype]);
179
395
  (0, import_react.useEffect)(function () {
180
- if (allColumns.length > 0 && enabledColumns.length === 0) {
181
- var initial = allColumns.filter(function (c) {
182
- return c.enabled;
183
- }).map(function (c) {
184
- return c.fieldname;
185
- });
186
- if (initial.length === 0) {
187
- setEnabledColumns(allColumns.slice(0, 5).map(function (c) {
188
- return c.fieldname;
189
- }));
190
- } else {
191
- setEnabledColumns(initial);
192
- }
193
- }
194
- }, [allColumns, enabledColumns.length]);
195
- var [savedReports, setSavedReports] = (0, import_react.useState)([]);
196
- var [saveDialogOpen, setSaveDialogOpen] = (0, import_react.useState)(false);
197
- var [saveReportName, setSaveReportName] = (0, import_react.useState)("");
396
+ return setFiltersCleared(false);
397
+ }, [filtersKey]);
398
+ var effectiveFiltersKey = (0, import_react.useMemo)(function () {
399
+ return JSON.stringify(effectiveFilters);
400
+ }, [effectiveFilters]);
198
401
  (0, import_react.useEffect)(function () {
402
+ setPage(0);
403
+ }, [effectiveFiltersKey, pageSize, groupBy]);
404
+ (0, import_react.useEffect)(function () {
405
+ if (!currentReport) {
406
+ setReportFilters(null);
407
+ return;
408
+ }
199
409
  var cancelled = false;
200
- void async function () {
201
- var reports = await loadSavedReports(doctype);
202
- if (!cancelled) {
203
- setSavedReports(reports);
410
+ void savedReports.load(currentReport).then(function (saved) {
411
+ var _saved_groupBy;
412
+ if (cancelled || !saved) return;
413
+ setSelectedOverride(saved.fieldnames.length > 0 ? saved.fieldnames : null);
414
+ setReportFilters(saved.filters);
415
+ setFilterDrafts({});
416
+ setCommittedFilters({});
417
+ setFiltersCleared(false);
418
+ if (saved.sort) setSortOverride(saved.sort);
419
+ if (saved.pageSize && import_reportViewModel.REPORT_PAGE_SIZES.some(function (size) {
420
+ return size === saved.pageSize;
421
+ })) {
422
+ setPageSize(saved.pageSize);
204
423
  }
205
- }();
424
+ setGroupBy((_saved_groupBy = saved.groupBy) !== null && _saved_groupBy !== void 0 ? _saved_groupBy : null);
425
+ });
206
426
  return function () {
207
427
  cancelled = true;
208
428
  };
209
- }, [doctype]);
210
- var handleSaveReport = (0, import_react.useCallback)(function () {
211
- if (!saveReportName.trim()) return;
212
- var report = {
213
- name: saveReportName.trim(),
214
- columns: enabledColumns,
215
- groupBy,
216
- filters
217
- };
218
- var updated = [...savedReports.filter(function (r) {
219
- return r.name !== report.name;
220
- }), report];
221
- setSavedReports(updated);
222
- void persistSavedReports(doctype, updated);
223
- setSaveDialogOpen(false);
224
- setSaveReportName("");
225
- }, [saveReportName, enabledColumns, groupBy, filters, savedReports, doctype]);
226
- var handleLoadReport = (0, import_react.useCallback)(function (report) {
227
- setEnabledColumns(report.columns);
228
- setGroupBy(report.groupBy);
229
- }, []);
230
- var handleDeleteReport = (0, import_react.useCallback)(function (name) {
231
- var updated = savedReports.filter(function (r) {
232
- return r.name !== name;
429
+ },
430
+ // savedReports.load changes identity with its report list; reloading the
431
+ // config on list refreshes would clobber in-progress edits — key on the
432
+ // selected report (and doctype via load's closure) only.
433
+ // eslint-disable-next-line react-hooks/exhaustive-deps
434
+ [currentReport, doctype]);
435
+ var handleToggleColumn = (0, import_react.useCallback)(function (fieldname) {
436
+ setSelectedOverride(function (previous) {
437
+ var _ref3, _ref12;
438
+ var current = (_ref3 = (_ref12 = previous !== null && previous !== void 0 ? previous : startFieldnames) !== null && _ref12 !== void 0 ? _ref12 : storedColumns) !== null && _ref3 !== void 0 ? _ref3 : defaultFieldnames;
439
+ var next = current.includes(fieldname) ? current.length === 1 ? current : current.filter(function (entry) {
440
+ return entry !== fieldname;
441
+ }) : [...current, fieldname];
442
+ if (!fixtureMode && !currentReport) persistStoredColumns(doctype, next);
443
+ return next;
233
444
  });
234
- setSavedReports(updated);
235
- void persistSavedReports(doctype, updated);
236
- }, [savedReports, doctype]);
237
- var handleExport = (0, import_react.useCallback)(function (exportData) {
238
- if (onExport) {
239
- onExport(exportData);
240
- return;
241
- }
242
- var cols = allColumns.filter(function (c) {
243
- return enabledColumns.includes(c.fieldname);
244
- });
245
- var headers = cols.map(function (c) {
246
- return c.label;
247
- });
248
- var csvRows = [headers.join(",")];
445
+ }, [startFieldnames, storedColumns, defaultFieldnames, fixtureMode, currentReport, doctype]);
446
+ var handleResetColumns = (0, import_react.useCallback)(function () {
447
+ setSelectedOverride(defaultFieldnames);
448
+ setStoredColumns(void 0);
449
+ if (!fixtureMode) persistStoredColumns(doctype, defaultFieldnames);
450
+ }, [defaultFieldnames, fixtureMode, doctype]);
451
+ var fetchFields = (0, import_react.useMemo)(function () {
452
+ var fields = /* @__PURE__ */new Set(["name", sort.field]);
249
453
  var _iteratorNormalCompletion = true,
250
454
  _didIteratorError = false,
251
455
  _iteratorError = void 0;
252
456
  try {
253
- var _loop = function () {
254
- var row = _step.value;
255
- var values = cols.map(function (col) {
256
- var val = row[col.fieldname];
257
- if (val === null || val === void 0) return "";
258
- var str = String(val);
259
- if (str.includes(",") || str.includes('"') || str.includes("\n")) {
260
- return `"${str.replace(/"/g, '""')}"`;
261
- }
262
- return str;
263
- });
264
- csvRows.push(values.join(","));
265
- };
266
- for (var _iterator = exportData[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) _loop();
457
+ for (var _iterator = selectedColumns[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
458
+ var column = _step.value;
459
+ fields.add(column.fieldname);
460
+ }
267
461
  } catch (err) {
268
462
  _didIteratorError = true;
269
463
  _iteratorError = err;
@@ -278,210 +472,321 @@ function FrappeReportBuilder(param) {
278
472
  }
279
473
  }
280
474
  }
281
- var csvContent = csvRows.join("\n");
282
- var blob = new Blob([csvContent], {
283
- type: "text/csv;charset=utf-8;"
475
+ if (groupBy) fields.add(groupBy);
476
+ if (chartConfig === null || chartConfig === void 0 ? void 0 : chartConfig.aggregationField) fields.add(chartConfig.aggregationField);
477
+ return [...fields];
478
+ }, [selectedColumns, sort.field, groupBy, chartConfig === null || chartConfig === void 0 ? void 0 : chartConfig.aggregationField]);
479
+ var orderBy = (0, import_react.useMemo)(function () {
480
+ return [{
481
+ field: sort.field,
482
+ order: sort.order === "asc" ? import_frappe.Order.Asc : import_frappe.Order.Desc
483
+ }];
484
+ }, [sort.field, sort.order]);
485
+ var {
486
+ rows: rowsData,
487
+ syncError,
488
+ isLoading: rowsLoading
489
+ } = (0, import_useFrappeRows.useFrappeRows)(connection, doctype, {
490
+ fields: fetchFields,
491
+ filters: effectiveFilters,
492
+ orderBy,
493
+ limit: null,
494
+ enabled: layoutMeta !== void 0,
495
+ mapError: asError
496
+ });
497
+ var orderedRows = (0, import_react.useMemo)(function () {
498
+ return (0, import_reportViewModel.orderReportRows)(rowsData, sort, groupBy);
499
+ }, [rowsData, sort, groupBy]);
500
+ var total = orderedRows.length;
501
+ var pageCount = Math.max(1, Math.ceil(total / pageSize));
502
+ var effectivePage = Math.min(page, pageCount - 1);
503
+ var gridRows = (0, import_react.useMemo)(function () {
504
+ return (0, import_reportViewModel.buildGridRows)(orderedRows, effectivePage * pageSize, pageSize, groupBy);
505
+ }, [orderedRows, effectivePage, pageSize, groupBy]);
506
+ var totals = (0, import_react.useMemo)(function () {
507
+ return (0, import_reportViewModel.computeTotals)(selectedColumns, orderedRows);
508
+ }, [selectedColumns, orderedRows]);
509
+ var groupByColumn = groupBy ? allColumns.find(function (column) {
510
+ return column.fieldname === groupBy;
511
+ }) : void 0;
512
+ var chartData = (0, import_react.useMemo)(function () {
513
+ return showChart && groupBy ? aggregateGroups(orderedRows, groupBy, chartConfig) : [];
514
+ }, [showChart, groupBy, orderedRows, chartConfig]);
515
+ var rowsPressable = Boolean(onOpenRow || onRowPress);
516
+ var handleOpenRow = (0, import_react.useCallback)(function (name) {
517
+ onOpenRow === null || onOpenRow === void 0 ? void 0 : onOpenRow(name);
518
+ if (onRowPress) {
519
+ var index = orderedRows.findIndex(function (row) {
520
+ return row.name === name;
521
+ });
522
+ if (index >= 0) onRowPress(orderedRows[index], index);
523
+ }
524
+ }, [onOpenRow, onRowPress, orderedRows]);
525
+ var handleSelectReport = (0, import_react.useCallback)(function (name) {
526
+ if (reportProp === void 0) setInternalReport(name);
527
+ onReportChange === null || onReportChange === void 0 ? void 0 : onReportChange(name);
528
+ if (!name) {
529
+ setReportFilters(null);
530
+ setSelectedOverride(null);
531
+ setSortOverride(null);
532
+ setGroupBy(null);
533
+ }
534
+ }, [reportProp, onReportChange]);
535
+ var handleClearBaseFilters = (0, import_react.useCallback)(function () {
536
+ setFiltersCleared(true);
537
+ if (propFilters && !reportFilters) onClearFilters === null || onClearFilters === void 0 ? void 0 : onClearFilters();
538
+ }, [propFilters, reportFilters, onClearFilters]);
539
+ var handleSaveReport = (0, import_react.useCallback)(function (name) {
540
+ void savedReports.save(name, {
541
+ fieldnames: [...selectedFieldnames],
542
+ filters: effectiveFilters,
543
+ sort,
544
+ pageSize,
545
+ groupBy,
546
+ addTotals: totals.length > 0
547
+ }).then(function (savedName) {
548
+ (0, import_components.notify)({
549
+ severity: "success",
550
+ scope: "page",
551
+ body: t("report.saveDone", {
552
+ defaultValue: "Saved report \u201C{{name}}\u201D",
553
+ name: savedName
554
+ })
555
+ });
556
+ if (savedName !== currentReport) handleSelectReport(savedName);
557
+ }).catch(function (error) {
558
+ (0, import_components.notify)({
559
+ severity: "error",
560
+ scope: "page",
561
+ body: _instanceof(error, Error) ? error.message : t("report.saveFailed", "Could not save the report")
562
+ });
563
+ });
564
+ }, [savedReports, selectedFieldnames, effectiveFilters, sort, pageSize, groupBy, totals.length, currentReport, handleSelectReport, t]);
565
+ var handleDeleteReport = (0, import_react.useCallback)(function (name) {
566
+ void savedReports.remove(name).then(function () {
567
+ (0, import_components.notify)({
568
+ severity: "success",
569
+ scope: "page",
570
+ body: t("report.deleteDone", {
571
+ defaultValue: "Deleted report \u201C{{name}}\u201D",
572
+ name
573
+ })
574
+ });
575
+ if (name === currentReport) handleSelectReport(null);
576
+ }).catch(function (error) {
577
+ (0, import_components.notify)({
578
+ severity: "error",
579
+ scope: "page",
580
+ body: _instanceof(error, Error) ? error.message : t("report.deleteFailed", "Could not delete the report")
581
+ });
284
582
  });
285
- (0, import_platform.downloadBlob)(blob, `${doctype}_report.csv`);
286
- }, [allColumns, enabledColumns, onExport, doctype]);
583
+ }, [savedReports, currentReport, handleSelectReport, t]);
287
584
  var exportEnabled = Boolean(onExport) || canDownloadCsv();
288
- if (isMetaLoading) {
289
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
290
- ...knobProps.panelPadding,
291
- alignItems: "center",
292
- justifyContent: "center",
293
- gap: "$2",
294
- ...stackProps,
295
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Spinner, {
296
- size: "large"
297
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
298
- color: "$color10",
299
- children: t("Loading {{doctype}} schema...", {
300
- doctype
585
+ var handleExport = (0, import_react.useCallback)(function () {
586
+ if (onExport) {
587
+ onExport(orderedRows);
588
+ return;
589
+ }
590
+ (0, import_platform.downloadBlob)(new Blob([(0, import_reportViewModel.buildReportCsv)(selectedColumns, orderedRows)], {
591
+ type: "text/csv;charset=utf-8;"
592
+ }), `${doctype}_report.csv`);
593
+ (0, import_components.notify)({
594
+ severity: "success",
595
+ scope: "page",
596
+ body: t("report.exportDone", {
597
+ count: orderedRows.length,
598
+ defaultValue_one: "Exported {{count}} row to CSV",
599
+ defaultValue_other: "Exported {{count}} rows to CSV"
600
+ })
601
+ });
602
+ }, [onExport, selectedColumns, orderedRows, doctype, t]);
603
+ var handleColumnFilterChange = (0, import_react.useCallback)(function (fieldname, value) {
604
+ setFilterDrafts(function (previous) {
605
+ if (value === "") {
606
+ if (!(fieldname in previous)) return previous;
607
+ var {
608
+ [fieldname]: _dropped,
609
+ ...rest
610
+ } = previous;
611
+ return rest;
612
+ }
613
+ return {
614
+ ...previous,
615
+ [fieldname]: value
616
+ };
617
+ });
618
+ }, []);
619
+ var handleClearColumnFilters = (0, import_react.useCallback)(function () {
620
+ setFilterDrafts({});
621
+ setCommittedFilters({});
622
+ }, []);
623
+ if (metaLoading && !meta) {
624
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
625
+ children: loadingFallback !== null && loadingFallback !== void 0 ? loadingFallback : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
626
+ flex: 1,
627
+ alignItems: "center",
628
+ justifyContent: "center",
629
+ ...stackProps,
630
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Spinner, {
631
+ size: "large"
301
632
  })
302
- })]
633
+ })
303
634
  });
304
635
  }
305
- if (metaError && !meta) {
306
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
307
- ...knobProps.panelPadding,
308
- alignItems: "center",
309
- ...knobProps.gap,
310
- ...stackProps,
311
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
312
- color: "$red11",
313
- children: t("Failed to load {{doctype}} schema", {
314
- doctype
636
+ if (metaError && metaRefused && !layoutMeta) {
637
+ if (recordShape.status === "pending") {
638
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
639
+ children: loadingFallback !== null && loadingFallback !== void 0 ? loadingFallback : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
640
+ flex: 1,
641
+ alignItems: "center",
642
+ justifyContent: "center",
643
+ ...stackProps,
644
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Spinner, {
645
+ size: "large"
646
+ })
315
647
  })
316
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
317
- color: "$color10",
318
- fontSize: "$2",
319
- children: metaError.message
320
- })]
648
+ });
649
+ }
650
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
651
+ children: errorFallback ? errorFallback(metaError) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
652
+ testID: "frappe-report-not-permitted",
653
+ title: t("report.notPermitted", {
654
+ defaultValue: "You can't open the {{doctype}} report",
655
+ doctype
656
+ }),
657
+ description: (0, import_liveErrors.refusalReason)(metaError)
658
+ })
321
659
  });
322
660
  }
323
- if (isLoading) {
324
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
325
- ...knobProps.panelPadding,
326
- alignItems: "center",
327
- gap: "$1",
328
- ...stackProps,
329
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Spinner, {
330
- size: "small"
331
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
332
- color: "$color10",
333
- fontSize: "$2",
334
- children: t("Loading data...")
335
- })]
661
+ if (metaError && !meta && !readsWithoutMeta) {
662
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
663
+ children: errorFallback ? errorFallback(metaError) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
664
+ intent: "error",
665
+ title: t("report.metaFailed", {
666
+ defaultValue: "Couldn't load the {{doctype}} report",
667
+ doctype
668
+ }),
669
+ description: metaError.message
670
+ })
336
671
  });
337
672
  }
338
- if (isError) {
339
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
340
- ...knobProps.panelPadding,
673
+ var body;
674
+ if (syncError && (0, import_liveErrors.isPermissionError)(syncError)) {
675
+ body = /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
676
+ testID: "frappe-report-not-permitted",
677
+ title: t("report.notPermitted", {
678
+ defaultValue: "You can't open the {{doctype}} report",
679
+ doctype
680
+ }),
681
+ description: (0, import_liveErrors.refusalReason)(syncError)
682
+ });
683
+ } else if (syncError) {
684
+ body = /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
685
+ intent: "error",
686
+ title: t("report.loadFailed", "Couldn't load report rows"),
687
+ description: syncError.message
688
+ });
689
+ } else if (rowsLoading && total === 0) {
690
+ body = /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
691
+ flex: 1,
341
692
  alignItems: "center",
693
+ justifyContent: "center",
694
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Spinner, {
695
+ size: "large"
696
+ })
697
+ });
698
+ } else if (total === 0) {
699
+ var hasFilters = effectiveFilters.length > 0;
700
+ body = /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
701
+ title: t("report.emptyTitle", "No results"),
702
+ description: hasFilters ? t("report.emptyFiltered", "No rows match the current filters") : t("report.emptyDescription", {
703
+ defaultValue: "There are no {{doctype}} records yet",
704
+ doctype
705
+ }),
706
+ action: hasFilters ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
707
+ size: "$3",
708
+ onPress: function onPress() {
709
+ handleClearColumnFilters();
710
+ handleClearBaseFilters();
711
+ },
712
+ children: t("report.clearAllFilters", "Clear all filters")
713
+ }) : void 0
714
+ });
715
+ } else {
716
+ body = /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.YStack, {
717
+ flex: 1,
718
+ minWidth: 0,
342
719
  ...knobProps.gap,
343
- ...stackProps,
344
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
345
- color: "$red11",
346
- children: t("Failed to load {{doctype}} data", {
347
- doctype
720
+ children: [chartData.length > 0 && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
721
+ ...knobProps.surface,
722
+ ...knobProps.containerRadius,
723
+ ...knobProps.panelPadding,
724
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.BarChart, {
725
+ data: chartData
348
726
  })
349
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
350
- color: "$color10",
351
- fontSize: "$2",
352
- children: t("The live query could not load report rows.")
727
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_ReportGrid.ReportGrid, {
728
+ columns: selectedColumns,
729
+ rows: gridRows,
730
+ sort,
731
+ onSortChange: setSortOverride,
732
+ columnFilters: filterDrafts,
733
+ onColumnFilterChange: handleColumnFilterChange,
734
+ onOpenRow: rowsPressable ? handleOpenRow : void 0,
735
+ onOpenLink,
736
+ totals,
737
+ groupByColumn
353
738
  })]
354
739
  });
355
740
  }
356
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
741
+ var content = /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.YStack, {
357
742
  flex: 1,
358
- ...knobProps.borderRadius,
743
+ minWidth: 0,
359
744
  ...stackProps,
360
- children: [/* Frappe-specific toolbar: Save/Load reports */
361
- /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
362
- ...knobProps.panelPadding,
363
- ...knobProps.surface,
364
- ...knobProps.gap,
365
- alignItems: "center",
366
- borderBottomWidth: 1,
367
- borderBottomColor: "$borderColor",
368
- children: [/* Subtle stale affordance while a post-event refresh reconciles */
369
- isLiveStale ? /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
370
- gap: "$2",
371
- alignItems: "center",
372
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Spinner, {
373
- size: "small",
374
- "aria-label": t("Updating")
375
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
376
- ...knobProps.label,
377
- color: import_forms.formCommonColors.muted,
378
- children: t("Updating...")
379
- })]
380
- }) : null, /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.XStack, {
381
- flex: 1
382
- }), /* Save */
383
- /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.Popover, {
384
- placement: "bottom-end",
385
- open: saveDialogOpen,
386
- onOpenChange: setSaveDialogOpen,
387
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Popover.Trigger, {
388
- asChild: true,
389
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
390
- size: "$2",
391
- icon: import_react2.FloppyDiskIcon,
392
- children: t("Save")
393
- })
394
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.PopoverContent, {
395
- children: /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
396
- ...knobProps.gap,
397
- minWidth: 220,
398
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
399
- ...knobProps.label,
400
- fontWeight: "400",
401
- children: t("Save Report")
402
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Input, {
403
- label: t("Report name"),
404
- labelHidden: true,
405
- placeholder: t("Report name"),
406
- value: saveReportName,
407
- onChangeText: setSaveReportName,
408
- inputProps: {
409
- onSubmitEditing: handleSaveReport
410
- }
411
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
412
- size: "$2",
413
- onPress: handleSaveReport,
414
- disabled: !saveReportName.trim(),
415
- children: t("Save")
416
- })]
417
- })
418
- })]
419
- }), /* Load */
420
- savedReports.length > 0 && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.Popover, {
421
- placement: "bottom-end",
422
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Popover.Trigger, {
423
- asChild: true,
424
- children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
425
- size: "$2",
426
- icon: import_react2.FolderOpenIcon,
427
- children: t("Load")
428
- })
429
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.PopoverContent, {
430
- children: /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.YStack, {
431
- ...knobProps.gap,
432
- minWidth: 180,
433
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
434
- ...knobProps.label,
435
- fontWeight: "400",
436
- color: import_forms.formCommonColors.muted,
437
- children: t("Saved Reports")
438
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Separator, {}), savedReports.map(function (report) {
439
- return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_tamagui.XStack, {
440
- alignItems: "center",
441
- justifyContent: "space-between",
442
- padding: "$2",
443
- ...knobProps.containerRadius,
444
- hoverStyle: {
445
- backgroundColor: "$color2"
446
- },
447
- cursor: "pointer",
448
- onPress: function onPress() {
449
- return handleLoadReport(report);
450
- },
451
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_tamagui.Text, {
452
- ...knobProps.body,
453
- flex: 1,
454
- children: report.name
455
- }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
456
- size: "$2",
457
- circular: true,
458
- chromeless: true,
459
- icon: import_react2.TrashIcon,
460
- onPress: function onPress(e) {
461
- e.stopPropagation();
462
- handleDeleteReport(report.name);
463
- },
464
- "aria-label": t("Delete {{name}}", {
465
- name: report.name
466
- })
467
- })]
468
- }, report.name);
469
- })]
470
- })
471
- })]
472
- })]
473
- }), /* Delegate to generic ReportBuilder */
474
- /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.ReportBuilder, {
745
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_ReportViewToolbar.ReportViewToolbar, {
475
746
  columns: allColumns,
476
- data,
477
- groupBy: groupBy !== null && groupBy !== void 0 ? groupBy : void 0,
747
+ selected: selectedFieldnames,
748
+ onToggleColumn: handleToggleColumn,
749
+ onResetColumns: handleResetColumns,
750
+ groupBy,
478
751
  onGroupByChange: setGroupBy,
479
- onColumnsChange: setEnabledColumns,
752
+ baseFilters,
753
+ onClearBaseFilters: baseFilters.length > 0 ? handleClearBaseFilters : void 0,
754
+ columnFilterCount: columnTuples.length,
755
+ onClearColumnFilters: handleClearColumnFilters,
756
+ savedReports: savedReports.reports,
757
+ currentReport,
758
+ onSelectReport: handleSelectReport,
759
+ onSaveReport: readsWithoutMeta ? void 0 : handleSaveReport,
760
+ onDeleteReport: readsWithoutMeta ? void 0 : handleDeleteReport,
480
761
  onExport: exportEnabled ? handleExport : void 0,
481
- onRowPress,
482
- showChart,
483
- flex: 1
762
+ exportDisabled: total === 0
763
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
764
+ flex: 1,
765
+ minWidth: 0,
766
+ paddingHorizontal: "$3",
767
+ children: body
768
+ }), total > 0 && !syncError && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
769
+ paddingHorizontal: "$3",
770
+ paddingVertical: "$2",
771
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.DataTablePagination, {
772
+ pagination: {
773
+ pageIndex: effectivePage,
774
+ pageSize,
775
+ totalCount: total,
776
+ totalPages: pageCount
777
+ },
778
+ onPaginationChange: function onPaginationChange(next) {
779
+ setPage(next.pageIndex);
780
+ setPageSize(next.pageSize);
781
+ },
782
+ pageSizeOptions: [...import_reportViewModel.REPORT_PAGE_SIZES],
783
+ compact: true
784
+ })
484
785
  })]
485
786
  });
787
+ return import_components.isWeb ? content : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.ScrollView, {
788
+ flex: 1,
789
+ children: content
790
+ });
486
791
  }
487
792
  //# sourceMappingURL=FrappeReportBuilder.native.js.map