@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
@@ -1,61 +1,165 @@
1
- import { useDocTypeMeta, useFrappeDoctypeEvents } from "@multiplatform.one/frappe";
1
+ import { BarChart, EmptyState, ScrollView, Spinner, YStack, isWeb, notify } from "@multiplatform.one/components";
2
+ import { Order, frappeFieldTypes, useDocTypeMeta } from "@multiplatform.one/frappe";
3
+ import { Button } from "@multiplatform.one/forms";
2
4
  import { downloadBlob } from "@multiplatform.one/platform";
3
- import { ReportBuilder, PopoverContent, Separator } from "@multiplatform.one/components";
4
- import { Button, Input, Spinner, formCommonColors } from "@multiplatform.one/forms";
5
5
  import { storage } from "@multiplatform.one/store";
6
- import { useMemo, useState, useCallback, useEffect, useRef } from "react";
7
- import { useTranslation } from "react-i18next";
8
- import { Popover, Text, XStack, YStack } from "tamagui";
9
- import { FloppyDiskIcon, FolderOpenIcon, TrashIcon } from "@phosphor-icons/react";
6
+ import { DataTablePagination } from "@multiplatform.one/table";
10
7
  import { useResolvedKnobs } from "@multiplatform.one/theme";
8
+ import { useCallback, useEffect, useMemo, useState } from "react";
9
+ import { useTranslation } from "react-i18next";
10
+ import { FrappeNotConfigured } from "./FrappeNotConfigured.mjs";
11
11
  import { useFrappeConfig } from "./FrappeProvider.mjs";
12
+ import { isPermissionError, refusalReason } from "./liveErrors.mjs";
13
+ import { recordKeyLabel, useRecordShape } from "./recordShape.mjs";
14
+ import { ReportGrid } from "./report/ReportGrid.mjs";
15
+ import { ReportViewToolbar } from "./report/ReportViewToolbar.mjs";
16
+ import { DEFAULT_REPORT_PAGE_SIZE, REPORT_PAGE_SIZES, buildGridRows, buildReportCsv, columnFilterTuples, computeTotals, defaultReportFieldnames, orderReportRows, reportColumnsFromMeta, resolveSelectedColumns } from "./report/reportViewModel.mjs";
17
+ import { useSavedReports } from "./report/savedReports.mjs";
12
18
  import { useFrappeRows } from "./useFrappeRows.mjs";
