@multiplatform.one/frappe-ui 7.28.1 → 7.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/dist/cjs/FrappeCalendar.cjs +3 -2
  2. package/dist/cjs/FrappeCalendar.native.js +3 -2
  3. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  4. package/dist/cjs/FrappeForm.cjs +148 -464
  5. package/dist/cjs/FrappeForm.native.js +152 -633
  6. package/dist/cjs/FrappeForm.native.js.map +1 -1
  7. package/dist/cjs/FrappeListView.cjs +5 -27
  8. package/dist/cjs/FrappeListView.native.js +11 -32
  9. package/dist/cjs/FrappeListView.native.js.map +1 -1
  10. package/dist/cjs/FrappeReportBuilder.cjs +523 -309
  11. package/dist/cjs/FrappeReportBuilder.native.js +658 -353
  12. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  13. package/dist/cjs/FrappeReportView.cjs +35 -234
  14. package/dist/cjs/FrappeReportView.native.js +39 -283
  15. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  16. package/dist/cjs/dependsOn.cjs +2 -2
  17. package/dist/cjs/dependsOn.native.js +1 -2
  18. package/dist/cjs/dependsOn.native.js.map +1 -1
  19. package/dist/cjs/fields/shared/EditorPreviewPanes.cjs +2 -2
  20. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js +2 -2
  21. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  22. package/dist/cjs/formEngine/docPermissions.cjs +20 -0
  23. package/dist/cjs/formEngine/docPermissions.native.js +69 -0
  24. package/dist/cjs/formEngine/docPermissions.native.js.map +1 -1
  25. package/dist/cjs/formEngine/index.cjs +2 -0
  26. package/dist/cjs/formEngine/index.native.js +2 -0
  27. package/dist/cjs/formEngine/index.native.js.map +1 -1
  28. package/dist/cjs/index.cjs +67 -7
  29. package/dist/cjs/index.native.js +67 -7
  30. package/dist/cjs/index.native.js.map +1 -1
  31. package/dist/cjs/liveErrors.cjs +8 -2
  32. package/dist/cjs/liveErrors.native.js +8 -2
  33. package/dist/cjs/liveErrors.native.js.map +1 -1
  34. package/dist/cjs/measures.cjs +31 -0
  35. package/dist/cjs/measures.native.js +34 -0
  36. package/dist/cjs/measures.native.js.map +1 -0
  37. package/dist/cjs/recordShape.cjs +103 -0
  38. package/dist/cjs/recordShape.native.js +115 -0
  39. package/dist/cjs/recordShape.native.js.map +1 -0
  40. package/dist/cjs/report/ReportGrid.cjs +453 -0
  41. package/dist/cjs/report/ReportGrid.native.js +510 -0
  42. package/dist/cjs/report/ReportGrid.native.js.map +1 -0
  43. package/dist/cjs/report/ReportViewToolbar.cjs +253 -0
  44. package/dist/cjs/report/ReportViewToolbar.native.js +303 -0
  45. package/dist/cjs/report/ReportViewToolbar.native.js.map +1 -0
  46. package/dist/cjs/report/queryReport.cjs +444 -0
  47. package/dist/cjs/report/queryReport.native.js +588 -0
  48. package/dist/cjs/report/queryReport.native.js.map +1 -0
  49. package/dist/cjs/report/queryReportColumns.cjs +131 -0
  50. package/dist/cjs/report/queryReportColumns.native.js +159 -0
  51. package/dist/cjs/report/queryReportColumns.native.js.map +1 -0
  52. package/dist/cjs/report/reportViewModel.cjs +386 -0
  53. package/dist/cjs/report/reportViewModel.native.js +657 -0
  54. package/dist/cjs/report/reportViewModel.native.js.map +1 -0
  55. package/dist/cjs/report/savedReports.cjs +137 -0
  56. package/dist/cjs/report/savedReports.native.js +169 -0
  57. package/dist/cjs/report/savedReports.native.js.map +1 -0
  58. package/dist/cjs/report/useFrappeReport.cjs +184 -0
  59. package/dist/cjs/report/useFrappeReport.native.js +214 -0
  60. package/dist/cjs/report/useFrappeReport.native.js.map +1 -0
  61. package/dist/cjs/report/useQueryReport.cjs +201 -0
  62. package/dist/cjs/report/useQueryReport.native.js +233 -0
  63. package/dist/cjs/report/useQueryReport.native.js.map +1 -0
  64. package/dist/cjs/useFrappeForm.cjs +558 -0
  65. package/dist/cjs/useFrappeForm.native.js +714 -0
  66. package/dist/cjs/useFrappeForm.native.js.map +1 -0
  67. package/dist/esm/FrappeCalendar.mjs +4 -3
  68. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  69. package/dist/esm/FrappeCalendar.native.js +4 -3
  70. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  71. package/dist/esm/FrappeForm.mjs +151 -467
  72. package/dist/esm/FrappeForm.mjs.map +1 -1
  73. package/dist/esm/FrappeForm.native.js +155 -636
  74. package/dist/esm/FrappeForm.native.js.map +1 -1
  75. package/dist/esm/FrappeListView.mjs +6 -28
  76. package/dist/esm/FrappeListView.mjs.map +1 -1
  77. package/dist/esm/FrappeListView.native.js +12 -33
  78. package/dist/esm/FrappeListView.native.js.map +1 -1
  79. package/dist/esm/FrappeReportBuilder.mjs +526 -312
  80. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  81. package/dist/esm/FrappeReportBuilder.native.js +661 -356
  82. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  83. package/dist/esm/FrappeReportView.mjs +30 -229
  84. package/dist/esm/FrappeReportView.mjs.map +1 -1
  85. package/dist/esm/FrappeReportView.native.js +34 -278
  86. package/dist/esm/FrappeReportView.native.js.map +1 -1
  87. package/dist/esm/dependsOn.mjs +2 -2
  88. package/dist/esm/dependsOn.mjs.map +1 -1
  89. package/dist/esm/dependsOn.native.js +1 -2
  90. package/dist/esm/dependsOn.native.js.map +1 -1
  91. package/dist/esm/fields/shared/EditorPreviewPanes.mjs +2 -2
  92. package/dist/esm/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  93. package/dist/esm/fields/shared/EditorPreviewPanes.native.js +2 -2
  94. package/dist/esm/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  95. package/dist/esm/formEngine/docPermissions.mjs +19 -1
  96. package/dist/esm/formEngine/docPermissions.mjs.map +1 -1
  97. package/dist/esm/formEngine/docPermissions.native.js +68 -1
  98. package/dist/esm/formEngine/docPermissions.native.js.map +1 -1
  99. package/dist/esm/formEngine/index.mjs +2 -2
  100. package/dist/esm/formEngine/index.mjs.map +1 -1
  101. package/dist/esm/formEngine/index.native.js +2 -2
  102. package/dist/esm/formEngine/index.native.js.map +1 -1
  103. package/dist/esm/index.mjs +16 -4
  104. package/dist/esm/index.mjs.map +1 -1
  105. package/dist/esm/index.native.js +16 -4
  106. package/dist/esm/index.native.js.map +1 -1
  107. package/dist/esm/liveErrors.mjs +8 -3
  108. package/dist/esm/liveErrors.mjs.map +1 -1
  109. package/dist/esm/liveErrors.native.js +8 -3
  110. package/dist/esm/liveErrors.native.js.map +1 -1
  111. package/dist/esm/measures.mjs +5 -0
  112. package/dist/esm/measures.mjs.map +1 -0
  113. package/dist/esm/measures.native.js +5 -0
  114. package/dist/esm/measures.native.js.map +1 -0
  115. package/dist/esm/recordShape.mjs +74 -0
  116. package/dist/esm/recordShape.mjs.map +1 -0
  117. package/dist/esm/recordShape.native.js +83 -0
  118. package/dist/esm/recordShape.native.js.map +1 -0
  119. package/dist/esm/report/ReportGrid.mjs +428 -0
  120. package/dist/esm/report/ReportGrid.mjs.map +1 -0
  121. package/dist/esm/report/ReportGrid.native.js +471 -0
  122. package/dist/esm/report/ReportGrid.native.js.map +1 -0
  123. package/dist/esm/report/ReportViewToolbar.mjs +228 -0
  124. package/dist/esm/report/ReportViewToolbar.mjs.map +1 -0
  125. package/dist/esm/report/ReportViewToolbar.native.js +264 -0
  126. package/dist/esm/report/ReportViewToolbar.native.js.map +1 -0
  127. package/dist/esm/report/queryReport.mjs +404 -0
  128. package/dist/esm/report/queryReport.mjs.map +1 -0
  129. package/dist/esm/report/queryReport.native.js +545 -0
  130. package/dist/esm/report/queryReport.native.js.map +1 -0
  131. package/dist/esm/report/queryReportColumns.mjs +105 -0
  132. package/dist/esm/report/queryReportColumns.mjs.map +1 -0
  133. package/dist/esm/report/queryReportColumns.native.js +119 -0
  134. package/dist/esm/report/queryReportColumns.native.js.map +1 -0
  135. package/dist/esm/report/reportViewModel.mjs +343 -0
  136. package/dist/esm/report/reportViewModel.mjs.map +1 -0
  137. package/dist/esm/report/reportViewModel.native.js +611 -0
  138. package/dist/esm/report/reportViewModel.native.js.map +1 -0
  139. package/dist/esm/report/savedReports.mjs +112 -0
  140. package/dist/esm/report/savedReports.mjs.map +1 -0
  141. package/dist/esm/report/savedReports.native.js +141 -0
  142. package/dist/esm/report/savedReports.native.js.map +1 -0
  143. package/dist/esm/report/useFrappeReport.mjs +158 -0
  144. package/dist/esm/report/useFrappeReport.mjs.map +1 -0
  145. package/dist/esm/report/useFrappeReport.native.js +185 -0
  146. package/dist/esm/report/useFrappeReport.native.js.map +1 -0
  147. package/dist/esm/report/useQueryReport.mjs +176 -0
  148. package/dist/esm/report/useQueryReport.mjs.map +1 -0
  149. package/dist/esm/report/useQueryReport.native.js +205 -0
  150. package/dist/esm/report/useQueryReport.native.js.map +1 -0
  151. package/dist/esm/useFrappeForm.mjs +533 -0
  152. package/dist/esm/useFrappeForm.mjs.map +1 -0
  153. package/dist/esm/useFrappeForm.native.js +686 -0
  154. package/dist/esm/useFrappeForm.native.js.map +1 -0
  155. package/dist/jsx/FrappeCalendar.mjs +4 -3
  156. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  157. package/dist/jsx/FrappeCalendar.native.js +3 -2
  158. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  159. package/dist/jsx/FrappeForm.mjs +151 -467
  160. package/dist/jsx/FrappeForm.mjs.map +1 -1
  161. package/dist/jsx/FrappeForm.native.js +152 -633
  162. package/dist/jsx/FrappeForm.native.js.map +1 -1
  163. package/dist/jsx/FrappeListView.mjs +6 -28
  164. package/dist/jsx/FrappeListView.mjs.map +1 -1
  165. package/dist/jsx/FrappeListView.native.js +11 -32
  166. package/dist/jsx/FrappeListView.native.js.map +1 -1
  167. package/dist/jsx/FrappeReportBuilder.mjs +526 -312
  168. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  169. package/dist/jsx/FrappeReportBuilder.native.js +658 -353
  170. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  171. package/dist/jsx/FrappeReportView.mjs +30 -229
  172. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  173. package/dist/jsx/FrappeReportView.native.js +39 -283
  174. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  175. package/dist/jsx/dependsOn.mjs +2 -2
  176. package/dist/jsx/dependsOn.mjs.map +1 -1
  177. package/dist/jsx/dependsOn.native.js +1 -2
  178. package/dist/jsx/dependsOn.native.js.map +1 -1
  179. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs +2 -2
  180. package/dist/jsx/fields/shared/EditorPreviewPanes.mjs.map +1 -1
  181. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js +2 -2
  182. package/dist/jsx/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  183. package/dist/jsx/formEngine/docPermissions.mjs +19 -1
  184. package/dist/jsx/formEngine/docPermissions.mjs.map +1 -1
  185. package/dist/jsx/formEngine/docPermissions.native.js +69 -0
  186. package/dist/jsx/formEngine/docPermissions.native.js.map +1 -1
  187. package/dist/jsx/formEngine/index.mjs +2 -2
  188. package/dist/jsx/formEngine/index.mjs.map +1 -1
  189. package/dist/jsx/formEngine/index.native.js +2 -0
  190. package/dist/jsx/formEngine/index.native.js.map +1 -1
  191. package/dist/jsx/index.js +16 -4
  192. package/dist/jsx/index.js.map +1 -1
  193. package/dist/jsx/index.mjs +16 -4
  194. package/dist/jsx/index.mjs.map +1 -1
  195. package/dist/jsx/index.native.js +67 -7
  196. package/dist/jsx/index.native.js.map +1 -1
  197. package/dist/jsx/liveErrors.mjs +8 -3
  198. package/dist/jsx/liveErrors.mjs.map +1 -1
  199. package/dist/jsx/liveErrors.native.js +8 -2
  200. package/dist/jsx/liveErrors.native.js.map +1 -1
  201. package/dist/jsx/measures.mjs +5 -0
  202. package/dist/jsx/measures.mjs.map +1 -0
  203. package/dist/jsx/measures.native.js +34 -0
  204. package/dist/jsx/measures.native.js.map +1 -0
  205. package/dist/jsx/recordShape.mjs +74 -0
  206. package/dist/jsx/recordShape.mjs.map +1 -0
  207. package/dist/jsx/recordShape.native.js +115 -0
  208. package/dist/jsx/recordShape.native.js.map +1 -0
  209. package/dist/jsx/report/ReportGrid.mjs +428 -0
  210. package/dist/jsx/report/ReportGrid.mjs.map +1 -0
  211. package/dist/jsx/report/ReportGrid.native.js +510 -0
  212. package/dist/jsx/report/ReportGrid.native.js.map +1 -0
  213. package/dist/jsx/report/ReportViewToolbar.mjs +228 -0
  214. package/dist/jsx/report/ReportViewToolbar.mjs.map +1 -0
  215. package/dist/jsx/report/ReportViewToolbar.native.js +303 -0
  216. package/dist/jsx/report/ReportViewToolbar.native.js.map +1 -0
  217. package/dist/jsx/report/queryReport.mjs +404 -0
  218. package/dist/jsx/report/queryReport.mjs.map +1 -0
  219. package/dist/jsx/report/queryReport.native.js +588 -0
  220. package/dist/jsx/report/queryReport.native.js.map +1 -0
  221. package/dist/jsx/report/queryReportColumns.mjs +105 -0
  222. package/dist/jsx/report/queryReportColumns.mjs.map +1 -0
  223. package/dist/jsx/report/queryReportColumns.native.js +159 -0
  224. package/dist/jsx/report/queryReportColumns.native.js.map +1 -0
  225. package/dist/jsx/report/reportViewModel.mjs +343 -0
  226. package/dist/jsx/report/reportViewModel.mjs.map +1 -0
  227. package/dist/jsx/report/reportViewModel.native.js +657 -0
  228. package/dist/jsx/report/reportViewModel.native.js.map +1 -0
  229. package/dist/jsx/report/savedReports.mjs +112 -0
  230. package/dist/jsx/report/savedReports.mjs.map +1 -0
  231. package/dist/jsx/report/savedReports.native.js +169 -0
  232. package/dist/jsx/report/savedReports.native.js.map +1 -0
  233. package/dist/jsx/report/useFrappeReport.mjs +158 -0
  234. package/dist/jsx/report/useFrappeReport.mjs.map +1 -0
  235. package/dist/jsx/report/useFrappeReport.native.js +214 -0
  236. package/dist/jsx/report/useFrappeReport.native.js.map +1 -0
  237. package/dist/jsx/report/useQueryReport.mjs +176 -0
  238. package/dist/jsx/report/useQueryReport.mjs.map +1 -0
  239. package/dist/jsx/report/useQueryReport.native.js +233 -0
  240. package/dist/jsx/report/useQueryReport.native.js.map +1 -0
  241. package/dist/jsx/useFrappeForm.mjs +533 -0
  242. package/dist/jsx/useFrappeForm.mjs.map +1 -0
  243. package/dist/jsx/useFrappeForm.native.js +714 -0
  244. package/dist/jsx/useFrappeForm.native.js.map +1 -0
  245. package/package.json +16 -16
  246. package/src/FrappeCalendar.tsx +8 -2
  247. package/src/FrappeForm.stories.tsx +52 -0
  248. package/src/FrappeForm.tsx +176 -565
  249. package/src/FrappeListView.cards.stories.tsx +3 -6
  250. package/src/FrappeListView.tsx +15 -55
  251. package/src/FrappeReportBuilder.stories.tsx +34 -7
  252. package/src/FrappeReportBuilder.tsx +790 -380
  253. package/src/FrappeReportView.spec.tsx +10 -6
  254. package/src/FrappeReportView.stories.tsx +20 -1
  255. package/src/FrappeReportView.tsx +89 -415
  256. package/src/dependsOn.ts +4 -1
  257. package/src/fields/shared/EditorPreviewPanes.tsx +2 -2
  258. package/src/formEngine/docPermissions.spec.ts +36 -1
  259. package/src/formEngine/docPermissions.ts +34 -0
  260. package/src/formEngine/index.ts +8 -1
  261. package/src/frappeRemainder.designLaw.spec.ts +9 -1
  262. package/src/frappeRoutes.spec.tsx +9 -0
  263. package/src/frappeViews.designLaw.spec.ts +15 -2
  264. package/src/guestFallback.spec.tsx +236 -0
  265. package/src/index.ts +117 -16
  266. package/src/liveErrors.spec.ts +10 -0
  267. package/src/liveErrors.ts +16 -3
  268. package/src/measures.ts +11 -0
  269. package/src/recordShape.spec.ts +100 -0
  270. package/src/recordShape.ts +133 -0
  271. package/src/report/ReportGrid.spec.tsx +175 -0
  272. package/src/report/ReportGrid.tsx +530 -0
  273. package/src/report/ReportViewToolbar.spec.tsx +90 -0
  274. package/src/report/ReportViewToolbar.tsx +314 -0
  275. package/src/report/queryReport.spec.ts +483 -0
  276. package/src/report/queryReport.ts +722 -0
  277. package/src/report/queryReportColumns.tsx +123 -0
  278. package/src/report/reportViewModel.spec.ts +393 -0
  279. package/src/report/reportViewModel.ts +617 -0
  280. package/src/report/savedReports.ts +172 -0
  281. package/src/report/seam.spec.ts +216 -0
  282. package/src/report/useFrappeReport.ts +241 -0
  283. package/src/report/useQueryReport.spec.tsx +131 -0
  284. package/src/report/useQueryReport.ts +309 -0
  285. package/src/useFrappeForm.spec.tsx +209 -0
  286. package/src/useFrappeForm.ts +778 -0
  287. package/types/FrappeCalendar.d.ts.map +1 -1
  288. package/types/FrappeForm.d.ts +21 -1
  289. package/types/FrappeForm.d.ts.map +1 -1
  290. package/types/FrappeListView.d.ts.map +1 -1
  291. package/types/FrappeReportBuilder.d.ts +66 -16
  292. package/types/FrappeReportBuilder.d.ts.map +1 -1
  293. package/types/FrappeReportView.d.ts +9 -127
  294. package/types/FrappeReportView.d.ts.map +1 -1
  295. package/types/dependsOn.d.ts.map +1 -1
  296. package/types/formEngine/docPermissions.d.ts +14 -0
  297. package/types/formEngine/docPermissions.d.ts.map +1 -1
  298. package/types/formEngine/index.d.ts +1 -1
  299. package/types/formEngine/index.d.ts.map +1 -1
  300. package/types/index.d.ts +15 -3
  301. package/types/index.d.ts.map +1 -1
  302. package/types/liveErrors.d.ts +9 -1
  303. package/types/liveErrors.d.ts.map +1 -1
  304. package/types/measures.d.ts +3 -0
  305. package/types/measures.d.ts.map +1 -0
  306. package/types/recordShape.d.ts +45 -0
  307. package/types/recordShape.d.ts.map +1 -0
  308. package/types/report/ReportGrid.d.ts +20 -0
  309. package/types/report/ReportGrid.d.ts.map +1 -0
  310. package/types/report/ReportViewToolbar.d.ts +31 -0
  311. package/types/report/ReportViewToolbar.d.ts.map +1 -0
  312. package/types/report/queryReport.d.ts +181 -0
  313. package/types/report/queryReport.d.ts.map +1 -0
  314. package/types/report/queryReportColumns.d.ts +12 -0
  315. package/types/report/queryReportColumns.d.ts.map +1 -0
  316. package/types/report/reportViewModel.d.ts +146 -0
  317. package/types/report/reportViewModel.d.ts.map +1 -0
  318. package/types/report/savedReports.d.ts +27 -0
  319. package/types/report/savedReports.d.ts.map +1 -0
  320. package/types/report/useFrappeReport.d.ts +60 -0
  321. package/types/report/useFrappeReport.d.ts.map +1 -0
  322. package/types/report/useQueryReport.d.ts +37 -0
  323. package/types/report/useQueryReport.d.ts.map +1 -0
  324. package/types/useFrappeForm.d.ts +142 -0
  325. package/types/useFrappeForm.d.ts.map +1 -0
