@multiplatform.one/frappe-ui 7.7.4 → 7.8.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 (670) 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.native.js.map +1 -1
  5. package/dist/cjs/FileBrowser/types.native.js.map +1 -1
  6. package/dist/cjs/FileBrowser/viewPersistence.native.js.map +1 -1
  7. package/dist/cjs/FormSidebar.native.js.map +1 -1
  8. package/dist/cjs/FrappeAssignment.cjs +1 -0
  9. package/dist/cjs/FrappeAssignment.native.js +1 -0
  10. package/dist/cjs/FrappeAssignment.native.js.map +1 -1
  11. package/dist/cjs/FrappeCalendar.cjs +22 -18
  12. package/dist/cjs/FrappeCalendar.native.js +24 -22
  13. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  14. package/dist/cjs/FrappeChartCard.cjs +1 -0
  15. package/dist/cjs/FrappeChartCard.native.js +1 -0
  16. package/dist/cjs/FrappeChartCard.native.js.map +1 -1
  17. package/dist/cjs/FrappeConnectionIndicator.native.js.map +1 -1
  18. package/dist/cjs/FrappeDashboard.cjs +1 -0
  19. package/dist/cjs/FrappeDashboard.native.js +1 -0
  20. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  21. package/dist/cjs/FrappeForm.cjs +3 -2
  22. package/dist/cjs/FrappeForm.native.js +4 -3
  23. package/dist/cjs/FrappeForm.native.js.map +1 -1
  24. package/dist/cjs/FrappeGantt.cjs +27 -35
  25. package/dist/cjs/FrappeGantt.native.js +29 -39
  26. package/dist/cjs/FrappeGantt.native.js.map +1 -1
  27. package/dist/cjs/FrappeImageView.cjs +6 -3
  28. package/dist/cjs/FrappeImageView.native.js +10 -5
  29. package/dist/cjs/FrappeImageView.native.js.map +1 -1
  30. package/dist/cjs/FrappeKPICard.cjs +27 -1
  31. package/dist/cjs/FrappeKPICard.native.js +27 -1
  32. package/dist/cjs/FrappeKPICard.native.js.map +1 -1
  33. package/dist/cjs/FrappeKanban.cjs +18 -18
  34. package/dist/cjs/FrappeKanban.native.js +20 -22
  35. package/dist/cjs/FrappeKanban.native.js.map +1 -1
  36. package/dist/cjs/FrappeLikedBy.cjs +2 -1
  37. package/dist/cjs/FrappeLikedBy.native.js +2 -1
  38. package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
  39. package/dist/cjs/FrappeList.cjs +4 -3
  40. package/dist/cjs/FrappeList.native.js +4 -3
  41. package/dist/cjs/FrappeList.native.js.map +1 -1
  42. package/dist/cjs/FrappeListView.cjs +1 -0
  43. package/dist/cjs/FrappeListView.native.js +1 -0
  44. package/dist/cjs/FrappeListView.native.js.map +1 -1
  45. package/dist/cjs/FrappeProvider.cjs +3 -1
  46. package/dist/cjs/FrappeProvider.native.js +3 -1
  47. package/dist/cjs/FrappeProvider.native.js.map +1 -1
  48. package/dist/cjs/FrappeReconnectIndicator.native.js.map +1 -1
  49. package/dist/cjs/FrappeReportBuilder.cjs +3 -2
  50. package/dist/cjs/FrappeReportBuilder.native.js +3 -2
  51. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  52. package/dist/cjs/FrappeReportView.cjs +2 -1
  53. package/dist/cjs/FrappeReportView.native.js +5 -4
  54. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  55. package/dist/cjs/FrappeTable.cjs +37 -39
  56. package/dist/cjs/FrappeTable.native.js +40 -40
  57. package/dist/cjs/FrappeTable.native.js.map +1 -1
  58. package/dist/cjs/FrappeTreeView.cjs +87 -51
  59. package/dist/cjs/FrappeTreeView.native.js +131 -51
  60. package/dist/cjs/FrappeTreeView.native.js.map +1 -1
  61. package/dist/cjs/SyncErrorNotice.native.js.map +1 -1
  62. package/dist/cjs/commentActions.cjs +1 -1
  63. package/dist/cjs/commentActions.native.js +1 -1
  64. package/dist/cjs/commentActions.native.js.map +1 -1
  65. package/dist/cjs/components/attachments.cjs +1 -0
  66. package/dist/cjs/components/attachments.native.js +1 -0
  67. package/dist/cjs/components/attachments.native.js.map +1 -1
  68. package/dist/cjs/components/tags.cjs +1 -0
  69. package/dist/cjs/components/tags.native.js +1 -0
  70. package/dist/cjs/components/tags.native.js.map +1 -1
  71. package/dist/cjs/components/timeline.cjs +2 -1
  72. package/dist/cjs/components/timeline.native.js +2 -1
  73. package/dist/cjs/components/timeline.native.js.map +1 -1
  74. package/dist/cjs/dependsOn.native.js.map +1 -1
  75. package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
  76. package/dist/cjs/desk/DeskFormSidebar.cjs +1 -0
  77. package/dist/cjs/desk/DeskFormSidebar.native.js +1 -0
  78. package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
  79. package/dist/cjs/desk/DeskListPage.native.js.map +1 -1
  80. package/dist/cjs/desk/DeskShell.cjs +2 -0
  81. package/dist/cjs/desk/DeskShell.native.js +2 -0
  82. package/dist/cjs/desk/DeskShell.native.js.map +1 -1
  83. package/dist/cjs/desk/DeskSidebar.cjs +1 -0
  84. package/dist/cjs/desk/DeskSidebar.native.js +1 -0
  85. package/dist/cjs/desk/DeskSidebar.native.js.map +1 -1
  86. package/dist/cjs/desk/awesomebar.cjs +2 -1
  87. package/dist/cjs/desk/awesomebar.native.js +2 -1
  88. package/dist/cjs/desk/awesomebar.native.js.map +1 -1
  89. package/dist/cjs/fieldOverrides.native.js.map +1 -1
  90. package/dist/cjs/fieldRegistry.cjs +1 -0
  91. package/dist/cjs/fieldRegistry.native.js +32 -31
  92. package/dist/cjs/fieldRegistry.native.js.map +1 -1
  93. package/dist/cjs/fields/Barcode/index.native.js.map +1 -1
  94. package/dist/cjs/fields/Check/index.native.js.map +1 -1
  95. package/dist/cjs/fields/CodeEditor/index.native.js.map +1 -1
  96. package/dist/cjs/fields/Color/index.native.js.map +1 -1
  97. package/dist/cjs/fields/Data/index.native.js.map +1 -1
  98. package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +1 -1
  99. package/dist/cjs/fields/Date/types.native.js.map +1 -1
  100. package/dist/cjs/fields/Date/wire.native.js.map +1 -1
  101. package/dist/cjs/fields/DateRange/index.native.js.map +1 -1
  102. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  103. package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
  104. package/dist/cjs/fields/FileUpload.cjs +1 -0
  105. package/dist/cjs/fields/FileUpload.native.js +1 -0
  106. package/dist/cjs/fields/FileUpload.native.js.map +1 -1
  107. package/dist/cjs/fields/FileUploadField/index.native.js.map +1 -1
  108. package/dist/cjs/fields/Geolocation/index.native.js.map +1 -1
  109. package/dist/cjs/fields/HTML/index.native.js.map +1 -1
  110. package/dist/cjs/fields/Heading/index.native.js.map +1 -1
  111. package/dist/cjs/fields/Icon/index.native.js.map +1 -1
  112. package/dist/cjs/fields/Link.cjs +1 -0
  113. package/dist/cjs/fields/Link.native.js +1 -0
  114. package/dist/cjs/fields/Link.native.js.map +1 -1
  115. package/dist/cjs/fields/LinkTree.cjs +2 -1
  116. package/dist/cjs/fields/LinkTree.native.js +2 -1
  117. package/dist/cjs/fields/LinkTree.native.js.map +1 -1
  118. package/dist/cjs/fields/LongText/index.native.js.map +1 -1
  119. package/dist/cjs/fields/MentionInput/index.cjs +4 -1
  120. package/dist/cjs/fields/MentionInput/index.native.js +4 -1
  121. package/dist/cjs/fields/MentionInput/index.native.js.map +1 -1
  122. package/dist/cjs/fields/Numeric/index.native.js.map +1 -1
  123. package/dist/cjs/fields/OTPInput/index.native.js.map +1 -1
  124. package/dist/cjs/fields/Password/index.native.js.map +1 -1
  125. package/dist/cjs/fields/Phone/index.native.js.map +1 -1
  126. package/dist/cjs/fields/Progress/index.native.js.map +1 -1
  127. package/dist/cjs/fields/RadioGroup/index.native.js.map +1 -1
  128. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  129. package/dist/cjs/fields/ReadOnly/index.native.js.map +1 -1
  130. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  131. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  132. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  133. package/dist/cjs/fields/SmallText/index.native.js.map +1 -1
  134. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  135. package/dist/cjs/fields/TableMultiSelect.cjs +1 -0
  136. package/dist/cjs/fields/TableMultiSelect.native.js +1 -0
  137. package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
  138. package/dist/cjs/fields/TextEditor/types.native.js.map +1 -1
  139. package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
  140. package/dist/cjs/fields/ToggleGroup/index.native.js.map +1 -1
  141. package/dist/cjs/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  142. package/dist/cjs/filterFields.native.js.map +1 -1
  143. package/dist/cjs/formEngine/createPrefill.native.js.map +1 -1
  144. package/dist/cjs/formEngine/dirtyTracking.native.js.map +1 -1
  145. package/dist/cjs/formEngine/doctypeMeta.native.js.map +1 -1
  146. package/dist/cjs/formEngine/fetchFrom.native.js.map +1 -1
  147. package/dist/cjs/formEngine/fieldPermissions.native.js.map +1 -1
  148. package/dist/cjs/formEngine/formActions.native.js.map +1 -1
  149. package/dist/cjs/formEngine/formLayout.native.js.map +1 -1
  150. package/dist/cjs/formEngine/index.native.js.map +1 -1
  151. package/dist/cjs/formEngine/useFormEngine.native.js.map +1 -1
  152. package/dist/cjs/frappeEventColor.native.js.map +1 -1
  153. package/dist/cjs/frappeStoryTarget.native.js.map +1 -1
  154. package/dist/cjs/frappeUsers.cjs +1 -0
  155. package/dist/cjs/frappeUsers.native.js +1 -0
  156. package/dist/cjs/frappeUsers.native.js.map +1 -1
  157. package/dist/cjs/index.cjs +4 -0
  158. package/dist/cjs/index.native.js +38 -34
  159. package/dist/cjs/index.native.js.map +1 -1
  160. package/dist/cjs/liveErrors.native.js.map +1 -1
  161. package/dist/cjs/resolveControl.native.js.map +1 -1
  162. package/dist/cjs/schemaForm/SchemaWizard.native.js.map +1 -1
  163. package/dist/cjs/schemaForm/applyFieldOrder.native.js.map +1 -1
  164. package/dist/cjs/schemaForm/index.cjs +10 -9
  165. package/dist/cjs/schemaForm/index.native.js +11 -10
  166. package/dist/cjs/schemaForm/index.native.js.map +1 -1
  167. package/dist/cjs/shared/devWarn.cjs +40 -0
  168. package/dist/cjs/shared/devWarn.native.js +45 -0
  169. package/dist/cjs/shared/devWarn.native.js.map +1 -0
  170. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  171. package/dist/cjs/syncError.native.js.map +1 -1
  172. package/dist/cjs/useFrappeAggregate.cjs +15 -8
  173. package/dist/cjs/useFrappeAggregate.native.js +15 -9
  174. package/dist/cjs/useFrappeAggregate.native.js.map +1 -1
  175. package/dist/cjs/useFrappeFacets.cjs +10 -9
  176. package/dist/cjs/useFrappeFacets.native.js +10 -10
  177. package/dist/cjs/useFrappeFacets.native.js.map +1 -1
  178. package/dist/cjs/useFrappePagination.native.js.map +1 -1
  179. package/dist/cjs/useFrappeRows.cjs +113 -0
  180. package/dist/cjs/useFrappeRows.native.js +129 -0
  181. package/dist/cjs/useFrappeRows.native.js.map +1 -0
  182. package/dist/esm/ChartCard.native.js.map +1 -1
  183. package/dist/esm/FileBrowser/AttachLibrary.native.js.map +1 -1
  184. package/dist/esm/FileBrowser/folderTree.native.js.map +1 -1
  185. package/dist/esm/FileBrowser/index.native.js.map +1 -1
  186. package/dist/esm/FileBrowser/types.native.js.map +1 -1
  187. package/dist/esm/FileBrowser/viewPersistence.native.js.map +1 -1
  188. package/dist/esm/FormSidebar.native.js.map +1 -1
  189. package/dist/esm/FrappeAssignment.mjs +1 -0
  190. package/dist/esm/FrappeAssignment.mjs.map +1 -1
  191. package/dist/esm/FrappeAssignment.native.js +1 -0
  192. package/dist/esm/FrappeAssignment.native.js.map +1 -1
  193. package/dist/esm/FrappeCalendar.mjs +22 -18
  194. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  195. package/dist/esm/FrappeCalendar.native.js +24 -22
  196. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  197. package/dist/esm/FrappeChartCard.mjs +1 -0
  198. package/dist/esm/FrappeChartCard.mjs.map +1 -1
  199. package/dist/esm/FrappeChartCard.native.js +1 -0
  200. package/dist/esm/FrappeChartCard.native.js.map +1 -1
  201. package/dist/esm/FrappeConnectionIndicator.native.js.map +1 -1
  202. package/dist/esm/FrappeDashboard.mjs +1 -0
  203. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  204. package/dist/esm/FrappeDashboard.native.js +1 -0
  205. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  206. package/dist/esm/FrappeForm.mjs +3 -2
  207. package/dist/esm/FrappeForm.mjs.map +1 -1
  208. package/dist/esm/FrappeForm.native.js +3 -2
  209. package/dist/esm/FrappeForm.native.js.map +1 -1
  210. package/dist/esm/FrappeGantt.mjs +29 -37
  211. package/dist/esm/FrappeGantt.mjs.map +1 -1
  212. package/dist/esm/FrappeGantt.native.js +31 -41
  213. package/dist/esm/FrappeGantt.native.js.map +1 -1
  214. package/dist/esm/FrappeImageView.mjs +7 -4
  215. package/dist/esm/FrappeImageView.mjs.map +1 -1
  216. package/dist/esm/FrappeImageView.native.js +11 -6
  217. package/dist/esm/FrappeImageView.native.js.map +1 -1
  218. package/dist/esm/FrappeKPICard.mjs +28 -2
  219. package/dist/esm/FrappeKPICard.mjs.map +1 -1
  220. package/dist/esm/FrappeKPICard.native.js +28 -2
  221. package/dist/esm/FrappeKPICard.native.js.map +1 -1
  222. package/dist/esm/FrappeKanban.mjs +18 -18
  223. package/dist/esm/FrappeKanban.mjs.map +1 -1
  224. package/dist/esm/FrappeKanban.native.js +20 -22
  225. package/dist/esm/FrappeKanban.native.js.map +1 -1
  226. package/dist/esm/FrappeLikedBy.mjs +2 -1
  227. package/dist/esm/FrappeLikedBy.mjs.map +1 -1
  228. package/dist/esm/FrappeLikedBy.native.js +2 -1
  229. package/dist/esm/FrappeLikedBy.native.js.map +1 -1
  230. package/dist/esm/FrappeList.mjs +4 -3
  231. package/dist/esm/FrappeList.mjs.map +1 -1
  232. package/dist/esm/FrappeList.native.js +4 -3
  233. package/dist/esm/FrappeList.native.js.map +1 -1
  234. package/dist/esm/FrappeListView.mjs +1 -0
  235. package/dist/esm/FrappeListView.mjs.map +1 -1
  236. package/dist/esm/FrappeListView.native.js +1 -0
  237. package/dist/esm/FrappeListView.native.js.map +1 -1
  238. package/dist/esm/FrappeProvider.mjs +3 -1
  239. package/dist/esm/FrappeProvider.mjs.map +1 -1
  240. package/dist/esm/FrappeProvider.native.js +3 -1
  241. package/dist/esm/FrappeProvider.native.js.map +1 -1
  242. package/dist/esm/FrappeReconnectIndicator.native.js.map +1 -1
  243. package/dist/esm/FrappeReportBuilder.mjs +3 -2
  244. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  245. package/dist/esm/FrappeReportBuilder.native.js +3 -2
  246. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  247. package/dist/esm/FrappeReportView.mjs +2 -1
  248. package/dist/esm/FrappeReportView.mjs.map +1 -1
  249. package/dist/esm/FrappeReportView.native.js +2 -1
  250. package/dist/esm/FrappeReportView.native.js.map +1 -1
  251. package/dist/esm/FrappeTable.mjs +38 -40
  252. package/dist/esm/FrappeTable.mjs.map +1 -1
  253. package/dist/esm/FrappeTable.native.js +41 -41
  254. package/dist/esm/FrappeTable.native.js.map +1 -1
  255. package/dist/esm/FrappeTreeView.mjs +91 -56
  256. package/dist/esm/FrappeTreeView.mjs.map +1 -1
  257. package/dist/esm/FrappeTreeView.native.js +135 -56
  258. package/dist/esm/FrappeTreeView.native.js.map +1 -1
  259. package/dist/esm/SyncErrorNotice.native.js.map +1 -1
  260. package/dist/esm/commentActions.mjs +1 -1
  261. package/dist/esm/commentActions.mjs.map +1 -1
  262. package/dist/esm/commentActions.native.js +1 -1
  263. package/dist/esm/commentActions.native.js.map +1 -1
  264. package/dist/esm/components/attachments.mjs +1 -0
  265. package/dist/esm/components/attachments.mjs.map +1 -1
  266. package/dist/esm/components/attachments.native.js +1 -0
  267. package/dist/esm/components/attachments.native.js.map +1 -1
  268. package/dist/esm/components/tags.mjs +1 -0
  269. package/dist/esm/components/tags.mjs.map +1 -1
  270. package/dist/esm/components/tags.native.js +1 -0
  271. package/dist/esm/components/tags.native.js.map +1 -1
  272. package/dist/esm/components/timeline.mjs +2 -1
  273. package/dist/esm/components/timeline.mjs.map +1 -1
  274. package/dist/esm/components/timeline.native.js +2 -1
  275. package/dist/esm/components/timeline.native.js.map +1 -1
  276. package/dist/esm/dependsOn.native.js.map +1 -1
  277. package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
  278. package/dist/esm/desk/DeskFormSidebar.mjs +1 -0
  279. package/dist/esm/desk/DeskFormSidebar.mjs.map +1 -1
  280. package/dist/esm/desk/DeskFormSidebar.native.js +1 -0
  281. package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
  282. package/dist/esm/desk/DeskListPage.native.js.map +1 -1
  283. package/dist/esm/desk/DeskShell.mjs +2 -0
  284. package/dist/esm/desk/DeskShell.mjs.map +1 -1
  285. package/dist/esm/desk/DeskShell.native.js +2 -0
  286. package/dist/esm/desk/DeskShell.native.js.map +1 -1
  287. package/dist/esm/desk/DeskSidebar.mjs +1 -0
  288. package/dist/esm/desk/DeskSidebar.mjs.map +1 -1
  289. package/dist/esm/desk/DeskSidebar.native.js +1 -0
  290. package/dist/esm/desk/DeskSidebar.native.js.map +1 -1
  291. package/dist/esm/desk/awesomebar.mjs +2 -1
  292. package/dist/esm/desk/awesomebar.mjs.map +1 -1
  293. package/dist/esm/desk/awesomebar.native.js +2 -1
  294. package/dist/esm/desk/awesomebar.native.js.map +1 -1
  295. package/dist/esm/fieldOverrides.native.js.map +1 -1
  296. package/dist/esm/fieldRegistry.mjs +1 -0
  297. package/dist/esm/fieldRegistry.mjs.map +1 -1
  298. package/dist/esm/fieldRegistry.native.js +1 -0
  299. package/dist/esm/fieldRegistry.native.js.map +1 -1
  300. package/dist/esm/fields/Barcode/index.native.js.map +1 -1
  301. package/dist/esm/fields/Check/index.native.js.map +1 -1
  302. package/dist/esm/fields/CodeEditor/index.native.js.map +1 -1
  303. package/dist/esm/fields/Color/index.native.js.map +1 -1
  304. package/dist/esm/fields/Data/index.native.js.map +1 -1
  305. package/dist/esm/fields/Date/sheetKeyboard.native.js.map +1 -1
  306. package/dist/esm/fields/Date/types.native.js.map +1 -1
  307. package/dist/esm/fields/Date/wire.native.js.map +1 -1
  308. package/dist/esm/fields/DateRange/index.native.js.map +1 -1
  309. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  310. package/dist/esm/fields/DynamicLink.native.js.map +1 -1
  311. package/dist/esm/fields/FileUpload.mjs +1 -0
  312. package/dist/esm/fields/FileUpload.mjs.map +1 -1
  313. package/dist/esm/fields/FileUpload.native.js +1 -0
  314. package/dist/esm/fields/FileUpload.native.js.map +1 -1
  315. package/dist/esm/fields/FileUploadField/index.native.js.map +1 -1
  316. package/dist/esm/fields/Geolocation/index.native.js.map +1 -1
  317. package/dist/esm/fields/HTML/index.native.js.map +1 -1
  318. package/dist/esm/fields/Heading/index.native.js.map +1 -1
  319. package/dist/esm/fields/Icon/index.native.js.map +1 -1
  320. package/dist/esm/fields/Link.mjs +1 -0
  321. package/dist/esm/fields/Link.mjs.map +1 -1
  322. package/dist/esm/fields/Link.native.js +1 -0
  323. package/dist/esm/fields/Link.native.js.map +1 -1
  324. package/dist/esm/fields/LinkTree.mjs +2 -1
  325. package/dist/esm/fields/LinkTree.mjs.map +1 -1
  326. package/dist/esm/fields/LinkTree.native.js +2 -1
  327. package/dist/esm/fields/LinkTree.native.js.map +1 -1
  328. package/dist/esm/fields/LongText/index.native.js.map +1 -1
  329. package/dist/esm/fields/MentionInput/index.mjs +4 -1
  330. package/dist/esm/fields/MentionInput/index.mjs.map +1 -1
  331. package/dist/esm/fields/MentionInput/index.native.js +4 -1
  332. package/dist/esm/fields/MentionInput/index.native.js.map +1 -1
  333. package/dist/esm/fields/Numeric/index.native.js.map +1 -1
  334. package/dist/esm/fields/OTPInput/index.native.js.map +1 -1
  335. package/dist/esm/fields/Password/index.native.js.map +1 -1
  336. package/dist/esm/fields/Phone/index.native.js.map +1 -1
  337. package/dist/esm/fields/Progress/index.native.js.map +1 -1
  338. package/dist/esm/fields/RadioGroup/index.native.js.map +1 -1
  339. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  340. package/dist/esm/fields/ReadOnly/index.native.js.map +1 -1
  341. package/dist/esm/fields/Select/index.native.js.map +1 -1
  342. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  343. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  344. package/dist/esm/fields/SmallText/index.native.js.map +1 -1
  345. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  346. package/dist/esm/fields/TableMultiSelect.mjs +1 -0
  347. package/dist/esm/fields/TableMultiSelect.mjs.map +1 -1
  348. package/dist/esm/fields/TableMultiSelect.native.js +1 -0
  349. package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
  350. package/dist/esm/fields/TextEditor/types.native.js.map +1 -1
  351. package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
  352. package/dist/esm/fields/ToggleGroup/index.native.js.map +1 -1
  353. package/dist/esm/fields/shared/EditorPreviewPanes.native.js.map +1 -1
  354. package/dist/esm/filterFields.native.js.map +1 -1
  355. package/dist/esm/formEngine/createPrefill.native.js.map +1 -1
  356. package/dist/esm/formEngine/dirtyTracking.native.js.map +1 -1
  357. package/dist/esm/formEngine/doctypeMeta.native.js.map +1 -1
  358. package/dist/esm/formEngine/fetchFrom.native.js.map +1 -1
  359. package/dist/esm/formEngine/fieldPermissions.native.js.map +1 -1
  360. package/dist/esm/formEngine/formActions.mjs.map +1 -1
  361. package/dist/esm/formEngine/formActions.native.js.map +1 -1
  362. package/dist/esm/formEngine/formLayout.native.js.map +1 -1
  363. package/dist/esm/formEngine/index.native.js.map +1 -1
  364. package/dist/esm/formEngine/useFormEngine.native.js.map +1 -1
  365. package/dist/esm/frappeEventColor.native.js.map +1 -1
  366. package/dist/esm/frappeStoryTarget.native.js.map +1 -1
  367. package/dist/esm/frappeUsers.mjs +1 -0
  368. package/dist/esm/frappeUsers.mjs.map +1 -1
  369. package/dist/esm/frappeUsers.native.js +1 -0
  370. package/dist/esm/frappeUsers.native.js.map +1 -1
  371. package/dist/esm/index.mjs +2 -1
  372. package/dist/esm/index.mjs.map +1 -1
  373. package/dist/esm/index.native.js +2 -1
  374. package/dist/esm/index.native.js.map +1 -1
  375. package/dist/esm/liveErrors.native.js.map +1 -1
  376. package/dist/esm/resolveControl.native.js.map +1 -1
  377. package/dist/esm/schemaForm/SchemaWizard.native.js.map +1 -1
  378. package/dist/esm/schemaForm/applyFieldOrder.native.js.map +1 -1
  379. package/dist/esm/schemaForm/index.mjs +8 -7
  380. package/dist/esm/schemaForm/index.mjs.map +1 -1
  381. package/dist/esm/schemaForm/index.native.js +8 -7
  382. package/dist/esm/schemaForm/index.native.js.map +1 -1
  383. package/dist/esm/shared/devWarn.mjs +14 -0
  384. package/dist/esm/shared/devWarn.mjs.map +1 -0
  385. package/dist/esm/shared/devWarn.native.js +16 -0
  386. package/dist/esm/shared/devWarn.native.js.map +1 -0
  387. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  388. package/dist/esm/syncError.native.js.map +1 -1
  389. package/dist/esm/useFrappeAggregate.mjs +15 -8
  390. package/dist/esm/useFrappeAggregate.mjs.map +1 -1
  391. package/dist/esm/useFrappeAggregate.native.js +15 -9
  392. package/dist/esm/useFrappeAggregate.native.js.map +1 -1
  393. package/dist/esm/useFrappeFacets.mjs +10 -9
  394. package/dist/esm/useFrappeFacets.mjs.map +1 -1
  395. package/dist/esm/useFrappeFacets.native.js +10 -10
  396. package/dist/esm/useFrappeFacets.native.js.map +1 -1
  397. package/dist/esm/useFrappePagination.native.js.map +1 -1
  398. package/dist/esm/useFrappeRows.mjs +86 -0
  399. package/dist/esm/useFrappeRows.mjs.map +1 -0
  400. package/dist/esm/useFrappeRows.native.js +99 -0
  401. package/dist/esm/useFrappeRows.native.js.map +1 -0
  402. package/dist/jsx/FrappeAssignment.mjs +1 -0
  403. package/dist/jsx/FrappeAssignment.mjs.map +1 -1
  404. package/dist/jsx/FrappeAssignment.native.js +1 -0
  405. package/dist/jsx/FrappeAssignment.native.js.map +1 -1
  406. package/dist/jsx/FrappeCalendar.mjs +22 -18
  407. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  408. package/dist/jsx/FrappeCalendar.native.js +24 -22
  409. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  410. package/dist/jsx/FrappeChartCard.mjs +1 -0
  411. package/dist/jsx/FrappeChartCard.mjs.map +1 -1
  412. package/dist/jsx/FrappeChartCard.native.js +1 -0
  413. package/dist/jsx/FrappeChartCard.native.js.map +1 -1
  414. package/dist/jsx/FrappeDashboard.mjs +1 -0
  415. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  416. package/dist/jsx/FrappeDashboard.native.js +1 -0
  417. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  418. package/dist/jsx/FrappeForm.mjs +3 -2
  419. package/dist/jsx/FrappeForm.mjs.map +1 -1
  420. package/dist/jsx/FrappeForm.native.js +3 -2
  421. package/dist/jsx/FrappeForm.native.js.map +1 -1
  422. package/dist/jsx/FrappeGantt.mjs +29 -37
  423. package/dist/jsx/FrappeGantt.mjs.map +1 -1
  424. package/dist/jsx/FrappeGantt.native.js +29 -39
  425. package/dist/jsx/FrappeGantt.native.js.map +1 -1
  426. package/dist/jsx/FrappeImageView.mjs +7 -4
  427. package/dist/jsx/FrappeImageView.mjs.map +1 -1
  428. package/dist/jsx/FrappeImageView.native.js +10 -5
  429. package/dist/jsx/FrappeImageView.native.js.map +1 -1
  430. package/dist/jsx/FrappeKPICard.mjs +28 -2
  431. package/dist/jsx/FrappeKPICard.mjs.map +1 -1
  432. package/dist/jsx/FrappeKPICard.native.js +27 -1
  433. package/dist/jsx/FrappeKPICard.native.js.map +1 -1
  434. package/dist/jsx/FrappeKanban.mjs +18 -18
  435. package/dist/jsx/FrappeKanban.mjs.map +1 -1
  436. package/dist/jsx/FrappeKanban.native.js +20 -22
  437. package/dist/jsx/FrappeKanban.native.js.map +1 -1
  438. package/dist/jsx/FrappeLikedBy.mjs +2 -1
  439. package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
  440. package/dist/jsx/FrappeLikedBy.native.js +2 -1
  441. package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
  442. package/dist/jsx/FrappeList.mjs +4 -3
  443. package/dist/jsx/FrappeList.mjs.map +1 -1
  444. package/dist/jsx/FrappeList.native.js +4 -3
  445. package/dist/jsx/FrappeList.native.js.map +1 -1
  446. package/dist/jsx/FrappeListView.mjs +1 -0
  447. package/dist/jsx/FrappeListView.mjs.map +1 -1
  448. package/dist/jsx/FrappeListView.native.js +1 -0
  449. package/dist/jsx/FrappeListView.native.js.map +1 -1
  450. package/dist/jsx/FrappeProvider.mjs +3 -1
  451. package/dist/jsx/FrappeProvider.mjs.map +1 -1
  452. package/dist/jsx/FrappeProvider.native.js +3 -1
  453. package/dist/jsx/FrappeProvider.native.js.map +1 -1
  454. package/dist/jsx/FrappeReportBuilder.mjs +3 -2
  455. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  456. package/dist/jsx/FrappeReportBuilder.native.js +3 -2
  457. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  458. package/dist/jsx/FrappeReportView.mjs +2 -1
  459. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  460. package/dist/jsx/FrappeReportView.native.js +2 -1
  461. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  462. package/dist/jsx/FrappeTable.mjs +38 -40
  463. package/dist/jsx/FrappeTable.mjs.map +1 -1
  464. package/dist/jsx/FrappeTable.native.js +40 -40
  465. package/dist/jsx/FrappeTable.native.js.map +1 -1
  466. package/dist/jsx/FrappeTreeView.mjs +91 -56
  467. package/dist/jsx/FrappeTreeView.mjs.map +1 -1
  468. package/dist/jsx/FrappeTreeView.native.js +131 -51
  469. package/dist/jsx/FrappeTreeView.native.js.map +1 -1
  470. package/dist/jsx/commentActions.mjs +1 -1
  471. package/dist/jsx/commentActions.mjs.map +1 -1
  472. package/dist/jsx/commentActions.native.js +1 -1
  473. package/dist/jsx/commentActions.native.js.map +1 -1
  474. package/dist/jsx/components/attachments.mjs +1 -0
  475. package/dist/jsx/components/attachments.mjs.map +1 -1
  476. package/dist/jsx/components/attachments.native.js +1 -0
  477. package/dist/jsx/components/attachments.native.js.map +1 -1
  478. package/dist/jsx/components/tags.mjs +1 -0
  479. package/dist/jsx/components/tags.mjs.map +1 -1
  480. package/dist/jsx/components/tags.native.js +1 -0
  481. package/dist/jsx/components/tags.native.js.map +1 -1
  482. package/dist/jsx/components/timeline.mjs +2 -1
  483. package/dist/jsx/components/timeline.mjs.map +1 -1
  484. package/dist/jsx/components/timeline.native.js +2 -1
  485. package/dist/jsx/components/timeline.native.js.map +1 -1
  486. package/dist/jsx/desk/DeskFormSidebar.mjs +1 -0
  487. package/dist/jsx/desk/DeskFormSidebar.mjs.map +1 -1
  488. package/dist/jsx/desk/DeskFormSidebar.native.js +1 -0
  489. package/dist/jsx/desk/DeskFormSidebar.native.js.map +1 -1
  490. package/dist/jsx/desk/DeskShell.mjs +2 -0
  491. package/dist/jsx/desk/DeskShell.mjs.map +1 -1
  492. package/dist/jsx/desk/DeskShell.native.js +2 -0
  493. package/dist/jsx/desk/DeskShell.native.js.map +1 -1
  494. package/dist/jsx/desk/DeskSidebar.mjs +1 -0
  495. package/dist/jsx/desk/DeskSidebar.mjs.map +1 -1
  496. package/dist/jsx/desk/DeskSidebar.native.js +1 -0
  497. package/dist/jsx/desk/DeskSidebar.native.js.map +1 -1
  498. package/dist/jsx/desk/awesomebar.mjs +2 -1
  499. package/dist/jsx/desk/awesomebar.mjs.map +1 -1
  500. package/dist/jsx/desk/awesomebar.native.js +2 -1
  501. package/dist/jsx/desk/awesomebar.native.js.map +1 -1
  502. package/dist/jsx/fieldRegistry.mjs +1 -0
  503. package/dist/jsx/fieldRegistry.mjs.map +1 -1
  504. package/dist/jsx/fieldRegistry.native.js +1 -0
  505. package/dist/jsx/fieldRegistry.native.js.map +1 -1
  506. package/dist/jsx/fields/FileUpload.mjs +1 -0
  507. package/dist/jsx/fields/FileUpload.mjs.map +1 -1
  508. package/dist/jsx/fields/FileUpload.native.js +1 -0
  509. package/dist/jsx/fields/FileUpload.native.js.map +1 -1
  510. package/dist/jsx/fields/Link.mjs +1 -0
  511. package/dist/jsx/fields/Link.mjs.map +1 -1
  512. package/dist/jsx/fields/Link.native.js +1 -0
  513. package/dist/jsx/fields/Link.native.js.map +1 -1
  514. package/dist/jsx/fields/LinkTree.mjs +2 -1
  515. package/dist/jsx/fields/LinkTree.mjs.map +1 -1
  516. package/dist/jsx/fields/LinkTree.native.js +2 -1
  517. package/dist/jsx/fields/LinkTree.native.js.map +1 -1
  518. package/dist/jsx/fields/MentionInput/index.mjs +4 -1
  519. package/dist/jsx/fields/MentionInput/index.mjs.map +1 -1
  520. package/dist/jsx/fields/MentionInput/index.native.js +4 -1
  521. package/dist/jsx/fields/MentionInput/index.native.js.map +1 -1
  522. package/dist/jsx/fields/TableMultiSelect.mjs +1 -0
  523. package/dist/jsx/fields/TableMultiSelect.mjs.map +1 -1
  524. package/dist/jsx/fields/TableMultiSelect.native.js +1 -0
  525. package/dist/jsx/fields/TableMultiSelect.native.js.map +1 -1
  526. package/dist/jsx/formEngine/formActions.mjs.map +1 -1
  527. package/dist/jsx/formEngine/formActions.native.js.map +1 -1
  528. package/dist/jsx/frappeUsers.mjs +1 -0
  529. package/dist/jsx/frappeUsers.mjs.map +1 -1
  530. package/dist/jsx/frappeUsers.native.js +1 -0
  531. package/dist/jsx/frappeUsers.native.js.map +1 -1
  532. package/dist/jsx/index.js +2 -1
  533. package/dist/jsx/index.js.map +1 -1
  534. package/dist/jsx/index.mjs +2 -1
  535. package/dist/jsx/index.mjs.map +1 -1
  536. package/dist/jsx/index.native.js +4 -0
  537. package/dist/jsx/index.native.js.map +1 -1
  538. package/dist/jsx/schemaForm/index.mjs +8 -7
  539. package/dist/jsx/schemaForm/index.mjs.map +1 -1
  540. package/dist/jsx/schemaForm/index.native.js +10 -9
  541. package/dist/jsx/schemaForm/index.native.js.map +1 -1
  542. package/dist/jsx/shared/devWarn.mjs +14 -0
  543. package/dist/jsx/shared/devWarn.mjs.map +1 -0
  544. package/dist/jsx/shared/devWarn.native.js +45 -0
  545. package/dist/jsx/shared/devWarn.native.js.map +1 -0
  546. package/dist/jsx/useFrappeAggregate.mjs +15 -8
  547. package/dist/jsx/useFrappeAggregate.mjs.map +1 -1
  548. package/dist/jsx/useFrappeAggregate.native.js +15 -9
  549. package/dist/jsx/useFrappeAggregate.native.js.map +1 -1
  550. package/dist/jsx/useFrappeFacets.mjs +10 -9
  551. package/dist/jsx/useFrappeFacets.mjs.map +1 -1
  552. package/dist/jsx/useFrappeFacets.native.js +10 -10
  553. package/dist/jsx/useFrappeFacets.native.js.map +1 -1
  554. package/dist/jsx/useFrappeRows.mjs +86 -0
  555. package/dist/jsx/useFrappeRows.mjs.map +1 -0
  556. package/dist/jsx/useFrappeRows.native.js +129 -0
  557. package/dist/jsx/useFrappeRows.native.js.map +1 -0
  558. package/package.json +17 -16
  559. package/src/FileBrowser/FileBrowser.spec.tsx +11 -1
  560. package/src/FrappeAssignment.tsx +1 -0
  561. package/src/FrappeCalendar.tsx +27 -22
  562. package/src/FrappeChartCard.tsx +1 -0
  563. package/src/FrappeDashboard.tsx +3 -0
  564. package/src/FrappeForm.tsx +9 -3
  565. package/src/FrappeGantt.tsx +31 -39
  566. package/src/FrappeImageView.tsx +7 -3
  567. package/src/FrappeKPICard.spec.tsx +128 -0
  568. package/src/FrappeKPICard.tsx +45 -4
  569. package/src/FrappeKanban.tsx +26 -17
  570. package/src/FrappeLikedBy.tsx +2 -1
  571. package/src/FrappeList.tsx +5 -2
  572. package/src/FrappeListView.tsx +1 -0
  573. package/src/FrappeProvider.fixturesOnly.spec.tsx +129 -0
  574. package/src/FrappeProvider.realtime.spec.tsx +59 -0
  575. package/src/FrappeProvider.tsx +33 -7
  576. package/src/FrappeReportBuilder.tsx +5 -2
  577. package/src/FrappeReportView.tsx +5 -2
  578. package/src/FrappeTable.autoHeight.spec.tsx +142 -0
  579. package/src/FrappeTable.rowAccumulator.spec.tsx +110 -0
  580. package/src/FrappeTable.tsx +77 -48
  581. package/src/FrappeTreeView.stories.tsx +59 -0
  582. package/src/FrappeTreeView.tsx +168 -56
  583. package/src/commentActions.ts +1 -1
  584. package/src/components/attachments.tsx +1 -0
  585. package/src/components/tags.tsx +1 -0
  586. package/src/components/timeline.tsx +2 -1
  587. package/src/desk/DeskFormSidebar.tsx +1 -0
  588. package/src/desk/DeskShell.tsx +2 -0
  589. package/src/desk/DeskSidebar.tsx +6 -1
  590. package/src/desk/awesomebar.tsx +11 -3
  591. package/src/fieldRegistry.ts +1 -0
  592. package/src/fields/CodeEditor/CodeEditor.spec.tsx +10 -9
  593. package/src/fields/Date/typeParity.spec.tsx +19 -9
  594. package/src/fields/Duration/Duration.spec.tsx +73 -0
  595. package/src/fields/FileUpload.tsx +1 -0
  596. package/src/fields/Link.tsx +6 -1
  597. package/src/fields/LinkTree.tsx +2 -1
  598. package/src/fields/MentionInput/MentionInput.spec.tsx +110 -0
  599. package/src/fields/MentionInput/index.tsx +4 -1
  600. package/src/fields/Password/index.tsx +1 -1
  601. package/src/fields/Progress/Progress.spec.tsx +9 -0
  602. package/src/fields/RadioGroup/RadioGroup.spec.tsx +93 -0
  603. package/src/fields/Signature/Signature.spec.tsx +105 -0
  604. package/src/fields/Slider/Slider.spec.tsx +73 -0
  605. package/src/fields/Switch/Switch.spec.tsx +65 -0
  606. package/src/fields/TableMultiSelect.tsx +1 -0
  607. package/src/fields/TextEditor/TextEditor.spec.tsx +2 -3
  608. package/src/fields/TextEditor/TextEditor.stories.tsx +31 -1
  609. package/src/fields/ToggleGroup/ToggleGroup.spec.tsx +110 -0
  610. package/src/formEngine/formActions.ts +2 -0
  611. package/src/frappeUsers.ts +1 -0
  612. package/src/frappeViews.designLaw.spec.ts +11 -7
  613. package/src/index.ts +13 -0
  614. package/src/schemaForm/index.tsx +6 -7
  615. package/src/shared/devWarn.ts +42 -0
  616. package/src/useFrappeAggregate.ts +19 -11
  617. package/src/useFrappeFacets.ts +17 -10
  618. package/src/useFrappeRows.spec.tsx +176 -0
  619. package/src/useFrappeRows.ts +293 -0
  620. package/types/FrappeAssignment.d.ts.map +1 -1
  621. package/types/FrappeCalendar.d.ts.map +1 -1
  622. package/types/FrappeChartCard.d.ts.map +1 -1
  623. package/types/FrappeDashboard.d.ts.map +1 -1
  624. package/types/FrappeForm.d.ts +6 -2
  625. package/types/FrappeForm.d.ts.map +1 -1
  626. package/types/FrappeGantt.d.ts.map +1 -1
  627. package/types/FrappeImageView.d.ts.map +1 -1
  628. package/types/FrappeKPICard.d.ts +9 -1
  629. package/types/FrappeKPICard.d.ts.map +1 -1
  630. package/types/FrappeKanban.d.ts.map +1 -1
  631. package/types/FrappeLikedBy.d.ts.map +1 -1
  632. package/types/FrappeList.d.ts.map +1 -1
  633. package/types/FrappeListView.d.ts.map +1 -1
  634. package/types/FrappeProvider.d.ts +21 -7
  635. package/types/FrappeProvider.d.ts.map +1 -1
  636. package/types/FrappeReportBuilder.d.ts.map +1 -1
  637. package/types/FrappeReportView.d.ts.map +1 -1
  638. package/types/FrappeTable.d.ts +20 -1
  639. package/types/FrappeTable.d.ts.map +1 -1
  640. package/types/FrappeTreeView.d.ts +38 -1
  641. package/types/FrappeTreeView.d.ts.map +1 -1
  642. package/types/components/attachments.d.ts.map +1 -1
  643. package/types/components/tags.d.ts.map +1 -1
  644. package/types/components/timeline.d.ts.map +1 -1
  645. package/types/desk/DeskFormSidebar.d.ts.map +1 -1
  646. package/types/desk/DeskShell.d.ts.map +1 -1
  647. package/types/desk/DeskSidebar.d.ts.map +1 -1
  648. package/types/desk/awesomebar.d.ts.map +1 -1
  649. package/types/fieldRegistry.d.ts.map +1 -1
  650. package/types/fields/FileUpload.d.ts.map +1 -1
  651. package/types/fields/Link.d.ts.map +1 -1
  652. package/types/fields/LinkTree.d.ts.map +1 -1
  653. package/types/fields/MentionInput/index.d.ts.map +1 -1
  654. package/types/fields/Password/index.d.ts +1 -1
  655. package/types/fields/Password/index.d.ts.map +1 -1
  656. package/types/fields/TableMultiSelect.d.ts.map +1 -1
  657. package/types/formEngine/formActions.d.ts +2 -0
  658. package/types/formEngine/formActions.d.ts.map +1 -1
  659. package/types/frappeUsers.d.ts.map +1 -1
  660. package/types/index.d.ts +1 -0
  661. package/types/index.d.ts.map +1 -1
  662. package/types/schemaForm/index.d.ts.map +1 -1
  663. package/types/shared/devWarn.d.ts +23 -0
  664. package/types/shared/devWarn.d.ts.map +1 -0
  665. package/types/useFrappeAggregate.d.ts +4 -1
  666. package/types/useFrappeAggregate.d.ts.map +1 -1
  667. package/types/useFrappeFacets.d.ts +2 -1
  668. package/types/useFrappeFacets.d.ts.map +1 -1
  669. package/types/useFrappeRows.d.ts +186 -0
  670. package/types/useFrappeRows.d.ts.map +1 -0