13
- import { jsx, jsxs } from "react/jsx-runtime";
14
- function getSavedReportsKey(doctype) {
15
- return `frappe-report-${doctype}`;
19
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
+ const EMPTY_FILTERS = [];
21
+ const COLUMN_FILTER_DEBOUNCE_MS = 350;
22
+ function columnsStorageKey(doctype) {
23
+ return `backoffice.report.columns.${doctype}`;
16
24
  }
17
- async function loadSavedReports(doctype) {
25
+ async function readStoredColumns(doctype) {
18
26
  try {
19
- const raw = await Promise.resolve(storage.getItem(getSavedReportsKey(doctype)));
20
- if (raw) return JSON.parse(raw);
27
+ const raw = await Promise.resolve(storage.getItem(columnsStorageKey(doctype)));
28
+ if (!raw) return void 0;
29
+ const parsed = JSON.parse(raw);
30
+ if (Array.isArray(parsed) && parsed.every(entry => typeof entry === "string")) {
31
+ return parsed;
32
+ }
21
33
  } catch {}
22
- return [];
34
+ return void 0;
23
35
  }
24
- async function persistSavedReports(doctype, reports) {
36
+ function persistStoredColumns(doctype, fieldnames) {
25
37
  try {
26
- await Promise.resolve(storage.setItem(getSavedReportsKey(doctype), JSON.stringify(reports)));
38
+ void Promise.resolve(storage.setItem(columnsStorageKey(doctype), JSON.stringify(fieldnames)));
27
39
  } catch {}
28
40
  }
41
+ function toReportFilters(filters) {
42
+ if (!filters) return void 0;
43
+ if (Array.isArray(filters)) return filters.length > 0 ? filters : void 0;
44
+ const tuples = Object.entries(filters).map(([field, value]) => [field, "=", value]);
45
+ return tuples.length > 0 ? tuples : void 0;
46
+ }
47
+ function initialFieldnames(columns) {
48
+ if (!columns) return null;
49
+ const fieldnames = columns.flatMap(column => typeof column === "string" ? [column] : column.enabled ? [column.fieldname] : []);
50
+ return fieldnames.length > 0 ? fieldnames : null;
51
+ }
52
+ function asFieldType(fieldtype) {
53
+ return frappeFieldTypes.find(known => known === fieldtype) ?? "Data";
54
+ }
55
+ function refusedMetaFields(initialColumns, recordFields) {
56
+ const declared = (initialColumns ?? []).map(column => typeof column === "string" ? {
57
+ fieldname: column,
58
+ label: recordKeyLabel(column),
59
+ fieldtype: "Data"
60
+ } : {
61
+ fieldname: column.fieldname,
62
+ label: column.label,
63
+ fieldtype: asFieldType(column.fieldtype)
64
+ });
65
+ return (declared.length > 0 ? declared : recordFields ?? []).filter(field => field.fieldname !== "name").map(field => ({
66
+ ...field,
67
+ read_only: 1,
68
+ in_list_view: 1
69
+ }));
70
+ }
71
+ function asError(error) {
72
+ return error instanceof Error ? error : new Error(String(error));
73
+ }
74
+ function groupField(groupBy) {
75
+ if (!groupBy) return null;
76
+ return typeof groupBy === "string" ? groupBy : groupBy.field;
77
+ }
78
+ function aggregateGroups(rows, field, config) {
79
+ const groups = /* @__PURE__ */new Map();
80
+ for (const row of rows) {
81
+ const key = row[field] === null || row[field] === void 0 ? "" : String(row[field]);
82
+ const bucket = groups.get(key);
83
+ if (bucket) bucket.push(row);else groups.set(key, [row]);
84
+ }
85
+ const numbers = group => group.map(row => Number(config?.aggregationField ? row[config.aggregationField] : 0) || 0);
86
+ return [...groups.entries()].map(([label, group]) => {
87
+ switch (config?.aggregationField ? config.aggregation : "count") {
88
+ case "sum":
89
+ return {
90
+ label,
91
+ value: numbers(group).reduce((sum, value) => sum + value, 0)
92
+ };
93
+ case "avg":
94
+ return {
95
+ label,
96
+ value: numbers(group).reduce((sum, value) => sum + value, 0) / group.length
97
+ };
98
+ case "min":
99
+ return {
100
+ label,
101
+ value: Math.min(...numbers(group))
102
+ };
103
+ case "max":
104
+ return {
105
+ label,
106
+ value: Math.max(...numbers(group))
107
+ };
108
+ default:
109
+ return {
110
+ label,
111
+ value: group.length
112
+ };
113
+ }
114
+ });
115
+ }
29
116
  function canDownloadCsv() {
30
117
  return typeof document !== "undefined" && typeof document.createElement === "function" && typeof Blob !== "undefined" && typeof URL !== "undefined" && typeof URL.createObjectURL === "function";
31
118
  }
32
- function FrappeReportBuilder({
119
+ function FrappeReportBuilder(props) {
120
+ const config = useFrappeConfig();
121
+ if (!(props.baseURL ?? config?.baseURL) && !config?.fixtures) {
122
+ return /* @__PURE__ */jsx(FrappeNotConfigured, {
123
+ doctype: props.doctype
124
+ });
125
+ }
126
+ return /* @__PURE__ */jsx(FrappeReportBuilderBody, {
127
+ ...props
128
+ });
129
+ }
130
+ function FrappeReportBuilderBody({
33
131
  doctype,
132
+ filters,
133
+ scopeFilters,
134
+ onClearFilters,
34
135
  initialColumns,
35
136
  initialGroupBy,
36
- filters,
37
137
  showChart = false,
38
- onExport,
138
+ onOpenRow,
39
139
  onRowPress,
140
+ onOpenLink,
141
+ report: reportProp,
142
+ onReportChange,
143
+ onExport,
144
+ loading: loadingFallback,
145
+ error: errorFallback,
40
146
  baseURL,
41
147
  auth,
42
148
  syncOptions,
43
149
  ...stackProps
44
150
  }) {
45
- const config = useFrappeConfig();
46
- const {
47
- knobProps
48
- } = useResolvedKnobs();
49
151
  const {
50
152
  t
51
153
  } = useTranslation();
154
+ const {
155
+ knobProps
156
+ } = useResolvedKnobs();
157
+ const config = useFrappeConfig();
52
158
  const finalBaseURL = baseURL ?? config?.baseURL;
53
159
  const finalAuth = auth ?? config?.auth;
54
160
  const finalSyncOptions = syncOptions ?? config?.syncOptions;
55
- if (!finalBaseURL && !config?.fixtures) {
56
- throw new Error("FrappeReportBuilder requires baseURL prop or FrappeProvider with baseURL or fixtures");
57
- }
58
- const connectionConfig = {
161
+ const fixtureMode = Boolean(config?.fixtures);
162
+ const connection = useMemo(() => ({
59
163
  baseURL: finalBaseURL,
60
164
  socketPort: config?.socketPort,
61
165
  siteName: config?.siteName,
@@ -64,331 +168,441 @@ function FrappeReportBuilder({
64
168
  syncOptions: finalSyncOptions,
65
169
  realtime: config?.realtime,
66
170
  fixtures: config?.fixtures
67
- };
171
+ }), [finalBaseURL, config?.socketPort, config?.siteName, config?.socketBaseURL, finalAuth, finalSyncOptions, config?.realtime, config?.fixtures]);
68
172
  const {
69
173
  meta,
70
- isLoading: isMetaLoading,
174
+ isLoading: metaLoading,
71
175
  error: metaError
72
- } = useDocTypeMeta(connectionConfig, doctype);
176
+ } = useDocTypeMeta(connection, doctype);
177
+ const metaRefused = !meta && metaError !== void 0 && isPermissionError(metaError);
178
+ const initialColumnsJson = JSON.stringify(initialColumns ?? []);
179
+ const declaresColumns = initialColumnsJson !== "[]";
180
+ const recordShape = useRecordShape(connection, doctype, metaRefused && !declaresColumns);
181
+ const layoutMeta = useMemo(() => {
182
+ if (meta) return meta;
183
+ if (!metaRefused) return void 0;
184
+ const fields = refusedMetaFields(JSON.parse(initialColumnsJson), recordShape.fields);
185
+ return fields.length > 0 ? {
186
+ fields
187
+ } : void 0;
188
+ }, [meta, metaRefused, initialColumnsJson, recordShape.fields]);
189
+ const readsWithoutMeta = !meta && layoutMeta !== void 0;
190
+ const savedReports = useSavedReports(doctype, useMemo(() => ({
191
+ baseURL: metaRefused ? "" : connection.baseURL ?? "",
192
+ auth: connection.auth,
193
+ fixtures: connection.fixtures
194
+ }), [metaRefused, connection.baseURL, connection.auth, connection.fixtures]));
195
+ const [internalReport, setInternalReport] = useState(null);
196
+ const currentReport = reportProp !== void 0 ? reportProp : internalReport;
73
197
  const allColumns = useMemo(() => {
74
- if (initialColumns) return initialColumns;
75
- if (!meta) return [];
76
- return meta.fields.filter(f => f.fieldtype !== "Section Break" && f.fieldtype !== "Column Break" && f.fieldtype !== "Tab Break").map(f => ({
77
- fieldname: f.fieldname,
78
- label: f.label || f.fieldname,
79
- fieldtype: f.fieldtype,
80
- enabled: !!f.in_list_view
81
- }));
82
- }, [initialColumns, meta]);
83
- const fetchFields = useMemo(() => {
84
- const fieldNames = allColumns.map(c => c.fieldname);
85
- if (!fieldNames.includes("name")) {
86
- fieldNames.unshift("name");
87
- }
88
- return fieldNames;
89
- }, [allColumns]);
90
- const {
91
- rows,
92
- isQueryLoading: isLoading,
93
- isError
94
- } = useFrappeRows(connectionConfig, doctype, {
95
- fields: fetchFields,
96
- filters,
97
- limit: null
98
- });
99
- const data = rows;
100
- const [isLiveStale, setIsLiveStale] = useState(false);
101
- const staleTimerRef = useRef(void 0);
102
- const clearStaleTimer = useCallback(() => {
103
- if (staleTimerRef.current) {
104
- clearTimeout(staleTimerRef.current);
105
- staleTimerRef.current = void 0;
106
- }
107
- }, []);
108
- useFrappeDoctypeEvents(connectionConfig, doctype, event => {
109
- if (event.type !== "doc_update" && event.type !== "list_update" && event.type !== "doc_deleted" && event.type !== "doc_changed") {
110
- return;
111
- }
112
- setIsLiveStale(true);
113
- clearStaleTimer();
114
- staleTimerRef.current = setTimeout(() => setIsLiveStale(false), 2500);
115
- });
116
- const isFirstData = useRef(true);
198
+ const columns = reportColumnsFromMeta(layoutMeta);
199
+ if (!readsWithoutMeta || !layoutMeta) return columns;
200
+ const own = new Set(layoutMeta.fields.map(field => field.fieldname));
201
+ return columns.filter(column => column.fieldname === "name" || own.has(column.fieldname));
202
+ }, [layoutMeta, readsWithoutMeta]);
203
+ const defaultFieldnames = useMemo(() => readsWithoutMeta && layoutMeta ? ["name", ...layoutMeta.fields.map(field => field.fieldname)] : defaultReportFieldnames(layoutMeta), [layoutMeta, readsWithoutMeta]);
204
+ const initialColumnsKey = JSON.stringify(initialFieldnames(initialColumns));
205
+ const startFieldnames = useMemo(() => JSON.parse(initialColumnsKey), [initialColumnsKey]);
206
+ const [storedColumns, setStoredColumns] = useState(void 0);
207
+ const [selectedOverride, setSelectedOverride] = useState(null);
117
208
  useEffect(() => {
118
- if (isFirstData.current) {
119
- isFirstData.current = false;
120
- return;
121
- }
122
- setIsLiveStale(false);
123
- clearStaleTimer();
124
- }, [data, clearStaleTimer]);
125
- useEffect(() => clearStaleTimer, [clearStaleTimer]);
126
- const [groupBy, setGroupBy] = useState(initialGroupBy ?? null);
127
- const [enabledColumns, setEnabledColumns] = useState([]);
209
+ if (fixtureMode) return;
210
+ let cancelled = false;
211
+ void readStoredColumns(doctype).then(stored => {
212
+ if (!cancelled) setStoredColumns(stored);
213
+ });
214
+ return () => {
215
+ cancelled = true;
216
+ };
217
+ }, [doctype, fixtureMode]);
218
+ const selectedFieldnames = selectedOverride ?? startFieldnames ?? storedColumns ?? defaultFieldnames;
219
+ const selectedColumns = useMemo(() => resolveSelectedColumns(allColumns, selectedFieldnames), [allColumns, selectedFieldnames]);
220
+ const filtersKey = JSON.stringify(filters ?? null);
221
+ const propFilters = useMemo(() => toReportFilters(JSON.parse(filtersKey)), [filtersKey]);
222
+ const [filtersCleared, setFiltersCleared] = useState(false);
223
+ const [reportFilters, setReportFilters] = useState(null);
224
+ const baseFilters = filtersCleared ? EMPTY_FILTERS : reportFilters ?? propFilters ?? EMPTY_FILTERS;
225
+ const [filterDrafts, setFilterDrafts] = useState({});
226
+ const [committedFilters, setCommittedFilters] = useState({});
128
227
  useEffect(() => {
129
- if (allColumns.length > 0 && enabledColumns.length === 0) {
130
- const initial = allColumns.filter(c => c.enabled).map(c => c.fieldname);
131
- if (initial.length === 0) {
132
- setEnabledColumns(allColumns.slice(0, 5).map(c => c.fieldname));
133
- } else {
134
- setEnabledColumns(initial);
135
- }
136
- }
137
- }, [allColumns, enabledColumns.length]);
138
- const [savedReports, setSavedReports] = useState([]);
139
- const [saveDialogOpen, setSaveDialogOpen] = useState(false);
140
- const [saveReportName, setSaveReportName] = useState("");
228
+ const handle = setTimeout(() => {
229
+ setCommittedFilters(previous => JSON.stringify(previous) === JSON.stringify(filterDrafts) ? previous : filterDrafts);
230
+ }, COLUMN_FILTER_DEBOUNCE_MS);
231
+ return () => clearTimeout(handle);
232
+ }, [filterDrafts]);
233
+ const columnTuples = useMemo(() => columnFilterTuples(selectedColumns, committedFilters), [selectedColumns, committedFilters]);
234
+ const scopeKey = JSON.stringify(scopeFilters ?? []);
235
+ const scope = useMemo(() => JSON.parse(scopeKey), [scopeKey]);
236
+ const effectiveFilters = useMemo(() => [...scope, ...baseFilters, ...columnTuples], [scope, baseFilters, columnTuples]);
237
+ const metaSort = useMemo(() => ({
238
+ field: (meta?.sort_field || "modified").split(" ")[0],
239
+ order: (meta?.sort_order || "DESC").toLowerCase() === "asc" ? "asc" : "desc"
240
+ }), [meta?.sort_field, meta?.sort_order]);
241
+ const [sortOverride, setSortOverride] = useState(null);
242
+ const sort = sortOverride ?? metaSort;
243
+ const startGroupBy = groupField(initialGroupBy);
244
+ const chartConfig = typeof initialGroupBy === "object" ? initialGroupBy : void 0;
245
+ const [groupBy, setGroupBy] = useState(startGroupBy);
246
+ const [pageSize, setPageSize] = useState(DEFAULT_REPORT_PAGE_SIZE);
247
+ const [page, setPage] = useState(0);
248
+ useEffect(() => {
249
+ setSelectedOverride(null);
250
+ setStoredColumns(void 0);
251
+ setSortOverride(null);
252
+ setGroupBy(startGroupBy);
253
+ setPage(0);
254
+ setPageSize(DEFAULT_REPORT_PAGE_SIZE);
255
+ setFilterDrafts({});
256
+ setCommittedFilters({});
257
+ setFiltersCleared(false);
258
+ setReportFilters(null);
259
+ }, [doctype]);
260
+ useEffect(() => setFiltersCleared(false), [filtersKey]);
261
+ const effectiveFiltersKey = useMemo(() => JSON.stringify(effectiveFilters), [effectiveFilters]);
262
+ useEffect(() => {
263
+ setPage(0);
264
+ }, [effectiveFiltersKey, pageSize, groupBy]);
141
265
  useEffect(() => {
266
+ if (!currentReport) {
267
+ setReportFilters(null);
268
+ return;
269
+ }
142
270
  let cancelled = false;
143
- void (async () => {
144
- const reports = await loadSavedReports(doctype);
145
- if (!cancelled) {
146
- setSavedReports(reports);
271
+ void savedReports.load(currentReport).then(saved => {
272
+ if (cancelled || !saved) return;
273
+ setSelectedOverride(saved.fieldnames.length > 0 ? saved.fieldnames : null);
274
+ setReportFilters(saved.filters);
275
+ setFilterDrafts({});
276
+ setCommittedFilters({});
277
+ setFiltersCleared(false);
278
+ if (saved.sort) setSortOverride(saved.sort);
279
+ if (saved.pageSize && REPORT_PAGE_SIZES.some(size => size === saved.pageSize)) {
280
+ setPageSize(saved.pageSize);
147
281
  }
148
- })();
282
+ setGroupBy(saved.groupBy ?? null);
283
+ });
149
284
  return () => {
150
285
  cancelled = true;
151
286
  };
152
- }, [doctype]);
153
- const handleSaveReport = useCallback(() => {
154
- if (!saveReportName.trim()) return;
155
- const report = {
156
- name: saveReportName.trim(),
157
- columns: enabledColumns,
287
+ }, [currentReport, doctype]);
288
+ const handleToggleColumn = useCallback(fieldname => {
289
+ setSelectedOverride(previous => {
290
+ const current = previous ?? startFieldnames ?? storedColumns ?? defaultFieldnames;
291
+ const next = current.includes(fieldname) ? current.length === 1 ? current : current.filter(entry => entry !== fieldname) : [...current, fieldname];
292
+ if (!fixtureMode && !currentReport) persistStoredColumns(doctype, next);
293
+ return next;
294
+ });
295
+ }, [startFieldnames, storedColumns, defaultFieldnames, fixtureMode, currentReport, doctype]);
296
+ const handleResetColumns = useCallback(() => {
297
+ setSelectedOverride(defaultFieldnames);
298
+ setStoredColumns(void 0);
299
+ if (!fixtureMode) persistStoredColumns(doctype, defaultFieldnames);
300
+ }, [defaultFieldnames, fixtureMode, doctype]);
301
+ const fetchFields = useMemo(() => {
302
+ const fields = /* @__PURE__ */new Set(["name", sort.field]);
303
+ for (const column of selectedColumns) fields.add(column.fieldname);
304
+ if (groupBy) fields.add(groupBy);
305
+ if (chartConfig?.aggregationField) fields.add(chartConfig.aggregationField);
306
+ return [...fields];
307
+ }, [selectedColumns, sort.field, groupBy, chartConfig?.aggregationField]);
308
+ const orderBy = useMemo(() => [{
309
+ field: sort.field,
310
+ order: sort.order === "asc" ? Order.Asc : Order.Desc
311
+ }], [sort.field, sort.order]);
312
+ const {
313
+ rows: rowsData,
314
+ syncError,
315
+ isLoading: rowsLoading
316
+ } = useFrappeRows(connection, doctype, {
317
+ fields: fetchFields,
318
+ filters: effectiveFilters,
319
+ orderBy,
320
+ limit: null,
321
+ enabled: layoutMeta !== void 0,
322
+ mapError: asError
323
+ });
324
+ const orderedRows = useMemo(() => orderReportRows(rowsData, sort, groupBy), [rowsData, sort, groupBy]);
325
+ const total = orderedRows.length;
326
+ const pageCount = Math.max(1, Math.ceil(total / pageSize));
327
+ const effectivePage = Math.min(page, pageCount - 1);
328
+ const gridRows = useMemo(() => buildGridRows(orderedRows, effectivePage * pageSize, pageSize, groupBy), [orderedRows, effectivePage, pageSize, groupBy]);
329
+ const totals = useMemo(() => computeTotals(selectedColumns, orderedRows), [selectedColumns, orderedRows]);
330
+ const groupByColumn = groupBy ? allColumns.find(column => column.fieldname === groupBy) : void 0;
331
+ const chartData = useMemo(() => showChart && groupBy ? aggregateGroups(orderedRows, groupBy, chartConfig) : [], [showChart, groupBy, orderedRows, chartConfig]);
332
+ const rowsPressable = Boolean(onOpenRow || onRowPress);
333
+ const handleOpenRow = useCallback(name => {
334
+ onOpenRow?.(name);
335
+ if (onRowPress) {
336
+ const index = orderedRows.findIndex(row => row.name === name);
337
+ if (index >= 0) onRowPress(orderedRows[index], index);
338
+ }
339
+ }, [onOpenRow, onRowPress, orderedRows]);
340
+ const handleSelectReport = useCallback(name => {
341
+ if (reportProp === void 0) setInternalReport(name);
342
+ onReportChange?.(name);
343
+ if (!name) {
344
+ setReportFilters(null);
345
+ setSelectedOverride(null);
346
+ setSortOverride(null);
347
+ setGroupBy(null);
348
+ }
349
+ }, [reportProp, onReportChange]);
350
+ const handleClearBaseFilters = useCallback(() => {
351
+ setFiltersCleared(true);
352
+ if (propFilters && !reportFilters) onClearFilters?.();
353
+ }, [propFilters, reportFilters, onClearFilters]);
354
+ const handleSaveReport = useCallback(name => {
355
+ void savedReports.save(name, {
356
+ fieldnames: [...selectedFieldnames],
357
+ filters: effectiveFilters,
358
+ sort,
359
+ pageSize,
158
360
  groupBy,
159
- filters
160
- };
161
- const updated = [...savedReports.filter(r => r.name !== report.name), report];
162
- setSavedReports(updated);
163
- void persistSavedReports(doctype, updated);
164
- setSaveDialogOpen(false);
165
- setSaveReportName("");
166
- }, [saveReportName, enabledColumns, groupBy, filters, savedReports, doctype]);
167
- const handleLoadReport = useCallback(report => {
168
- setEnabledColumns(report.columns);
169
- setGroupBy(report.groupBy);
170
- }, []);
361
+ addTotals: totals.length > 0
362
+ }).then(savedName => {
363
+ notify({
364
+ severity: "success",
365
+ scope: "page",
366
+ body: t("report.saveDone", {
367
+ defaultValue: "Saved report \u201C{{name}}\u201D",
368
+ name: savedName
369
+ })
370
+ });
371
+ if (savedName !== currentReport) handleSelectReport(savedName);
372
+ }).catch(error => {
373
+ notify({
374
+ severity: "error",
375
+ scope: "page",
376
+ body: error instanceof Error ? error.message : t("report.saveFailed", "Could not save the report")
377
+ });
378
+ });
379
+ }, [savedReports, selectedFieldnames, effectiveFilters, sort, pageSize, groupBy, totals.length, currentReport, handleSelectReport, t]);
171
380
  const handleDeleteReport = useCallback(name => {
172
- const updated = savedReports.filter(r => r.name !== name);
173
- setSavedReports(updated);
174
- void persistSavedReports(doctype, updated);
175
- }, [savedReports, doctype]);
176
- const handleExport = useCallback(exportData => {
381
+ void savedReports.remove(name).then(() => {
382
+ notify({
383
+ severity: "success",
384
+ scope: "page",
385
+ body: t("report.deleteDone", {
386
+ defaultValue: "Deleted report \u201C{{name}}\u201D",
387
+ name
388
+ })
389
+ });
390
+ if (name === currentReport) handleSelectReport(null);
391
+ }).catch(error => {
392
+ notify({
393
+ severity: "error",
394
+ scope: "page",
395
+ body: error instanceof Error ? error.message : t("report.deleteFailed", "Could not delete the report")
396
+ });
397
+ });
398
+ }, [savedReports, currentReport, handleSelectReport, t]);
399
+ const exportEnabled = Boolean(onExport) || canDownloadCsv();
400
+ const handleExport = useCallback(() => {
177
401
  if (onExport) {
178
- onExport(exportData);
402
+ onExport(orderedRows);
179
403
  return;
180
404
  }
181
- const cols = allColumns.filter(c => enabledColumns.includes(c.fieldname));
182
- const headers = cols.map(c => c.label);
183
- const csvRows = [headers.join(",")];
184
- for (const row of exportData) {
185
- const values = cols.map(col => {
186
- const val = row[col.fieldname];
187
- if (val === null || val === void 0) return "";
188
- const str = String(val);
189
- if (str.includes(",") || str.includes('"') || str.includes("\n")) {
190
- return `"${str.replace(/"/g, '""')}"`;
191
- }
192
- return str;
193
- });
194
- csvRows.push(values.join(","));
195
- }
196
- const csvContent = csvRows.join("\n");
197
- const blob = new Blob([csvContent], {
405
+ downloadBlob(new Blob([buildReportCsv(selectedColumns, orderedRows)], {
198
406
  type: "text/csv;charset=utf-8;"
407
+ }), `${doctype}_report.csv`);
408
+ notify({
409
+ severity: "success",
410
+ scope: "page",
411
+ body: t("report.exportDone", {
412
+ count: orderedRows.length,
413
+ defaultValue_one: "Exported {{count}} row to CSV",
414
+ defaultValue_other: "Exported {{count}} rows to CSV"
415
+ })
199
416
  });
200
- downloadBlob(blob, `${doctype}_report.csv`);
201
- }, [allColumns, enabledColumns, onExport, doctype]);
202
- const exportEnabled = Boolean(onExport) || canDownloadCsv();
203
- if (isMetaLoading) {
204
- return /* @__PURE__ */jsxs(YStack, {
205
- ...knobProps.panelPadding,
206
- alignItems: "center",
207
- justifyContent: "center",
208
- gap: "$2",
209
- ...stackProps,
210
- children: [/* @__PURE__ */jsx(Spinner, {
211
- size: "large"
212
- }), /* @__PURE__ */jsx(Text, {
213
- color: "$color10",
214
- children: t("Loading {{doctype}} schema...", {
215
- doctype
417
+ }, [onExport, selectedColumns, orderedRows, doctype, t]);
418
+ const handleColumnFilterChange = useCallback((fieldname, value) => {
419
+ setFilterDrafts(previous => {
420
+ if (value === "") {
421
+ if (!(fieldname in previous)) return previous;
422
+ const {
423
+ [fieldname]: _dropped,
424
+ ...rest
425
+ } = previous;
426
+ return rest;
427
+ }
428
+ return {
429
+ ...previous,
430
+ [fieldname]: value
431
+ };
432
+ });
433
+ }, []);
434
+ const handleClearColumnFilters = useCallback(() => {
435
+ setFilterDrafts({});
436
+ setCommittedFilters({});
437
+ }, []);
438
+ if (metaLoading && !meta) {
439
+ return /* @__PURE__ */jsx(Fragment, {
440
+ children: loadingFallback ?? /* @__PURE__ */jsx(YStack, {
441
+ flex: 1,
442
+ alignItems: "center",
443
+ justifyContent: "center",
444
+ ...stackProps,
445
+ children: /* @__PURE__ */jsx(Spinner, {
446
+ size: "large"
216
447
  })
217
- })]
448
+ })
218
449
  });
219
450
  }
220
- if (metaError && !meta) {
221
- return /* @__PURE__ */jsxs(YStack, {
222
- ...knobProps.panelPadding,
223
- alignItems: "center",
224
- ...knobProps.gap,
225
- ...stackProps,
226
- children: [/* @__PURE__ */jsx(Text, {
227
- color: "$red11",
228
- children: t("Failed to load {{doctype}} schema", {
229
- doctype
451
+ if (metaError && metaRefused && !layoutMeta) {
452
+ if (recordShape.status === "pending") {
453
+ return /* @__PURE__ */jsx(Fragment, {
454
+ children: loadingFallback ?? /* @__PURE__ */jsx(YStack, {
455
+ flex: 1,
456
+ alignItems: "center",
457
+ justifyContent: "center",
458
+ ...stackProps,
459
+ children: /* @__PURE__ */jsx(Spinner, {
460
+ size: "large"
461
+ })
230
462
  })
231
- }), /* @__PURE__ */jsx(Text, {
232
- color: "$color10",
233
- fontSize: "$2",
234
- children: metaError.message
235
- })]
463
+ });
464
+ }
465
+ return /* @__PURE__ */jsx(Fragment, {
466
+ children: errorFallback ? errorFallback(metaError) : /* @__PURE__ */jsx(EmptyState, {
467
+ testID: "frappe-report-not-permitted",
468
+ title: t("report.notPermitted", {
469
+ defaultValue: "You can't open the {{doctype}} report",
470
+ doctype
471
+ }),
472
+ description: refusalReason(metaError)
473
+ })
236
474
  });
237
475
  }
238
- if (isLoading) {
239
- return /* @__PURE__ */jsxs(YStack, {
240
- ...knobProps.panelPadding,
241
- alignItems: "center",
242
- gap: "$1",
243
- ...stackProps,
244
- children: [/* @__PURE__ */jsx(Spinner, {
245
- size: "small"
246
- }), /* @__PURE__ */jsx(Text, {
247
- color: "$color10",
248
- fontSize: "$2",
249
- children: t("Loading data...")
250
- })]
476
+ if (metaError && !meta && !readsWithoutMeta) {
477
+ return /* @__PURE__ */jsx(Fragment, {
478
+ children: errorFallback ? errorFallback(metaError) : /* @__PURE__ */jsx(EmptyState, {
479
+ intent: "error",
480
+ title: t("report.metaFailed", {
481
+ defaultValue: "Couldn't load the {{doctype}} report",
482
+ doctype
483
+ }),
484
+ description: metaError.message
485
+ })
251
486
  });
252
487
  }
253
- if (isError) {
254
- return /* @__PURE__ */jsxs(YStack, {
255
- ...knobProps.panelPadding,
488
+ let body;
489
+ if (syncError && isPermissionError(syncError)) {
490
+ body = /* @__PURE__ */jsx(EmptyState, {
491
+ testID: "frappe-report-not-permitted",
492
+ title: t("report.notPermitted", {
493
+ defaultValue: "You can't open the {{doctype}} report",
494
+ doctype
495
+ }),
496
+ description: refusalReason(syncError)
497
+ });
498
+ } else if (syncError) {
499
+ body = /* @__PURE__ */jsx(EmptyState, {
500
+ intent: "error",
501
+ title: t("report.loadFailed", "Couldn't load report rows"),
502
+ description: syncError.message
503
+ });
504
+ } else if (rowsLoading && total === 0) {
505
+ body = /* @__PURE__ */jsx(YStack, {
506
+ flex: 1,
256
507
  alignItems: "center",
508
+ justifyContent: "center",
509
+ children: /* @__PURE__ */jsx(Spinner, {
510
+ size: "large"
511
+ })
512
+ });
513
+ } else if (total === 0) {
514
+ const hasFilters = effectiveFilters.length > 0;
515
+ body = /* @__PURE__ */jsx(EmptyState, {
516
+ title: t("report.emptyTitle", "No results"),
517
+ description: hasFilters ? t("report.emptyFiltered", "No rows match the current filters") : t("report.emptyDescription", {
518
+ defaultValue: "There are no {{doctype}} records yet",
519
+ doctype
520
+ }),
521
+ action: hasFilters ? /* @__PURE__ */jsx(Button, {
522
+ size: "$3",
523
+ onPress: () => {
524
+ handleClearColumnFilters();
525
+ handleClearBaseFilters();
526
+ },
527
+ children: t("report.clearAllFilters", "Clear all filters")
528
+ }) : void 0
529
+ });
530
+ } else {
531
+ body = /* @__PURE__ */jsxs(YStack, {
532
+ flex: 1,
533
+ minWidth: 0,
257
534
  ...knobProps.gap,
258
- ...stackProps,
259
- children: [/* @__PURE__ */jsx(Text, {
260
- color: "$red11",
261
- children: t("Failed to load {{doctype}} data", {
262
- doctype
535
+ children: [chartData.length > 0 && /* @__PURE__ */jsx(YStack, {
536
+ ...knobProps.surface,
537
+ ...knobProps.containerRadius,
538
+ ...knobProps.panelPadding,
539
+ children: /* @__PURE__ */jsx(BarChart, {
540
+ data: chartData
263
541
  })
264
- }), /* @__PURE__ */jsx(Text, {
265
- color: "$color10",
266
- fontSize: "$2",
267
- children: t("The live query could not load report rows.")
542
+ }), /* @__PURE__ */jsx(ReportGrid, {
543
+ columns: selectedColumns,
544
+ rows: gridRows,
545
+ sort,
546
+ onSortChange: setSortOverride,
547
+ columnFilters: filterDrafts,
548
+ onColumnFilterChange: handleColumnFilterChange,
549
+ onOpenRow: rowsPressable ? handleOpenRow : void 0,
550
+ onOpenLink,
551
+ totals,
552
+ groupByColumn
268
553
  })]
269
554
  });
270
555
  }
271
- return /* @__PURE__ */jsxs(YStack, {
556
+ const content = /* @__PURE__ */jsxs(YStack, {
272
557
  flex: 1,
273
- ...knobProps.borderRadius,
558
+ minWidth: 0,
274
559
  ...stackProps,
275
- children: [/* @__PURE__ */jsxs(XStack, {
276
- ...knobProps.panelPadding,
277
- ...knobProps.surface,
278
- ...knobProps.gap,
279
- alignItems: "center",
280
- borderBottomWidth: 1,
281
- borderBottomColor: "$borderColor",
282
- children: [isLiveStale ? /* @__PURE__ */jsxs(XStack, {
283
- gap: "$2",
284
- alignItems: "center",
285
- children: [/* @__PURE__ */jsx(Spinner, {
286
- size: "small",
287
- "aria-label": t("Updating")
288
- }), /* @__PURE__ */jsx(Text, {
289
- ...knobProps.label,
290
- color: formCommonColors.muted,
291
- children: t("Updating...")
292
- })]
293
- }) : null, /* @__PURE__ */jsx(XStack, {
294
- flex: 1
295
- }), /* @__PURE__ */jsxs(Popover, {
296
- placement: "bottom-end",
297
- open: saveDialogOpen,
298
- onOpenChange: setSaveDialogOpen,
299
- children: [/* @__PURE__ */jsx(Popover.Trigger, {
300
- asChild: true,
301
- children: /* @__PURE__ */jsx(Button, {
302
- size: "$2",
303
- icon: FloppyDiskIcon,
304
- children: t("Save")
305
- })
306
- }), /* @__PURE__ */jsx(PopoverContent, {
307
- children: /* @__PURE__ */jsxs(YStack, {
308
- ...knobProps.gap,
309
- minWidth: 220,
310
- children: [/* @__PURE__ */jsx(Text, {
311
- ...knobProps.label,
312
- fontWeight: "400",
313
- children: t("Save Report")
314
- }), /* @__PURE__ */jsx(Input, {
315
- label: t("Report name"),
316
- labelHidden: true,
317
- placeholder: t("Report name"),
318
- value: saveReportName,
319
- onChangeText: setSaveReportName,
320
- inputProps: {
321
- onSubmitEditing: handleSaveReport
322
- }
323
- }), /* @__PURE__ */jsx(Button, {
324
- size: "$2",
325
- onPress: handleSaveReport,
326
- disabled: !saveReportName.trim(),
327
- children: t("Save")
328
- })]
329
- })
330
- })]
331
- }), savedReports.length > 0 && /* @__PURE__ */jsxs(Popover, {
332
- placement: "bottom-end",
333
- children: [/* @__PURE__ */jsx(Popover.Trigger, {
334
- asChild: true,
335
- children: /* @__PURE__ */jsx(Button, {
336
- size: "$2",
337
- icon: FolderOpenIcon,
338
- children: t("Load")
339
- })
340
- }), /* @__PURE__ */jsx(PopoverContent, {
341
- children: /* @__PURE__ */jsxs(YStack, {
342
- ...knobProps.gap,
343
- minWidth: 180,
344
- children: [/* @__PURE__ */jsx(Text, {
345
- ...knobProps.label,
346
- fontWeight: "400",
347
- color: formCommonColors.muted,
348
- children: t("Saved Reports")
349
- }), /* @__PURE__ */jsx(Separator, {}), savedReports.map(report => /* @__PURE__ */jsxs(XStack, {
350
- alignItems: "center",
351
- justifyContent: "space-between",
352
- padding: "$2",
353
- ...knobProps.containerRadius,
354
- hoverStyle: {
355
- backgroundColor: "$color2"
356
- },
357
- cursor: "pointer",
358
- onPress: () => handleLoadReport(report),
359
- children: [/* @__PURE__ */jsx(Text, {
360
- ...knobProps.body,
361
- flex: 1,
362
- children: report.name
363
- }), /* @__PURE__ */jsx(Button, {
364
- size: "$2",
365
- circular: true,
366
- chromeless: true,
367
- icon: TrashIcon,
368
- onPress: e => {
369
- e.stopPropagation();
370
- handleDeleteReport(report.name);
371
- },
372
- "aria-label": t("Delete {{name}}", {
373
- name: report.name
374
- })
375
- })]
376
- }, report.name))]
377
- })
378
- })]
379
- })]
380
- }), /* @__PURE__ */jsx(ReportBuilder, {
560
+ children: [/* @__PURE__ */jsx(ReportViewToolbar, {
381
561
  columns: allColumns,
382
- data,
383
- groupBy: groupBy ?? void 0,
562
+ selected: selectedFieldnames,
563
+ onToggleColumn: handleToggleColumn,
564
+ onResetColumns: handleResetColumns,
565
+ groupBy,
384
566
  onGroupByChange: setGroupBy,
385
- onColumnsChange: setEnabledColumns,
567
+ baseFilters,
568
+ onClearBaseFilters: baseFilters.length > 0 ? handleClearBaseFilters : void 0,
569
+ columnFilterCount: columnTuples.length,
570
+ onClearColumnFilters: handleClearColumnFilters,
571
+ savedReports: savedReports.reports,
572
+ currentReport,
573
+ onSelectReport: handleSelectReport,
574
+ onSaveReport: readsWithoutMeta ? void 0 : handleSaveReport,
575
+ onDeleteReport: readsWithoutMeta ? void 0 : handleDeleteReport,
386
576
  onExport: exportEnabled ? handleExport : void 0,
387
- onRowPress,
388
- showChart,
389
- flex: 1
577
+ exportDisabled: total === 0
578
+ }), /* @__PURE__ */jsx(YStack, {
579
+ flex: 1,
580
+ minWidth: 0,
581
+ paddingHorizontal: "$3",
582
+ children: body
583
+ }), total > 0 && !syncError && /* @__PURE__ */jsx(YStack, {
584
+ paddingHorizontal: "$3",
585
+ paddingVertical: "$2",
586
+ children: /* @__PURE__ */jsx(DataTablePagination, {
587
+ pagination: {
588
+ pageIndex: effectivePage,
589
+ pageSize,
590
+ totalCount: total,
591
+ totalPages: pageCount
592
+ },
593
+ onPaginationChange: next => {
594
+ setPage(next.pageIndex);
595
+ setPageSize(next.pageSize);
596
+ },
597
+ pageSizeOptions: [...REPORT_PAGE_SIZES],
598
+ compact: true
599
+ })
390
600
  })]
391
601
  });
602
+ return isWeb ? content : /* @__PURE__ */jsx(ScrollView, {
603
+ flex: 1,
604
+ children: content
605
+ });
392
606
  }
393
607
  export { FrappeReportBuilder };
394
608
  //# sourceMappingURL=FrappeReportBuilder.mjs.map