@@ -1,7 +1,7 @@
1
- import { Card } from "@multiplatform.one/components";
1
+ import { Card, Image } from "@multiplatform.one/components";
2
2
  import { action } from "@multiplatform.one/storybook";
3
3
  import { useResolvedKnobs } from "@multiplatform.one/theme";
4
- import { Image, Text, YStack } from "tamagui";
4
+ import { Text, YStack } from "tamagui";
5
5
  import {
6
6
  createRosterFixtures,
7
7
  rosterPokemonFields,
@@ -54,10 +54,7 @@ function PokemonTile({ pokemon }: { pokemon: Partial<RosterPokemon> }) {
54
54
  return (
55
55
  <Card>
56
56
  <YStack {...knobProps.panelPadding} {...knobProps.gap} alignItems="center">
57
- <Image
58
- source={{ uri: pokemon.sprite_front, width: 96, height: 96 }}
59
- alt={pokemon.pokemon_name ?? ""}
60
- />
57
+ <Image src={pokemon.sprite_front} size="large" alt={pokemon.pokemon_name ?? ""} />
61
58
  <Text {...knobProps.body} fontWeight="700" textTransform="capitalize">
62
59
  {pokemon.pokemon_name}
63
60
  </Text>
@@ -1,4 +1,4 @@
1
- import { HttpClient, useDocTypeMeta } from "@multiplatform.one/frappe";
1
+ import { useDocTypeMeta } from "@multiplatform.one/frappe";
2
2
  import type { DataTableColumn } from "@multiplatform.one/table";
3
3
  import {
4
4
  ArrowsClockwiseIcon,
@@ -56,6 +56,7 @@ import {
56
56
  import { ListToastHost } from "./list/ListToastHost";
57
57
  import { ShufflePanel } from "./list/ShufflePanel";
58
58
  import { useListControls } from "./list/useListControls";
59
+ import { recordKeyLabel, useRecordShape } from "./recordShape";
59
60
  import { useConnectionFilters, type FrappeDoctypeFilter } from "./useConnectionFilters";
60
61
 
61
62
  interface ListFieldConfig {
@@ -210,23 +211,6 @@ const storageKeyPrefix = "frappe-listview-";
210
211
  /** Cards whose images load eagerly; the rest wait until they near the viewport. */
211
212
  const eagerCards = 6;
212
213
 
213
- // Frappe document bookkeeping keys -- never useful as display columns.
214
- const internalDocKeys = new Set([
215
- "name",
216
- "owner",
217
- "creation",
218
- "modified",
219
- "modified_by",
220
- "docstatus",
221
- "idx",
222
- "doctype",
223
- "_user_tags",
224
- "_comments",
225
- "_assign",
226
- "_liked_by",
227
- "_seen",
228
- ]);
229
-
230
214
  // Fieldtypes that structure a form but hold no listable value.
231
215
  const layoutFieldtypes = new Set([
232
216
  "Column Break",
@@ -238,11 +222,6 @@ const layoutFieldtypes = new Set([
238
222
  "Button",
239
223
  ]);
240
224
 
241
- /** "pokemon_name" -> "Pokemon Name" for fields we only know by key. */
242
- function fieldKeyLabel(key: string): string {
243
- return key.replace(/_/g, " ").replace(/(^|\s)\S/g, (c) => c.toUpperCase());
244
- }
245
-
246
225
  /**
247
226
  * Resolves an image field value to a full URL.
248
227
  */
@@ -398,36 +377,17 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
398
377
  (route !== undefined && navigate
399
378
  ? () => navigate(frappeRouteHref(route, { mode: "create" }))
400
379
  : undefined));
401
- // Guest fallback: DocType meta is permission-gated (Guests get 403) while
402
- // the documents themselves are often guest-readable. Peek one doc with
403
- // fields=["*"] and derive display fields from its keys so the views render
404
- // real columns instead of collapsing to a lone Name column.
405
- const [peekedFields, setPeekedFields] = useState<string[] | null>(null);
406
- useEffect(() => {
407
- if (meta || isMetaLoading || !metaError || !finalBaseURL) return;
408
- let cancelled = false;
409
- const http = new HttpClient(
410
- finalBaseURL,
411
- finalAuth as ConstructorParameters<typeof HttpClient>[1],
412
- );
413
- (async () => {
414
- try {
415
- const response = await http.get<{ data?: Record<string, unknown>[] }>(
416
- `/api/resource/${encodeURIComponent(doctype)}`,
417
- { fields: ["*"], limit_page_length: 1 },
418
- );
419
- const sample = response.payload?.data?.[0];
420
- if (!cancelled && sample) {
421
- setPeekedFields(Object.keys(sample).filter((key) => !internalDocKeys.has(key)));
422
- }
423
- } catch {
424
- // Doctype not readable at all -- the views' own empty states handle it.
425
- }
426
- })();
427
- return () => {
428
- cancelled = true;
429
- };
430
- }, [meta, isMetaLoading, metaError, doctype, finalBaseURL, finalAuth]);
380
+ // Meta refused (Guest gets 403) while the rows are readable: the views
381
+ // take their fields from one record instead of collapsing to Name (LC-96).
382
+ const recordShape = useRecordShape(
383
+ connectionConfig,
384
+ doctype,
385
+ !meta && !isMetaLoading && Boolean(metaError),
386
+ );
387
+ const peekedFields = useMemo(
388
+ () => recordShape.fields?.map((field) => field.fieldname) ?? null,
389
+ [recordShape.fields],
390
+ );
431
391
 
432
392
  // List-view fields: prefer the doctype's in_list_view flags; when a doctype
433
393
  // declares none, lead with its first data fields so the list/table still
@@ -472,7 +432,7 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
472
432
  return peekedFields
473
433
  .filter((key) => key !== imageFieldName)
474
434
  .slice(0, 4)
475
- .map((key) => ({ key, label: fieldKeyLabel(key) }));
435
+ .map((key) => ({ key, label: recordKeyLabel(key) }));
476
436
  }
477
437
  return [{ key: "name", label: t("Name") }];
478
438
  }, [displayFields, meta, metaListFields, peekedFields, imageFieldName, t]);
@@ -546,7 +506,7 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
546
506
  .slice(0, 4)
547
507
  .map(
548
508
  (key) =>
549
- ({ accessorKey: key, header: fieldKeyLabel(key) }) as DataTableColumn<Partial<TDoc>>,
509
+ ({ accessorKey: key, header: recordKeyLabel(key) }) as DataTableColumn<Partial<TDoc>>,
550
510
  );
551
511
  }
552
512
  return [{ accessorKey: "name" as string, header: t("Name") }] as DataTableColumn<
@@ -13,7 +13,7 @@ export default {
13
13
  docs: {
14
14
  description: {
15
15
  component:
16
- "Report builder over a Frappe DocType: meta-derived columns, group-by, save/load reports (storage), CSV export. Meta from an in-story fetch mock; rows from fixtures.",
16
+ "A doctype's report view, the one the desk's view=report renders: desk default columns, a per-column filter row, group-by, totals, saved reports, CSV export and paging. Meta from an in-story fetch mock; rows from fixtures.",
17
17
  },
18
18
  },
19
19
  },
@@ -24,6 +24,7 @@ export default {
24
24
 
25
25
  const MOCK_HOST = "https://report.mock.test";
26
26
  const ERR_HOST = "https://forbidden.report.mock.test";
27
+ const GUEST_HOST = "https://guest.report.mock.test";
27
28
 
28
29
  function jsonResponse(body: unknown, status = 200): Response {
29
30
  return new Response(JSON.stringify(body), {
@@ -71,6 +72,12 @@ function saleMeta(name: string) {
71
72
  const urlStr =
72
73
  typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
73
74
  if (urlStr.startsWith(ERR_HOST)) return jsonResponse({ message: "Not permitted" }, 403);
75
+ if (urlStr.startsWith(GUEST_HOST)) {
76
+ const url = new URL(urlStr);
77
+ return url.pathname === "/api/resource/QaSaleGuest"
78
+ ? jsonResponse({ data: makeSales("QaSaleGuest", 1) })
79
+ : jsonResponse({ message: "Not permitted" }, 403);
80
+ }
74
81
  if (urlStr.startsWith(MOCK_HOST)) {
75
82
  const url = new URL(urlStr);
76
83
  const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
@@ -126,8 +133,9 @@ export const EmptyData = () => (
126
133
  );
127
134
 
128
135
  /**
129
- * Meta endpoint 403s but explicit initialColumns are provided: the builder
130
- * must still render columns and fixture rows without DocType meta.
136
+ * Meta endpoint 403s with explicit initialColumns: a reader refused the
137
+ * schema still gets the rows, laid out from those columns, with nothing to
138
+ * save (LC-96).
131
139
  */
132
140
  export const InitialColumnsNoMeta = () => (
133
141
  <FrappeProvider baseURL={ERR_HOST} fixtures={fixturesFor("QaSaleNoMeta", 8)}>
@@ -143,12 +151,31 @@ export const InitialColumnsNoMeta = () => (
143
151
  </FrappeProvider>
144
152
  );
145
153
 
154
+ /**
155
+ * Meta refused, one record readable: the columns come from that record's own
156
+ * fields, labelled from their keys, and there is nothing to save (LC-96).
157
+ */
158
+ export const GuestRecordShape = () => (
159
+ <FrappeProvider baseURL={GUEST_HOST} fixtures={fixturesFor("QaSaleGuest", 8)}>
160
+ <FrappeReportBuilder doctype="QaSaleGuest" height={480} />
161
+ </FrappeProvider>
162
+ );
163
+
164
+ /**
165
+ * Meta and records both refused: a permission state that says what the reader
166
+ * can't do, with no retry (LC-96).
167
+ */
168
+ export const GuestRefused = () => (
169
+ <FrappeProvider baseURL={ERR_HOST} fixtures={fixturesFor("QaSaleRefused", 8)}>
170
+ <FrappeReportBuilder doctype="QaSaleRefused" height={480} />
171
+ </FrappeProvider>
172
+ );
173
+
146
174
  // ---------------------------------------------------------------------------
147
175
  // Live bench report: rows over the bench's ToDo doctype stream through the
148
- // sync engine and refresh in place on realtime events (subtle "Updating..."
149
- // affordance in the toolbar) while the builder's chosen columns / group-by
150
- // survive untouched. Fixtures + initialColumns fallback when the bench is
151
- // unreachable (meta 404s there — initialColumns keep the builder rendering).
176
+ // sync engine and refresh in place on realtime events while the chosen
177
+ // columns and group-by survive untouched. Fixtures stand in when the bench is
178
+ // unreachable.
152
179
  // ---------------------------------------------------------------------------
153
180
 
154
181
  const liveTodoFixtures = new InMemoryFixtureProvider({