@multiplatform.one/frappe-ui 7.28.1 → 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 (325) hide show
  1. package/dist/cjs/FrappeCalendar.cjs +3 -2
  2. package/dist/cjs/FrappeCalendar.native.js +3 -2
  3. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  4. package/dist/cjs/FrappeForm.cjs +148 -464
  5. package/dist/cjs/FrappeForm.native.js +152 -633
  6. package/dist/cjs/FrappeForm.native.js.map +1 -1
  7. package/dist/cjs/FrappeListView.cjs +5 -27
  8. package/dist/cjs/FrappeListView.native.js +11 -32
  9. package/dist/cjs/FrappeListView.native.js.map +1 -1
  10. package/dist/cjs/FrappeReportBuilder.cjs +523 -309
  11. package/dist/cjs/FrappeReportBuilder.native.js +658 -353
  12. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  13. package/dist/cjs/FrappeReportView.cjs +35 -234
  14. package/dist/cjs/FrappeReportView.native.js +39 -283
  15. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  16. package/dist/cjs/dependsOn.cjs +2 -2
  17. package/dist/cjs/dependsOn.native.js +1 -2
  18. package/dist/cjs/dependsOn.native.js.map +1 -1
  19. package/dist/cjs/fields/shared/EditorPreviewPanes.cjs +2 -2
  20. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js +2 -2
  21. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  22. package/dist/cjs/formEngine/docPermissions.cjs +20 -0
  23. package/dist/cjs/formEngine/docPermissions.native.js +69 -0
  24. package/dist/cjs/formEngine/docPermissions.native.js.map +1 -1
  25. package/dist/cjs/formEngine/index.cjs +2 -0
  26. package/dist/cjs/formEngine/index.native.js +2 -0
  27. package/dist/cjs/formEngine/index.native.js.map +1 -1
  28. package/dist/cjs/index.cjs +67 -7
  29. package/dist/cjs/index.native.js +67 -7
  30. package/dist/cjs/index.native.js.map +1 -1
  31. package/dist/cjs/liveErrors.cjs +8 -2
  32. package/dist/cjs/liveErrors.native.js +8 -2
  33. package/dist/cjs/liveErrors.native.js.map +1 -1
  34. package/dist/cjs/measures.cjs +31 -0
  35. package/dist/cjs/measures.native.js +34 -0
  36. package/dist/cjs/measures.native.js.map +1 -0
  37. package/dist/cjs/recordShape.cjs +103 -0
  38. package/dist/cjs/recordShape.native.js +115 -0
  39. package/dist/cjs/recordShape.native.js.map +1 -0
  40. package/dist/cjs/report/ReportGrid.cjs +453 -0
  41. package/dist/cjs/report/ReportGrid.native.js +510 -0
  42. package/dist/cjs/report/ReportGrid.native.js.map +1 -0
  43. package/dist/cjs/report/ReportViewToolbar.cjs +253 -0
  44. package/dist/cjs/report/ReportViewToolbar.native.js +303 -0
  45. package/dist/cjs/report/ReportViewToolbar.native.js.map +1 -0
  46. package/dist/cjs/report/queryReport.cjs +444 -0
  47. package/dist/cjs/report/queryReport.native.js +588 -0
  48. package/dist/cjs/report/queryReport.native.js.map +1 -0
  49. package/dist/cjs/report/queryReportColumns.cjs +131 -0
  50. package/dist/cjs/report/queryReportColumns.native.js +159 -0
  51. package/dist/cjs/report/queryReportColumns.native.js.map +1 -0
  52. package/dist/cjs/report/reportViewModel.cjs +386 -0
  53. package/dist/cjs/report/reportViewModel.native.js +657 -0
  54. package/dist/cjs/report/reportViewModel.native.js.map +1 -0
  55. package/dist/cjs/report/savedReports.cjs +137 -0
  56. package/dist/cjs/report/savedReports.native.js +169 -0
  57. package/dist/cjs/report/savedReports.native.js.map +1 -0
  58. package/dist/cjs/report/useFrappeReport.cjs +184 -0
  59. package/dist/cjs/report/useFrappeReport.native.js +214 -0
  60. package/dist/cjs/report/useFrappeReport.native.js.map +1 -0
  61. package/dist/cjs/report/useQueryReport.cjs +201 -0
  62. package/dist/cjs/report/useQueryReport.native.js +233 -0
  63. package/dist/cjs/report/useQueryReport.native.js.map +1 -0
  64. package/dist/cjs/useFrappeForm.cjs +558 -0
  65. package/dist/cjs/useFrappeForm.native.js +714 -0
  66. package/dist/cjs/useFrappeForm.native.js.map +1 -0
  67. package/dist/esm/FrappeCalendar.mjs +4 -3
  68. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  69. package/dist/esm/FrappeCalendar.native.js +4 -3
  70. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  71. package/dist/esm/FrappeForm.mjs +151 -467
  72. package/dist/esm/FrappeForm.mjs.map +1 -1
  73. package/dist/esm/FrappeForm.native.js +155 -636
  74. package/dist/esm/FrappeForm.native.js.map +1 -1
  75. package/dist/esm/FrappeListView.mjs +6 -28
  76. package/dist/esm/FrappeListView.mjs.map +1 -1
  77. package/dist/esm/FrappeListView.native.js +12 -33
  78. package/dist/esm/FrappeListView.native.js.map +1 -1
  79. package/dist/esm/FrappeReportBuilder.mjs +526 -312
  80. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  81. package/dist/esm/FrappeReportBuilder.native.js +661 -356
  82. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  83. package/dist/esm/FrappeReportView.mjs +30 -229
  84. package/dist/esm/FrappeReportView.mjs.map +1 -1
  85. package/dist/esm/FrappeReportView.native.js +34 -278
  86. package/dist/esm/FrappeReportView.native.js.map +1 -1
  87. package/dist/esm/dependsOn.mjs +2 -2
  88. package/dist/esm/dependsOn.mjs.map +1 -1
  89. package/dist/esm/dependsOn.native.js +1 -2
  90. package/dist/esm/dependsOn.native.js.map +1 -1
  91. package/dist/esm/fields/shared/EditorPreviewPanes.mjs +2 -2
  92. package/dist/esm/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  93. package/dist/esm/fields/shared/EditorPreviewPanes.native.js +2 -2
  94. package/dist/esm/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  95. package/dist/esm/formEngine/docPermissions.mjs +19 -1
  96. package/dist/esm/formEngine/docPermissions.mjs.map +1 -1
  97. package/dist/esm/formEngine/docPermissions.native.js +68 -1
  98. package/dist/esm/formEngine/docPermissions.native.js.map +1 -1
  99. package/dist/esm/formEngine/index.mjs +2 -2
  100. package/dist/esm/formEngine/index.mjs.map +1 -1
  101. package/dist/esm/formEngine/index.native.js +2 -2
  102. package/dist/esm/formEngine/index.native.js.map +1 -1
  103. package/dist/esm/index.mjs +16 -4
  104. package/dist/esm/index.mjs.map +1 -1
  105. package/dist/esm/index.native.js +16 -4
  106. package/dist/esm/index.native.js.map +1 -1
  107. package/dist/esm/liveErrors.mjs +8 -3
  108. package/dist/esm/liveErrors.mjs.map +1 -1
  109. package/dist/esm/liveErrors.native.js +8 -3
  110. package/dist/esm/liveErrors.native.js.map +1 -1
  111. package/dist/esm/measures.mjs +5 -0
  112. package/dist/esm/measures.mjs.map +1 -0
  113. package/dist/esm/measures.native.js +5 -0
  114. package/dist/esm/measures.native.js.map +1 -0
  115. package/dist/esm/recordShape.mjs +74 -0
  116. package/dist/esm/recordShape.mjs.map +1 -0
  117. package/dist/esm/recordShape.native.js +83 -0
  118. package/dist/esm/recordShape.native.js.map +1 -0
  119. package/dist/esm/report/ReportGrid.mjs +428 -0
  120. package/dist/esm/report/ReportGrid.mjs.map +1 -0
  121. package/dist/esm/report/ReportGrid.native.js +471 -0
  122. package/dist/esm/report/ReportGrid.native.js.map +1 -0
  123. package/dist/esm/report/ReportViewToolbar.mjs +228 -0
  124. package/dist/esm/report/ReportViewToolbar.mjs.map +1 -0
  125. package/dist/esm/report/ReportViewToolbar.native.js +264 -0
  126. package/dist/esm/report/ReportViewToolbar.native.js.map +1 -0
  127. package/dist/esm/report/queryReport.mjs +404 -0
  128. package/dist/esm/report/queryReport.mjs.map +1 -0
  129. package/dist/esm/report/queryReport.native.js +545 -0
  130. package/dist/esm/report/queryReport.native.js.map +1 -0
  131. package/dist/esm/report/queryReportColumns.mjs +105 -0
  132. package/dist/esm/report/queryReportColumns.mjs.map +1 -0
  133. package/dist/esm/report/queryReportColumns.native.js +119 -0
  134. package/dist/esm/report/queryReportColumns.native.js.map +1 -0
  135. package/dist/esm/report/reportViewModel.mjs +343 -0
  136. package/dist/esm/report/reportViewModel.mjs.map +1 -0
  137. package/dist/esm/report/reportViewModel.native.js +611 -0
  138. package/dist/esm/report/reportViewModel.native.js.map +1 -0
  139. package/dist/esm/report/savedReports.mjs +112 -0
  140. package/dist/esm/report/savedReports.mjs.map +1 -0
  141. package/dist/esm/report/savedReports.native.js +141 -0
  142. package/dist/esm/report/savedReports.native.js.map +1 -0
  143. package/dist/esm/report/useFrappeReport.mjs +158 -0
  144. package/dist/esm/report/useFrappeReport.mjs.map +1 -0
  145. package/dist/esm/report/useFrappeReport.native.js +185 -0
  146. package/dist/esm/report/useFrappeReport.native.js.map +1 -0
  147. package/dist/esm/report/useQueryReport.mjs +176 -0
  148. package/dist/esm/report/useQueryReport.mjs.map +1 -0
  149. package/dist/esm/report/useQueryReport.native.js +205 -0
  150. package/dist/esm/report/useQueryReport.native.js.map +1 -0
  151. package/dist/esm/useFrappeForm.mjs +533 -0
  152. package/dist/esm/useFrappeForm.mjs.map +1 -0
  153. package/dist/esm/useFrappeForm.native.js +686 -0
  154. package/dist/esm/useFrappeForm.native.js.map +1 -0
  155. package/dist/jsx/FrappeCalendar.mjs +4 -3
  156. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  157. package/dist/jsx/FrappeCalendar.native.js +3 -2
  158. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  159. package/dist/jsx/FrappeForm.mjs +151 -467
  160. package/dist/jsx/FrappeForm.mjs.map +1 -1
  161. package/dist/jsx/FrappeForm.native.js +152 -633
  162. package/dist/jsx/FrappeForm.native.js.map +1 -1
  163. package/dist/jsx/FrappeListView.mjs +6 -28
  164. package/dist/jsx/FrappeListView.mjs.map +1 -1
  165. package/dist/jsx/FrappeListView.native.js +11 -32
  166. package/dist/jsx/FrappeListView.native.js.map +1 -1
  167. package/dist/jsx/FrappeReportBuilder.mjs +526 -312
  168. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  169. package/dist/jsx/FrappeReportBuilder.native.js +658 -353
  170. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  171. package/dist/jsx/FrappeReportView.mjs +30 -229
  172. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  173. package/dist/jsx/FrappeReportView.native.js +39 -283
  174. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  175. package/dist/jsx/dependsOn.mjs +2 -2
  176. package/dist/jsx/dependsOn.mjs.map +1 -1
  177. package/dist/jsx/dependsOn.native.js +1 -2
  178. package/dist/jsx/dependsOn.native.js.map +1 -1
  179. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs +2 -2
  180. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  181. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js +2 -2
  182. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  183. package/dist/jsx/formEngine/docPermissions.mjs +19 -1
  184. package/dist/jsx/formEngine/docPermissions.mjs.map +1 -1
  185. package/dist/jsx/formEngine/docPermissions.native.js +69 -0
  186. package/dist/jsx/formEngine/docPermissions.native.js.map +1 -1
  187. package/dist/jsx/formEngine/index.mjs +2 -2
  188. package/dist/jsx/formEngine/index.mjs.map +1 -1
  189. package/dist/jsx/formEngine/index.native.js +2 -0
  190. package/dist/jsx/formEngine/index.native.js.map +1 -1
  191. package/dist/jsx/index.js +16 -4
  192. package/dist/jsx/index.js.map +1 -1
  193. package/dist/jsx/index.mjs +16 -4
  194. package/dist/jsx/index.mjs.map +1 -1
  195. package/dist/jsx/index.native.js +67 -7
  196. package/dist/jsx/index.native.js.map +1 -1
  197. package/dist/jsx/liveErrors.mjs +8 -3
  198. package/dist/jsx/liveErrors.mjs.map +1 -1
  199. package/dist/jsx/liveErrors.native.js +8 -2
  200. package/dist/jsx/liveErrors.native.js.map +1 -1
  201. package/dist/jsx/measures.mjs +5 -0
  202. package/dist/jsx/measures.mjs.map +1 -0
  203. package/dist/jsx/measures.native.js +34 -0
  204. package/dist/jsx/measures.native.js.map +1 -0
  205. package/dist/jsx/recordShape.mjs +74 -0
  206. package/dist/jsx/recordShape.mjs.map +1 -0
  207. package/dist/jsx/recordShape.native.js +115 -0
  208. package/dist/jsx/recordShape.native.js.map +1 -0
  209. package/dist/jsx/report/ReportGrid.mjs +428 -0
  210. package/dist/jsx/report/ReportGrid.mjs.map +1 -0
  211. package/dist/jsx/report/ReportGrid.native.js +510 -0
  212. package/dist/jsx/report/ReportGrid.native.js.map +1 -0
  213. package/dist/jsx/report/ReportViewToolbar.mjs +228 -0
  214. package/dist/jsx/report/ReportViewToolbar.mjs.map +1 -0
  215. package/dist/jsx/report/ReportViewToolbar.native.js +303 -0
  216. package/dist/jsx/report/ReportViewToolbar.native.js.map +1 -0
  217. package/dist/jsx/report/queryReport.mjs +404 -0
  218. package/dist/jsx/report/queryReport.mjs.map +1 -0
  219. package/dist/jsx/report/queryReport.native.js +588 -0
  220. package/dist/jsx/report/queryReport.native.js.map +1 -0
  221. package/dist/jsx/report/queryReportColumns.mjs +105 -0
  222. package/dist/jsx/report/queryReportColumns.mjs.map +1 -0
  223. package/dist/jsx/report/queryReportColumns.native.js +159 -0
  224. package/dist/jsx/report/queryReportColumns.native.js.map +1 -0
  225. package/dist/jsx/report/reportViewModel.mjs +343 -0
  226. package/dist/jsx/report/reportViewModel.mjs.map +1 -0
  227. package/dist/jsx/report/reportViewModel.native.js +657 -0
  228. package/dist/jsx/report/reportViewModel.native.js.map +1 -0
  229. package/dist/jsx/report/savedReports.mjs +112 -0
  230. package/dist/jsx/report/savedReports.mjs.map +1 -0
  231. package/dist/jsx/report/savedReports.native.js +169 -0
  232. package/dist/jsx/report/savedReports.native.js.map +1 -0
  233. package/dist/jsx/report/useFrappeReport.mjs +158 -0
  234. package/dist/jsx/report/useFrappeReport.mjs.map +1 -0
  235. package/dist/jsx/report/useFrappeReport.native.js +214 -0
  236. package/dist/jsx/report/useFrappeReport.native.js.map +1 -0
  237. package/dist/jsx/report/useQueryReport.mjs +176 -0
  238. package/dist/jsx/report/useQueryReport.mjs.map +1 -0
  239. package/dist/jsx/report/useQueryReport.native.js +233 -0
  240. package/dist/jsx/report/useQueryReport.native.js.map +1 -0
  241. package/dist/jsx/useFrappeForm.mjs +533 -0
  242. package/dist/jsx/useFrappeForm.mjs.map +1 -0
  243. package/dist/jsx/useFrappeForm.native.js +714 -0
  244. package/dist/jsx/useFrappeForm.native.js.map +1 -0
  245. package/package.json +16 -16
  246. package/src/FrappeCalendar.tsx +8 -2
  247. package/src/FrappeForm.stories.tsx +52 -0
  248. package/src/FrappeForm.tsx +176 -565
  249. package/src/FrappeListView.cards.stories.tsx +3 -6
  250. package/src/FrappeListView.tsx +15 -55
  251. package/src/FrappeReportBuilder.stories.tsx +34 -7
  252. package/src/FrappeReportBuilder.tsx +790 -380
  253. package/src/FrappeReportView.spec.tsx +10 -6
  254. package/src/FrappeReportView.stories.tsx +20 -1
  255. package/src/FrappeReportView.tsx +89 -415
  256. package/src/dependsOn.ts +4 -1
  257. package/src/fields/shared/EditorPreviewPanes.tsx +2 -2
  258. package/src/formEngine/docPermissions.spec.ts +36 -1
  259. package/src/formEngine/docPermissions.ts +34 -0
  260. package/src/formEngine/index.ts +8 -1
  261. package/src/frappeRemainder.designLaw.spec.ts +9 -1
  262. package/src/frappeRoutes.spec.tsx +9 -0
  263. package/src/frappeViews.designLaw.spec.ts +15 -2
  264. package/src/guestFallback.spec.tsx +236 -0
  265. package/src/index.ts +117 -16
  266. package/src/liveErrors.spec.ts +10 -0
  267. package/src/liveErrors.ts +16 -3
  268. package/src/measures.ts +11 -0
  269. package/src/recordShape.spec.ts +100 -0
  270. package/src/recordShape.ts +133 -0
  271. package/src/report/ReportGrid.spec.tsx +175 -0
  272. package/src/report/ReportGrid.tsx +530 -0
  273. package/src/report/ReportViewToolbar.spec.tsx +90 -0
  274. package/src/report/ReportViewToolbar.tsx +314 -0
  275. package/src/report/queryReport.spec.ts +483 -0
  276. package/src/report/queryReport.ts +722 -0
  277. package/src/report/queryReportColumns.tsx +123 -0
  278. package/src/report/reportViewModel.spec.ts +393 -0
  279. package/src/report/reportViewModel.ts +617 -0
  280. package/src/report/savedReports.ts +172 -0
  281. package/src/report/seam.spec.ts +216 -0
  282. package/src/report/useFrappeReport.ts +241 -0
  283. package/src/report/useQueryReport.spec.tsx +131 -0
  284. package/src/report/useQueryReport.ts +309 -0
  285. package/src/useFrappeForm.spec.tsx +209 -0
  286. package/src/useFrappeForm.ts +778 -0
  287. package/types/FrappeCalendar.d.ts.map +1 -1
  288. package/types/FrappeForm.d.ts +21 -1
  289. package/types/FrappeForm.d.ts.map +1 -1
  290. package/types/FrappeListView.d.ts.map +1 -1
  291. package/types/FrappeReportBuilder.d.ts +66 -16
  292. package/types/FrappeReportBuilder.d.ts.map +1 -1
  293. package/types/FrappeReportView.d.ts +9 -127
  294. package/types/FrappeReportView.d.ts.map +1 -1
  295. package/types/dependsOn.d.ts.map +1 -1
  296. package/types/formEngine/docPermissions.d.ts +14 -0
  297. package/types/formEngine/docPermissions.d.ts.map +1 -1
  298. package/types/formEngine/index.d.ts +1 -1
  299. package/types/formEngine/index.d.ts.map +1 -1
  300. package/types/index.d.ts +15 -3
  301. package/types/index.d.ts.map +1 -1
  302. package/types/liveErrors.d.ts +9 -1
  303. package/types/liveErrors.d.ts.map +1 -1
  304. package/types/measures.d.ts +3 -0
  305. package/types/measures.d.ts.map +1 -0
  306. package/types/recordShape.d.ts +45 -0
  307. package/types/recordShape.d.ts.map +1 -0
  308. package/types/report/ReportGrid.d.ts +20 -0
  309. package/types/report/ReportGrid.d.ts.map +1 -0
  310. package/types/report/ReportViewToolbar.d.ts +31 -0
  311. package/types/report/ReportViewToolbar.d.ts.map +1 -0
  312. package/types/report/queryReport.d.ts +181 -0
  313. package/types/report/queryReport.d.ts.map +1 -0
  314. package/types/report/queryReportColumns.d.ts +12 -0
  315. package/types/report/queryReportColumns.d.ts.map +1 -0
  316. package/types/report/reportViewModel.d.ts +146 -0
  317. package/types/report/reportViewModel.d.ts.map +1 -0
  318. package/types/report/savedReports.d.ts +27 -0
  319. package/types/report/savedReports.d.ts.map +1 -0
  320. package/types/report/useFrappeReport.d.ts +60 -0
  321. package/types/report/useFrappeReport.d.ts.map +1 -0
  322. package/types/report/useQueryReport.d.ts +37 -0
  323. package/types/report/useQueryReport.d.ts.map +1 -0
  324. package/types/useFrappeForm.d.ts +142 -0
  325. package/types/useFrappeForm.d.ts.map +1 -0
