@multiplatform.one/frappe-ui 6.6.0 → 7.0.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 (516) hide show
  1. package/dist/cjs/FrappeAssignment.cjs +2 -0
  2. package/dist/cjs/FrappeAssignment.native.js +2 -0
  3. package/dist/cjs/FrappeAssignment.native.js.map +1 -1
  4. package/dist/cjs/FrappeCalendar.cjs +5 -7
  5. package/dist/cjs/FrappeCalendar.native.js +5 -9
  6. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  7. package/dist/cjs/FrappeChartCard.cjs +2 -0
  8. package/dist/cjs/FrappeChartCard.native.js +2 -0
  9. package/dist/cjs/FrappeChartCard.native.js.map +1 -1
  10. package/dist/cjs/FrappeDashboard.cjs +11 -22
  11. package/dist/cjs/FrappeDashboard.native.js +20 -22
  12. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  13. package/dist/cjs/FrappeForm.cjs +3 -1
  14. package/dist/cjs/FrappeForm.native.js +3 -1
  15. package/dist/cjs/FrappeForm.native.js.map +1 -1
  16. package/dist/cjs/FrappeGantt.cjs +5 -7
  17. package/dist/cjs/FrappeGantt.native.js +5 -9
  18. package/dist/cjs/FrappeGantt.native.js.map +1 -1
  19. package/dist/cjs/FrappeImageView.cjs +3 -1
  20. package/dist/cjs/FrappeImageView.native.js +3 -1
  21. package/dist/cjs/FrappeImageView.native.js.map +1 -1
  22. package/dist/cjs/FrappeKPICard.cjs +2 -0
  23. package/dist/cjs/FrappeKPICard.native.js +2 -0
  24. package/dist/cjs/FrappeKPICard.native.js.map +1 -1
  25. package/dist/cjs/FrappeKanban.cjs +3 -1
  26. package/dist/cjs/FrappeKanban.native.js +3 -1
  27. package/dist/cjs/FrappeKanban.native.js.map +1 -1
  28. package/dist/cjs/FrappeLikedBy.cjs +2 -0
  29. package/dist/cjs/FrappeLikedBy.native.js +2 -0
  30. package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
  31. package/dist/cjs/FrappeList.cjs +3 -1
  32. package/dist/cjs/FrappeList.native.js +3 -1
  33. package/dist/cjs/FrappeList.native.js.map +1 -1
  34. package/dist/cjs/FrappeListView.cjs +6 -12
  35. package/dist/cjs/FrappeListView.native.js +13 -12
  36. package/dist/cjs/FrappeListView.native.js.map +1 -1
  37. package/dist/cjs/FrappeProvider.cjs +5 -1
  38. package/dist/cjs/FrappeProvider.native.js +5 -1
  39. package/dist/cjs/FrappeProvider.native.js.map +1 -1
  40. package/dist/cjs/FrappeReportBuilder.cjs +2 -0
  41. package/dist/cjs/FrappeReportBuilder.native.js +2 -0
  42. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  43. package/dist/cjs/FrappeReportView.cjs +23 -45
  44. package/dist/cjs/FrappeReportView.native.js +35 -50
  45. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  46. package/dist/cjs/FrappeTable.cjs +105 -31
  47. package/dist/cjs/FrappeTable.native.js +140 -42
  48. package/dist/cjs/FrappeTable.native.js.map +1 -1
  49. package/dist/cjs/FrappeTreeView.cjs +3 -1
  50. package/dist/cjs/FrappeTreeView.native.js +3 -1
  51. package/dist/cjs/FrappeTreeView.native.js.map +1 -1
  52. package/dist/cjs/SyncErrorNotice.cjs +76 -0
  53. package/dist/cjs/SyncErrorNotice.native.js +92 -0
  54. package/dist/cjs/SyncErrorNotice.native.js.map +1 -0
  55. package/dist/cjs/commentActions.cjs +120 -0
  56. package/dist/cjs/commentActions.native.js +129 -0
  57. package/dist/cjs/commentActions.native.js.map +1 -0
  58. package/dist/cjs/components/attachments.cjs +2 -0
  59. package/dist/cjs/components/attachments.native.js +2 -0
  60. package/dist/cjs/components/attachments.native.js.map +1 -1
  61. package/dist/cjs/components/tags.cjs +5 -0
  62. package/dist/cjs/components/tags.native.js +5 -0
  63. package/dist/cjs/components/tags.native.js.map +1 -1
  64. package/dist/cjs/components/timeline.cjs +29 -2
  65. package/dist/cjs/components/timeline.native.js +33 -2
  66. package/dist/cjs/components/timeline.native.js.map +1 -1
  67. package/dist/cjs/desk/DeskFormSidebar.cjs +2 -0
  68. package/dist/cjs/desk/DeskFormSidebar.native.js +2 -0
  69. package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
  70. package/dist/cjs/fieldRegistry.cjs +2 -0
  71. package/dist/cjs/fieldRegistry.native.js +2 -0
  72. package/dist/cjs/fieldRegistry.native.js.map +1 -1
  73. package/dist/cjs/fields/Date/index.cjs +71 -7
  74. package/dist/cjs/fields/Date/index.native.js +325 -37
  75. package/dist/cjs/fields/Date/index.native.js.map +1 -1
  76. package/dist/cjs/fields/Date/types.cjs +18 -0
  77. package/dist/cjs/fields/Date/types.native.js +21 -0
  78. package/dist/cjs/fields/Date/types.native.js.map +1 -0
  79. package/dist/cjs/fields/Date/wire.cjs +4 -8
  80. package/dist/cjs/fields/Date/wire.native.js +4 -11
  81. package/dist/cjs/fields/Date/wire.native.js.map +1 -1
  82. package/dist/cjs/fields/DynamicLink.cjs +2 -0
  83. package/dist/cjs/fields/DynamicLink.native.js +2 -0
  84. package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
  85. package/dist/cjs/fields/FileUpload.cjs +2 -0
  86. package/dist/cjs/fields/FileUpload.native.js +2 -0
  87. package/dist/cjs/fields/FileUpload.native.js.map +1 -1
  88. package/dist/cjs/fields/TableMultiSelect.cjs +6 -1
  89. package/dist/cjs/fields/TableMultiSelect.native.js +6 -1
  90. package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
  91. package/dist/cjs/frappeStoryTarget.cjs +88 -0
  92. package/dist/cjs/frappeStoryTarget.native.js +100 -0
  93. package/dist/cjs/frappeStoryTarget.native.js.map +1 -1
  94. package/dist/cjs/frappeUsers.cjs +2 -0
  95. package/dist/cjs/frappeUsers.native.js +2 -0
  96. package/dist/cjs/frappeUsers.native.js.map +1 -1
  97. package/dist/cjs/index.cjs +17 -4
  98. package/dist/cjs/index.native.js +17 -4
  99. package/dist/cjs/index.native.js.map +1 -1
  100. package/dist/cjs/liveErrors.cjs +5 -1
  101. package/dist/cjs/liveErrors.native.js +5 -1
  102. package/dist/cjs/liveErrors.native.js.map +1 -1
  103. package/dist/cjs/useFrappeAggregate.cjs +13 -1
  104. package/dist/cjs/useFrappeAggregate.native.js +14 -1
  105. package/dist/cjs/useFrappeAggregate.native.js.map +1 -1
  106. package/dist/cjs/useFrappeFacets.cjs +329 -0
  107. package/dist/cjs/useFrappeFacets.native.js +632 -0
  108. package/dist/cjs/useFrappeFacets.native.js.map +1 -0
  109. package/dist/esm/FrappeAssignment.mjs +2 -0
  110. package/dist/esm/FrappeAssignment.mjs.map +1 -1
  111. package/dist/esm/FrappeAssignment.native.js +2 -0
  112. package/dist/esm/FrappeAssignment.native.js.map +1 -1
  113. package/dist/esm/FrappeCalendar.mjs +6 -8
  114. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  115. package/dist/esm/FrappeCalendar.native.js +6 -10
  116. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  117. package/dist/esm/FrappeChartCard.mjs +2 -0
  118. package/dist/esm/FrappeChartCard.mjs.map +1 -1
  119. package/dist/esm/FrappeChartCard.native.js +2 -0
  120. package/dist/esm/FrappeChartCard.native.js.map +1 -1
  121. package/dist/esm/FrappeDashboard.mjs +12 -19
  122. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  123. package/dist/esm/FrappeDashboard.native.js +23 -21
  124. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  125. package/dist/esm/FrappeForm.mjs +3 -1
  126. package/dist/esm/FrappeForm.mjs.map +1 -1
  127. package/dist/esm/FrappeForm.native.js +3 -1
  128. package/dist/esm/FrappeForm.native.js.map +1 -1
  129. package/dist/esm/FrappeGantt.mjs +6 -8
  130. package/dist/esm/FrappeGantt.mjs.map +1 -1
  131. package/dist/esm/FrappeGantt.native.js +6 -10
  132. package/dist/esm/FrappeGantt.native.js.map +1 -1
  133. package/dist/esm/FrappeImageView.mjs +3 -1
  134. package/dist/esm/FrappeImageView.mjs.map +1 -1
  135. package/dist/esm/FrappeImageView.native.js +3 -1
  136. package/dist/esm/FrappeImageView.native.js.map +1 -1
  137. package/dist/esm/FrappeKPICard.mjs +2 -0
  138. package/dist/esm/FrappeKPICard.mjs.map +1 -1
  139. package/dist/esm/FrappeKPICard.native.js +2 -0
  140. package/dist/esm/FrappeKPICard.native.js.map +1 -1
  141. package/dist/esm/FrappeKanban.mjs +3 -1
  142. package/dist/esm/FrappeKanban.mjs.map +1 -1
  143. package/dist/esm/FrappeKanban.native.js +3 -1
  144. package/dist/esm/FrappeKanban.native.js.map +1 -1
  145. package/dist/esm/FrappeLikedBy.mjs +2 -0
  146. package/dist/esm/FrappeLikedBy.mjs.map +1 -1
  147. package/dist/esm/FrappeLikedBy.native.js +2 -0
  148. package/dist/esm/FrappeLikedBy.native.js.map +1 -1
  149. package/dist/esm/FrappeList.mjs +3 -1
  150. package/dist/esm/FrappeList.mjs.map +1 -1
  151. package/dist/esm/FrappeList.native.js +3 -1
  152. package/dist/esm/FrappeList.native.js.map +1 -1
  153. package/dist/esm/FrappeListView.mjs +7 -13
  154. package/dist/esm/FrappeListView.mjs.map +1 -1
  155. package/dist/esm/FrappeListView.native.js +15 -14
  156. package/dist/esm/FrappeListView.native.js.map +1 -1
  157. package/dist/esm/FrappeProvider.mjs +5 -1
  158. package/dist/esm/FrappeProvider.mjs.map +1 -1
  159. package/dist/esm/FrappeProvider.native.js +5 -1
  160. package/dist/esm/FrappeProvider.native.js.map +1 -1
  161. package/dist/esm/FrappeReportBuilder.mjs +2 -0
  162. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  163. package/dist/esm/FrappeReportBuilder.native.js +2 -0
  164. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  165. package/dist/esm/FrappeReportView.mjs +26 -49
  166. package/dist/esm/FrappeReportView.mjs.map +1 -1
  167. package/dist/esm/FrappeReportView.native.js +38 -54
  168. package/dist/esm/FrappeReportView.native.js.map +1 -1
  169. package/dist/esm/FrappeTable.mjs +107 -33
  170. package/dist/esm/FrappeTable.mjs.map +1 -1
  171. package/dist/esm/FrappeTable.native.js +142 -44
  172. package/dist/esm/FrappeTable.native.js.map +1 -1
  173. package/dist/esm/FrappeTreeView.mjs +3 -1
  174. package/dist/esm/FrappeTreeView.mjs.map +1 -1
  175. package/dist/esm/FrappeTreeView.native.js +3 -1
  176. package/dist/esm/FrappeTreeView.native.js.map +1 -1
  177. package/dist/esm/SyncErrorNotice.mjs +51 -0
  178. package/dist/esm/SyncErrorNotice.mjs.map +1 -0
  179. package/dist/esm/SyncErrorNotice.native.js +53 -0
  180. package/dist/esm/SyncErrorNotice.native.js.map +1 -0
  181. package/dist/esm/commentActions.mjs +95 -0
  182. package/dist/esm/commentActions.mjs.map +1 -0
  183. package/dist/esm/commentActions.native.js +101 -0
  184. package/dist/esm/commentActions.native.js.map +1 -0
  185. package/dist/esm/components/attachments.mjs +2 -0
  186. package/dist/esm/components/attachments.mjs.map +1 -1
  187. package/dist/esm/components/attachments.native.js +2 -0
  188. package/dist/esm/components/attachments.native.js.map +1 -1
  189. package/dist/esm/components/tags.mjs +5 -0
  190. package/dist/esm/components/tags.mjs.map +1 -1
  191. package/dist/esm/components/tags.native.js +5 -0
  192. package/dist/esm/components/tags.native.js.map +1 -1
  193. package/dist/esm/components/timeline.mjs +31 -4
  194. package/dist/esm/components/timeline.mjs.map +1 -1
  195. package/dist/esm/components/timeline.native.js +35 -4
  196. package/dist/esm/components/timeline.native.js.map +1 -1
  197. package/dist/esm/desk/DeskFormSidebar.mjs +2 -0
  198. package/dist/esm/desk/DeskFormSidebar.mjs.map +1 -1
  199. package/dist/esm/desk/DeskFormSidebar.native.js +2 -0
  200. package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
  201. package/dist/esm/fieldRegistry.mjs +2 -0
  202. package/dist/esm/fieldRegistry.mjs.map +1 -1
  203. package/dist/esm/fieldRegistry.native.js +2 -0
  204. package/dist/esm/fieldRegistry.native.js.map +1 -1
  205. package/dist/esm/fields/Date/index.mjs +73 -9
  206. package/dist/esm/fields/Date/index.mjs.map +1 -1
  207. package/dist/esm/fields/Date/index.native.js +315 -38
  208. package/dist/esm/fields/Date/index.native.js.map +1 -1
  209. package/dist/esm/fields/Date/types.mjs +2 -0
  210. package/dist/esm/fields/Date/types.mjs.map +1 -0
  211. package/dist/esm/fields/Date/types.native.js +2 -0
  212. package/dist/esm/fields/Date/types.native.js.map +1 -0
  213. package/dist/esm/fields/Date/wire.mjs +4 -8
  214. package/dist/esm/fields/Date/wire.mjs.map +1 -1
  215. package/dist/esm/fields/Date/wire.native.js +4 -11
  216. package/dist/esm/fields/Date/wire.native.js.map +1 -1
  217. package/dist/esm/fields/DynamicLink.mjs +2 -0
  218. package/dist/esm/fields/DynamicLink.mjs.map +1 -1
  219. package/dist/esm/fields/DynamicLink.native.js +2 -0
  220. package/dist/esm/fields/DynamicLink.native.js.map +1 -1
  221. package/dist/esm/fields/FileUpload.mjs +2 -0
  222. package/dist/esm/fields/FileUpload.mjs.map +1 -1
  223. package/dist/esm/fields/FileUpload.native.js +2 -0
  224. package/dist/esm/fields/FileUpload.native.js.map +1 -1
  225. package/dist/esm/fields/TableMultiSelect.mjs +7 -2
  226. package/dist/esm/fields/TableMultiSelect.mjs.map +1 -1
  227. package/dist/esm/fields/TableMultiSelect.native.js +7 -2
  228. package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
  229. package/dist/esm/frappeStoryTarget.mjs +88 -2
  230. package/dist/esm/frappeStoryTarget.mjs.map +1 -1
  231. package/dist/esm/frappeStoryTarget.native.js +100 -2
  232. package/dist/esm/frappeStoryTarget.native.js.map +1 -1
  233. package/dist/esm/frappeUsers.mjs +2 -0
  234. package/dist/esm/frappeUsers.mjs.map +1 -1
  235. package/dist/esm/frappeUsers.native.js +2 -0
  236. package/dist/esm/frappeUsers.native.js.map +1 -1
  237. package/dist/esm/index.mjs +7 -3
  238. package/dist/esm/index.mjs.map +1 -1
  239. package/dist/esm/index.native.js +7 -3
  240. package/dist/esm/index.native.js.map +1 -1
  241. package/dist/esm/liveErrors.mjs +5 -1
  242. package/dist/esm/liveErrors.mjs.map +1 -1
  243. package/dist/esm/liveErrors.native.js +5 -1
  244. package/dist/esm/liveErrors.native.js.map +1 -1
  245. package/dist/esm/useFrappeAggregate.mjs +13 -1
  246. package/dist/esm/useFrappeAggregate.mjs.map +1 -1
  247. package/dist/esm/useFrappeAggregate.native.js +14 -1
  248. package/dist/esm/useFrappeAggregate.native.js.map +1 -1
  249. package/dist/esm/useFrappeFacets.mjs +299 -0
  250. package/dist/esm/useFrappeFacets.mjs.map +1 -0
  251. package/dist/esm/useFrappeFacets.native.js +599 -0
  252. package/dist/esm/useFrappeFacets.native.js.map +1 -0
  253. package/dist/jsx/FrappeAssignment.mjs +2 -0
  254. package/dist/jsx/FrappeAssignment.mjs.map +1 -1
  255. package/dist/jsx/FrappeAssignment.native.js +2 -0
  256. package/dist/jsx/FrappeAssignment.native.js.map +1 -1
  257. package/dist/jsx/FrappeCalendar.mjs +6 -8
  258. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  259. package/dist/jsx/FrappeCalendar.native.js +5 -9
  260. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  261. package/dist/jsx/FrappeChartCard.mjs +2 -0
  262. package/dist/jsx/FrappeChartCard.mjs.map +1 -1
  263. package/dist/jsx/FrappeChartCard.native.js +2 -0
  264. package/dist/jsx/FrappeChartCard.native.js.map +1 -1
  265. package/dist/jsx/FrappeDashboard.mjs +12 -19
  266. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  267. package/dist/jsx/FrappeDashboard.native.js +20 -22
  268. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  269. package/dist/jsx/FrappeForm.mjs +3 -1
  270. package/dist/jsx/FrappeForm.mjs.map +1 -1
  271. package/dist/jsx/FrappeForm.native.js +3 -1
  272. package/dist/jsx/FrappeForm.native.js.map +1 -1
  273. package/dist/jsx/FrappeGantt.mjs +6 -8
  274. package/dist/jsx/FrappeGantt.mjs.map +1 -1
  275. package/dist/jsx/FrappeGantt.native.js +5 -9
  276. package/dist/jsx/FrappeGantt.native.js.map +1 -1
  277. package/dist/jsx/FrappeImageView.mjs +3 -1
  278. package/dist/jsx/FrappeImageView.mjs.map +1 -1
  279. package/dist/jsx/FrappeImageView.native.js +3 -1
  280. package/dist/jsx/FrappeImageView.native.js.map +1 -1
  281. package/dist/jsx/FrappeKPICard.mjs +2 -0
  282. package/dist/jsx/FrappeKPICard.mjs.map +1 -1
  283. package/dist/jsx/FrappeKPICard.native.js +2 -0
  284. package/dist/jsx/FrappeKPICard.native.js.map +1 -1
  285. package/dist/jsx/FrappeKanban.mjs +3 -1
  286. package/dist/jsx/FrappeKanban.mjs.map +1 -1
  287. package/dist/jsx/FrappeKanban.native.js +3 -1
  288. package/dist/jsx/FrappeKanban.native.js.map +1 -1
  289. package/dist/jsx/FrappeLikedBy.mjs +2 -0
  290. package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
  291. package/dist/jsx/FrappeLikedBy.native.js +2 -0
  292. package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
  293. package/dist/jsx/FrappeList.mjs +3 -1
  294. package/dist/jsx/FrappeList.mjs.map +1 -1
  295. package/dist/jsx/FrappeList.native.js +3 -1
  296. package/dist/jsx/FrappeList.native.js.map +1 -1
  297. package/dist/jsx/FrappeListView.mjs +7 -13
  298. package/dist/jsx/FrappeListView.mjs.map +1 -1
  299. package/dist/jsx/FrappeListView.native.js +13 -12
  300. package/dist/jsx/FrappeListView.native.js.map +1 -1
  301. package/dist/jsx/FrappeProvider.mjs +5 -1
  302. package/dist/jsx/FrappeProvider.mjs.map +1 -1
  303. package/dist/jsx/FrappeProvider.native.js +5 -1
  304. package/dist/jsx/FrappeProvider.native.js.map +1 -1
  305. package/dist/jsx/FrappeReportBuilder.mjs +2 -0
  306. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  307. package/dist/jsx/FrappeReportBuilder.native.js +2 -0
  308. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  309. package/dist/jsx/FrappeReportView.mjs +26 -49
  310. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  311. package/dist/jsx/FrappeReportView.native.js +35 -50
  312. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  313. package/dist/jsx/FrappeTable.mjs +107 -33
  314. package/dist/jsx/FrappeTable.mjs.map +1 -1
  315. package/dist/jsx/FrappeTable.native.js +140 -42
  316. package/dist/jsx/FrappeTable.native.js.map +1 -1
  317. package/dist/jsx/FrappeTreeView.mjs +3 -1
  318. package/dist/jsx/FrappeTreeView.mjs.map +1 -1
  319. package/dist/jsx/FrappeTreeView.native.js +3 -1
  320. package/dist/jsx/FrappeTreeView.native.js.map +1 -1
  321. package/dist/jsx/SyncErrorNotice.mjs +51 -0
  322. package/dist/jsx/SyncErrorNotice.mjs.map +1 -0
  323. package/dist/jsx/SyncErrorNotice.native.js +92 -0
  324. package/dist/jsx/SyncErrorNotice.native.js.map +1 -0
  325. package/dist/jsx/commentActions.mjs +95 -0
  326. package/dist/jsx/commentActions.mjs.map +1 -0
  327. package/dist/jsx/commentActions.native.js +129 -0
  328. package/dist/jsx/commentActions.native.js.map +1 -0
  329. package/dist/jsx/components/attachments.mjs +2 -0
  330. package/dist/jsx/components/attachments.mjs.map +1 -1
  331. package/dist/jsx/components/attachments.native.js +2 -0
  332. package/dist/jsx/components/attachments.native.js.map +1 -1
  333. package/dist/jsx/components/tags.mjs +5 -0
  334. package/dist/jsx/components/tags.mjs.map +1 -1
  335. package/dist/jsx/components/tags.native.js +5 -0
  336. package/dist/jsx/components/tags.native.js.map +1 -1
  337. package/dist/jsx/components/timeline.mjs +31 -4
  338. package/dist/jsx/components/timeline.mjs.map +1 -1
  339. package/dist/jsx/components/timeline.native.js +33 -2
  340. package/dist/jsx/components/timeline.native.js.map +1 -1
  341. package/dist/jsx/desk/DeskFormSidebar.mjs +2 -0
  342. package/dist/jsx/desk/DeskFormSidebar.mjs.map +1 -1
  343. package/dist/jsx/desk/DeskFormSidebar.native.js +2 -0
  344. package/dist/jsx/desk/DeskFormSidebar.native.js.map +1 -1
  345. package/dist/jsx/fieldRegistry.mjs +2 -0
  346. package/dist/jsx/fieldRegistry.mjs.map +1 -1
  347. package/dist/jsx/fieldRegistry.native.js +2 -0
  348. package/dist/jsx/fieldRegistry.native.js.map +1 -1
  349. package/dist/jsx/fields/Date/index.mjs +73 -9
  350. package/dist/jsx/fields/Date/index.mjs.map +1 -1
  351. package/dist/jsx/fields/Date/index.native.js +325 -37
  352. package/dist/jsx/fields/Date/index.native.js.map +1 -1
  353. package/dist/jsx/fields/Date/types.mjs +2 -0
  354. package/dist/jsx/fields/Date/types.mjs.map +1 -0
  355. package/dist/jsx/fields/Date/types.native.js +21 -0
  356. package/dist/jsx/fields/Date/types.native.js.map +1 -0
  357. package/dist/jsx/fields/Date/wire.mjs +4 -8
  358. package/dist/jsx/fields/Date/wire.mjs.map +1 -1
  359. package/dist/jsx/fields/Date/wire.native.js +4 -11
  360. package/dist/jsx/fields/Date/wire.native.js.map +1 -1
  361. package/dist/jsx/fields/DynamicLink.mjs +2 -0
  362. package/dist/jsx/fields/DynamicLink.mjs.map +1 -1
  363. package/dist/jsx/fields/DynamicLink.native.js +2 -0
  364. package/dist/jsx/fields/DynamicLink.native.js.map +1 -1
  365. package/dist/jsx/fields/FileUpload.mjs +2 -0
  366. package/dist/jsx/fields/FileUpload.mjs.map +1 -1
  367. package/dist/jsx/fields/FileUpload.native.js +2 -0
  368. package/dist/jsx/fields/FileUpload.native.js.map +1 -1
  369. package/dist/jsx/fields/TableMultiSelect.mjs +7 -2
  370. package/dist/jsx/fields/TableMultiSelect.mjs.map +1 -1
  371. package/dist/jsx/fields/TableMultiSelect.native.js +6 -1
  372. package/dist/jsx/fields/TableMultiSelect.native.js.map +1 -1
  373. package/dist/jsx/frappeStoryTarget.mjs +88 -2
  374. package/dist/jsx/frappeStoryTarget.mjs.map +1 -1
  375. package/dist/jsx/frappeStoryTarget.native.js +100 -0
  376. package/dist/jsx/frappeStoryTarget.native.js.map +1 -1
  377. package/dist/jsx/frappeUsers.mjs +2 -0
  378. package/dist/jsx/frappeUsers.mjs.map +1 -1
  379. package/dist/jsx/frappeUsers.native.js +2 -0
  380. package/dist/jsx/frappeUsers.native.js.map +1 -1
  381. package/dist/jsx/index.js +7 -3
  382. package/dist/jsx/index.js.map +1 -1
  383. package/dist/jsx/index.mjs +7 -3
  384. package/dist/jsx/index.mjs.map +1 -1
  385. package/dist/jsx/index.native.js +17 -4
  386. package/dist/jsx/index.native.js.map +1 -1
  387. package/dist/jsx/liveErrors.mjs +5 -1
  388. package/dist/jsx/liveErrors.mjs.map +1 -1
  389. package/dist/jsx/liveErrors.native.js +5 -1
  390. package/dist/jsx/liveErrors.native.js.map +1 -1
  391. package/dist/jsx/useFrappeAggregate.mjs +13 -1
  392. package/dist/jsx/useFrappeAggregate.mjs.map +1 -1
  393. package/dist/jsx/useFrappeAggregate.native.js +14 -1
  394. package/dist/jsx/useFrappeAggregate.native.js.map +1 -1
  395. package/dist/jsx/useFrappeFacets.mjs +299 -0
  396. package/dist/jsx/useFrappeFacets.mjs.map +1 -0
  397. package/dist/jsx/useFrappeFacets.native.js +632 -0
  398. package/dist/jsx/useFrappeFacets.native.js.map +1 -0
  399. package/package.json +21 -21
  400. package/src/FormSidebar.stories.tsx +88 -10
  401. package/src/FrappeAssignment.tsx +2 -0
  402. package/src/FrappeCalendar.tsx +12 -7
  403. package/src/FrappeChartCard.tsx +9 -2
  404. package/src/FrappeDashboard.spec.tsx +95 -0
  405. package/src/FrappeDashboard.tsx +20 -41
  406. package/src/FrappeForm.stories.tsx +53 -46
  407. package/src/FrappeForm.tsx +11 -1
  408. package/src/FrappeGantt.tsx +12 -7
  409. package/src/FrappeImageView.tsx +11 -1
  410. package/src/FrappeKPICard.stories.tsx +4 -1
  411. package/src/FrappeKPICard.tsx +2 -0
  412. package/src/FrappeKanban.tsx +4 -0
  413. package/src/FrappeLikedBy.stories.tsx +26 -10
  414. package/src/FrappeLikedBy.tsx +2 -0
  415. package/src/FrappeList.tsx +11 -1
  416. package/src/FrappeListView.spec.tsx +144 -0
  417. package/src/FrappeListView.tsx +11 -23
  418. package/src/FrappeProvider.tsx +30 -2
  419. package/src/FrappeReportBuilder.tsx +2 -0
  420. package/src/FrappeReportView.spec.tsx +140 -16
  421. package/src/FrappeReportView.stories.tsx +12 -6
  422. package/src/FrappeReportView.tsx +62 -61
  423. package/src/FrappeTable.keepRows.spec.tsx +200 -0
  424. package/src/FrappeTable.retryStorm.spec.tsx +140 -0
  425. package/src/FrappeTable.spec.tsx +222 -0
  426. package/src/FrappeTable.tsx +211 -54
  427. package/src/FrappeTreeView.tsx +11 -1
  428. package/src/SyncErrorNotice.spec.tsx +60 -0
  429. package/src/SyncErrorNotice.tsx +81 -0
  430. package/src/commentActions.ts +157 -0
  431. package/src/components/attachments.tsx +2 -0
  432. package/src/components/tags.tsx +14 -1
  433. package/src/components/timeline.optimistic.spec.tsx +106 -0
  434. package/src/components/timeline.tsx +36 -4
  435. package/src/desk/DeskFormSidebar.tsx +2 -0
  436. package/src/fieldRegistry.ts +2 -0
  437. package/src/fields/Date/index.native.tsx +410 -0
  438. package/src/fields/Date/index.tsx +138 -57
  439. package/src/fields/Date/nativePresentation.spec.tsx +251 -0
  440. package/src/fields/Date/typeParity.spec.tsx +480 -0
  441. package/src/fields/Date/types.ts +53 -0
  442. package/src/fields/Date/wire.spec.ts +63 -1
  443. package/src/fields/Date/wire.ts +17 -17
  444. package/src/fields/DynamicLink.tsx +2 -0
  445. package/src/fields/FileUpload.tsx +2 -0
  446. package/src/fields/TableMultiSelect.tsx +6 -3
  447. package/src/frappeStoryTarget.tsx +104 -1
  448. package/src/frappeUsers.ts +2 -0
  449. package/src/index.spec.ts +62 -0
  450. package/src/index.ts +36 -2
  451. package/src/liveErrors.spec.ts +50 -0
  452. package/src/liveErrors.ts +11 -1
  453. package/src/useFrappeAggregate.ts +20 -1
  454. package/src/useFrappeFacets.spec.tsx +436 -0
  455. package/src/useFrappeFacets.ts +568 -0
  456. package/types/FrappeAssignment.d.ts.map +1 -1
  457. package/types/FrappeCalendar.d.ts.map +1 -1
  458. package/types/FrappeChartCard.d.ts +1 -2
  459. package/types/FrappeChartCard.d.ts.map +1 -1
  460. package/types/FrappeDashboard.d.ts +0 -1
  461. package/types/FrappeDashboard.d.ts.map +1 -1
  462. package/types/FrappeForm.d.ts.map +1 -1
  463. package/types/FrappeGantt.d.ts.map +1 -1
  464. package/types/FrappeKPICard.d.ts.map +1 -1
  465. package/types/FrappeKanban.d.ts.map +1 -1
  466. package/types/FrappeLikedBy.d.ts.map +1 -1
  467. package/types/FrappeList.d.ts.map +1 -1
  468. package/types/FrappeListView.d.ts.map +1 -1
  469. package/types/FrappeProvider.d.ts +18 -1
  470. package/types/FrappeProvider.d.ts.map +1 -1
  471. package/types/FrappeReportBuilder.d.ts.map +1 -1
  472. package/types/FrappeReportView.d.ts +22 -15
  473. package/types/FrappeReportView.d.ts.map +1 -1
  474. package/types/FrappeTable.d.ts +21 -2
  475. package/types/FrappeTable.d.ts.map +1 -1
  476. package/types/FrappeTreeView.d.ts.map +1 -1
  477. package/types/SyncErrorNotice.d.ts +38 -0
  478. package/types/SyncErrorNotice.d.ts.map +1 -0
  479. package/types/commentActions.d.ts +46 -0
  480. package/types/commentActions.d.ts.map +1 -0
  481. package/types/components/attachments.d.ts.map +1 -1
  482. package/types/components/tags.d.ts.map +1 -1
  483. package/types/components/timeline.d.ts.map +1 -1
  484. package/types/desk/DeskFormSidebar.d.ts.map +1 -1
  485. package/types/fieldRegistry.d.ts.map +1 -1
  486. package/types/fields/Date/index.d.ts +22 -12
  487. package/types/fields/Date/index.d.ts.map +1 -1
  488. package/types/fields/Date/index.native.d.ts +14 -0
  489. package/types/fields/Date/index.native.d.ts.map +1 -0
  490. package/types/fields/Date/types.d.ts +27 -0
  491. package/types/fields/Date/types.d.ts.map +1 -0
  492. package/types/fields/Date/wire.d.ts +13 -9
  493. package/types/fields/Date/wire.d.ts.map +1 -1
  494. package/types/fields/DynamicLink.d.ts.map +1 -1
  495. package/types/fields/FileUpload.d.ts.map +1 -1
  496. package/types/fields/TableMultiSelect.d.ts.map +1 -1
  497. package/types/frappeStoryTarget.d.ts +19 -1
  498. package/types/frappeStoryTarget.d.ts.map +1 -1
  499. package/types/frappeUsers.d.ts.map +1 -1
  500. package/types/index.d.ts +6 -2
  501. package/types/index.d.ts.map +1 -1
  502. package/types/liveErrors.d.ts +4 -0
  503. package/types/liveErrors.d.ts.map +1 -1
  504. package/types/useFrappeAggregate.d.ts +4 -0
  505. package/types/useFrappeAggregate.d.ts.map +1 -1
  506. package/types/useFrappeFacets.d.ts +143 -0
  507. package/types/useFrappeFacets.d.ts.map +1 -0
  508. package/dist/cjs/fields/Date/date.native.js +0 -277
  509. package/dist/cjs/fields/Date/date.native.js.map +0 -1
  510. package/dist/esm/fields/Date/date.native.js +0 -238
  511. package/dist/esm/fields/Date/date.native.js.map +0 -1
  512. package/dist/jsx/fields/Date/date.native.js +0 -277
  513. package/dist/jsx/fields/Date/date.native.js.map +0 -1
  514. package/src/fields/Date/date.native.tsx +0 -299
  515. package/types/fields/Date/date.native.d.ts +0 -19
  516. package/types/fields/Date/date.native.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/frappe-ui",