@@ -171,11 +171,15 @@ export interface AssignmentTodoRow {
171
171
  reference_name?: string;
172
172
  }
173
173
 
174
- /** Resolves a Frappe file field value (e.g. `/files/x.png`) to a full URL. */
175
- export function resolveFileUrl(value: unknown, baseURL: string): string | undefined {
174
+ /**
175
+ * Resolves a Frappe file field value (e.g. `/files/x.png`) to a full URL.
176
+ * A site-relative path needs a server to hang off, so it resolves to nothing
177
+ * on a fixtures-only host (no baseURL); absolute URLs still pass through.
178
+ */
179
+ export function resolveFileUrl(value: unknown, baseURL: string | undefined): string | undefined {
176
180
  if (!value || typeof value !== "string") return undefined;
177
181
  if (value.startsWith("http://") || value.startsWith("https://")) return value;
178
- if (value.startsWith("/")) return `${baseURL.replace(/\/$/, "")}${value}`;
182
+ if (value.startsWith("/")) return baseURL ? `${baseURL.replace(/\/$/, "")}${value}` : undefined;
179
183
  return value;
180
184
  }
181
185
 
@@ -326,6 +330,7 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
326
330
  socketBaseURL: config?.socketBaseURL,
327
331
  auth: finalAuth,
328
332
  syncOptions: finalSyncOptions,
333
+ realtime: config?.realtime,
329
334
  fixtures: config?.fixtures,
330
335
  }),