@@ -0,0 +1,453 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all) __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
21
+ value: true
22
+ }), mod);
23
+ var ReportGrid_exports = {};
24
+ __export(ReportGrid_exports, {
25
+ ReportGrid: () => ReportGrid
26
+ });
27
+ module.exports = __toCommonJS(ReportGrid_exports);
28
+ var import_components = require("@multiplatform.one/components");
29
+ var import_forms = require("@multiplatform.one/forms");
30
+ var import_table = require("@multiplatform.one/table");
31
+ var import_theme = require("@multiplatform.one/theme");
32
+ var import_react = require("@phosphor-icons/react");
33
+ var import_react2 = require("react");
34
+ var import_react_i18next = require("react-i18next");
35
+ var import_listFormat = require("../list/listFormat.cjs");
36
+ var import_reportViewModel = require("./reportViewModel.cjs");
37
+ var import_jsx_runtime = require("react/jsx-runtime");
38
+ const ROW_NUMBER_WIDTH = 56;
39
+ const INTERACTIVE_SELECTOR = ["a[href]", "button", "input", "select", "textarea", "label", '[contenteditable="true"]', '[role="button"]', '[role="checkbox"]', '[role="combobox"]', '[role="link"]', '[role="menuitem"]', '[role="option"]', '[role="radio"]', '[role="slider"]', '[role="spinbutton"]', '[role="switch"]', '[role="textbox"]', "[aria-expanded]"].join(", ");
40
+ function isInteractiveInnerTarget(target, boundary) {
41
+ if (typeof Element === "undefined") return false;
42
+ if (!(target instanceof Element)) return false;
43
+ const boundaryEl = boundary instanceof Element ? boundary : null;
44
+ let node = target;
45
+ while (node && node !== boundaryEl) {
46
+ if (node.matches(INTERACTIVE_SELECTOR)) return true;
47
+ const tabIndex = node.getAttribute("tabindex");
48
+ if (tabIndex != null && Number(tabIndex) >= 0) return true;
49
+ node = node.parentElement;
50
+ }
51
+ return false;
52
+ }
53
+ function alignToJustify(align) {
54
+ return align === "right" ? "flex-end" : align === "center" ? "center" : "flex-start";
55
+ }
56
+ function formatNumericCell(value, fieldtype) {
57
+ switch (fieldtype) {
58
+ case "Currency":
59
+ return (0, import_theme.formatCurrency)(value);
60
+ case "Int":
61
+ return (0, import_theme.formatNumber)(Math.round(value), {
62
+ maximumFractionDigits: 0
63
+ });
64
+ case "Percent":
65
+ return (0, import_theme.formatPercent)(value, {
66
+ precision: 1
67
+ });
68
+ default:
69
+ return (0, import_theme.formatNumber)(value);
70
+ }
71
+ }
72
+ function ReportCellValue({
73
+ column,
74
+ row,
75
+ onOpenLink
76
+ }) {
77
+ const raw = row[column.fieldname];
78
+ if (raw === null || raw === void 0 || raw === "") {
79
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
80
+ fontSize: "$3",
81
+ color: "$color8",
82
+ children: "\u2014"
83
+ });
84
+ }
85
+ if (column.fieldtype === "Check") {
86
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
87
+ fontSize: "$3",
88
+ color: raw ? "$green11" : "$color8",
89
+ children: raw ? "\u2713" : "\u2014"
90
+ });
91
+ }
92
+ if (import_reportViewModel.REPORT_NUMERIC_FIELDTYPES.has(column.fieldtype)) {
93
+ const numeric = Number(raw);
94
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
95
+ fontSize: "$3",
96
+ color: "$color12",
97
+ fontFamily: "$mono",
98
+ children: Number.isFinite(numeric) ? formatNumericCell(numeric, column.fieldtype) : String(raw)
99
+ });
100
+ }
101
+ const value = String(raw);
102
+ switch (column.fieldtype) {
103
+ case "Date":
104
+ case "Datetime":
105
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
106
+ fontSize: "$3",
107
+ color: "$color11",
108
+ numberOfLines: 1,
109
+ children: (0, import_listFormat.formatDateCell)(value)
110
+ });
111
+ case "Link":
112
+ {
113
+ const target = column.options;
114
+ if (target && onOpenLink) {
115
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
116
+ fontSize: "$3",
117
+ color: "$color11",
118
+ textDecorationLine: "underline",
119
+ cursor: "pointer",
120
+ numberOfLines: 1,
121
+ role: "link",
122
+ onPress: event => {
123
+ event?.stopPropagation?.();
124
+ onOpenLink(target, value);
125
+ },
126
+ children: value
127
+ });
128
+ }
129
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
130
+ fontSize: "$3",
131
+ color: "$color11",
132
+ numberOfLines: 1,
133
+ children: value
134
+ });
135
+ }
136
+ default:
137
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
138
+ fontSize: "$3",
139
+ color: "$color11",
140
+ numberOfLines: 1,
141
+ children: value
142
+ });
143
+ }
144
+ }
145
+ function ReportGrid({
146
+ columns,
147
+ rows,
148
+ sort,
149
+ onSortChange,
150
+ columnFilters,
151
+ onColumnFilterChange,
152
+ onOpenRow,
153
+ onOpenLink,
154
+ totals,
155
+ groupByColumn
156
+ }) {
157
+ const {
158
+ t
159
+ } = (0, import_react_i18next.useTranslation)();
160
+ const handleSortPress = (0, import_react2.useCallback)(fieldname => {
161
+ if (sort.field === fieldname) {
162
+ onSortChange({
163
+ field: fieldname,
164
+ order: sort.order === "asc" ? "desc" : "asc"
165
+ });
166
+ } else {
167
+ onSortChange({
168
+ field: fieldname,
169
+ order: "asc"
170
+ });
171
+ }
172
+ }, [sort, onSortChange]);
173
+ const isSSR = typeof window === "undefined";
174
+ const [rowAnchor, setRowAnchor] = (0, import_react2.useState)(0);
175
+ const dataRowCount = rows.reduce((count, row) => row.kind === "row" ? count + 1 : count, 0);
176
+ const effectiveRowAnchor = Math.min(rowAnchor, Math.max(dataRowCount - 1, 0));
177
+ const getRowPressProps = (0, import_react2.useCallback)((row, pressIndex) => {
178
+ const handlePress = event => {
179
+ if (event?.defaultPrevented) return;
180
+ const targetEl = event?.target ?? event?.nativeEvent?.target;
181
+ if (import_components.isWeb && typeof Element !== "undefined" && targetEl instanceof Element) {
182
+ const boundary = targetEl.closest('[data-report-row="true"]');
183
+ if (isInteractiveInnerTarget(targetEl, boundary)) return;
184
+ }
185
+ onOpenRow?.(row.name);
186
+ };
187
+ return {
188
+ // Accessible row name from doc identity (DG-A11Y-06); positional
189
+ // fallback for the defensive empty-name case.
190
+ "aria-label": row.name || t("report.rowLabel", {
191
+ defaultValue: "Row {{row}}",
192
+ row: pressIndex + 1
193
+ }),
194
+ onPress: handlePress,
195
+ cursor: "pointer",
196
+ hoverStyle: {
197
+ backgroundColor: "$color2"
198
+ },
199
+ pressStyle: {
200
+ backgroundColor: "$color4"
201
+ },
202
+ ...(import_components.isWeb && !isSSR ? {
203
+ tabIndex: pressIndex === effectiveRowAnchor ? 0 : -1,
204
+ outlineWidth: 0,
205
+ focusStyle: {
206
+ outlineWidth: 0
207
+ },
208
+ focusVisibleStyle: (0, import_theme.ensureFocusVisibleRing)({
209
+ outlineOffset: -2
210
+ }),
211
+ "data-report-row": "true",
212
+ onFocus: event => {
213
+ if (event.target === event.currentTarget) setRowAnchor(pressIndex);
214
+ },
215
+ onBlur: event => {
216
+ const next = event.relatedTarget;
217
+ if (!(next instanceof Element) || !next.closest('[data-report-row="true"]')) {
218
+ setRowAnchor(0);
219
+ }
220
+ },
221
+ onKeyDown: event => {
222
+ if (event.defaultPrevented) return;
223
+ if (event.target !== event.currentTarget) return;
224
+ const key = event.key;
225
+ if (key === "Enter" || key === " " || key === "Spacebar") {
226
+ event.preventDefault();
227
+ event.stopPropagation();
228
+ if (event.repeat) return;
229
+ onOpenRow?.(row.name);
230
+ return;
231
+ }
232
+ if (key === "ArrowDown" || key === "ArrowUp" || key === "Home" || key === "End") {
233
+ event.preventDefault();
234
+ event.stopPropagation();
235
+ const rowEl = event.currentTarget;
236
+ const scope = rowEl.closest('[data-report-grid="true"]') ?? rowEl.ownerDocument;
237
+ const pressRows = Array.from(scope.querySelectorAll('[data-report-row="true"]'));
238
+ const currentIdx = pressRows.indexOf(rowEl);
239
+ if (currentIdx < 0) return;
240
+ const nextIdx = key === "Home" ? 0 : key === "End" ? pressRows.length - 1 : Math.min(Math.max(currentIdx + (key === "ArrowDown" ? 1 : -1), 0), pressRows.length - 1);
241
+ pressRows[nextIdx]?.focus();
242
+ }
243
+ }
244
+ } : {})
245
+ };
246
+ }, [onOpenRow, effectiveRowAnchor, isSSR, t]);
247
+ const totalsByField = new Map(totals.map(total => [total.fieldname, total]));
248
+ const gridWidth = ROW_NUMBER_WIDTH + columns.reduce((sum, column) => sum + column.width, 0);
249
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.ScrollView, {
250
+ horizontal: true,
251
+ showsHorizontalScrollIndicator: true,
252
+ flexGrow: 0,
253
+ flexShrink: 1,
254
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_table.Table, {
255
+ minWidth: gridWidth,
256
+ width: gridWidth,
257
+ displayMode: "flex",
258
+ cellHeight: "$3",
259
+ ...{
260
+ "data-report-grid": "true"
261
+ },
262
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_table.Table.Head, {
263
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_table.Table.Row, {
264
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.HeaderCell, {
265
+ cellWidth: ROW_NUMBER_WIDTH,
266
+ "aria-label": t("report.rowNumber", "Row number"),
267
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
268
+ fontSize: "$2",
269
+ color: "$color9",
270
+ children: "#"
271
+ })
272
+ }), columns.map(column => {
273
+ const sorted = sort.field === column.fieldname ? sort.order : void 0;
274
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.HeaderCell, {
275
+ cellWidth: column.width,
276
+ justifyContent: alignToJustify(column.align),
277
+ "aria-sort": sorted === "asc" ? "ascending" : sorted === "desc" ? "descending" : "none",
278
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Tooltip, {
279
+ content: sorted === "asc" ? t("report.sortDesc", "Sorted ascending (press to sort descending)") : sorted === "desc" ? t("report.sortAsc", "Sorted descending (press to sort ascending)") : t("report.sortColumn", "Sort by this column"),
280
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
281
+ gap: "$1.5",
282
+ alignItems: "center",
283
+ cursor: "pointer",
284
+ role: "button",
285
+ tabIndex: 0,
286
+ outlineWidth: 0,
287
+ focusStyle: {
288
+ outlineWidth: 0
289
+ },
290
+ focusVisibleStyle: (0, import_theme.ensureFocusVisibleRing)({
291
+ outlineOffset: -2
292
+ }),
293
+ "aria-label": t("report.sortBy", {
294
+ defaultValue: "Sort by {{column}}",
295
+ column: column.label
296
+ }),
297
+ onPress: () => handleSortPress(column.fieldname),
298
+ onKeyDown: event => {
299
+ if (event.key === "Enter" || event.key === " ") {
300
+ event.preventDefault?.();
301
+ handleSortPress(column.fieldname);
302
+ }
303
+ },
304
+ hoverStyle: {
305
+ opacity: 0.8
306
+ },
307
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
308
+ fontSize: "$3",
309
+ fontWeight: "400",
310
+ numberOfLines: 1,
311
+ children: column.label
312
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.View, {
313
+ "aria-hidden": true,
314
+ role: "presentation",
315
+ children: sorted ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_react.CaretDownIcon, {
316
+ size: 12,
317
+ color: "var(--color10)",
318
+ style: sorted === "desc" ? {
319
+ transform: "rotate(180deg)"
320
+ } : void 0
321
+ }) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_react.CaretUpDownIcon, {
322
+ size: 12,
323
+ color: "var(--color8)"
324
+ })
325
+ })]
326
+ })
327
+ })
328
+ }, column.fieldname);
329
+ })]
330
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_table.Table.Row, {
331
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.HeaderCell, {
332
+ cellWidth: ROW_NUMBER_WIDTH,
333
+ paddingVertical: "$1.5"
334
+ }), columns.map(column => {
335
+ const placeholder = column.kind === "number" || column.kind === "date" ? t("report.filterComparablePlaceholder", "= > <\u2026") : column.kind === "check" ? t("report.filterCheckPlaceholder", "yes / no") : t("report.filterPlaceholder", "Filter\u2026");
336
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.HeaderCell, {
337
+ cellWidth: column.width,
338
+ paddingVertical: "$1.5",
339
+ overflow: "visible",
340
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.View, {
341
+ flex: 1,
342
+ minWidth: 0,
343
+ overflow: "visible",
344
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Input, {
345
+ size: "$2",
346
+ compact: true,
347
+ value: columnFilters[column.fieldname] ?? "",
348
+ onChangeText: next => onColumnFilterChange(column.fieldname, next),
349
+ placeholder,
350
+ inputProps: {
351
+ "aria-label": t("report.filterColumn", {
352
+ defaultValue: "Filter {{column}}",
353
+ column: column.label
354
+ })
355
+ }
356
+ })
357
+ })
358
+ }, column.fieldname);
359
+ })]
360
+ })]
361
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.Body, {
362
+ children: (() => {
363
+ let pressCursor = -1;
364
+ return rows.map(gridRow => {
365
+ if (gridRow.kind === "group") {
366
+ const label = gridRow.value === null || gridRow.value === void 0 || gridRow.value === "" ? t("report.groupEmpty", "(blank)") : String(gridRow.value);
367
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.Row, {
368
+ backgroundColor: "$color2",
369
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.Cell, {
370
+ cellWidth: gridWidth,
371
+ paddingVertical: "$1.5",
372
+ role: "rowheader",
373
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
374
+ fontSize: "$2",
375
+ fontWeight: "400",
376
+ color: "$color11",
377
+ numberOfLines: 1,
378
+ children: groupByColumn ? t("report.groupHeader", {
379
+ defaultValue: "{{field}}: {{value}} \xB7 {{count}}",
380
+ field: groupByColumn.label,
381
+ value: label,
382
+ count: gridRow.count
383
+ }) : label
384
+ })
385
+ })
386
+ }, gridRow.key);
387
+ }
388
+ pressCursor += 1;
389
+ return (
390
+ // Spread LAST so the roving tabIndex/handlers stay in
391
+ // charge of this row's interactivity (DataTable precedent).
392
+ /* @__PURE__ */
393
+ (0, import_jsx_runtime.jsxs)(import_table.Table.Row, {
394
+ ...(onOpenRow ? getRowPressProps(gridRow.row, pressCursor) : {
395
+ "aria-label": gridRow.row.name
396
+ }),
397
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.Cell, {
398
+ cellWidth: ROW_NUMBER_WIDTH,
399
+ paddingVertical: "$2",
400
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
401
+ fontSize: "$2",
402
+ color: "$color9",
403
+ fontFamily: "$mono",
404
+ children: gridRow.index
405
+ })
406
+ }), columns.map(column => /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.Cell, {
407
+ cellWidth: column.width,
408
+ paddingVertical: "$2",
409
+ justifyContent: alignToJustify(column.align),
410
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(ReportCellValue, {
411
+ column,
412
+ row: gridRow.row,
413
+ onOpenLink
414
+ })
415
+ }, column.fieldname))]
416
+ }, gridRow.key)
417
+ );
418
+ });
419
+ })()
420
+ }), totals.length > 0 && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.Foot, {
421
+ borderTopWidth: 1,
422
+ borderTopColor: "$color6",
423
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_table.Table.Row, {
424
+ backgroundColor: "$color2",
425
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.Cell, {
426
+ cellWidth: ROW_NUMBER_WIDTH,
427
+ paddingVertical: "$2",
428
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
429
+ fontSize: "$2",
430
+ fontWeight: "400",
431
+ color: "$color10",
432
+ children: t("report.totals", "Totals")
433
+ })
434
+ }), columns.map(column => {
435
+ const total = totalsByField.get(column.fieldname);
436
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_table.Table.Cell, {
437
+ cellWidth: column.width,
438
+ paddingVertical: "$2",
439
+ justifyContent: alignToJustify(column.align),
440
+ children: total ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
441
+ fontSize: "$3",
442
+ fontWeight: "400",
443
+ color: "$color12",
444
+ fontFamily: "$mono",
445
+ children: formatNumericCell(total.value, total.fieldtype)
446
+ }) : null
447
+ }, column.fieldname);
448
+ })]
449
+ })
450
+ })]
451
+ })
452
+ });
453
+ }