3
- "version": "6.6.0",
3
+ "version": "7.0.0",
4
4
  "description": "Pre-wired Tamagui components for Frappe doctypes with live data",
5
5
  "keywords": [
6
6
  "cross-platform",
@@ -66,7 +66,7 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@phosphor-icons/react": "^2.1.10",
69
- "@tamagui/colors": "2.0.0-rc.41",
69
+ "@tamagui/colors": "2.7.6",
70
70
  "@tanstack/db": "0.6.5",
71
71
  "@tanstack/react-hotkeys": "^0.5.1",
72
72
  "@tiptap/extension-image": "^3.30.0",
@@ -77,22 +77,22 @@
77
77
  "@tiptap/starter-kit": "^3.30.0",
78
78
  "html5-qrcode": "^2.3.8",
79
79
  "signature_pad": "^5.1.3",
80
- "tamagui": "2.0.0-rc.41",
81
- "@multiplatform.one/components": "6.6.0",
82
- "@multiplatform.one/forms": "6.6.0",
83
- "@multiplatform.one/i18n": "6.6.0",
84
- "@multiplatform.one/platform": "6.6.0",
85
- "@multiplatform.one/router": "6.6.0",
86
- "@multiplatform.one/theme": "6.6.0",
87
- "@multiplatform.one/desktop": "6.6.0",
88
- "@multiplatform.one/rich-text": "6.6.0",
89
- "@multiplatform.one/frappe": "6.6.0",
90
- "@multiplatform.one/markdown": "6.6.0",
91
- "@multiplatform.one/store": "6.6.0",
92
- "@multiplatform.one/table": "6.6.0"
80
+ "tamagui": "2.7.6",
81
+ "@multiplatform.one/components": "7.0.0",
82
+ "@multiplatform.one/desktop": "7.0.0",
83
+ "@multiplatform.one/frappe": "7.0.0",
84
+ "@multiplatform.one/forms": "7.0.0",
85
+ "@multiplatform.one/i18n": "7.0.0",
86
+ "@multiplatform.one/markdown": "7.0.0",
87
+ "@multiplatform.one/platform": "7.0.0",
88
+ "@multiplatform.one/rich-text": "7.0.0",
89
+ "@multiplatform.one/router": "7.0.0",
90
+ "@multiplatform.one/store": "7.0.0",
91
+ "@multiplatform.one/table": "7.0.0",
92
+ "@multiplatform.one/theme": "7.0.0"
93
93
  },
