@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
@@ -0,0 +1,73 @@
1
+ /**
2
+ * SliderField contract specs. The adapter wraps a scalar number as the
3
+ * forms Slider's `[number]` tuple. Pin that value, onChange, disabled,
4
+ * label and error survive the hop.
5
+ */
6
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
7
+ import { cleanup, fireEvent } from "@testing-library/react";
8
+ import type React from "react";
9
+ import { afterEach, describe, expect, it, vi } from "vitest";
10
+ import { getFieldComponent, type FieldRenderProps } from "../../fieldRegistry";
11
+ import { SliderField } from ".";
12
+
13
+ afterEach(cleanup);
14
+
15
+ const thumb = (container: HTMLElement) =>
16
+ container.querySelector('[role="slider"]') as HTMLElement | null;
17
+
18
+ describe("SliderField composes the forms Slider", () => {
19
+ it("paints a controlled value onto the thumb", () => {
20
+ const result = renderWithProviders(
21
+ <SliderField label="Volume" value={40} min={0} max={100} onChange={() => {}} />,
22
+ );
23
+ expect(thumb(result.container)?.getAttribute("aria-valuenow")).toBe("40");
24
+ });
25
+
26
+ it("emits a scalar through canonical onChange", () => {
27
+ const onChange = vi.fn();
28
+ const result = renderWithProviders(
29
+ <SliderField label="Volume" value={40} min={0} max={100} step={1} onChange={onChange} />,
30
+ );
31
+ const el = thumb(result.container) as HTMLElement;
32
+ el.focus();
33
+ fireEvent.keyDown(el, { key: "ArrowRight" });
34
+ expect(onChange).toHaveBeenCalled();
35
+ expect(typeof onChange.mock.calls.at(-1)?.[0]).toBe("number");
36
+ });
37
+
38
+ it("forwards disabled onto the thumb", () => {
39
+ const result = renderWithProviders(
40
+ <SliderField label="Volume" value={40} disabled onChange={() => {}} />,
41
+ );
42
+ const el = thumb(result.container);
43
+ const disabledMarker =
44
+ el?.getAttribute("aria-disabled") === "true" ||
45
+ el?.hasAttribute("data-disabled") ||
46
+ Boolean(el?.closest("[data-disabled]"));
47
+ expect(disabledMarker).toBe(true);
48
+ });
49
+
50
+ it("shows the label and error", () => {
51
+ const result = renderWithProviders(
52
+ <SliderField label="Volume" value={40} error="out of range" onChange={() => {}} />,
53
+ );
54
+ expect(result.container.textContent).toContain("Volume");
55
+ expect(result.container.textContent).toContain("out of range");
56
+ });
57
+ });
58
+
59
+ describe("registry resolution (Slider fieldtype)", () => {
60
+ function propsFor(overrides: Partial<FieldRenderProps> = {}): FieldRenderProps {
61
+ return { value: "", onChange: () => {}, ...overrides };
62
+ }
63
+
64
+ it("resolves 'Slider' to SliderField and coerces a non-number to 0", () => {
65
+ const Component = getFieldComponent("Slider")!;
66
+ const element = (Component as Function)(
67
+ propsFor({ value: "nope", label: "Volume" }),
68
+ ) as React.ReactElement<Record<string, unknown>>;
69
+ expect(element.type).toBe(SliderField);
70
+ expect(element.props.value).toBe(0);
71
+ expect(element.props.label).toBe("Volume");
72
+ });
73
+ });
@@ -0,0 +1,65 @@
1
+ /**
2
+ * SwitchField contract specs. Frappe Switch is 1/0 in the doc; this adapter
3
+ * maps that onto the forms Switch's boolean checked/onCheckedChange. Pin
4
+ * that value, onChange, disabled, label and error survive the hop.
5
+ */
6
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
7
+ import { act, cleanup, fireEvent } from "@testing-library/react";
8
+ import type React from "react";
9
+ import { afterEach, describe, expect, it, vi } from "vitest";
10
+ import { getFieldComponent, type FieldRenderProps } from "../../fieldRegistry";
11
+ import { SwitchField } from ".";
12
+
13
+ afterEach(cleanup);
14
+
15
+ describe("SwitchField composes the forms Switch", () => {
16
+ it("paints a controlled true value as aria-checked=true", () => {
17
+ const result = renderWithProviders(
18
+ <SwitchField label="Enabled" value={true} onChange={() => {}} />,
19
+ );
20
+ expect(result.getSwitch()?.getAttribute("aria-checked")).toBe("true");
21
+ });
22
+
23
+ it("emits a boolean through canonical onChange", async () => {
24
+ const onChange = vi.fn();
25
+ const result = renderWithProviders(
26
+ <SwitchField label="Enabled" value={false} onChange={onChange} />,
27
+ );
28
+ await act(async () => {
29
+ fireEvent.click(result.getSwitch() as HTMLElement);
30
+ });
31
+ expect(onChange).toHaveBeenCalledWith(true);
32
+ });
33
+
34
+ it("forwards disabled onto the switch", () => {
35
+ const result = renderWithProviders(
36
+ <SwitchField label="Enabled" value={false} disabled onChange={() => {}} />,
37
+ );
38
+ const el = result.getSwitch();
39
+ expect(el?.hasAttribute("disabled") || el?.getAttribute("aria-disabled") === "true").toBe(true);
40
+ });
41
+
42
+ it("shows the label and error", () => {
43
+ const result = renderWithProviders(
44
+ <SwitchField label="Enabled" value={false} error="cannot enable" onChange={() => {}} />,
45
+ );
46
+ expect(result.container.textContent).toContain("Enabled");
47
+ expect(result.container.textContent).toContain("cannot enable");
48
+ });
49
+ });
50
+
51
+ describe("registry resolution (Switch fieldtype)", () => {
52
+ function propsFor(overrides: Partial<FieldRenderProps> = {}): FieldRenderProps {
53
+ return { value: "", onChange: () => {}, ...overrides };
54
+ }
55
+
56
+ it("resolves 'Switch' to SwitchField and maps a truthy doc value to true", () => {
57
+ const Component = getFieldComponent("Switch")!;
58
+ const element = (Component as Function)(
59
+ propsFor({ value: 1, label: "Enabled" }),
60
+ ) as React.ReactElement<Record<string, unknown>>;
61
+ expect(element.type).toBe(SwitchField);
62
+ expect(element.props.value).toBe(true);
63
+ expect(element.props.label).toBe("Enabled");
64
+ });
65
+ });
@@ -69,6 +69,7 @@ export function TableMultiSelect({
69
69
  socketBaseURL: config?.socketBaseURL,
70
70
  auth: auth ?? config?.auth,
71
71
  syncOptions: config?.syncOptions,
72
+ realtime: config?.realtime,
72
73
  fixtures: config?.fixtures,
73
74
  }
74
75
  : undefined;
@@ -51,11 +51,10 @@ describe("TextEditor initialization emissions", () => {
51
51
  await waitFor(() => {
52
52
  expect(utils.container.querySelector(".ProseMirror")).toBeTruthy();
53
53
  });
54
- // House RichTextEditor seeds via initialContent (mount). External HTML
55
- // sync is the house editor's contract, not a forked TipTap in this wrapper.
54
+ // An external update changes the actual document without echoing an edit.
56
55
  utils.rerender(<TextEditor label="Description" value="<p>second</p>" onChange={onChange} />);
57
56
  await waitFor(() => {
58
- expect(utils.container.querySelector(".ProseMirror")).toBeTruthy();
57
+ expect(utils.container.querySelector(".ProseMirror")?.textContent).toBe("second");
59
58
  });
60
59
  expect(onChange).not.toHaveBeenCalled();
61
60
  });
@@ -1,7 +1,8 @@
1
1
  import { action } from "@multiplatform.one/storybook";
2
+ import { Button } from "@multiplatform.one/forms";
2
3
  import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
3
4
  import { useState } from "react";
4
- import { YStack } from "tamagui";
5
+ import { Text, YStack } from "tamagui";
5
6
  import { fieldtypeToTableField } from "../../fieldRegistry";
6
7
  import { FrappeStoryProvider } from "../../frappeStoryTarget";
7
8
  import { TextEditor, type TextEditorProps } from ".";
@@ -51,6 +52,35 @@ Main.args = {
51
52
  } as Partial<StoryProps>;
52
53
  Main.storyName = "Main";
53
54
 
55
+ export const ExternalValueUpdates = {
56
+ name: "External value updates",
57
+ render: function ExternalValueUpdatesStory() {
58
+ const [value, setValue] = useState("<p>Original note</p>");
59
+ const [edits, setEdits] = useState(0);
60
+ return (
61
+ <YStack gap="$3" maxWidth={640}>
62
+ <TextEditor
63
+ label="Note"
64
+ value={value}
65
+ onChange={(next) => {
66
+ setValue(next);
67
+ setEdits((count) => count + 1);
68
+ }}
69
+ />
70
+ <Button
71
+ onPress={() => {
72
+ setEdits(0);
73
+ setValue("<p>Saved note</p>");
74
+ }}
75
+ >
76
+ Load saved note
77
+ </Button>
78
+ <Text testID="editor-user-edits">User edits: {edits}</Text>
79
+ </YStack>
80
+ );
81
+ },
82
+ };
83
+
54
84
  export const Empty = (args: StoryProps) => <Controlled {...args} />;
55
85
  Empty.args = {
56
86
  label: "Empty editor",
@@ -0,0 +1,110 @@
1
+ /**
2
+ * ToggleGroupField contract specs. The adapter maps `onChange` onto the forms
3
+ * ToggleGroup's `onValueChange`. Pin that value, onChange, disabled, label
4
+ * and error survive the hop.
5
+ */
6
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
7
+ import { cleanup, fireEvent } from "@testing-library/react";
8
+ import type React from "react";
9
+ import { afterEach, describe, expect, it, vi } from "vitest";
10
+ import { getFieldComponent, type FieldRenderProps } from "../../fieldRegistry";
11
+ import { ToggleGroupField } from ".";
12
+
13
+ afterEach(cleanup);
14
+
15
+ const options = [
16
+ { label: "Left", value: "left" },
17
+ { label: "Center", value: "center" },
18
+ { label: "Right", value: "right" },
19
+ ];
20
+
21
+ describe("ToggleGroupField composes the forms ToggleGroup", () => {
22
+ it("paints a controlled value onto the matching item", () => {
23
+ const result = renderWithProviders(
24
+ <ToggleGroupField
25
+ label="Align"
26
+ type="single"
27
+ value="center"
28
+ options={options}
29
+ onChange={() => {}}
30
+ />,
31
+ );
32
+ expect(result.container.textContent).toContain("Center");
33
+ const pressed = result.container.querySelector('[aria-pressed="true"], [data-state="on"]');
34
+ expect(pressed).toBeTruthy();
35
+ });
36
+
37
+ it("emits the item value through canonical onChange", () => {
38
+ const onChange = vi.fn();
39
+ const result = renderWithProviders(
40
+ <ToggleGroupField
41
+ label="Align"
42
+ type="single"
43
+ value="left"
44
+ options={options}
45
+ onChange={onChange}
46
+ />,
47
+ );
48
+ const center = result.findTextElement("Center");
49
+ expect(center).toBeTruthy();
50
+ fireEvent.click(center as HTMLElement);
51
+ expect(onChange).toHaveBeenCalledWith("center");
52
+ });
53
+
54
+ it("forwards disabled onto the group", () => {
55
+ const result = renderWithProviders(
56
+ <ToggleGroupField
57
+ label="Align"
58
+ type="single"
59
+ value="left"
60
+ options={options}
61
+ disabled
62
+ onChange={() => {}}
63
+ />,
64
+ );
65
+ const el =
66
+ result.container.querySelector('[role="group"]') ||
67
+ result.container.querySelector('[data-disabled="true"]') ||
68
+ result.container.querySelector("[disabled]");
69
+ expect(el).toBeTruthy();
70
+ });
71
+
72
+ it("shows the label and error", () => {
73
+ const result = renderWithProviders(
74
+ <ToggleGroupField
75
+ label="Align"
76
+ type="single"
77
+ value="left"
78
+ options={options}
79
+ error="pick a side"
80
+ onChange={() => {}}
81
+ />,
82
+ );
83
+ expect(result.container.textContent).toContain("Align");
84
+ expect(result.container.textContent).toContain("pick a side");
85
+ });
86
+ });
87
+
88
+ describe("registry resolution (Toggle Group fieldtype)", () => {
89
+ function propsFor(overrides: Partial<FieldRenderProps> = {}): FieldRenderProps {
90
+ return { value: "", onChange: () => {}, ...overrides };
91
+ }
92
+
93
+ it("resolves 'Toggle Group' to ToggleGroupField and splits df.options on newlines", () => {
94
+ const Component = getFieldComponent("Toggle Group")!;
95
+ const element = (Component as Function)(
96
+ propsFor({
97
+ value: "Left",
98
+ label: "Align",
99
+ fieldMeta: { options: "Left\nCenter" },
100
+ } as Partial<FieldRenderProps>),
101
+ ) as React.ReactElement<Record<string, unknown>>;
102
+ expect(element.type).toBe(ToggleGroupField);
103
+ expect(element.props.value).toBe("Left");
104
+ expect(element.props.label).toBe("Align");
105
+ expect(element.props.options).toEqual([
106
+ { label: "Left", value: "Left" },
107
+ { label: "Center", value: "Center" },
108
+ ]);
109
+ });
110
+ });
@@ -36,6 +36,8 @@ import type { FixtureProvider } from "@multiplatform.one/frappe";
36
36
  */
37
37
  export interface FrappeConnection {
38
38
  baseURL: string;
39
+ /** False keeps HTTP reads without realtime subscriptions. */
40
+ realtime?: boolean;
39
41
  socketPort?: number;
40
42
  /** Same-origin socket override (see FrappeConfig.socketBaseURL). */
41
43
  socketBaseURL?: string;
@@ -65,6 +65,7 @@ export function useFrappeUsers(
65
65
  socketBaseURL: config.socketBaseURL,
66
66
  auth: config.auth,
67
67
  syncOptions: config.syncOptions,
68
+ realtime: config.realtime,
68
69
  fixtures: config.fixtures,
69
70
  }
70
71
  : undefined,
@@ -55,14 +55,15 @@ describe("Frappe view adapters — design-law 100%", () => {
55
55
  expect(source).toMatch(/from "@multiplatform.one\/components"/);
56
56
  });
57
57
 
58
- it("FrappeGantt action banners use form ramps and do not steal Desk assembly", () => {
58
+ it("FrappeGantt action errors use Alert and keep the adapter boundary", () => {
59
59
  const source = read("FrappeGantt.tsx");
60
- expect(source).toContain("formCommonColors");
60
+ expect(source).toMatch(/import \{[^}]*Alert[^}]*\} from "@multiplatform.one\/components"/);
61
+ expect(source).toMatch(/<Alert\b[^>]*intent="error"/);
61
62
  expect(source).toContain("containerRadius");
63
+ expect(source).not.toContain("knobProps.borderRadius");
62
64
  expect(source).not.toMatch(/fontSize=\{knobProps\.sizeToken\}/);
63
- expect(source).not.toContain('color="$red11"');
64
- expect(source).toContain("BACKOFFICE_VIEWS");
65
- expect(source).toContain("MPO-14");
65
+ expect(source).not.toMatch(/\$red\d+/);
66
+ expect(source).not.toMatch(/from ["'](?:@multiplatform\.one\/backoffice|\.\/desk\/)/);
66
67
  });
67
68
 
68
69
  it("FrappeReportView uses the house Button and label fragments (LC-54)", () => {
@@ -81,12 +82,15 @@ describe("Frappe view adapters — design-law 100%", () => {
81
82
  expect(source).toContain("formCommonColors");
82
83
  expect(source).not.toMatch(/fontWeight="600"|fontWeight="500"/);
83
84
  expect(source).toContain('fontWeight="400"');
84
- expect(source).toContain("outlined");
85
+ expect(source).not.toMatch(/<Button\b[^>]*\b(?:controlFill|backgroundColor|borderColor)=/);
85
86
  });
86
87
 
87
88
  it("FrappeTreeView empty chrome is EmptyState and labels use the label fragment", () => {
88
89
  const source = read("FrappeTreeView.tsx");
89
- expect(source).toContain("EmptyState");
90
+ expect(source).toMatch(/import \{[^}]*EmptyState[^}]*\} from "@multiplatform.one\/components"/);
91
+ expect(source).toContain("<EmptyState");
92
+ expect(source).toContain("useGlyphColor(formCommonColors.muted)");
93
+ expect(source).not.toMatch(/<TreeStructureIcon\b[^>]*color=\{formCommonColors\./);
90
94
  expect(source).not.toMatch(/size=\{48\}/);
91
95
  expect(source).toContain("knobProps.label");
92
96
  expect(source).not.toMatch(/fontSize=\{display === "compressed" \? 12 : 14\}/);
package/src/index.ts CHANGED
@@ -120,6 +120,19 @@ export {
120
120
  type FrappeChartDataSource,
121
121
  } from "./FrappeChartCard";
122
122
 
123
+ // The composed doctype read (MPO-251) — the supported way to get rows out of
124
+ // a doctype when the panel shape has no shipped component. FrappeTable and
125
+ // the other live views read through it, so there is one implementation.
126
+ export {
127
+ useFrappeRows,
128
+ useFrappeConnection,
129
+ DEFAULT_FRAPPE_ROWS_LIMIT,
130
+ type FrappeRowsConnection,
131
+ type FrappeRowsMessages,
132
+ type UseFrappeRowsOptions,
133
+ type UseFrappeRowsResult,
134
+ } from "./useFrappeRows";
135
+
123
136
  export {
124
137
  useFrappeAggregate,
125
138
  type FrappeAggregateConnection,
@@ -17,9 +17,10 @@ import {
17
17
  type RequiredMarkStrategy,
18
18
  } from "@multiplatform.one/forms";
19
19
  import { useResolvedKnobs } from "@multiplatform.one/theme";
20
+ import { Card } from "@multiplatform.one/components";
20
21
  import React, { useMemo } from "react";
21
22
  import { useTranslation } from "react-i18next";
22
- import { Card, Text, XStack, YStack } from "tamagui";
23
+ import { Text, XStack, YStack } from "tamagui";
23
24
 
24
25
  import { compileDependsOn } from "../dependsOn";
25
26
  import { Heading, type HeadingLevel } from "../fields/Heading";
@@ -353,13 +354,12 @@ function SchemaFormSectionCard({ section, headingLevel, renderField }: SchemaFor
353
354
 
354
355
  return (
355
356
  <Card
356
- borderWidth={hideBorder ? 0 : 1}
357
- borderColor="$borderColor"
358
- size={knobProps.sizeToken}
359
- backgroundColor={hideBorder ? "transparent" : undefined}
357
+ data-mpo-schema-form-card=""
358
+ data-mpo-schema-form-borderless={hideBorder ? "" : undefined}
359
+ {...(hideBorder ? { borderWidth: 0, backgroundColor: "transparent" } : {})}
360
360
  >
361
361
  {(section.label || section.description) && (
362
- <Card.Header {...knobProps.panelPadding}>
362
+ <Card.Header>
363
363
  {section.label ? (
364
364
  <Heading
365
365
  label={section.label}
@@ -380,7 +380,6 @@ function SchemaFormSectionCard({ section, headingLevel, renderField }: SchemaFor
380
380
  {/* Kept mounted while collapsed (display none) so field state and the
381
381
  collapse target survive toggles — matches desk's CSS hide. */}
382
382
  <Card.Footer
383
- {...knobProps.panelPadding}
384
383
  display={effectiveCollapsed ? "none" : undefined}
385
384
  aria-hidden={effectiveCollapsed || undefined}
386
385
  >
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Package-local DEV guardrails for frappe-ui, warned under a `[frappe-ui]`
3
+ * prefix.
4
+ *
5
+ * The canonical catalog is `devWarn` in `@multiplatform.one/theme`, whose
6
+ * `DevWarnCode` union is closed over design-guardrail codes. Live-data
7
+ * misconfiguration is a frappe-ui concern rather than a design-law one, so
8
+ * it warns from here, the same way AsyncBoundary keeps its own.
9
+ *
10
+ * No-ops when `NODE_ENV === "production"`, and each key warns once per
11
+ * process so a re-render never repeats a line.
12
+ */
13
+
14
+ export type FrappeDevWarnCode = "kpi-datasource-without-baseurl";
15
+
16
+ export type FrappeDevWarnDetail = {
17
+ component?: string;
18
+ id?: string;
19
+ doctype?: string;
20
+ suggest?: string;
21
+ };
22
+
23
+ const seen = new Set<string>();
24
+
25
+ export function frappeDevWarn(code: FrappeDevWarnCode, detail: FrappeDevWarnDetail = {}): void {
26
+ if (process.env.NODE_ENV === "production") return;
27
+ const key = [code, detail.component ?? "", detail.id ?? "", detail.doctype ?? ""].join(":");
28
+ if (seen.has(key)) return;
29
+ seen.add(key);
30
+ const bits = [
31
+ detail.component ? `component=${detail.component}` : undefined,
32
+ detail.id ? `id=${detail.id}` : undefined,
33
+ detail.doctype ? `doctype=${detail.doctype}` : undefined,
34
+ detail.suggest ? `suggest=${detail.suggest}` : undefined,
35
+ ].filter(Boolean);
36
+ console.warn(`[frappe-ui] ${code}${bits.length ? ` (${bits.join(", ")})` : ""}`);
37
+ }
38
+
39
+ /** @internal test helper */
40
+ export function __resetFrappeDevWarnSeen(): void {
41
+ seen.clear();
42
+ }
@@ -41,7 +41,10 @@ export type FrappeAggregateOperation = "count" | "sum" | "avg" | "min" | "max";
41
41
 
42
42
  /** Connection shape shared with the other frappe-ui widgets. */
43
43
  export interface FrappeAggregateConnection {
44
- baseURL: string;
44
+ /** Required unless `fixtures` is set (see FrappeConfig.baseURL). */
45
+ baseURL?: string;
46
+ /** False keeps HTTP reads without realtime subscriptions. */
47
+ realtime?: boolean;
45
48
  socketPort?: number;
46
49
  /** Same-origin socket override (see FrappeConfig.socketBaseURL). */
47
50
  socketBaseURL?: string;
@@ -95,18 +98,18 @@ const DEFAULT_DEBOUNCE_MS = 300;
95
98
  // One REST client per connection — widgets sharing a bench share it.
96
99
  const dbCache = new Map<string, DbModule>();
97
100
 
98
- function getDb(connection: FrappeAggregateConnection): DbModule {
99
- const key = `${connection.baseURL}:${connection.auth?.token ?? ""}:${connection.auth?.type ?? ""}`;
101
+ function getDb(baseURL: string, auth: FrappeAggregateConnection["auth"]): DbModule {
102
+ const key = `${baseURL}:${auth?.token ?? ""}:${auth?.type ?? ""}`;
100
103
  let db = dbCache.get(key);
101
104
  if (!db) {
102
- const authConfig: AuthConfig | undefined = connection.auth
105
+ const authConfig: AuthConfig | undefined = auth
103
106
  ? {
104
- useToken: connection.auth.useToken,
105
- token: connection.auth.token,
106
- type: connection.auth.type as AuthConfig["type"],
107
+ useToken: auth.useToken,
108
+ token: auth.token,
109
+ type: auth.type as AuthConfig["type"],
107
110
  }
108
111
  : undefined;
109
- db = new DbModule(new HttpClient(connection.baseURL, authConfig));
112
+ db = new DbModule(new HttpClient(baseURL, authConfig));
110
113
  dbCache.set(key, db);
111
114
  }
112
115
  return db;
@@ -269,9 +272,14 @@ export function useFrappeAggregate(
269
272
  if (!conn || !currentSpec.doctype) return;
270
273
  const seq = ++fetchSeq.current;
271
274
  try {
272
- const result = conn.fixtures
273
- ? await fetchFixtureAggregate(conn.fixtures, currentSpec)
274
- : await fetchLiveAggregate(getDb(conn), currentSpec);
275
+ let result: AggregateData;
276
+ if (conn.fixtures) {
277
+ result = await fetchFixtureAggregate(conn.fixtures, currentSpec);
278
+ } else if (conn.baseURL) {
279
+ result = await fetchLiveAggregate(getDb(conn.baseURL, conn.auth), currentSpec);
280
+ } else {
281
+ throw new Error("useFrappeAggregate requires a connection with baseURL or fixtures");
282
+ }
275
283
  if (seq !== fetchSeq.current) return; // stale response — a newer fetch won
276
284
  setData(result);
277
285
  setError(undefined);
@@ -78,7 +78,8 @@ export interface FrappeFacetState {
78
78
 
79
79
  /** Connection shape shared with the other frappe-ui widgets. */
80
80
  export interface FrappeFacetsConnection {
81
- baseURL: string;
81
+ /** Required unless `fixtures` is set (see FrappeConfig.baseURL). */
82
+ baseURL?: string;
82
83
  auth?: { useToken?: boolean; token?: string | (() => string | Promise<string>); type?: string };
83
84
  fixtures?: FixtureProvider;
84
85
  }
@@ -169,18 +170,18 @@ export function scrubUserFacetRows(
169
170
  // One RPC client per connection — facets sharing a bench share it.
170
171
  const callCache = new Map<string, CallModule>();
171
172
 
172
- function getCall(connection: FrappeFacetsConnection): CallModule {
173
- const key = `${connection.baseURL}:${connection.auth?.token ?? ""}:${connection.auth?.type ?? ""}`;
173
+ function getCall(baseURL: string, auth: FrappeFacetsConnection["auth"]): CallModule {
174
+ const key = `${baseURL}:${auth?.token ?? ""}:${auth?.type ?? ""}`;
174
175
  let call = callCache.get(key);
175
176
  if (!call) {
176
- const authConfig: AuthConfig | undefined = connection.auth
177
+ const authConfig: AuthConfig | undefined = auth
177
178
  ? {
178
- useToken: connection.auth.useToken,
179
- token: connection.auth.token,
180
- type: connection.auth.type as AuthConfig["type"],
179
+ useToken: auth.useToken,
180
+ token: auth.token,
181
+ type: auth.type as AuthConfig["type"],
181
182
  }
182
183
  : undefined;
183
- call = new CallModule(new HttpClient(connection.baseURL, authConfig));
184
+ call = new CallModule(new HttpClient(baseURL, authConfig));
184
185
  callCache.set(key, call);
185
186
  }
186
187
  return call;
@@ -439,7 +440,9 @@ export function useFrappeFacets(
439
440
  useEffect(() => {
440
441
  if (!enabled) return;
441
442
  const conn = connectionRef.current;
442
- if (!conn) return;
443
+ // Neither a corpus nor a bench can answer, so stay idle instead of
444
+ // entering a loading state nothing will ever resolve.
445
+ if (!conn || (!conn.fixtures && !conn.baseURL)) return;
443
446
  const seq = ++fetchSeq.current;
444
447
  const activeFilters = JSON.parse(filtersKey) as FrappeFacetFilters;
445
448
 
@@ -525,7 +528,11 @@ export function useFrappeFacets(
525
528
  return;
526
529
  }
527
530
 
528
- const call = getCall(conn);
531
+ // Narrowing only: the guard at the top of the effect already returned
532
+ // when neither a corpus nor a baseURL is configured.
533
+ if (!conn.baseURL) return;
534
+
535
+ const call = getCall(conn.baseURL, conn.auth);
529
536
  fetchGroupByCount(call, doctype, filtersExcludingField(activeFilters, "_assign"), "assigned_to")
530
537
  .then((rows) => done("assigned", rows))
531
538
  .catch((error) => fail("assigned", error));