331
336
  [
@@ -333,6 +338,7 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
333
338
  config?.socketPort,
334
339
  config?.siteName,
335
340
  config?.socketBaseURL,
341
+ config?.realtime,
336
342
  finalAuth,
337
343
  finalSyncOptions,
338
344
  config?.fixtures,
@@ -1,14 +1,13 @@
1
- import { useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
2
1
  import {
2
+ Alert,
3
3
  GanttView,
4
4
  type GanttItemMoveRange,
5
5
  type GanttTask,
6
6
  type GanttZoom,
7
7
  } from "@multiplatform.one/components";
8
8
  import React, { useCallback, useMemo, useState, type ReactNode } from "react";
9
- import { Text, YStack, type YStackProps } from "tamagui";
9
+ import { YStack, type YStackProps } from "tamagui";
10
10
  import { useTranslation } from "react-i18next";
11
- import { formCommonColors } from "@multiplatform.one/forms";
12
11
  import {
13
12
  formatCalendarDate,
14
13
  parseCalendarDate,
@@ -18,6 +17,7 @@ import {
18
17
  import { FrappeConnectionIndicator } from "./FrappeConnectionIndicator";
19
18
  import { useFrappeConfig } from "./FrappeProvider";
20
19
  import { describeSyncError } from "./syncError";
20
+ import { useFrappeRows } from "./useFrappeRows";
21
21
  import { resolveFrappeEventColor } from "./frappeEventColor";
22
22
 
23
23
  export interface FrappeGanttProps<TDoc extends { name: string; doctype: string }> extends Omit<
@@ -113,16 +113,13 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
113
113
  const { knobProps } = useResolvedKnobs();
114
114
  const { t } = useTranslation();
115
115
  const [actionError, setActionError] = useState<Error | null>(null);
116
- // Honest error state: the collection swallows failed subscription fetches
117
- // (the chart would just look empty) — onSyncError reports them here.
118
- const [syncError, setSyncError] = useState<unknown>(null);
119
116
 
120
117
  const finalBaseURL = baseURL ?? config?.baseURL;
121
118
  const finalAuth = auth ?? config?.auth;
122
119
  const finalSyncOptions = syncOptions ?? config?.syncOptions;
123
120
 
124
- if (!finalBaseURL) {
125
- throw new Error("FrappeGantt requires baseURL prop or FrappeProvider with baseURL");
121
+ if (!finalBaseURL && !config?.fixtures) {
122
+ throw new Error("FrappeGantt requires baseURL prop or FrappeProvider with baseURL or fixtures");
126
123
  }
127
124
 
128
125
  // Ensure required fields are fetched
@@ -146,6 +143,7 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
146
143
  auth: finalAuth,
147
144
  syncOptions: finalSyncOptions,
148
145
  socketOptions: config?.socketOptions,
146
+ realtime: config?.realtime,
149
147
  fixtures: config?.fixtures,
150
148
  }),
151
149
  [
@@ -153,6 +151,7 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
153
151
  config?.socketPort,
154
152
  config?.siteName,
155
153
  config?.socketBaseURL,
154
+ config?.realtime,
156
155
  finalAuth,
157
156
  finalSyncOptions,
158
157
  config?.socketOptions,
@@ -160,25 +159,29 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
160
159
  ],
161
160
  );
162
161
 
163
- const collection = useFrappeCollection<TDoc>(connectionConfig, doctype, {
162
+ // The shared doctype read (MPO-251). `mapError` keeps this chart's own
163
+ // error copy (describeSyncError); real subscription failures still win over
164
+ // the generic isError flag inside the hook, because they carry an
165
+ // actionable message. `limit: null` keeps the bench's own page length.
166
+ const mapSyncError = useCallback(
167
+ (err: unknown) => new Error(describeSyncError(err, doctype, t)),
168
+ [doctype, t],
169
+ );
170
+ const {
171
+ rows: docs,
172
+ isQueryLoading: isLoading,
173
+ error: queryError,
174
+ collection,
175
+ } = useFrappeRows<TDoc>(connectionConfig, doctype, {
164
176
  fields: effectiveFields,
165
177
  filters,
166
- onSyncError: setSyncError,
178
+ limit: null,
179
+ mapError: mapSyncError,
180
+ messages: {
181
+ permission: t("You do not have permission to view {{doctype}}", { doctype }),
182
+ generic: t("Failed to load {{doctype}} tasks", { doctype }),
183
+ },
167
184
  });
168
- const {
169
- data: rawData,
170
- isLoading,
171
- isError,
172
- } = useLiveQuery((q) => (collection ? q.from({ _list: collection }) : null), [collection]);
173
- const docs = useMemo(() => (rawData as TDoc[] | undefined) ?? [], [rawData]);
174
- // Real subscription failures (permission-error, network, bad doctype) win
175
- // over the generic isError flag — they carry an actionable message.
176
- const queryError =
177
- syncError !== null && syncError !== undefined
178
- ? new Error(describeSyncError(syncError, doctype, t))
179
- : isError
180
- ? new Error(t("Failed to load {{doctype}} tasks", { doctype }))
181
- : null;
182
185
 
183
186
  // Scheme-aware palette for resolving NAMED doc colors (P-15 / LC-27):
184
187
  // Frappe's palette references ("blue", "Red") map to sanctioned solids per
@@ -253,23 +256,12 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
253
256
  <YStack {...knobProps.gap}>
254
257
  <FrappeConnectionIndicator config={connectionConfig} />
255
258
  {actionError ? (
256
- <YStack
257
- {...knobProps.panelPadding}
258
- {...knobProps.borderRadius}
259
- backgroundColor="$red2"
260
- borderColor="$red7"
261
- borderWidth={1}
262
- >
263
- <Text color={formCommonColors.error} {...knobProps.label}>
264
- {t("Action failed")}
265
- </Text>
266
- <Text color={formCommonColors.muted} {...knobProps.label}>
267
- {actionError.message}
268
- </Text>
269
- </YStack>
259
+ <Alert intent="error" title={t("Action failed")}>
260
+ {actionError.message}
261
+ </Alert>
270
262
  ) : null}
271
263
  <GanttView
272
- {...knobProps.borderRadius}
264
+ {...knobProps.containerRadius}
273
265
  tasks={tasks}
274
266
  zoom={zoom}
275
267
  isLoading={isLoading}
@@ -4,7 +4,7 @@ import { ImageSquareIcon } from "@phosphor-icons/react";
4
4
  import React, { useMemo } from "react";
5
5
  import { useTranslation } from "react-i18next";
6
6
  import { Spinner, formCommonColors } from "@multiplatform.one/forms";
7
- import { Image, Text, YStack, type YStackProps } from "tamagui";
7
+ import { Image, Text, YStack, useTheme, type YStackProps } from "tamagui";
8
8
  import { isServer } from "@multiplatform.one/platform";
9
9
  import { useResolvedKnobs } from "@multiplatform.one/theme";
10
10
  import { useFrappeConfig } from "./FrappeProvider";
@@ -167,6 +167,7 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
167
167
  syncOptions,
168
168
  ...stackProps
169
169
  }: FrappeImageViewProps<TDoc>) {
170
+ const theme = useTheme();
170
171
  const config = useFrappeConfig();
171
172
  const { knobProps } = useResolvedKnobs();
172
173
  const { t } = useTranslation();
@@ -190,6 +191,7 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
190
191
  socketBaseURL: config?.socketBaseURL,
191
192
  auth: finalAuth,
192
193
  syncOptions: finalSyncOptions,
194
+ realtime: config?.realtime,
193
195
  fixtures: config?.fixtures,
194
196
  }),
195
197
  [
@@ -197,6 +199,7 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
197
199
  config?.socketPort,
198
200
  config?.siteName,
199
201
  config?.socketBaseURL,
202
+ config?.realtime,
200
203
  finalAuth,
201
204
  finalSyncOptions,
202
205
  config?.fixtures,
@@ -271,7 +274,7 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
271
274
  const iconSize = Number(knobProps.controlIcon?.width) || 16;
272
275
  return (
273
276
  <YStack {...knobProps.panelPadding} alignItems="center" {...knobProps.gap} {...stackProps}>
274
- <ImageSquareIcon size={iconSize * 2} color={formCommonColors.muted} />
277
+ <ImageSquareIcon size={iconSize * 2} color={theme.color11?.val ?? "currentColor"} />
275
278
  <Text color={formCommonColors.muted} {...knobProps.body}>
276
279
  {t("No image field configured for {{doctype}}", { doctype })}
277
280
  </Text>
@@ -330,6 +333,7 @@ function FrappeImageCard({
330
333
  onItemClick?: (doc: Partial<unknown>) => void;
331
334
  knobProps: ReturnType<typeof useResolvedKnobs>["knobProps"];
332
335
  }) {
336
+ const theme = useTheme();
333
337
  const imageUrl = getImageUrl(doc[imageField], baseURL);
334
338
  const title = doc[titleField] || doc.name;
335
339
  const subtitle = subtitleField ? doc[subtitleField] : undefined;
@@ -369,7 +373,7 @@ function FrappeImageCard({
369
373
  alignItems="center"
370
374
  justifyContent="center"
371
375
  >
372
- <ImageSquareIcon size={iconSize * 2} color={formCommonColors.muted} />
376
+ <ImageSquareIcon size={iconSize * 2} color={theme.color11?.val ?? "currentColor"} />
373
377
  </YStack>
374
378
  )}
375
379
  <Card.Footer>
@@ -0,0 +1,128 @@
1
+ /**
2
+ * MPO-237: a `dataSource` with no `baseURL` in scope is a misconfiguration,
3
+ * not static mode. The card asked for a computed figure and there is nowhere
4
+ * to compute it, so `config.value` must never be painted as the KPI: a wrong
5
+ * number presented confidently is worse than a visible gap, because nothing
6
+ * downstream can tell it was never computed.
7
+ *
8
+ * Static mode (no `dataSource` at all) is the documented, intended path and
9
+ * is asserted here too, so the fix cannot over-correct into it.
10
+ */
11
+
12
+ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
13
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
14
+ import { cleanup, screen, waitFor } from "@testing-library/react";
15
+ import i18next from "i18next";
16
+ import { initReactI18next } from "react-i18next";
17
+ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
18
+ import { FrappeKPICard } from "./FrappeKPICard";
19
+ import { FrappeProvider } from "./FrappeProvider";
20
+ import { __resetFrappeDevWarnSeen } from "./shared/devWarn";
21
+
22
+ beforeAll(async () => {
23
+ await i18next.use(initReactI18next).init({
24
+ lng: "en",
25
+ interpolation: { escapeValue: false },
26
+ resources: { en: { translation: {} } },
27
+ });
28
+ });
29
+
30
+ beforeEach(() => {
31
+ __resetFrappeDevWarnSeen();
32
+ });
33
+
34
+ afterEach(() => {
35
+ cleanup();
36
+ vi.restoreAllMocks();
37
+ });
38
+
39
+ const config = { id: "open-todos", title: "Open ToDos", value: 999, format: "number" as const };
40
+
41
+ describe("FrappeKPICard with a dataSource and no baseURL (MPO-237)", () => {
42
+ it("does not render config.value as though it were the computed figure", () => {
43
+ vi.spyOn(console, "warn").mockImplementation(() => {});
44
+ renderWithProviders(<FrappeKPICard config={config} dataSource={{ doctype: "ToDo" }} />);
45
+
46
+ expect(screen.queryByText("999")).toBeNull();
47
+ expect(screen.getByText("Open ToDos is not configured")).toBeInTheDocument();
48
+ expect(screen.getByText(/no Frappe baseURL is in scope/)).toBeInTheDocument();
49
+ });
50
+
51
+ it("logs a development warning naming the missing baseURL", () => {
52
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
53
+ renderWithProviders(<FrappeKPICard config={config} dataSource={{ doctype: "ToDo" }} />);
54
+
55
+ const line = warn.mock.calls.map((call) => String(call[0])).join("\n");
56
+ expect(line).toContain("[frappe-ui] kpi-datasource-without-baseurl");
57
+ expect(line).toContain("baseURL");
58
+ expect(line).toContain("component=FrappeKPICard");
59
+ expect(line).toContain("id=open-todos");
60
+ expect(line).toContain("doctype=ToDo");
61
+ });
62
+
63
+ it("warns once per card, not once per render", () => {
64
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
65
+ const { rerender } = renderWithProviders(
66
+ <FrappeKPICard config={config} dataSource={{ doctype: "ToDo" }} />,
67
+ );
68
+ rerender(<FrappeKPICard config={{ ...config }} dataSource={{ doctype: "ToDo" }} />);
69
+ rerender(<FrappeKPICard config={{ ...config }} dataSource={{ doctype: "ToDo" }} />);
70
+
71
+ const lines = warn.mock.calls.filter((call) =>
72
+ String(call[0]).includes("kpi-datasource-without-baseurl"),
73
+ );
74
+ expect(lines).toHaveLength(1);
75
+ });
76
+
77
+ it("stays silent in production", () => {
78
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
79
+ const previous = process.env.NODE_ENV;
80
+ process.env.NODE_ENV = "production";
81
+ try {
82
+ renderWithProviders(<FrappeKPICard config={config} dataSource={{ doctype: "ToDo" }} />);
83
+ } finally {
84
+ process.env.NODE_ENV = previous;
85
+ }
86
+
87
+ expect(
88
+ warn.mock.calls.filter((call) => String(call[0]).includes("kpi-datasource-without-baseurl")),
89
+ ).toHaveLength(0);
90
+ });
91
+ });
92
+
93
+ describe("FrappeKPICard configured paths stay untouched (MPO-237)", () => {
94
+ it("renders config.value with no warning when no dataSource is set", () => {
95
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
96
+ renderWithProviders(<FrappeKPICard config={config} />);
97
+
98
+ expect(screen.getByText("999")).toBeInTheDocument();
99
+ expect(
100
+ warn.mock.calls.filter((call) => String(call[0]).includes("kpi-datasource-without-baseurl")),
101
+ ).toHaveLength(0);
102
+ });
103
+
104
+ it("computes the figure, and does not warn, when the provider supplies a baseURL", async () => {
105
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
106
+ renderWithProviders(
107
+ <FrappeProvider
108
+ baseURL="http://test"
109
+ fixtures={
110
+ new InMemoryFixtureProvider({
111
+ ToDo: [
112
+ { name: "TD-1", doctype: "ToDo", status: "Open" },
113
+ { name: "TD-2", doctype: "ToDo", status: "Open" },
114
+ ],
115
+ })
116
+ }
117
+ >
118
+ <FrappeKPICard config={config} dataSource={{ doctype: "ToDo" }} />
119
+ </FrappeProvider>,
120
+ );
121
+
122
+ await waitFor(() => expect(screen.getByText("2")).toBeInTheDocument());
123
+ expect(screen.queryByText("999")).toBeNull();
124
+ expect(
125
+ warn.mock.calls.filter((call) => String(call[0]).includes("kpi-datasource-without-baseurl")),
126
+ ).toHaveLength(0);
127
+ });
128
+ });
@@ -11,6 +11,12 @@
11
11
  * (permission failures called out explicitly), a subtle stale affordance
12
12
  * (the card dims while a post-event refetch is in flight), and "—" when the
13
13
  * aggregate has no result (e.g. avg over an empty set).
14
+ *
15
+ * A `dataSource` with no `baseURL` in scope (neither the prop nor a
16
+ * FrappeProvider) is a misconfiguration, not static mode: the caller asked
17
+ * for a computed figure and there is nowhere to compute it. The card renders
18
+ * the not-configured surface and warns in dev. It never falls back to
19
+ * `config.value`, which would present an uncomputed number as the KPI.
14
20
  */
15
21
  import {
16
22
  AsyncBoundary,
@@ -19,10 +25,11 @@ import {
19
25
  Skeleton,
20
26
  type KPICardConfig,
21
27
  } from "@multiplatform.one/components";
22
- import React, { useMemo } from "react";
28
+ import React, { useEffect, useMemo } from "react";
23
29
  import { useTranslation } from "react-i18next";
24
30
  import { type YStackProps } from "tamagui";
25
31
  import { useFrappeConfig } from "./FrappeProvider";
32
+ import { frappeDevWarn } from "./shared/devWarn";
26
33
  import {
27
34
  useFrappeAggregate,
28
35
  type FrappeAggregateConnection,
@@ -44,11 +51,13 @@ export interface FrappeKPIDataSource {
44
51
  export interface FrappeKPICardProps extends Omit<YStackProps, "children"> {
45
52
  /**
46
53
  * KPI chrome (title, format, trend, icon…). In live mode `value` is
47
- * overridden by the aggregate; in static mode it renders as-is.
54
+ * overridden by the aggregate; in static mode it renders as-is. With a
55
+ * `dataSource` and no `baseURL`, `value` is not rendered at all.
48
56
  */
49
57
  config: KPICardConfig;
50
58
  /** When set, the card's value goes live against this doctype. */
51
59
  dataSource?: FrappeKPIDataSource;
60
+ /** Falls back to the FrappeProvider's. Required whenever `dataSource` is set. */
52
61
  baseURL?: string;
53
62
  auth?: { useToken?: boolean; token?: string; type?: string };
54
63
  syncOptions?: unknown;
@@ -87,10 +96,23 @@ export function FrappeKPICard({
87
96
  socketBaseURL: providerConfig?.socketBaseURL,
88
97
  auth: auth ?? providerConfig?.auth,
89
98
  syncOptions: syncOptions ?? providerConfig?.syncOptions,
99
+ realtime: providerConfig?.realtime,
90
100
  fixtures: providerConfig?.fixtures,
91
101
  }
92
102
  : undefined;
93
103
 
104
+ const missingBaseURL = !!dataSource && !finalBaseURL;
105
+ const doctype = dataSource?.doctype;
106
+ useEffect(() => {
107
+ if (!missingBaseURL) return;
108
+ frappeDevWarn("kpi-datasource-without-baseurl", {
109
+ component: "FrappeKPICard",
110
+ id: config.id,
111
+ doctype,
112
+ suggest: "set baseURL on FrappeKPICard or on the FrappeProvider above it",
113
+ });
114
+ }, [missingBaseURL, config.id, doctype]);
115
+
94
116
  const { value, isLoading, isStale, error, isPermissionError } = useFrappeAggregate(connection, {
95
117
  doctype: dataSource?.doctype ?? "",
96
118
  aggregate: dataSource?.aggregate,
@@ -105,11 +127,30 @@ export function FrappeKPICard({
105
127
  return { ...config, value: value ?? "—" };
106
128
  }, [config, dataSource, value]);
107
129
 
108
- // Static passthrough — same component object semantics as before.
109
- if (!dataSource || !connection) {
130
+ // Static passthrough. The caller supplied the figure and asked for no
131
+ // computation.
132
+ if (!dataSource) {
110
133
  return <KPICard config={config} {...stackProps} />;
111
134
  }
112
135
 
136
+ // A requested figure with nowhere to compute it. `config.value` is the
137
+ // caller's placeholder, so painting it here would publish a number nothing
138
+ // downstream could tell was never computed.
139
+ if (!connection) {
140
+ return (
141
+ <AsyncBoundary
142
+ compact
143
+ error
144
+ errorTitle={t("{{title}} is not configured", { title: config.title })}
145
+ errorDescription={t(
146
+ "This card reads {{doctype}} live, but no Frappe baseURL is in scope, so the figure was never computed.",
147
+ { doctype: dataSource.doctype },
148
+ )}
149
+ {...stackProps}
150
+ />
151
+ );
152
+ }
153
+
113
154
  if (isLoading) {
114
155
  return <KPICardSkeleton {...stackProps} />;
115
156
  }
@@ -1,4 +1,3 @@
1
- import { useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
2
1
  import {
3
2
  Kanban,
4
3
  componentColors,
@@ -15,6 +14,7 @@ import { useResolvedKnobs } from "@multiplatform.one/theme";
15
14
  import { FrappeConnectionIndicator } from "./FrappeConnectionIndicator";
16
15
  import { useFrappeConfig } from "./FrappeProvider";
17
16
  import { describeSyncError } from "./syncError";
17
+ import { useFrappeRows } from "./useFrappeRows";
18
18
 
19
19
  /**
20
20
  * Configuration for a single Kanban column.
@@ -91,16 +91,15 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
91
91
  const { knobProps } = useResolvedKnobs();
92
92
  const { t } = useTranslation();
93
93
  const [actionError, setActionError] = useState<Error | null>(null);
94
- // Honest error state: the collection swallows failed subscription fetches
95
- // (board would just look empty) — onSyncError reports them here.
96
- const [syncError, setSyncError] = useState<unknown>(null);
97
94
 
98
95
  const finalBaseURL = baseURL ?? config?.baseURL;
99
96
  const finalAuth = auth ?? config?.auth;
100
97
  const finalSyncOptions = syncOptions ?? config?.syncOptions;
101
98
 
102
- if (!finalBaseURL) {
103
- throw new Error("FrappeKanban requires baseURL prop or FrappeProvider with baseURL");
99
+ if (!finalBaseURL && !config?.fixtures) {
100
+ throw new Error(
101
+ "FrappeKanban requires baseURL prop or FrappeProvider with baseURL or fixtures",
102
+ );
104
103
  }
105
104
 
106
105
  // Ensure required fields are fetched
@@ -123,6 +122,7 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
123
122
  auth: finalAuth,
124
123
  syncOptions: finalSyncOptions,
125
124
  socketOptions: config?.socketOptions,
125
+ realtime: config?.realtime,
126
126
  fixtures: config?.fixtures,
127
127
  }),
128
128
  [
@@ -130,6 +130,7 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
130
130
  config?.socketPort,
131
131
  config?.siteName,
132
132
  config?.socketBaseURL,
133
+ config?.realtime,
133
134
  finalAuth,
134
135
  finalSyncOptions,
135
136
  config?.socketOptions,
@@ -137,17 +138,25 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
137
138
  ],
138
139
  );
139
140
 
140
- const collection = useFrappeCollection<TDoc>(connectionConfig, doctype, {
141
+ // The shared doctype read (MPO-251). `mapError` keeps this board's own
142
+ // error copy (describeSyncError) rather than the hook's default shape, and
143
+ // `limit: null` keeps the bench's own page length.
144
+ const mapSyncError = useCallback(
145
+ (err: unknown) => new Error(describeSyncError(err, doctype, t)),
146
+ [doctype, t],
147
+ );
148
+ const {
149
+ rows: cards,
150
+ isQueryLoading: isLoading,
151
+ isError,
152
+ syncError,
153
+ collection,
154
+ } = useFrappeRows<TDoc>(connectionConfig, doctype, {
141
155
  fields: effectiveFields,
142
156
  filters,
143
- onSyncError: setSyncError,
157
+ limit: null,
158
+ mapError: mapSyncError,
144
159
  });
145
- const {
146
- data: rawData,
147
- isLoading,
148
- isError,
149
- } = useLiveQuery((q) => (collection ? q.from({ _list: collection }) : null), [collection]);
150
- const cards = useMemo(() => (rawData as TDoc[] | undefined) ?? [], [rawData]);
151
160
 
152
161
  // Group cards by status into generic KanbanColumn format.
153
162
  // Cards with an unknown status land in an "Unassigned" column so they
@@ -284,9 +293,9 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
284
293
  // Real subscription failure (permission-error, network, bad doctype)
285
294
  // reported by the collection via onSyncError — honest error UI instead of
286
295
  // an empty board. The `error` render prop stays the consumer override.
287
- const boardError = syncError != null ? describeSyncError(syncError, doctype, t) : null;
288
- if (boardError && error) {
289
- return <>{error(new Error(boardError))}</>;
296
+ const boardError = syncError ? syncError.message : null;
297
+ if (syncError && error) {
298
+ return <>{error(syncError)}</>;
290
299
  }
291
300
 
292
301
  // Opt-in query error panel via `error` prop. Empty/fixture-less collections
@@ -131,6 +131,7 @@ function FrappeLikedByBody({
131
131
  socketBaseURL: config.socketBaseURL,
132
132
  auth: config.auth,
133
133
  syncOptions: config.syncOptions,
134
+ realtime: config.realtime,
134
135
  fixtures: config.fixtures,
135
136
  }
136
137
  : undefined,
@@ -167,7 +168,7 @@ function FrappeLikedByBody({
167
168
 
168
169
  const http = useMemo(
169
170
  () =>
170
- config && !config.fixtures
171
+ config?.baseURL && !config.fixtures
171
172
  ? new HttpClient(
172
173
  config.baseURL,
173
174
  config.auth as Parameters<typeof HttpClient.prototype.updateAuth>[0],
@@ -51,8 +51,9 @@ export function FrappeList<TDoc extends { name: string; doctype: string }>({
51
51
  const finalAuth = auth ?? config?.auth;
52
52
  const finalSyncOptions = syncOptions ?? config?.syncOptions;
53
53
 
54
- if (!finalBaseURL) {
55
- throw new Error("FrappeList requires baseURL prop or FrappeProvider with baseURL");
54
+ // Fixtures answer every read locally, so they stand in for a baseURL.
55
+ if (!finalBaseURL && !config?.fixtures) {
56
+ throw new Error("FrappeList requires baseURL prop or FrappeProvider with baseURL or fixtures");
56
57
  }
57
58
 
58
59
  const connectionConfig = useMemo(
@@ -63,6 +64,7 @@ export function FrappeList<TDoc extends { name: string; doctype: string }>({
63
64
  socketBaseURL: config?.socketBaseURL,
64
65
  auth: finalAuth,
65
66
  syncOptions: finalSyncOptions,
67
+ realtime: config?.realtime,
66
68
  fixtures: config?.fixtures,
67
69
  }),
68
70
  [
@@ -70,6 +72,7 @@ export function FrappeList<TDoc extends { name: string; doctype: string }>({
70
72
  config?.socketPort,
71
73
  config?.siteName,
72
74
  config?.socketBaseURL,
75
+ config?.realtime,
73
76
  finalAuth,
74
77
  finalSyncOptions,
75
78
  config?.fixtures,
@@ -149,6 +149,7 @@ export function FrappeListView<TDoc extends { name: string; doctype: string }>({
149
149
  socketBaseURL: config?.socketBaseURL,
150
150
  auth: finalAuth,
151
151
  syncOptions: finalSyncOptions,
152
+ realtime: config?.realtime,
152
153
  fixtures: config?.fixtures,
153
154
  };
154
155