94
94
  "devDependencies": {
95
- "@tamagui/build": "2.0.0-rc.41",
95
+ "@tamagui/build": "2.7.6",
96
96
  "@testing-library/react": "^16.3.2",
97
97
  "@types/react": "~19.2.14",
98
98
  "@types/react-dom": "^19.2.3",
@@ -102,12 +102,12 @@
102
102
  "react-dom": "19.2.5",
103
103
  "react-i18next": "^16.6.6",
104
104
  "vitest": "^4.1.5",
105
- "@multiplatform.one/config": "6.6.0",
106
- "@multiplatform.one/storybook": "6.6.0",
107
- "@multiplatform.one/test-utils": "6.6.0"
105
+ "@multiplatform.one/config": "7.0.0",
106
+ "@multiplatform.one/storybook": "7.0.0",
107
+ "@multiplatform.one/test-utils": "7.0.0"
108
108
  },
109
109
  "peerDependencies": {
110
- "@react-native-community/datetimepicker": "^8.0.1",
110
+ "@react-native-community/datetimepicker": ">=8.0.1",
111
111
  "react": "^19.1.0",
112
112
  "react-dom": "^19.1.0",
113
113
  "react-i18next": ">=14",
@@ -128,6 +128,6 @@
128
128
  "scripts": {
129
129
  "build": "rm -rf dist types 2>/dev/null && tamagui-build --ts-project ./tsconfig.build.json --exclude '\\.spec\\.|\\.test\\.|\\.stories\\.'",
130
130
  "test": "vitest run --coverage --coverage.provider=v8 --coverage.reporter=text --coverage.reporter=lcov --coverage.reporter=html",
131
- "typecheck": "tsc --noEmit"
131
+ "typecheck": "tsgo --noEmit"
132
132
  }
133
133
  }
