@multiplatform.one/frappe-ui 6.7.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 +20 -20
  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
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Optimistic comment writes for timeline surfaces (frappe-ui Timeline and
3
+ * the backoffice FormTimeline).
4
+ *
5
+ * Server-side parity ruling: the desk RPCs are KEPT as the transport,
6
+ * wrapped in engine mutations via `mutation.execute`. A plain live
7
+ * `create_doc` on Comment is NOT equivalent to
8
+ * `frappe.desk.form.utils.add_comment` — upstream, add_comment inserts
9
+ * with ignore_permissions (any user who can read the reference doc may
10
+ * comment, without Comment-create permission) and extracts inline images
11
+ * into Files. Losing either silently would be a regression, so the RPC
12
+ * stays; the engine supplies optimism, journaling, temp→real remap, and
13
+ * rollback around it. In fixture mode there is no desk endpoint, so the
14
+ * engine's default REST-shape path (FixtureDbModule) is used instead.
15
+ */
16
+ import {
17
+ FrappeApp,
18
+ Operation,
19
+ getFrappeSyncModule,
20
+ type FrappeDoc,
21
+ type FrappeDocData,
22
+ type UseFrappeCollectionConfig,
23
+ } from "@multiplatform.one/frappe";
24
+ import { useMemo } from "react";
25
+
26
+ type CommentDoc = FrappeDoc<FrappeDocData>;
27
+
28
+ export interface AddCommentInput {
29
+ content: string;
30
+ /** Session user's email (`comment_email` on the Comment). */
31
+ email: string;
32
+ /** Display name (`comment_by`); falls back to the email. */
33
+ fullname?: string;
34
+ }
35
+
36
+ export interface FrappeCommentActions {
37
+ /**
38
+ * Inserts a comment optimistically: the row paints from the in-memory
39
+ * store immediately under a `local:` identity, the desk RPC runs in the
40
+ * background, and the ack remaps to the server-assigned name (the
41
+ * realtime echo then reconciles idempotently). On rejection the row is
42
+ * rolled back and the failure lands in the mutation ledger
43
+ * (`useFrappePendingMutations` + `SyncErrorNotice`).
44
+ */
45
+ addComment: (input: AddCommentInput) => Promise<void>;
46
+ /** Optimistic content edit via `frappe.desk.form.utils.update_comment`. */
47
+ updateComment: (commentName: string, content: string) => Promise<void>;
48
+ /** Optimistic delete via `frappe.client.delete`. */
49
+ deleteComment: (commentName: string) => Promise<void>;
50
+ }
51
+
52
+ function nowFrappeTimestamp(): string {
53
+ // Frappe timestamps are "YYYY-MM-DD HH:mm:ss.SSSSSS" naive datetimes.
54
+ return new Date().toISOString().replace("T", " ").replace("Z", "");
55
+ }
56
+
57
+ /**
58
+ * Builds the optimistic comment actions for one referenced document. The
59
+ * mutations run through the shared sync engine, so any mounted Comment
60
+ * collection (frappe-ui Timeline, backoffice FormTimeline) repaints
61
+ * optimistically without extra wiring.
62
+ */
63
+ export function useFrappeCommentActions(
64
+ config: UseFrappeCollectionConfig | undefined,
65
+ doctype: string,
66
+ docname: string,
67
+ ): FrappeCommentActions {
68
+ return useMemo(() => {
69
+ const app =
70
+ config && !config.fixtures
71
+ ? new FrappeApp(config.baseURL, (config.auth ?? {}) as Record<string, unknown>)
72
+ : undefined;
73
+
74
+ const requireSync = () => {
75
+ const sync = getFrappeSyncModule(config);
76
+ if (!sync) throw new Error("Frappe connection is not available");
77
+ return sync;
78
+ };
79
+
80
+ const addComment = async ({ content, email, fullname }: AddCommentInput) => {
81
+ const sync = requireSync();
82
+ const doc: CommentDoc = {
83
+ doctype: "Comment",
84
+ name: `local:${crypto.randomUUID()}`,
85
+ comment_type: "Comment",
86
+ reference_doctype: doctype,
87
+ reference_name: docname,
88
+ content,
89
+ comment_email: email,
90
+ comment_by: fullname || email,
91
+ owner: email,
92
+ creation: nowFrappeTimestamp(),
93
+ modified: nowFrappeTimestamp(),
94
+ };
95
+ await sync.mutate({
96
+ mutationId: crypto.randomUUID(),
97
+ operation: Operation.Create,
98
+ doc,
99
+ execute: app
100
+ ? async () => {
101
+ const response = await app
102
+ .call()
103
+ .post<{ message?: CommentDoc }>("frappe.desk.form.utils.add_comment", {
104
+ reference_doctype: doctype,
105
+ reference_name: docname,
106
+ content,
107
+ comment_email: email,
108
+ comment_by: fullname || email,
109
+ });
110
+ const payload = response?.payload;
111
+ const created = (payload?.message ?? payload) as CommentDoc | undefined;
112
+ if (!created?.name) throw new Error("add_comment returned no document");
113
+ return created;
114
+ }
115
+ : undefined,
116
+ });
117
+ };
118
+
119
+ const updateComment = async (commentName: string, content: string) => {
120
+ const sync = requireSync();
121
+ await sync.mutate({
122
+ mutationId: crypto.randomUUID(),
123
+ operation: Operation.Update,
124
+ doc: { doctype: "Comment", name: commentName, content } as CommentDoc,
125
+ execute: app
126
+ ? async () => {
127
+ await app.call().post("frappe.desk.form.utils.update_comment", {
128
+ name: commentName,
129
+ content,
130
+ });
131
+ // update_comment returns no document — the optimistic value
132
+ // stands until the realtime echo reconciles.
133
+ }
134
+ : undefined,
135
+ });
136
+ };
137
+
138
+ const deleteComment = async (commentName: string) => {
139
+ const sync = requireSync();
140
+ await sync.mutate({
141
+ mutationId: crypto.randomUUID(),
142
+ operation: Operation.Delete,
143
+ doc: { doctype: "Comment", name: commentName } as CommentDoc,
144
+ execute: app
145
+ ? async () => {
146
+ await app.call().post("frappe.client.delete", {
147
+ doctype: "Comment",
148
+ name: commentName,
149
+ });
150
+ }
151
+ : undefined,
152
+ });
153
+ };
154
+
155
+ return { addComment, updateComment, deleteComment };
156
+ }, [config?.baseURL, config?.fixtures, doctype, docname]);
157
+ }
@@ -77,6 +77,8 @@ function AttachmentsBody({
77
77
  ? {
78
78
  baseURL: config.baseURL,
79
79
  socketPort: config.socketPort,
80
+ siteName: config.siteName,
81
+ socketBaseURL: config.socketBaseURL,
80
82
  auth: config.auth,
81
83
  syncOptions: config.syncOptions,
82
84
  fixtures: config.fixtures,
@@ -28,8 +28,21 @@ export interface FrappeTagsProps extends Omit<TagsProps, "tags" | "suggestions">
28
28
  export function Tags({ doctype, docname, onAdd, onRemove, enableAdd, ...props }: FrappeTagsProps) {
29
29
  const config = useFrappeConfig();
30
30
 
31
+ // Forward the full socket target + engine options: the SyncModule cache
32
+ // keys on baseURL + socketPort/socketBaseURL/siteName, so dropping them
33
+ // here would split Tags onto a second SyncModule (own socket, own cache)
34
+ // whenever the provider sets them.
31
35
  const connectionConfig = config
32
- ? { baseURL: config.baseURL, auth: config.auth, fixtures: config.fixtures }
36
+ ? {
37
+ baseURL: config.baseURL,
38
+ socketPort: config.socketPort,
39
+ siteName: config.siteName,
40
+ socketBaseURL: config.socketBaseURL,
41
+ auth: config.auth,
42
+ syncOptions: config.syncOptions,
43
+ socketOptions: config.socketOptions,
44
+ fixtures: config.fixtures,
45
+ }
33
46
  : undefined;
34
47
 
35
48
  const tagLinkFilters = useMemo<Array<[string, string, unknown]>>(
@@ -0,0 +1,106 @@
1
+ // The comment repro kill, as a deferred-network spec: a comment submitted
2
+ // through the Timeline composer must PAINT before the server ack resolves
3
+ // (the whole point of the live client's in-memory store), then reconcile to
4
+ // the server-assigned name without duplicating when the ack lands.
5
+ import { InMemoryFixtureProvider, type FrappeDocData } from "@multiplatform.one/frappe";
6
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
7
+ import { cleanup, fireEvent, screen, waitFor } from "@testing-library/react";
8
+ import i18next from "i18next";
9
+ import { initReactI18next } from "react-i18next";
10
+ import { afterEach, beforeAll, describe, expect, it } from "vitest";
11
+ import { FrappeProvider } from "../FrappeProvider";
12
+ import { Timeline } from "./timeline";
13
+
14
+ beforeAll(async () => {
15
+ await i18next.use(initReactI18next).init({
16
+ lng: "en",
17
+ interpolation: { escapeValue: false },
18
+ resources: { en: { translation: {} } },
19
+ });
20
+ });
21
+
22
+ afterEach(cleanup);
23
+
24
+ /**
25
+ * Fixture provider whose creates hang until `release()` — the "server" is
26
+ * slow. Assigns a server-style name (drops the client's `local:` identity)
27
+ * so the temp→real remap path is exercised too.
28
+ */
29
+ class DeferredCreateFixtureProvider extends InMemoryFixtureProvider {
30
+ private pendingCreates: Array<() => void> = [];
31
+ private serial = 0;
32
+
33
+ get pendingCount() {
34
+ return this.pendingCreates.length;
35
+ }
36
+
37
+ async createDoc<TDoc extends FrappeDocData>(doctype: string, doc: Partial<TDoc>): Promise<TDoc> {
38
+ await new Promise<void>((resolve) => this.pendingCreates.push(resolve));
39
+ const { name: _clientName, ...rest } = doc as Record<string, unknown>;
40
+ return super.createDoc(doctype, {
41
+ ...rest,
42
+ name: `CMT-${String(++this.serial).padStart(3, "0")}`,
43
+ } as Partial<TDoc>);
44
+ }
45
+
46
+ release() {
47
+ const pending = this.pendingCreates.splice(0);
48
+ for (const resolve of pending) resolve();
49
+ }
50
+ }
51
+
52
+ const makeFixtures = () =>
53
+ new DeferredCreateFixtureProvider({
54
+ Comment: [
55
+ {
56
+ name: "CMT-EXISTING",
57
+ doctype: "Comment",
58
+ comment_type: "Comment",
59
+ content: "already here",
60
+ comment_by: "Jane Doe",
61
+ comment_email: "jane@example.com",
62
+ reference_doctype: "Task",
63
+ reference_name: "TASK-001",
64
+ creation: "2024-01-01 10:00:00",
65
+ owner: "jane@example.com",
66
+ },
67
+ ],
68
+ Version: [],
69
+ });
70
+
71
+ describe("Timeline optimistic comments (deferred network)", () => {
72
+ it("paints the comment row BEFORE the create ack resolves, then reconciles without duplicating", async () => {
73
+ const fixtures = makeFixtures();
74
+ renderWithProviders(
75
+ <FrappeProvider baseURL="https://bench.example.com" fixtures={fixtures}>
76
+ <Timeline doctype="Task" docname="TASK-001" />
77
+ </FrappeProvider>,
78
+ );
79
+
80
+ // Seeded comment arrives from the fixture store.
81
+ expect(await screen.findByText("already here")).toBeTruthy();
82
+
83
+ // Submit through the composer — no onAddComment prop: this is the
84
+ // default engine write path (previously a silent drop).
85
+ const input = screen.getByPlaceholderText("Add a comment...");
86
+ fireEvent.change(input, { target: { value: "optimistic!" } });
87
+ fireEvent.click(screen.getByRole("button", { name: /Comment/ }));
88
+
89
+ // THE REPRO KILL: the row paints while the server ack is still pending.
90
+ await waitFor(() => {
91
+ expect(screen.getByText("optimistic!")).toBeTruthy();
92
+ });
93
+ expect(fixtures.pendingCount).toBeGreaterThan(0);
94
+
95
+ // Ack lands: the local: identity remaps to the server name — the row
96
+ // stays painted and does not duplicate.
97
+ fixtures.release();
98
+ await waitFor(() => {
99
+ expect(fixtures.getData().Comment?.some((c) => c.content === "optimistic!")).toBe(true);
100
+ });
101
+ await waitFor(() => {
102
+ expect(screen.getAllByText("optimistic!")).toHaveLength(1);
103
+ });
104
+ expect(screen.getByText("already here")).toBeTruthy();
105
+ });
106
+ });
@@ -4,8 +4,9 @@ import {
4
4
  type TimelineProps,
5
5
  type VersionChange,
6
6
  } from "@multiplatform.one/components";
7
- import { useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
8
- import { useCallback, useMemo } from "react";
7
+ import { FrappeApp, useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
8
+ import { useCallback, useMemo, useRef } from "react";
9
+ import { useFrappeCommentActions } from "../commentActions";
9
10
  import { useFrappeConfig } from "../FrappeProvider";
10
11
 
11
12
  export interface FrappeComment {
@@ -124,6 +125,8 @@ export function Timeline({
124
125
  ? {
125
126
  baseURL: config.baseURL,
126
127
  socketPort: config.socketPort,
128
+ siteName: config.siteName,
129
+ socketBaseURL: config.socketBaseURL,
127
130
  auth: config.auth,
128
131
  syncOptions: config.syncOptions,
129
132
  socketOptions: config.socketOptions,
@@ -195,11 +198,40 @@ export function Timeline({
195
198
  );
196
199
  }, [commentsData, versionsData, showComments, showVersions, showAttachments, showAssignments]);
197
200
 
201
+ // Default write path: comments insert through the sync engine (optimistic
202
+ // paint, desk-RPC transport, rollback on rejection). Previously the
203
+ // composer only forwarded to the onAddComment prop, and consumers that
204
+ // didn't pass one (FrappeForm) dropped the comment silently.
205
+ const { addComment } = useFrappeCommentActions(connectionConfig, doctype, docname);
206
+ const sessionUserRef = useRef<string | undefined>(undefined);
207
+
208
+ const resolveSessionUser = useCallback(async (): Promise<string> => {
209
+ if (sessionUserRef.current) return sessionUserRef.current;
210
+ if (config && !config.fixtures) {
211
+ const app = new FrappeApp(config.baseURL, (config.auth ?? {}) as Record<string, unknown>);
212
+ sessionUserRef.current = await app.auth().getLoggedInUser();
213
+ } else {
214
+ // Fixture/story mode has no session endpoint.
215
+ sessionUserRef.current = "Administrator";
216
+ }
217
+ return sessionUserRef.current;
218
+ }, [config?.baseURL, config?.fixtures]);
219
+
198
220
  const handleAddComment = useCallback(
199
221
  (content: string) => {
200
- onAddComment?.(content);
222
+ if (onAddComment) {
223
+ onAddComment(content);
224
+ return;
225
+ }
226
+ void (async () => {
227
+ const email = await resolveSessionUser();
228
+ await addComment({ content, email });
229
+ })().catch(() => {
230
+ // Rejection already rolled back and landed in the mutation ledger
231
+ // (useFrappePendingMutations / SyncErrorNotice at the surface).
232
+ });
201
233
  },
202
- [onAddComment],
234
+ [onAddComment, addComment, resolveSessionUser],
203
235
  );
204
236
 
205
237
  // The base Timeline follows the `timestampStyle` house knob (default
@@ -56,6 +56,8 @@ export function DeskFormSidebar({ doctype, name }: DeskFormSidebarProps) {
56
56
  ? {
57
57
  baseURL: config.baseURL,
58
58
  socketPort: config.socketPort,
59
+ siteName: config.siteName,
60
+ socketBaseURL: config.socketBaseURL,
59
61
  auth: config.auth,
60
62
  syncOptions: config.syncOptions,
61
63
  fixtures: config.fixtures,
@@ -1154,6 +1154,8 @@ function TableAdapter(props: FieldRenderProps) {
1154
1154
  ? {
1155
1155
  baseURL: config.baseURL,
1156
1156
  socketPort: config.socketPort,
1157
+ siteName: config.siteName,
1158
+ socketBaseURL: config.socketBaseURL,
1157
1159
  auth: config.auth,
1158
1160
  syncOptions: config.syncOptions,
1159
1161
  fixtures: config.fixtures,