@multiplatform.one/frappe-ui 7.28.0 → 7.29.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 (618) hide show
  1. package/dist/cjs/ChartCard.native.js.map +1 -1
  2. package/dist/cjs/FileBrowser/AttachLibrary.native.js.map +1 -1
  3. package/dist/cjs/FileBrowser/folderTree.native.js.map +1 -1
  4. package/dist/cjs/FileBrowser/index.cjs +20 -3
  5. package/dist/cjs/FileBrowser/index.native.js +20 -3
  6. package/dist/cjs/FileBrowser/index.native.js.map +1 -1
  7. package/dist/cjs/FileBrowser/types.native.js.map +1 -1
  8. package/dist/cjs/FileBrowser/viewPersistence.native.js.map +1 -1
  9. package/dist/cjs/FormSidebar.native.js.map +1 -1
  10. package/dist/cjs/FrappeAssignment.native.js.map +1 -1
  11. package/dist/cjs/FrappeCalendar.cjs +3 -2
  12. package/dist/cjs/FrappeCalendar.native.js +3 -2
  13. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  14. package/dist/cjs/FrappeChartCard.native.js.map +1 -1
  15. package/dist/cjs/FrappeConnectionIndicator.native.js.map +1 -1
  16. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  17. package/dist/cjs/FrappeForm.cjs +148 -464
  18. package/dist/cjs/FrappeForm.native.js +153 -634
  19. package/dist/cjs/FrappeForm.native.js.map +1 -1
  20. package/dist/cjs/FrappeFormActions.native.js.map +1 -1
  21. package/dist/cjs/FrappeFormConnections.native.js.map +1 -1
  22. package/dist/cjs/FrappeGantt.native.js.map +1 -1
  23. package/dist/cjs/FrappeImageView.native.js.map +1 -1
  24. package/dist/cjs/FrappeInsights.native.js.map +1 -1
  25. package/dist/cjs/FrappeKPICard.native.js.map +1 -1
  26. package/dist/cjs/FrappeKanban.native.js.map +1 -1
  27. package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
  28. package/dist/cjs/FrappeList.native.js.map +1 -1
  29. package/dist/cjs/FrappeListView.cjs +5 -27
  30. package/dist/cjs/FrappeListView.native.js +11 -32
  31. package/dist/cjs/FrappeListView.native.js.map +1 -1
  32. package/dist/cjs/FrappeNotConfigured.native.js.map +1 -1
  33. package/dist/cjs/FrappeProvider.native.js.map +1 -1
  34. package/dist/cjs/FrappeReconnectIndicator.native.js.map +1 -1
  35. package/dist/cjs/FrappeRecordView.native.js.map +1 -1
  36. package/dist/cjs/FrappeReportBuilder.cjs +523 -309
  37. package/dist/cjs/FrappeReportBuilder.native.js +658 -353
  38. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  39. package/dist/cjs/FrappeReportView.cjs +35 -234
  40. package/dist/cjs/FrappeReportView.native.js +42 -286
  41. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  42. package/dist/cjs/FrappeRowsReader.native.js.map +1 -1
  43. package/dist/cjs/FrappeTable.native.js.map +1 -1
  44. package/dist/cjs/FrappeTreeView.native.js.map +1 -1
  45. package/dist/cjs/SyncErrorNotice.native.js.map +1 -1
  46. package/dist/cjs/commentActions.native.js.map +1 -1
  47. package/dist/cjs/components/attachments.native.js.map +1 -1
  48. package/dist/cjs/components/tags.native.js.map +1 -1
  49. package/dist/cjs/components/timeline.native.js.map +1 -1
  50. package/dist/cjs/dependsOn.cjs +2 -2
  51. package/dist/cjs/dependsOn.native.js +1 -2
  52. package/dist/cjs/dependsOn.native.js.map +1 -1
  53. package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
  54. package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
  55. package/dist/cjs/desk/DeskListPage.native.js.map +1 -1
  56. package/dist/cjs/desk/DeskShell.native.js.map +1 -1
  57. package/dist/cjs/desk/DeskSidebar.native.js.map +1 -1
  58. package/dist/cjs/desk/awesomebar.native.js.map +1 -1
  59. package/dist/cjs/fieldOverrides.native.js.map +1 -1
  60. package/dist/cjs/fieldRegistry.native.js +31 -31
  61. package/dist/cjs/fieldRegistry.native.js.map +1 -1
  62. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  63. package/dist/cjs/fields/Check/index.native.js.map +1 -1
  64. package/dist/cjs/fields/CodeEditor/index.native.js.map +1 -1
  65. package/dist/cjs/fields/Color/index.native.js.map +1 -1
  66. package/dist/cjs/fields/Data/index.native.js.map +1 -1
  67. package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +1 -1
  68. package/dist/cjs/fields/Date/types.native.js.map +1 -1
  69. package/dist/cjs/fields/Date/wire.native.js.map +1 -1
  70. package/dist/cjs/fields/DateRange/index.native.js.map +1 -1
  71. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  72. package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
  73. package/dist/cjs/fields/FileUpload.native.js.map +1 -1
  74. package/dist/cjs/fields/FileUploadField/index.native.js.map +1 -1
  75. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  76. package/dist/cjs/fields/HTML/index.native.js.map +1 -1
  77. package/dist/cjs/fields/Heading/index.native.js.map +1 -1
  78. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  79. package/dist/cjs/fields/Link.native.js.map +1 -1
  80. package/dist/cjs/fields/LinkTree.native.js.map +1 -1
  81. package/dist/cjs/fields/LongText/index.native.js.map +1 -1
  82. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  83. package/dist/cjs/fields/Numeric/index.native.js.map +1 -1
  84. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  85. package/dist/cjs/fields/Password/index.native.js.map +1 -1
  86. package/dist/cjs/fields/Phone/index.native.js.map +1 -1
  87. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  88. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  89. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  90. package/dist/cjs/fields/ReadOnly/index.native.js.map +1 -1
  91. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  92. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  93. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  94. package/dist/cjs/fields/SmallText/index.native.js.map +1 -1
  95. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  96. package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
  97. package/dist/cjs/fields/TextEditor/types.native.js.map +1 -1
  98. package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
  99. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  100. package/dist/cjs/fields/shared/EditorPreviewPanes.cjs +2 -2
  101. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js +2 -2
  102. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  103. package/dist/cjs/filterFields.native.js.map +1 -1
  104. package/dist/cjs/formEngine/createPrefill.native.js.map +1 -1
  105. package/dist/cjs/formEngine/dirtyTracking.native.js.map +1 -1
  106. package/dist/cjs/formEngine/docLifecycle.native.js.map +1 -1
  107. package/dist/cjs/formEngine/docPermissions.cjs +20 -0
  108. package/dist/cjs/formEngine/docPermissions.native.js +69 -0
  109. package/dist/cjs/formEngine/docPermissions.native.js.map +1 -1
  110. package/dist/cjs/formEngine/doctypeMeta.native.js.map +1 -1
  111. package/dist/cjs/formEngine/fetchFrom.native.js.map +1 -1
  112. package/dist/cjs/formEngine/fieldPermissions.native.js.map +1 -1
  113. package/dist/cjs/formEngine/formActions.native.js.map +1 -1
  114. package/dist/cjs/formEngine/formLayout.native.js.map +1 -1
  115. package/dist/cjs/formEngine/index.cjs +2 -0
  116. package/dist/cjs/formEngine/index.native.js +2 -0
  117. package/dist/cjs/formEngine/index.native.js.map +1 -1
  118. package/dist/cjs/formEngine/useAmendedAs.native.js.map +1 -1
  119. package/dist/cjs/formEngine/useDocRights.native.js.map +1 -1
  120. package/dist/cjs/formEngine/useFormEngine.native.js.map +1 -1
  121. package/dist/cjs/formEngine/useSessionRoles.native.js.map +1 -1
  122. package/dist/cjs/frappeConnections.native.js.map +1 -1
  123. package/dist/cjs/frappeEventColor.native.js.map +1 -1
  124. package/dist/cjs/frappeNavigation.native.js.map +1 -1
  125. package/dist/cjs/frappeStoryTarget.native.js.map +1 -1
  126. package/dist/cjs/frappeUsers.native.js.map +1 -1
  127. package/dist/cjs/index.cjs +67 -7
  128. package/dist/cjs/index.native.js +101 -41
  129. package/dist/cjs/index.native.js.map +1 -1
  130. package/dist/cjs/insights/InsightsFacetTags.native.js.map +1 -1
  131. package/dist/cjs/insights/InsightsKpiBand.native.js.map +1 -1
  132. package/dist/cjs/insights/InsightsLeaders.native.js.map +1 -1
  133. package/dist/cjs/insights/InsightsRecords.native.js.map +1 -1
  134. package/dist/cjs/insights/InsightsTable.native.js.map +1 -1
  135. package/dist/cjs/insights/insightsData.native.js.map +1 -1
  136. package/dist/cjs/insights/insightsRecord.native.js.map +1 -1
  137. package/dist/cjs/list/FacetBadge.native.js.map +1 -1
  138. package/dist/cjs/list/FacetRail.native.js.map +1 -1
  139. package/dist/cjs/list/ImageWell.native.js.map +1 -1
  140. package/dist/cjs/list/ListControls.native.js.map +1 -1
  141. package/dist/cjs/list/ListToastHost.native.js.map +1 -1
  142. package/dist/cjs/list/RangeFilter.native.js.map +1 -1
  143. package/dist/cjs/list/ShufflePanel.native.js.map +1 -1
  144. package/dist/cjs/list/facetReading.native.js.map +1 -1
  145. package/dist/cjs/list/favorites.native.js.map +1 -1
  146. package/dist/cjs/list/listColumns.native.js.map +1 -1
  147. package/dist/cjs/list/listFields.native.js.map +1 -1
  148. package/dist/cjs/list/listFormat.native.js.map +1 -1
  149. package/dist/cjs/list/listState.native.js.map +1 -1
  150. package/dist/cjs/list/recordLook.native.js.map +1 -1
  151. package/dist/cjs/list/statusColors.native.js.map +1 -1
  152. package/dist/cjs/list/useListControls.native.js.map +1 -1
  153. package/dist/cjs/liveErrors.cjs +8 -2
  154. package/dist/cjs/liveErrors.native.js +8 -2
  155. package/dist/cjs/liveErrors.native.js.map +1 -1
  156. package/dist/cjs/measures.cjs +31 -0
  157. package/dist/cjs/measures.native.js +34 -0
  158. package/dist/cjs/measures.native.js.map +1 -0
  159. package/dist/cjs/record/RecordBars.native.js.map +1 -1
  160. package/dist/cjs/record/RecordGallery.native.js.map +1 -1
  161. package/dist/cjs/record/RecordHero.native.js.map +1 -1
  162. package/dist/cjs/record/RecordPage.native.js.map +1 -1
  163. package/dist/cjs/record/RecordPager.native.js.map +1 -1
  164. package/dist/cjs/record/RecordRows.native.js.map +1 -1
  165. package/dist/cjs/record/recordData.native.js.map +1 -1
  166. package/dist/cjs/record/recordSections.native.js.map +1 -1
  167. package/dist/cjs/recordShape.cjs +103 -0
  168. package/dist/cjs/recordShape.native.js +115 -0
  169. package/dist/cjs/recordShape.native.js.map +1 -0
  170. package/dist/cjs/report/ReportGrid.cjs +453 -0
  171. package/dist/cjs/report/ReportGrid.native.js +510 -0
  172. package/dist/cjs/report/ReportGrid.native.js.map +1 -0
  173. package/dist/cjs/report/ReportViewToolbar.cjs +253 -0
  174. package/dist/cjs/report/ReportViewToolbar.native.js +303 -0
  175. package/dist/cjs/report/ReportViewToolbar.native.js.map +1 -0
  176. package/dist/cjs/report/queryReport.cjs +444 -0
  177. package/dist/cjs/report/queryReport.native.js +588 -0
  178. package/dist/cjs/report/queryReport.native.js.map +1 -0
  179. package/dist/cjs/report/queryReportColumns.cjs +131 -0
  180. package/dist/cjs/report/queryReportColumns.native.js +159 -0
  181. package/dist/cjs/report/queryReportColumns.native.js.map +1 -0
  182. package/dist/cjs/report/reportViewModel.cjs +386 -0
  183. package/dist/cjs/report/reportViewModel.native.js +657 -0
  184. package/dist/cjs/report/reportViewModel.native.js.map +1 -0
  185. package/dist/cjs/report/savedReports.cjs +137 -0
  186. package/dist/cjs/report/savedReports.native.js +169 -0
  187. package/dist/cjs/report/savedReports.native.js.map +1 -0
  188. package/dist/cjs/report/useFrappeReport.cjs +184 -0
  189. package/dist/cjs/report/useFrappeReport.native.js +214 -0
  190. package/dist/cjs/report/useFrappeReport.native.js.map +1 -0
  191. package/dist/cjs/report/useQueryReport.cjs +201 -0
  192. package/dist/cjs/report/useQueryReport.native.js +233 -0
  193. package/dist/cjs/report/useQueryReport.native.js.map +1 -0
  194. package/dist/cjs/resolveControl.native.js.map +1 -1
  195. package/dist/cjs/schemaForm/SchemaWizard.native.js.map +1 -1
  196. package/dist/cjs/schemaForm/applyFieldOrder.native.js.map +1 -1
  197. package/dist/cjs/schemaForm/index.native.js +1 -1
  198. package/dist/cjs/schemaForm/index.native.js.map +1 -1
  199. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  200. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  201. package/dist/cjs/syncError.native.js.map +1 -1
  202. package/dist/cjs/useConnectionFilters.native.js.map +1 -1
  203. package/dist/cjs/useFrappeAggregate.native.js.map +1 -1
  204. package/dist/cjs/useFrappeFacets.native.js.map +1 -1
  205. package/dist/cjs/useFrappeForm.cjs +558 -0
  206. package/dist/cjs/useFrappeForm.native.js +714 -0
  207. package/dist/cjs/useFrappeForm.native.js.map +1 -0
  208. package/dist/cjs/useFrappePagination.native.js.map +1 -1
  209. package/dist/cjs/useFrappeRows.native.js.map +1 -1
  210. package/dist/esm/ChartCard.native.js.map +1 -1
  211. package/dist/esm/FileBrowser/AttachLibrary.native.js.map +1 -1
  212. package/dist/esm/FileBrowser/folderTree.native.js.map +1 -1
  213. package/dist/esm/FileBrowser/index.mjs +20 -3
  214. package/dist/esm/FileBrowser/index.mjs.map +1 -1
  215. package/dist/esm/FileBrowser/index.native.js +20 -3
  216. package/dist/esm/FileBrowser/index.native.js.map +1 -1
  217. package/dist/esm/FileBrowser/types.native.js.map +1 -1
  218. package/dist/esm/FileBrowser/viewPersistence.native.js.map +1 -1
  219. package/dist/esm/FormSidebar.native.js.map +1 -1
  220. package/dist/esm/FrappeAssignment.native.js.map +1 -1
  221. package/dist/esm/FrappeCalendar.mjs +4 -3
  222. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  223. package/dist/esm/FrappeCalendar.native.js +4 -3
  224. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  225. package/dist/esm/FrappeChartCard.native.js.map +1 -1
  226. package/dist/esm/FrappeConnectionIndicator.native.js.map +1 -1
  227. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  228. package/dist/esm/FrappeForm.mjs +151 -467
  229. package/dist/esm/FrappeForm.mjs.map +1 -1
  230. package/dist/esm/FrappeForm.native.js +155 -636
  231. package/dist/esm/FrappeForm.native.js.map +1 -1
  232. package/dist/esm/FrappeFormActions.native.js.map +1 -1
  233. package/dist/esm/FrappeFormConnections.native.js.map +1 -1
  234. package/dist/esm/FrappeGantt.native.js.map +1 -1
  235. package/dist/esm/FrappeImageView.native.js.map +1 -1
  236. package/dist/esm/FrappeInsights.native.js.map +1 -1
  237. package/dist/esm/FrappeKPICard.native.js.map +1 -1
  238. package/dist/esm/FrappeKanban.native.js.map +1 -1
  239. package/dist/esm/FrappeLikedBy.native.js.map +1 -1
  240. package/dist/esm/FrappeList.native.js.map +1 -1
  241. package/dist/esm/FrappeListView.mjs +6 -28
  242. package/dist/esm/FrappeListView.mjs.map +1 -1
  243. package/dist/esm/FrappeListView.native.js +12 -33
  244. package/dist/esm/FrappeListView.native.js.map +1 -1
  245. package/dist/esm/FrappeNotConfigured.native.js.map +1 -1
  246. package/dist/esm/FrappeProvider.native.js.map +1 -1
  247. package/dist/esm/FrappeReconnectIndicator.native.js.map +1 -1
  248. package/dist/esm/FrappeRecordView.native.js.map +1 -1
  249. package/dist/esm/FrappeReportBuilder.mjs +526 -312
  250. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  251. package/dist/esm/FrappeReportBuilder.native.js +661 -356
  252. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  253. package/dist/esm/FrappeReportView.mjs +30 -229
  254. package/dist/esm/FrappeReportView.mjs.map +1 -1
  255. package/dist/esm/FrappeReportView.native.js +34 -278
  256. package/dist/esm/FrappeReportView.native.js.map +1 -1
  257. package/dist/esm/FrappeRowsReader.native.js.map +1 -1
  258. package/dist/esm/FrappeTable.native.js.map +1 -1
  259. package/dist/esm/FrappeTreeView.native.js.map +1 -1
  260. package/dist/esm/SyncErrorNotice.native.js.map +1 -1
  261. package/dist/esm/commentActions.native.js.map +1 -1
  262. package/dist/esm/components/attachments.native.js.map +1 -1
  263. package/dist/esm/components/tags.native.js.map +1 -1
  264. package/dist/esm/components/timeline.native.js.map +1 -1
  265. package/dist/esm/dependsOn.mjs +2 -2
  266. package/dist/esm/dependsOn.mjs.map +1 -1
  267. package/dist/esm/dependsOn.native.js +1 -2
  268. package/dist/esm/dependsOn.native.js.map +1 -1
  269. package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
  270. package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
  271. package/dist/esm/desk/DeskListPage.native.js.map +1 -1
  272. package/dist/esm/desk/DeskShell.native.js.map +1 -1
  273. package/dist/esm/desk/DeskSidebar.native.js.map +1 -1
  274. package/dist/esm/desk/awesomebar.native.js.map +1 -1
  275. package/dist/esm/fieldOverrides.native.js.map +1 -1
  276. package/dist/esm/fieldRegistry.native.js.map +1 -1
  277. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  278. package/dist/esm/fields/Check/index.native.js.map +1 -1
  279. package/dist/esm/fields/CodeEditor/index.native.js.map +1 -1
  280. package/dist/esm/fields/Color/index.native.js.map +1 -1
  281. package/dist/esm/fields/Data/index.native.js.map +1 -1
  282. package/dist/esm/fields/Date/sheetKeyboard.native.js.map +1 -1
  283. package/dist/esm/fields/Date/types.native.js.map +1 -1
  284. package/dist/esm/fields/Date/wire.native.js.map +1 -1
  285. package/dist/esm/fields/DateRange/index.native.js.map +1 -1
  286. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  287. package/dist/esm/fields/DynamicLink.native.js.map +1 -1
  288. package/dist/esm/fields/FileUpload.native.js.map +1 -1
  289. package/dist/esm/fields/FileUploadField/index.native.js.map +1 -1
  290. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  291. package/dist/esm/fields/HTML/index.native.js.map +1 -1
  292. package/dist/esm/fields/Heading/index.native.js.map +1 -1
  293. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  294. package/dist/esm/fields/Link.native.js.map +1 -1
  295. package/dist/esm/fields/LinkTree.native.js.map +1 -1
  296. package/dist/esm/fields/LongText/index.native.js.map +1 -1
  297. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  298. package/dist/esm/fields/Numeric/index.native.js.map +1 -1
  299. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  300. package/dist/esm/fields/Password/index.native.js.map +1 -1
  301. package/dist/esm/fields/Phone/index.native.js.map +1 -1
  302. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  303. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  304. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  305. package/dist/esm/fields/ReadOnly/index.native.js.map +1 -1
  306. package/dist/esm/fields/Select/index.native.js.map +1 -1
  307. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  308. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  309. package/dist/esm/fields/SmallText/index.native.js.map +1 -1
  310. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  311. package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
  312. package/dist/esm/fields/TextEditor/types.native.js.map +1 -1
  313. package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
  314. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  315. package/dist/esm/fields/shared/EditorPreviewPanes.mjs +2 -2
  316. package/dist/esm/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  317. package/dist/esm/fields/shared/EditorPreviewPanes.native.js +2 -2
  318. package/dist/esm/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  319. package/dist/esm/filterFields.native.js.map +1 -1
  320. package/dist/esm/formEngine/createPrefill.native.js.map +1 -1
  321. package/dist/esm/formEngine/dirtyTracking.native.js.map +1 -1
  322. package/dist/esm/formEngine/docLifecycle.native.js.map +1 -1
  323. package/dist/esm/formEngine/docPermissions.mjs +19 -1
  324. package/dist/esm/formEngine/docPermissions.mjs.map +1 -1
  325. package/dist/esm/formEngine/docPermissions.native.js +68 -1
  326. package/dist/esm/formEngine/docPermissions.native.js.map +1 -1
  327. package/dist/esm/formEngine/doctypeMeta.native.js.map +1 -1
  328. package/dist/esm/formEngine/fetchFrom.native.js.map +1 -1
  329. package/dist/esm/formEngine/fieldPermissions.native.js.map +1 -1
  330. package/dist/esm/formEngine/formActions.native.js.map +1 -1
  331. package/dist/esm/formEngine/formLayout.native.js.map +1 -1
  332. package/dist/esm/formEngine/index.mjs +2 -2
  333. package/dist/esm/formEngine/index.mjs.map +1 -1
  334. package/dist/esm/formEngine/index.native.js +2 -2
  335. package/dist/esm/formEngine/index.native.js.map +1 -1
  336. package/dist/esm/formEngine/useAmendedAs.native.js.map +1 -1
  337. package/dist/esm/formEngine/useDocRights.native.js.map +1 -1
  338. package/dist/esm/formEngine/useFormEngine.native.js.map +1 -1
  339. package/dist/esm/formEngine/useSessionRoles.native.js.map +1 -1
  340. package/dist/esm/frappeConnections.native.js.map +1 -1
  341. package/dist/esm/frappeEventColor.native.js.map +1 -1
  342. package/dist/esm/frappeNavigation.native.js.map +1 -1
  343. package/dist/esm/frappeStoryTarget.native.js.map +1 -1
  344. package/dist/esm/frappeUsers.native.js.map +1 -1
  345. package/dist/esm/index.mjs +16 -4
  346. package/dist/esm/index.mjs.map +1 -1
  347. package/dist/esm/index.native.js +16 -4
  348. package/dist/esm/index.native.js.map +1 -1
  349. package/dist/esm/insights/InsightsFacetTags.native.js.map +1 -1
  350. package/dist/esm/insights/InsightsKpiBand.native.js.map +1 -1
  351. package/dist/esm/insights/InsightsLeaders.native.js.map +1 -1
  352. package/dist/esm/insights/InsightsRecords.native.js.map +1 -1
  353. package/dist/esm/insights/InsightsTable.native.js.map +1 -1
  354. package/dist/esm/insights/insightsData.native.js.map +1 -1
  355. package/dist/esm/insights/insightsRecord.native.js.map +1 -1
  356. package/dist/esm/list/FacetBadge.native.js.map +1 -1
  357. package/dist/esm/list/FacetRail.native.js.map +1 -1
  358. package/dist/esm/list/ImageWell.native.js.map +1 -1
  359. package/dist/esm/list/ListControls.native.js.map +1 -1
  360. package/dist/esm/list/ListToastHost.native.js.map +1 -1
  361. package/dist/esm/list/RangeFilter.native.js.map +1 -1
  362. package/dist/esm/list/ShufflePanel.native.js.map +1 -1
  363. package/dist/esm/list/facetReading.native.js.map +1 -1
  364. package/dist/esm/list/favorites.native.js.map +1 -1
  365. package/dist/esm/list/listColumns.native.js.map +1 -1
  366. package/dist/esm/list/listFields.native.js.map +1 -1
  367. package/dist/esm/list/listFormat.native.js.map +1 -1
  368. package/dist/esm/list/listState.native.js.map +1 -1
  369. package/dist/esm/list/recordLook.native.js.map +1 -1
  370. package/dist/esm/list/statusColors.native.js.map +1 -1
  371. package/dist/esm/list/useListControls.native.js.map +1 -1
  372. package/dist/esm/liveErrors.mjs +8 -3
  373. package/dist/esm/liveErrors.mjs.map +1 -1
  374. package/dist/esm/liveErrors.native.js +8 -3
  375. package/dist/esm/liveErrors.native.js.map +1 -1
  376. package/dist/esm/measures.mjs +5 -0
  377. package/dist/esm/measures.mjs.map +1 -0
  378. package/dist/esm/measures.native.js +5 -0
  379. package/dist/esm/measures.native.js.map +1 -0
  380. package/dist/esm/record/RecordBars.native.js.map +1 -1
  381. package/dist/esm/record/RecordGallery.native.js.map +1 -1
  382. package/dist/esm/record/RecordHero.native.js.map +1 -1
  383. package/dist/esm/record/RecordPage.native.js.map +1 -1
  384. package/dist/esm/record/RecordPager.native.js.map +1 -1
  385. package/dist/esm/record/RecordRows.native.js.map +1 -1
  386. package/dist/esm/record/recordData.native.js.map +1 -1
  387. package/dist/esm/record/recordSections.native.js.map +1 -1
  388. package/dist/esm/recordShape.mjs +74 -0
  389. package/dist/esm/recordShape.mjs.map +1 -0
  390. package/dist/esm/recordShape.native.js +83 -0
  391. package/dist/esm/recordShape.native.js.map +1 -0
  392. package/dist/esm/report/ReportGrid.mjs +428 -0
  393. package/dist/esm/report/ReportGrid.mjs.map +1 -0
  394. package/dist/esm/report/ReportGrid.native.js +471 -0
  395. package/dist/esm/report/ReportGrid.native.js.map +1 -0
  396. package/dist/esm/report/ReportViewToolbar.mjs +228 -0
  397. package/dist/esm/report/ReportViewToolbar.mjs.map +1 -0
  398. package/dist/esm/report/ReportViewToolbar.native.js +264 -0
  399. package/dist/esm/report/ReportViewToolbar.native.js.map +1 -0
  400. package/dist/esm/report/queryReport.mjs +404 -0
  401. package/dist/esm/report/queryReport.mjs.map +1 -0
  402. package/dist/esm/report/queryReport.native.js +545 -0
  403. package/dist/esm/report/queryReport.native.js.map +1 -0
  404. package/dist/esm/report/queryReportColumns.mjs +105 -0
  405. package/dist/esm/report/queryReportColumns.mjs.map +1 -0
  406. package/dist/esm/report/queryReportColumns.native.js +119 -0
  407. package/dist/esm/report/queryReportColumns.native.js.map +1 -0
  408. package/dist/esm/report/reportViewModel.mjs +343 -0
  409. package/dist/esm/report/reportViewModel.mjs.map +1 -0
  410. package/dist/esm/report/reportViewModel.native.js +611 -0
  411. package/dist/esm/report/reportViewModel.native.js.map +1 -0
  412. package/dist/esm/report/savedReports.mjs +112 -0
  413. package/dist/esm/report/savedReports.mjs.map +1 -0
  414. package/dist/esm/report/savedReports.native.js +141 -0
  415. package/dist/esm/report/savedReports.native.js.map +1 -0
  416. package/dist/esm/report/useFrappeReport.mjs +158 -0
  417. package/dist/esm/report/useFrappeReport.mjs.map +1 -0
  418. package/dist/esm/report/useFrappeReport.native.js +185 -0
  419. package/dist/esm/report/useFrappeReport.native.js.map +1 -0
  420. package/dist/esm/report/useQueryReport.mjs +176 -0
  421. package/dist/esm/report/useQueryReport.mjs.map +1 -0
  422. package/dist/esm/report/useQueryReport.native.js +205 -0
  423. package/dist/esm/report/useQueryReport.native.js.map +1 -0
  424. package/dist/esm/resolveControl.native.js.map +1 -1
  425. package/dist/esm/schemaForm/SchemaWizard.native.js.map +1 -1
  426. package/dist/esm/schemaForm/applyFieldOrder.native.js.map +1 -1
  427. package/dist/esm/schemaForm/index.native.js.map +1 -1
  428. package/dist/esm/shared/devWarn.native.js.map +1 -1
  429. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  430. package/dist/esm/syncError.native.js.map +1 -1
  431. package/dist/esm/useConnectionFilters.native.js.map +1 -1
  432. package/dist/esm/useFrappeAggregate.native.js.map +1 -1
  433. package/dist/esm/useFrappeFacets.native.js.map +1 -1
  434. package/dist/esm/useFrappeForm.mjs +533 -0
  435. package/dist/esm/useFrappeForm.mjs.map +1 -0
  436. package/dist/esm/useFrappeForm.native.js +686 -0
  437. package/dist/esm/useFrappeForm.native.js.map +1 -0
  438. package/dist/esm/useFrappePagination.native.js.map +1 -1
  439. package/dist/esm/useFrappeRows.native.js.map +1 -1
  440. package/dist/jsx/FileBrowser/index.mjs +20 -3
  441. package/dist/jsx/FileBrowser/index.mjs.map +1 -1
  442. package/dist/jsx/FileBrowser/index.native.js +20 -3
  443. package/dist/jsx/FileBrowser/index.native.js.map +1 -1
  444. package/dist/jsx/FrappeCalendar.mjs +4 -3
  445. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  446. package/dist/jsx/FrappeCalendar.native.js +3 -2
  447. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  448. package/dist/jsx/FrappeForm.mjs +151 -467
  449. package/dist/jsx/FrappeForm.mjs.map +1 -1
  450. package/dist/jsx/FrappeForm.native.js +152 -633
  451. package/dist/jsx/FrappeForm.native.js.map +1 -1
  452. package/dist/jsx/FrappeListView.mjs +6 -28
  453. package/dist/jsx/FrappeListView.mjs.map +1 -1
  454. package/dist/jsx/FrappeListView.native.js +11 -32
  455. package/dist/jsx/FrappeListView.native.js.map +1 -1
  456. package/dist/jsx/FrappeReportBuilder.mjs +526 -312
  457. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  458. package/dist/jsx/FrappeReportBuilder.native.js +658 -353
  459. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  460. package/dist/jsx/FrappeReportView.mjs +30 -229
  461. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  462. package/dist/jsx/FrappeReportView.native.js +39 -283
  463. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  464. package/dist/jsx/dependsOn.mjs +2 -2
  465. package/dist/jsx/dependsOn.mjs.map +1 -1
  466. package/dist/jsx/dependsOn.native.js +1 -2
  467. package/dist/jsx/dependsOn.native.js.map +1 -1
  468. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs +2 -2
  469. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  470. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js +2 -2
  471. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  472. package/dist/jsx/formEngine/docPermissions.mjs +19 -1
  473. package/dist/jsx/formEngine/docPermissions.mjs.map +1 -1
  474. package/dist/jsx/formEngine/docPermissions.native.js +69 -0
  475. package/dist/jsx/formEngine/docPermissions.native.js.map +1 -1
  476. package/dist/jsx/formEngine/index.mjs +2 -2
  477. package/dist/jsx/formEngine/index.mjs.map +1 -1
  478. package/dist/jsx/formEngine/index.native.js +2 -0
  479. package/dist/jsx/formEngine/index.native.js.map +1 -1
  480. package/dist/jsx/index.js +16 -4
  481. package/dist/jsx/index.js.map +1 -1
  482. package/dist/jsx/index.mjs +16 -4
  483. package/dist/jsx/index.mjs.map +1 -1
  484. package/dist/jsx/index.native.js +67 -7
  485. package/dist/jsx/index.native.js.map +1 -1
  486. package/dist/jsx/liveErrors.mjs +8 -3
  487. package/dist/jsx/liveErrors.mjs.map +1 -1
  488. package/dist/jsx/liveErrors.native.js +8 -2
  489. package/dist/jsx/liveErrors.native.js.map +1 -1
  490. package/dist/jsx/measures.mjs +5 -0
  491. package/dist/jsx/measures.mjs.map +1 -0
  492. package/dist/jsx/measures.native.js +34 -0
  493. package/dist/jsx/measures.native.js.map +1 -0
  494. package/dist/jsx/recordShape.mjs +74 -0
  495. package/dist/jsx/recordShape.mjs.map +1 -0
  496. package/dist/jsx/recordShape.native.js +115 -0
  497. package/dist/jsx/recordShape.native.js.map +1 -0
  498. package/dist/jsx/report/ReportGrid.mjs +428 -0
  499. package/dist/jsx/report/ReportGrid.mjs.map +1 -0
  500. package/dist/jsx/report/ReportGrid.native.js +510 -0
  501. package/dist/jsx/report/ReportGrid.native.js.map +1 -0
  502. package/dist/jsx/report/ReportViewToolbar.mjs +228 -0
  503. package/dist/jsx/report/ReportViewToolbar.mjs.map +1 -0
  504. package/dist/jsx/report/ReportViewToolbar.native.js +303 -0
  505. package/dist/jsx/report/ReportViewToolbar.native.js.map +1 -0
  506. package/dist/jsx/report/queryReport.mjs +404 -0
  507. package/dist/jsx/report/queryReport.mjs.map +1 -0
  508. package/dist/jsx/report/queryReport.native.js +588 -0
  509. package/dist/jsx/report/queryReport.native.js.map +1 -0
  510. package/dist/jsx/report/queryReportColumns.mjs +105 -0
  511. package/dist/jsx/report/queryReportColumns.mjs.map +1 -0
  512. package/dist/jsx/report/queryReportColumns.native.js +159 -0
  513. package/dist/jsx/report/queryReportColumns.native.js.map +1 -0
  514. package/dist/jsx/report/reportViewModel.mjs +343 -0
  515. package/dist/jsx/report/reportViewModel.mjs.map +1 -0
  516. package/dist/jsx/report/reportViewModel.native.js +657 -0
  517. package/dist/jsx/report/reportViewModel.native.js.map +1 -0
  518. package/dist/jsx/report/savedReports.mjs +112 -0
  519. package/dist/jsx/report/savedReports.mjs.map +1 -0
  520. package/dist/jsx/report/savedReports.native.js +169 -0
  521. package/dist/jsx/report/savedReports.native.js.map +1 -0
  522. package/dist/jsx/report/useFrappeReport.mjs +158 -0
  523. package/dist/jsx/report/useFrappeReport.mjs.map +1 -0
  524. package/dist/jsx/report/useFrappeReport.native.js +214 -0
  525. package/dist/jsx/report/useFrappeReport.native.js.map +1 -0
  526. package/dist/jsx/report/useQueryReport.mjs +176 -0
  527. package/dist/jsx/report/useQueryReport.mjs.map +1 -0
  528. package/dist/jsx/report/useQueryReport.native.js +233 -0
  529. package/dist/jsx/report/useQueryReport.native.js.map +1 -0
  530. package/dist/jsx/useFrappeForm.mjs +533 -0
  531. package/dist/jsx/useFrappeForm.mjs.map +1 -0
  532. package/dist/jsx/useFrappeForm.native.js +714 -0
  533. package/dist/jsx/useFrappeForm.native.js.map +1 -0
  534. package/package.json +16 -16
  535. package/src/FileBrowser/FileBrowser.spec.tsx +21 -0
  536. package/src/FileBrowser/FileBrowser.stories.tsx +27 -0
  537. package/src/FileBrowser/index.tsx +25 -2
  538. package/src/FrappeCalendar.tsx +8 -2
  539. package/src/FrappeForm.stories.tsx +52 -0
  540. package/src/FrappeForm.tsx +176 -565
  541. package/src/FrappeListView.cards.stories.tsx +3 -6
  542. package/src/FrappeListView.tsx +15 -55
  543. package/src/FrappeReportBuilder.stories.tsx +34 -7
  544. package/src/FrappeReportBuilder.tsx +790 -380
  545. package/src/FrappeReportView.spec.tsx +10 -6
  546. package/src/FrappeReportView.stories.tsx +20 -1
  547. package/src/FrappeReportView.tsx +89 -415
  548. package/src/dependsOn.ts +4 -1
  549. package/src/fields/shared/EditorPreviewPanes.tsx +2 -2
  550. package/src/formEngine/docPermissions.spec.ts +36 -1
  551. package/src/formEngine/docPermissions.ts +34 -0
  552. package/src/formEngine/index.ts +8 -1
  553. package/src/frappeRemainder.designLaw.spec.ts +9 -1
  554. package/src/frappeRoutes.spec.tsx +9 -0
  555. package/src/frappeViews.designLaw.spec.ts +15 -2
  556. package/src/guestFallback.spec.tsx +236 -0
  557. package/src/index.ts +117 -16
  558. package/src/liveErrors.spec.ts +10 -0
  559. package/src/liveErrors.ts +16 -3
  560. package/src/measures.ts +11 -0
  561. package/src/recordShape.spec.ts +100 -0
  562. package/src/recordShape.ts +133 -0
  563. package/src/report/ReportGrid.spec.tsx +175 -0
  564. package/src/report/ReportGrid.tsx +530 -0
  565. package/src/report/ReportViewToolbar.spec.tsx +90 -0
  566. package/src/report/ReportViewToolbar.tsx +314 -0
  567. package/src/report/queryReport.spec.ts +483 -0
  568. package/src/report/queryReport.ts +722 -0
  569. package/src/report/queryReportColumns.tsx +123 -0
  570. package/src/report/reportViewModel.spec.ts +393 -0
  571. package/src/report/reportViewModel.ts +617 -0
  572. package/src/report/savedReports.ts +172 -0
  573. package/src/report/seam.spec.ts +216 -0
  574. package/src/report/useFrappeReport.ts +241 -0
  575. package/src/report/useQueryReport.spec.tsx +131 -0
  576. package/src/report/useQueryReport.ts +309 -0
  577. package/src/useFrappeForm.spec.tsx +209 -0
  578. package/src/useFrappeForm.ts +778 -0
  579. package/types/FileBrowser/index.d.ts.map +1 -1
  580. package/types/FrappeCalendar.d.ts.map +1 -1
  581. package/types/FrappeForm.d.ts +21 -1
  582. package/types/FrappeForm.d.ts.map +1 -1
  583. package/types/FrappeListView.d.ts.map +1 -1
  584. package/types/FrappeReportBuilder.d.ts +66 -16
  585. package/types/FrappeReportBuilder.d.ts.map +1 -1
  586. package/types/FrappeReportView.d.ts +9 -127
  587. package/types/FrappeReportView.d.ts.map +1 -1
  588. package/types/dependsOn.d.ts.map +1 -1
  589. package/types/formEngine/docPermissions.d.ts +14 -0
  590. package/types/formEngine/docPermissions.d.ts.map +1 -1
  591. package/types/formEngine/index.d.ts +1 -1
  592. package/types/formEngine/index.d.ts.map +1 -1
  593. package/types/index.d.ts +15 -3
  594. package/types/index.d.ts.map +1 -1
  595. package/types/liveErrors.d.ts +9 -1
  596. package/types/liveErrors.d.ts.map +1 -1
  597. package/types/measures.d.ts +3 -0
  598. package/types/measures.d.ts.map +1 -0
  599. package/types/recordShape.d.ts +45 -0
  600. package/types/recordShape.d.ts.map +1 -0
  601. package/types/report/ReportGrid.d.ts +20 -0
  602. package/types/report/ReportGrid.d.ts.map +1 -0
  603. package/types/report/ReportViewToolbar.d.ts +31 -0
  604. package/types/report/ReportViewToolbar.d.ts.map +1 -0
  605. package/types/report/queryReport.d.ts +181 -0
  606. package/types/report/queryReport.d.ts.map +1 -0
  607. package/types/report/queryReportColumns.d.ts +12 -0
  608. package/types/report/queryReportColumns.d.ts.map +1 -0
  609. package/types/report/reportViewModel.d.ts +146 -0
  610. package/types/report/reportViewModel.d.ts.map +1 -0
  611. package/types/report/savedReports.d.ts +27 -0
  612. package/types/report/savedReports.d.ts.map +1 -0
  613. package/types/report/useFrappeReport.d.ts +60 -0
  614. package/types/report/useFrappeReport.d.ts.map +1 -0
  615. package/types/report/useQueryReport.d.ts +37 -0
  616. package/types/report/useQueryReport.d.ts.map +1 -0
  617. package/types/useFrappeForm.d.ts +142 -0
  618. 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