@@ -26,7 +26,7 @@ import {
26
26
  type SidebarSection,
27
27
  } from "./FormSidebar";
28
28
  import { FrappeForm } from "./FrappeForm";
29
- import { FrappeStoryProvider } from "./frappeStoryTarget";
29
+ import { FrappeStoryProvider, LiveToDoGate } from "./frappeStoryTarget";
30
30
 
31
31
  export default {
32
32
  title: "FrappeUI/FormSidebar",
@@ -343,18 +343,92 @@ export const DeskParity = () => {
343
343
  // Live bench story — sidebar data plumbing over the live data path
344
344
  // ---------------------------------------------------------------------------
345
345
 
346
+ /**
347
+ * Getdoctype-shaped ToDo meta for the fixture fallback, mirroring the bench's
348
+ * own ToDo (title_field `description`, the Reference section, the two fields
349
+ * the story hides). Schema mode cannot render without meta, so the documented
350
+ * "falls back to fixtures when the bench is down" promise needs this entry —
351
+ * without it the offline story only ever showed a failed meta request.
352
+ */
353
+ const todoFixtureMeta = {
354
+ name: "ToDo",
355
+ doctype: "DocType",
356
+ module: "Desk",
357
+ title_field: "description",
358
+ sort_field: "modified",
359
+ sort_order: "DESC",
360
+ fields: [
361
+ { fieldname: "description_and_status", fieldtype: "Section Break" },
362
+ {
363
+ fieldname: "status",
364
+ fieldtype: "Select",
365
+ label: "Status",
366
+ options: "Open\nClosed\nCancelled",
367
+ in_list_view: 1,
368
+ },
369
+ {
370
+ fieldname: "priority",
371
+ fieldtype: "Select",
372
+ label: "Priority",
373
+ options: "High\nMedium\nLow",
374
+ in_list_view: 1,
375
+ },
376
+ { fieldname: "column_break_2", fieldtype: "Column Break" },
377
+ { fieldname: "color", fieldtype: "Color", label: "Color" },
378
+ { fieldname: "date", fieldtype: "Date", label: "Due Date", in_list_view: 1 },
379
+ { fieldname: "allocated_to", fieldtype: "Link", label: "Allocated To", options: "User" },
380
+ { fieldname: "description_section", fieldtype: "Section Break" },
381
+ { fieldname: "description", fieldtype: "Text Editor", label: "Description", reqd: 1 },
382
+ { fieldname: "section_break_6", fieldtype: "Section Break", label: "Reference" },
383
+ {
384
+ fieldname: "reference_type",
385
+ fieldtype: "Link",
386
+ label: "Reference Type",
387
+ options: "DocType",
388
+ in_list_view: 1,
389
+ },
390
+ {
391
+ fieldname: "reference_name",
392
+ fieldtype: "Dynamic Link",
393
+ label: "Reference Name",
394
+ options: "reference_type",
395
+ },
396
+ { fieldname: "column_break_10", fieldtype: "Column Break" },
397
+ { fieldname: "role", fieldtype: "Link", label: "Role", options: "Role" },
398
+ { fieldname: "assigned_by", fieldtype: "Link", label: "Assigned By", options: "User" },
399
+ {
400
+ fieldname: "assigned_by_full_name",
401
+ fieldtype: "Read Only",
402
+ label: "Assigned By Full Name",
403
+ },
404
+ { fieldname: "sender", fieldtype: "Data", label: "Sender", options: "Email" },
405
+ {
406
+ fieldname: "assignment_rule",
407
+ fieldtype: "Link",
408
+ label: "Assignment Rule",
409
+ options: "Assignment Rule",
410
+ read_only: 1,
411
+ },
412
+ ],
413
+ permissions: [{ role: "All", read: 1, write: 1 }],
414
+ };
415
+
346
416
  /**
347
417
  * Live sidebar plumbing: renders FrappeForm (schema mode + showSidebar)
348
418
  * against the real bench ToDo doctype so the sidebar's assignments
349
419
  * (`_assign`), shares (DocShare) and metadata reflect realtime changes to
350
420
  * the open document in place. The `name` arg selects the document
351
- * (harnesses pass a real doc name via URL args). Falls back to fixtures
352
- * when the bench is down.
421
+ * (harnesses pass a real doc name via URL args). When live with no arg,
422
+ * LiveToDoGate resolves a real ToDo so the story does not 404 on a
423
+ * hash-named doctype. Falls back to fixtures when the bench is down —
424
+ * the `DocType` entry below is what makes the offline branch render a
425
+ * form rather than a meta error.
353
426
  */
354
427
  export const Live = (args: { name?: string }) => (
355
428
  <FrappeStoryProvider
356
429
  fixtures={
357
430
  new InMemoryFixtureProvider({
431
+ DocType: [todoFixtureMeta],
358
432
  ToDo: [
359
433
  {
360
434
  name: "TODO-LIVE-001",
@@ -368,12 +442,16 @@ export const Live = (args: { name?: string }) => (
368
442
  })
369
443
  }
370
444
  >
371
- <FrappeForm
372
- doctype="ToDo"
373
- name={args.name || "TODO-LIVE-001"}
374
- showSidebar
375
- hideFields={["assigned_by_full_name", "sender"]}
376
- />
445
+ <LiveToDoGate name={args.name}>
446
+ {(name) => (
447
+ <FrappeForm
448
+ doctype="ToDo"
449
+ name={name}
450
+ showSidebar
451
+ hideFields={["assigned_by_full_name", "sender"]}
452
+ />
453
+ )}
454
+ </LiveToDoGate>
377
455
  </FrappeStoryProvider>
378
456
  );
379
457
  Live.args = { name: "" };
@@ -382,7 +460,7 @@ Live.parameters = {
382
460
  docs: {
383
461
  description: {
384
462
  story:
385
- "Live sidebar over the real bench: assignments (_assign), shares (DocShare subscription) and metadata update in place when the open ToDo changes on the server. Fixture fallback when the bench is down.",
463
+ "Live sidebar over the real bench: assignments (_assign), shares (DocShare subscription) and metadata update in place when the open ToDo changes on the server. Opens a real bench ToDo so the live arm is not a 404. Administrator sees live DocShare rows; an ordinary Desk User is refused DocShare (403) and the Shared With section degrades — that is expected, not a product failure. Fixture fallback when the bench is down.",
386
464
  },
387
465
  },
388
466
  };
@@ -248,6 +248,8 @@ function FrappeAssignmentBody({
248
248
  ? {
249
249
  baseURL: config.baseURL,
250
250
  socketPort: config.socketPort,
251
+ siteName: config.siteName,
252
+ socketBaseURL: config.socketBaseURL,
251
253
  auth: config.auth,
252
254
  syncOptions: config.syncOptions,
253
255
  fixtures: config.fixtures,
@@ -9,7 +9,12 @@ import { Spinner } from "@multiplatform.one/forms";
9
9
  import React, { useMemo, useCallback, useState, type ReactNode } from "react";
10
10
  import { Text, YStack, type YStackProps } from "tamagui";
11
11
  import { useTranslation } from "react-i18next";
12
- import { parseCalendarDate, useChartPalette, useResolvedKnobs } from "@multiplatform.one/theme";
12
+ import {
13
+ formatCalendarDate,
14
+ parseCalendarDate,
15
+ useChartPalette,
16
+ useResolvedKnobs,
17
+ } from "@multiplatform.one/theme";
13
18
  import { FrappeConnectionIndicator } from "./FrappeConnectionIndicator";
14
19
  import { useFrappeConfig } from "./FrappeProvider";
15
20
  import { describeSyncError } from "./syncError";
@@ -64,12 +69,8 @@ export interface FrappeCalendarProps<TDoc extends { name: string; doctype: strin
64
69
  */
65
70
  function toFrappeFieldValue(original: unknown, next: Date): unknown {
66
71
  if (original instanceof Date) return next;
67
- const pad = (n: number) => String(n).padStart(2, "0");
68
- const datePart = `${next.getFullYear()}-${pad(next.getMonth() + 1)}-${pad(next.getDate())}`;
69
- if (typeof original === "string" && original.includes(":")) {
70
- return `${datePart} ${pad(next.getHours())}:${pad(next.getMinutes())}:${pad(next.getSeconds())}`;
71
- }
72
- return datePart;
72
+ const carriesTime = typeof original === "string" && original.includes(":");
73
+ return formatCalendarDate(next, carriesTime ? "datetime" : "date");
73
74
  }
74
75
 
75
76
  /**
@@ -141,6 +142,8 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
141
142
  () => ({
142
143
  baseURL: finalBaseURL,
143
144
  socketPort: config?.socketPort,
145
+ siteName: config?.siteName,
146
+ socketBaseURL: config?.socketBaseURL,
144
147
  auth: finalAuth,
145
148
  syncOptions: finalSyncOptions,
146
149
  socketOptions: config?.socketOptions,
@@ -149,6 +152,8 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
149
152
  [
150
153
  finalBaseURL,
151
154
  config?.socketPort,
155
+ config?.siteName,
156
+ config?.socketBaseURL,
152
157
  finalAuth,
153
158
  finalSyncOptions,
154
159
  config?.socketOptions,
@@ -16,12 +16,17 @@
16
16
  * returns no groups, and a subtle stale dim while a post-event refetch is
17
17
  * in flight.
18
18
  */
19
- import { AsyncBoundary, Skeleton, type ChartConfig } from "@multiplatform.one/components";
19
+ import {
20
+ AsyncBoundary,
21
+ Skeleton,
22
+ type ChartCardProps,
23
+ type ChartConfig,
24
+ } from "@multiplatform.one/components";
20
25
  import React, { useMemo } from "react";
21
26
  import { useTranslation } from "react-i18next";
22
27
  import { Card, YStack, type YStackProps } from "tamagui";
23
28
  import { useResolvedKnobs } from "@multiplatform.one/theme";
24
- import { ChartCard, type ChartCardProps } from "./FrappeDashboard";
29
+ import { ChartCard } from "./FrappeDashboard";
25
30
  import { useFrappeConfig } from "./FrappeProvider";
26
31
  import {
27
32
  useFrappeAggregate,
@@ -101,6 +106,8 @@ export function FrappeChartCard({
101
106
  ? {
102
107
  baseURL: finalBaseURL,
103
108
  socketPort: providerConfig?.socketPort,
109
+ siteName: providerConfig?.siteName,
110
+ socketBaseURL: providerConfig?.socketBaseURL,
104
111
  auth: auth ?? providerConfig?.auth,
105
112
  syncOptions: syncOptions ?? providerConfig?.syncOptions,
106
113
  fixtures: providerConfig?.fixtures,
@@ -0,0 +1,95 @@
1
+ // FrappeDashboard refresh trigger — LC-54 PRESS-FLOOR-CHANNEL (amendment
2
+ // 2026-08-13, "the grown box NEVER PAINTS"): the refresh affordance used to
3
+ // be a raw tamagui Button riding a grown transparent press target (negative
4
+ // outsets escaping the header slot) whose default hover fill painted the
5
+ // whole escaped 44px floor. The fix migrates it to the house forms Button
6
+ // with `circular`, whose painted box ITSELF is the 44×44 control — feedback
7
+ // stays inside its own reserved layout slot (box-is-control mechanism).
8
+ //
9
+ // jsdom never applies :hover, but tamagui compiles style props into
10
+ // value-carrying atomic classes, so both the escape mechanism (negative
11
+ // margin atoms) and the paint channel are asserted through the atoms each
12
+ // node carries, with a positive control proving the detectors see them.
13
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
14
+ import { pressTargetStyle } from "@multiplatform.one/theme";
15
+ import { cleanup, screen } from "@testing-library/react";
16
+ import i18next from "i18next";
17
+ import { initReactI18next } from "react-i18next";
18
+ import { View } from "tamagui";
19
+ import { afterEach, beforeAll, describe, expect, it } from "vitest";
20
+ import { FrappeDashboard } from "./FrappeDashboard";
21
+ import { FrappeProvider } from "./FrappeProvider";
22
+
23
+ beforeAll(async () => {
24
+ await i18next.use(initReactI18next).init({
25
+ lng: "en",
26
+ interpolation: { escapeValue: false },
27
+ resources: { en: { translation: {} } },
28
+ });
29
+ });
30
+
31
+ afterEach(cleanup);
32
+
33
+ /** The retired anatomy, re-created as the positive control for both detectors. */
34
+ function OldGrownPaintedFloor() {
35
+ return (
36
+ <View
37
+ data-testid="old-anatomy"
38
+ {...pressTargetStyle()}
39
+ marginVertical={-8}
40
+ marginHorizontal={-8}
41
+ hoverStyle={{ backgroundColor: "$color4" }}
42
+ />
43
+ );
44
+ }
45
+
46
+ // Grown-box escape mechanism: any negative margin atom on the press floor.
47
+ const negativeMarginAtom = /_m[trbl]--\d/;
48
+ // Painted state feedback: any non-transparent hover/press background atom.
49
+ const paintedStateAtom = /_bg-0(?:hover|active)-(?!transparent)/;
50
+
51
+ describe("FrappeDashboard refresh press floor (LC-54 amendment)", () => {
52
+ const renderStatic = () =>
53
+ renderWithProviders(
54
+ <FrappeProvider baseURL="https://dashboard.spec.test">
55
+ <FrappeDashboard title="Sales" widgets={[]} />
56
+ </FrappeProvider>,
57
+ );
58
+
59
+ it("positive control: the detectors see the retired grown painted anatomy", () => {
60
+ renderWithProviders(<OldGrownPaintedFloor />);
61
+ const oldFloor = screen.getByTestId("old-anatomy");
62
+ expect(oldFloor.className).toMatch(negativeMarginAtom);
63
+ expect(oldFloor.className).toMatch(paintedStateAtom);
64
+ });
65
+
66
+ it("renders the refresh trigger as a role=button with its accessible name", () => {
67
+ const { container } = renderStatic();
68
+ const refresh = container.querySelector('[aria-label="Refresh"]') as HTMLElement;
69
+ expect(refresh).not.toBeNull();
70
+ expect(refresh.getAttribute("role")).toBe("button");
71
+ });
72
+
73
+ it("the refresh floor is its own box — no grown-target negative outset", () => {
74
+ const { container } = renderStatic();
75
+ const refresh = container.querySelector('[aria-label="Refresh"]') as HTMLElement;
76
+ // The house circular Button reserves the 44px floor as REAL layout
77
+ // (box-is-control); the escape mechanism (negative margins pulling the
78
+ // grown box over neighbors) must be gone.
79
+ expect(refresh.className).not.toMatch(negativeMarginAtom);
80
+ expect(refresh.className).toMatch(/_mih-44px/);
81
+ expect(refresh.className).toMatch(/_miw-44px/);
82
+ });
83
+
84
+ it("hover feedback rides the button's own in-slot box (house channel)", () => {
85
+ const { container } = renderStatic();
86
+ const refresh = container.querySelector('[aria-label="Refresh"]') as HTMLElement;
87
+ // Paint on the OWN box is the sanctioned own-size mechanism — what the
88
+ // amendment bans is paint on a box that escapes its slot. With the
89
+ // outset gone (arm above), the house hover fill on this node is legal
90
+ // and expected; its absence would mean the house Button stopped
91
+ // owning the feedback.
92
+ expect(refresh.className).toMatch(paintedStateAtom);
93
+ expect(refresh.querySelector("svg")).not.toBeNull();
94
+ });
95
+ });
@@ -13,28 +13,9 @@ import {
13
13
  import { ArrowsClockwiseIcon } from "@phosphor-icons/react";
14
14
  import React, { useMemo, useCallback, useState, useEffect, useRef } from "react";
15
15
  import { useTranslation } from "react-i18next";
16
- import { Spinner } from "@multiplatform.one/forms";
17
- import { Button, Text, XStack, YStack, type YStackProps, H3 } from "tamagui";
18
- import {
19
- formatTimeOfDay,
20
- MIN_PRESS_TARGET,
21
- pressTargetHitSlop,
22
- pressTargetStyle,
23
- useResolvedKnobs,
24
- } from "@multiplatform.one/theme";
25
-
26
- // DG-LAY-04 / D-02 press-floor: the chromeless $2 refresh button paints
27
- // ~28×28; the press box is floored at 44 via the house pressTarget* channel
28
- // (grown transparent box + negative outset + hitSlop). Layout stays put; the
29
- // only adjacent node is non-interactive text, so no target overlap.
30
- const REFRESH_VISUAL = 28;
31
- const REFRESH_OUTSET = Math.ceil((MIN_PRESS_TARGET - REFRESH_VISUAL) / 2);
32
- const refreshPressFloorProps = {
33
- ...pressTargetStyle(),
34
- marginVertical: -REFRESH_OUTSET,
35
- marginHorizontal: -REFRESH_OUTSET,
36
- hitSlop: pressTargetHitSlop(REFRESH_VISUAL),
37
- } as const;
16
+ import { Button, Spinner } from "@multiplatform.one/forms";
17
+ import { Text, XStack, YStack, type YStackProps, H3 } from "tamagui";
18
+ import { formatTimeOfDay, useResolvedKnobs } from "@multiplatform.one/theme";
38
19
  import { useFrappeConfig } from "./FrappeProvider";
39
20
 
40
21
  /**
@@ -75,6 +56,10 @@ export interface FrappeDashboardProps<TDoc extends { name: string; doctype: stri
75
56
  type ConnectionConfig = {
76
57
  baseURL: string;
77
58
  socketPort?: number;
59
+ /** Same-origin socket override (see FrappeConfig.socketBaseURL). */
60
+ socketBaseURL?: string;
61
+ /** Frappe site name — the realtime Socket.IO namespace. */
62
+ siteName?: string;
78
63
  auth?: FrappeDashboardProps<{ name: string; doctype: string }>["auth"];
79
64
  syncOptions?: unknown;
80
65
  fixtures?: unknown;
@@ -221,14 +206,20 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
221
206
  time: formatTimeOfDay(dataUpdatedAt ?? lastRefresh),
222
207
  })}
223
208
  </Text>
209
+ {/* LC-54 (amendment 2026-08-13): house Button, own-box floor —
210
+ the raw tamagui Button + grown transparent target painted
211
+ its hover fill across the escaped 44px floor. `circular`
212
+ makes the painted box ITSELF the 44×44 control (box-is-
213
+ control mechanism), so feedback stays inside its own slot.
214
+ `loading` (not bare `disabled`) is the derived busy state. */}
224
215
  <Button
225
216
  size="$2"
217
+ circular
226
218
  icon={ArrowsClockwiseIcon}
227
219
  onPress={onRefresh}
228
- disabled={isRefreshing || isLiveLoading}
220
+ loading={isRefreshing || isLiveLoading}
229
221
  chromeless
230
222
  aria-label={t("Refresh")}
231
- {...refreshPressFloorProps}
232
223
  />
233
224
  </XStack>
234
225
  )}
@@ -293,6 +284,8 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
293
284
  ? {
294
285
  baseURL: finalBaseURL,
295
286
  socketPort: config?.socketPort,
287
+ siteName: config?.siteName,
288
+ socketBaseURL: config?.socketBaseURL,
296
289
  auth: finalAuth,
297
290
  syncOptions: finalSyncOptions,
298
291
  fixtures: config?.fixtures,
@@ -332,14 +325,15 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
332
325
  {t("Last updated: {{time}}", { time: formatTimeOfDay(lastRefresh) })}
333
326
  </Text>
334
327
  )}
328
+ {/* LC-54: house Button, own-box floor (see the live-path refresh). */}
335
329
  <Button
336
330
  size="$2"
331
+ circular
337
332
  icon={ArrowsClockwiseIcon}
338
333
  onPress={bumpRefresh}
339
- disabled={isRefreshing}
334
+ loading={isRefreshing}
340
335
  chromeless
341
336
  aria-label={t("Refresh")}
342
- {...refreshPressFloorProps}
343
337
  />
344
338
  </XStack>
345
339
  </XStack>
@@ -386,21 +380,6 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
386
380
  );
387
381
  }
388
382
 
389
- export {
390
- KPICard,
391
- calculateTrend,
392
- calculatePercentageChange,
393
- aggregateData,
394
- type DashboardWidget,
395
- type KPICardConfig,
396
- type KPICardProps,
397
- type ChartConfig,
398
- type ChartCardProps,
399
- type ChartDataPoint,
400
- type ChartType,
401
- type TrendDirection,
402
- } from "@multiplatform.one/components";
403
-
404
383
  /**
405
384
  * ChartCard bridge that sanitizes series rows before render: values are
406
385
  * coerced to numbers and rows without a finite value (missing, NaN,
@@ -9,7 +9,7 @@ import { Date } from "./fields/Date";
9
9
  import { Numeric } from "./fields/Numeric";
10
10
  import { FrappeForm } from "./FrappeForm";
11
11
  import { FrappeProvider } from "./FrappeProvider";
12
- import { FrappeStoryProvider } from "./frappeStoryTarget";
12
+ import { FrappeStoryProvider, LiveToDoGate } from "./frappeStoryTarget";
13
13
 
14
14
  export default {
15
15
  title: "FrappeUI/FrappeForm",
@@ -421,54 +421,61 @@ const liveFormFixtures = new InMemoryFixtureProvider({
421
421
  * user has dirty are preserved and flagged via the conflict banner;
422
422
  * `doc_deleted` for the open doc renders the read-only deleted banner. The
423
423
  * `name` arg selects the document (harnesses pass the real doc name via URL
424
- * args). Falls back to fixtures when the bench is down.
424
+ * args). When live with no arg, {@link LiveToDoGate} resolves a real ToDo
425
+ * (TODO-LIVE-001 if present, else the first readable row, else a seeded one)
426
+ * so the story does not 404 on a hash-named doctype. Falls back to fixtures
427
+ * when the bench is down.
425
428
  */
426
429
  export const Live = (args: { name?: string }) => (
427
430
  <FrappeStoryProvider fixtures={liveFormFixtures}>
428
- <FrappeForm<LiveToDo>
429
- doctype="ToDo"
430
- name={args.name || "TODO-LIVE-001"}
431
- fields={["name", "description", "status", "priority"]}
432
- onSave={action("onSave")}
433
- onCancel={action("onCancel")}
434
- >
435
- {({ doc, setValue, errors, disabled }) => (
436
- <YStack gap="$3" width={420}>
437
- <Data
438
- label="Description"
439
- value={doc.description || ""}
440
- onChange={(v) => setValue("description", v)}
441
- error={errors.description}
442
- disabled={disabled}
443
- />
444
- {/* The real ToDo doctype pins 3-option enums; DG-CTRL-01 routes short
445
- single choices to RadioGroup, so the live arm composes the honest
446
- control instead of tripping `select-too-few-options` at rest. */}
447
- <RadioGroupField
448
- label="Status"
449
- value={doc.status || ""}
450
- onChange={(v) => setValue("status", v)}
451
- options={[
452
- { label: "Open", value: "Open" },
453
- { label: "Closed", value: "Closed" },
454
- { label: "Cancelled", value: "Cancelled" },
455
- ]}
456
- disabled={disabled}
457
- />
458
- <RadioGroupField
459
- label="Priority"
460
- value={doc.priority || ""}
461
- onChange={(v) => setValue("priority", v)}
462
- options={[
463
- { label: "Low", value: "Low" },
464
- { label: "Medium", value: "Medium" },
465
- { label: "High", value: "High" },
466
- ]}
467
- disabled={disabled}
468
- />
469
- </YStack>
431
+ <LiveToDoGate name={args.name}>
432
+ {(name) => (
433
+ <FrappeForm<LiveToDo>
434
+ doctype="ToDo"
435
+ name={name}
436
+ fields={["name", "description", "status", "priority"]}
437
+ onSave={action("onSave")}
438
+ onCancel={action("onCancel")}
439
+ >
440
+ {({ doc, setValue, errors, disabled }) => (
441
+ <YStack gap="$3" width={420}>
442
+ <Data
443
+ label="Description"
444
+ value={doc.description || ""}
445
+ onChange={(v) => setValue("description", v)}
446
+ error={errors.description}
447
+ disabled={disabled}
448
+ />
449
+ {/* The real ToDo doctype pins 3-option enums; DG-CTRL-01 routes short
450
+ single choices to RadioGroup, so the live arm composes the honest
451
+ control instead of tripping `select-too-few-options` at rest. */}
452
+ <RadioGroupField
453
+ label="Status"
454
+ value={doc.status || ""}
455
+ onChange={(v) => setValue("status", v)}
456
+ options={[
457
+ { label: "Open", value: "Open" },
458
+ { label: "Closed", value: "Closed" },
459
+ { label: "Cancelled", value: "Cancelled" },
460
+ ]}
461
+ disabled={disabled}
462
+ />
463
+ <RadioGroupField
464
+ label="Priority"
465
+ value={doc.priority || ""}
466
+ onChange={(v) => setValue("priority", v)}
467
+ options={[
468
+ { label: "Low", value: "Low" },
469
+ { label: "Medium", value: "Medium" },
470
+ { label: "High", value: "High" },
471
+ ]}
472
+ disabled={disabled}
473
+ />
474
+ </YStack>
475
+ )}
476
+ </FrappeForm>
470
477
  )}
471
- </FrappeForm>
478
+ </LiveToDoGate>
472
479
  </FrappeStoryProvider>
473
480
  );
474
481
  Live.args = { name: "" };
@@ -477,7 +484,7 @@ Live.parameters = {
477
484
  docs: {
478
485
  description: {
479
486
  story:
480
- "Live ToDo edit form over the real bench: realtime doc_update patches clean fields in place, dirty fields are preserved with an honest conflict banner, doc_deleted renders the read-only deleted state. Fixture fallback when the bench is down.",
487
+ "Live ToDo edit form over the real bench: realtime doc_update patches clean fields in place, dirty fields are preserved with an honest conflict banner, doc_deleted renders the read-only deleted state. Opens a real bench ToDo (TODO-LIVE-001 when present, else the first readable row / a seeded one) so the live arm is not a 404 on a hash-named doctype. Fixture fallback when the bench is down. DocShare 403 for an ordinary Desk User is expected — the form still renders; Administrator sees live shares.",
481
488
  },
482
489
  },
483
490
  };
@@ -315,11 +315,21 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
315
315
  () => ({
316
316
  baseURL: finalBaseURL,
317
317
  socketPort: config?.socketPort,
318
+ siteName: config?.siteName,
319
+ socketBaseURL: config?.socketBaseURL,
318
320
  auth: finalAuth,
319
321
  syncOptions: finalSyncOptions,
320
322
  fixtures: config?.fixtures,
321
323
  }),
322
- [finalBaseURL, config?.socketPort, finalAuth, finalSyncOptions, config?.fixtures],
324
+ [
325
+ finalBaseURL,
326
+ config?.socketPort,
327
+ config?.siteName,
328
+ config?.socketBaseURL,
329
+ finalAuth,
330
+ finalSyncOptions,
331
+ config?.fixtures,
332
+ ],
323
333
  );
324
334
 
325
335
  // Fetch DocType metadata