@arbidocs/blocks 0.5.107 → 0.5.108

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 (341) hide show
  1. package/dist/{ConnectedCallDock-TDYRHPAK.js → ConnectedCallDock-DV4FU376.js} +8 -8
  2. package/dist/{ConnectedCallDock-TDYRHPAK.js.map → ConnectedCallDock-DV4FU376.js.map} +1 -1
  3. package/dist/{ConnectedCallDock-H3WWFGXF.cjs → ConnectedCallDock-EM2VVGZK.cjs} +10 -10
  4. package/dist/{ConnectedCallDock-H3WWFGXF.cjs.map → ConnectedCallDock-EM2VVGZK.cjs.map} +1 -1
  5. package/dist/{ConnectedCallRoom-55O5OUN7.cjs → ConnectedCallRoom-7WEPEWUJ.cjs} +9 -9
  6. package/dist/{ConnectedCallRoom-55O5OUN7.cjs.map → ConnectedCallRoom-7WEPEWUJ.cjs.map} +1 -1
  7. package/dist/{ConnectedCallRoom-Z6F6WCLH.js → ConnectedCallRoom-RYTZP34O.js} +8 -8
  8. package/dist/{ConnectedCallRoom-Z6F6WCLH.js.map → ConnectedCallRoom-RYTZP34O.js.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-NVZRVNOS.js → ConnectedNativeDocxComparison-2NDXXZLQ.js} +15 -15
  10. package/dist/{ConnectedNativeDocxComparison-NVZRVNOS.js.map → ConnectedNativeDocxComparison-2NDXXZLQ.js.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-DGBZJ4XA.cjs → ConnectedNativeDocxComparison-7HOY3AVI.cjs} +16 -16
  12. package/dist/{ConnectedNativeDocxComparison-DGBZJ4XA.cjs.map → ConnectedNativeDocxComparison-7HOY3AVI.cjs.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-R4WINUUB.cjs → ConnectedNativeDocxEditor-CUWDPHXN.cjs} +16 -16
  14. package/dist/{ConnectedNativeDocxEditor-R4WINUUB.cjs.map → ConnectedNativeDocxEditor-CUWDPHXN.cjs.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-RSVBN7DY.js → ConnectedNativeDocxEditor-SPZB6Y27.js} +14 -14
  16. package/dist/{ConnectedNativeDocxEditor-RSVBN7DY.js.map → ConnectedNativeDocxEditor-SPZB6Y27.js.map} +1 -1
  17. package/dist/{ConnectedProductionSetDialog-2DFBXE2X.js → ConnectedProductionSetDialog-N3EDG3SU.js} +4 -4
  18. package/dist/{ConnectedProductionSetDialog-2DFBXE2X.js.map → ConnectedProductionSetDialog-N3EDG3SU.js.map} +1 -1
  19. package/dist/{ConnectedProductionSetDialog-KYDPQ7SG.cjs → ConnectedProductionSetDialog-XAEFEN3N.cjs} +4 -4
  20. package/dist/{ConnectedProductionSetDialog-KYDPQ7SG.cjs.map → ConnectedProductionSetDialog-XAEFEN3N.cjs.map} +1 -1
  21. package/dist/{ConnectedStreamedWordArtifact-HLJ5IIOU.js → ConnectedStreamedWordArtifact-6LTGEAJO.js} +15 -15
  22. package/dist/ConnectedStreamedWordArtifact-6LTGEAJO.js.map +1 -0
  23. package/dist/{ConnectedStreamedWordArtifact-JQ34AOUU.cjs → ConnectedStreamedWordArtifact-HNCRKZTV.cjs} +16 -16
  24. package/dist/ConnectedStreamedWordArtifact-HNCRKZTV.cjs.map +1 -0
  25. package/dist/{DocumentReviewCard-7JSXRJZ2.js → DocumentReviewCard-RJD3CO32.js} +8 -8
  26. package/dist/{DocumentReviewCard-7JSXRJZ2.js.map → DocumentReviewCard-RJD3CO32.js.map} +1 -1
  27. package/dist/{DocumentReviewCard-C4HVT3WM.cjs → DocumentReviewCard-VON7LOOY.cjs} +8 -8
  28. package/dist/{DocumentReviewCard-C4HVT3WM.cjs.map → DocumentReviewCard-VON7LOOY.cjs.map} +1 -1
  29. package/dist/{FilesViewerDialog-IMQTZWKD.js → FilesViewerDialog-7SJGY72Q.js} +21 -21
  30. package/dist/{FilesViewerDialog-IMQTZWKD.js.map → FilesViewerDialog-7SJGY72Q.js.map} +1 -1
  31. package/dist/{FilesViewerDialog-UP7GFHYN.cjs → FilesViewerDialog-VIPTC6OT.cjs} +27 -27
  32. package/dist/{FilesViewerDialog-UP7GFHYN.cjs.map → FilesViewerDialog-VIPTC6OT.cjs.map} +1 -1
  33. package/dist/{RechartsRenderer-GIRCW7DB.cjs → RechartsRenderer-THES2SE5.cjs} +6 -5
  34. package/dist/RechartsRenderer-THES2SE5.cjs.map +1 -0
  35. package/dist/{RechartsRenderer-23OF4H6X.js → RechartsRenderer-XIZLV6GH.js} +6 -5
  36. package/dist/RechartsRenderer-XIZLV6GH.js.map +1 -0
  37. package/dist/{WorkspaceTableView-PJM47B5F.cjs → WorkspaceTableView-FNME7TL6.cjs} +9 -9
  38. package/dist/{WorkspaceTableView-PJM47B5F.cjs.map → WorkspaceTableView-FNME7TL6.cjs.map} +1 -1
  39. package/dist/{WorkspaceTableView-YDA7A4UJ.js → WorkspaceTableView-XQ6J2JKI.js} +7 -7
  40. package/dist/{WorkspaceTableView-YDA7A4UJ.js.map → WorkspaceTableView-XQ6J2JKI.js.map} +1 -1
  41. package/dist/agents/index.cjs +202 -202
  42. package/dist/agents/index.js +8 -8
  43. package/dist/{ai-ADS6YSS2.cjs → ai-3SAMEYBB.cjs} +20 -20
  44. package/dist/ai-3SAMEYBB.cjs.map +1 -0
  45. package/dist/{ai-KHWTGBT5.js → ai-OTQWSYVK.js} +12 -12
  46. package/dist/ai-OTQWSYVK.js.map +1 -0
  47. package/dist/calls/index.cjs +57 -57
  48. package/dist/calls/index.js +9 -9
  49. package/dist/chat/index.cjs +3 -3
  50. package/dist/chat/index.js +3 -3
  51. package/dist/{chunk-O27K7KTZ.cjs → chunk-2TBQBF4Y.cjs} +5 -5
  52. package/dist/{chunk-O27K7KTZ.cjs.map → chunk-2TBQBF4Y.cjs.map} +1 -1
  53. package/dist/{chunk-YJWAGXYM.js → chunk-4ZA2RSQH.js} +3 -3
  54. package/dist/{chunk-YJWAGXYM.js.map → chunk-4ZA2RSQH.js.map} +1 -1
  55. package/dist/{chunk-6A4GNM4T.cjs → chunk-5D2ZINOJ.cjs} +16 -16
  56. package/dist/{chunk-6A4GNM4T.cjs.map → chunk-5D2ZINOJ.cjs.map} +1 -1
  57. package/dist/{chunk-BFVCYBND.cjs → chunk-5HXQOM3I.cjs} +5 -5
  58. package/dist/{chunk-BFVCYBND.cjs.map → chunk-5HXQOM3I.cjs.map} +1 -1
  59. package/dist/{chunk-GSD5U553.cjs → chunk-5KKT65WU.cjs} +3 -3
  60. package/dist/{chunk-GSD5U553.cjs.map → chunk-5KKT65WU.cjs.map} +1 -1
  61. package/dist/{chunk-AVGHTUPE.js → chunk-5PWLXLHY.js} +5 -5
  62. package/dist/chunk-5PWLXLHY.js.map +1 -0
  63. package/dist/{chunk-BBWLFK3C.js → chunk-5XIMUQ63.js} +3 -3
  64. package/dist/{chunk-BBWLFK3C.js.map → chunk-5XIMUQ63.js.map} +1 -1
  65. package/dist/{chunk-AHMRYY7J.cjs → chunk-6DAJXQZZ.cjs} +13 -13
  66. package/dist/{chunk-AHMRYY7J.cjs.map → chunk-6DAJXQZZ.cjs.map} +1 -1
  67. package/dist/{chunk-3PV25ICC.js → chunk-6KKVJ2V6.js} +3 -3
  68. package/dist/{chunk-3PV25ICC.js.map → chunk-6KKVJ2V6.js.map} +1 -1
  69. package/dist/{chunk-OLAYDOPC.js → chunk-6LUHNFEE.js} +6 -6
  70. package/dist/{chunk-OLAYDOPC.js.map → chunk-6LUHNFEE.js.map} +1 -1
  71. package/dist/{chunk-FSXQHEFQ.cjs → chunk-7CDV7Y4U.cjs} +25 -25
  72. package/dist/{chunk-FSXQHEFQ.cjs.map → chunk-7CDV7Y4U.cjs.map} +1 -1
  73. package/dist/{chunk-OAIOOVFN.cjs → chunk-7SJXYEZI.cjs} +36 -36
  74. package/dist/chunk-7SJXYEZI.cjs.map +1 -0
  75. package/dist/{chunk-LFYKB7KF.cjs → chunk-7V6APLF7.cjs} +19 -19
  76. package/dist/{chunk-LFYKB7KF.cjs.map → chunk-7V6APLF7.cjs.map} +1 -1
  77. package/dist/{chunk-4WMGFGYP.cjs → chunk-AJZ66VJC.cjs} +4 -4
  78. package/dist/{chunk-4WMGFGYP.cjs.map → chunk-AJZ66VJC.cjs.map} +1 -1
  79. package/dist/{chunk-KCP42W67.cjs → chunk-ARGQ5YZ5.cjs} +3 -3
  80. package/dist/{chunk-KCP42W67.cjs.map → chunk-ARGQ5YZ5.cjs.map} +1 -1
  81. package/dist/{chunk-BH6IKGZ3.js → chunk-AUAHGQY6.js} +5 -5
  82. package/dist/{chunk-BH6IKGZ3.js.map → chunk-AUAHGQY6.js.map} +1 -1
  83. package/dist/{chunk-KIXFXCHL.js → chunk-CEOCA7ID.js} +3 -3
  84. package/dist/{chunk-KIXFXCHL.js.map → chunk-CEOCA7ID.js.map} +1 -1
  85. package/dist/{chunk-TNKPQ3EF.js → chunk-CIRSOYGK.js} +12 -12
  86. package/dist/{chunk-TNKPQ3EF.js.map → chunk-CIRSOYGK.js.map} +1 -1
  87. package/dist/{chunk-BAUZUIHB.js → chunk-COL2TJGO.js} +83 -83
  88. package/dist/chunk-COL2TJGO.js.map +1 -0
  89. package/dist/{chunk-XHN5KOI2.cjs → chunk-DRLD4P2C.cjs} +8 -8
  90. package/dist/{chunk-XHN5KOI2.cjs.map → chunk-DRLD4P2C.cjs.map} +1 -1
  91. package/dist/{chunk-5AC52BHL.cjs → chunk-DYPFNQTQ.cjs} +140 -140
  92. package/dist/chunk-DYPFNQTQ.cjs.map +1 -0
  93. package/dist/{chunk-SCLGUHLU.cjs → chunk-E7TGSOPR.cjs} +4 -4
  94. package/dist/{chunk-SCLGUHLU.cjs.map → chunk-E7TGSOPR.cjs.map} +1 -1
  95. package/dist/{chunk-CRLFLMTK.cjs → chunk-EOXA4VJH.cjs} +3 -3
  96. package/dist/{chunk-CRLFLMTK.cjs.map → chunk-EOXA4VJH.cjs.map} +1 -1
  97. package/dist/{chunk-DBKZANTC.js → chunk-GA47YVW5.js} +3 -3
  98. package/dist/{chunk-DBKZANTC.js.map → chunk-GA47YVW5.js.map} +1 -1
  99. package/dist/{chunk-RCZRI72J.cjs → chunk-GMODJT4N.cjs} +4 -4
  100. package/dist/{chunk-RCZRI72J.cjs.map → chunk-GMODJT4N.cjs.map} +1 -1
  101. package/dist/{chunk-22KAKJ3W.cjs → chunk-GS5MFUPC.cjs} +4 -4
  102. package/dist/{chunk-22KAKJ3W.cjs.map → chunk-GS5MFUPC.cjs.map} +1 -1
  103. package/dist/{chunk-62OMGQHS.js → chunk-H6W3VXHU.js} +3 -3
  104. package/dist/{chunk-62OMGQHS.js.map → chunk-H6W3VXHU.js.map} +1 -1
  105. package/dist/{chunk-DX3Z2COD.cjs → chunk-HUYKO2ES.cjs} +3 -3
  106. package/dist/{chunk-DX3Z2COD.cjs.map → chunk-HUYKO2ES.cjs.map} +1 -1
  107. package/dist/{chunk-U5F5P4YU.js → chunk-IK234EFX.js} +12 -12
  108. package/dist/{chunk-U5F5P4YU.js.map → chunk-IK234EFX.js.map} +1 -1
  109. package/dist/{chunk-UQ2OBHMV.js → chunk-JUGEFTRC.js} +1010 -1010
  110. package/dist/chunk-JUGEFTRC.js.map +1 -0
  111. package/dist/{chunk-CHQMVIHR.js → chunk-LPGBRMYS.js} +36 -36
  112. package/dist/chunk-LPGBRMYS.js.map +1 -0
  113. package/dist/{chunk-D35EHOK5.cjs → chunk-M23W7IID.cjs} +12 -12
  114. package/dist/chunk-M23W7IID.cjs.map +1 -0
  115. package/dist/{chunk-FPOKWML2.js → chunk-MIVNNQO3.js} +21 -4
  116. package/dist/chunk-MIVNNQO3.js.map +1 -0
  117. package/dist/{chunk-WI3BVKEC.cjs → chunk-MNFI66H5.cjs} +5 -5
  118. package/dist/{chunk-WI3BVKEC.cjs.map → chunk-MNFI66H5.cjs.map} +1 -1
  119. package/dist/{chunk-T5ZMG6MC.js → chunk-NF4M7PUB.js} +3 -3
  120. package/dist/{chunk-T5ZMG6MC.js.map → chunk-NF4M7PUB.js.map} +1 -1
  121. package/dist/{chunk-ZNY5W3VX.js → chunk-NPSFPBIB.js} +3 -3
  122. package/dist/{chunk-ZNY5W3VX.js.map → chunk-NPSFPBIB.js.map} +1 -1
  123. package/dist/{chunk-LYW5A35J.js → chunk-OMIYTUVR.js} +12 -12
  124. package/dist/{chunk-LYW5A35J.js.map → chunk-OMIYTUVR.js.map} +1 -1
  125. package/dist/{chunk-ZMVF7EYJ.cjs → chunk-PBPO54KZ.cjs} +21 -3
  126. package/dist/chunk-PBPO54KZ.cjs.map +1 -0
  127. package/dist/{chunk-7V4OCZS6.cjs → chunk-RA3EGF6K.cjs} +6 -6
  128. package/dist/{chunk-7V4OCZS6.cjs.map → chunk-RA3EGF6K.cjs.map} +1 -1
  129. package/dist/{chunk-PL7O3RJJ.cjs → chunk-RKBAY7GZ.cjs} +3 -3
  130. package/dist/{chunk-PL7O3RJJ.cjs.map → chunk-RKBAY7GZ.cjs.map} +1 -1
  131. package/dist/{chunk-J3E5CSSC.js → chunk-RKFWBIKS.js} +3 -3
  132. package/dist/{chunk-J3E5CSSC.js.map → chunk-RKFWBIKS.js.map} +1 -1
  133. package/dist/{chunk-YLKHTBYA.js → chunk-RRP7MQAO.js} +3 -3
  134. package/dist/{chunk-YLKHTBYA.js.map → chunk-RRP7MQAO.js.map} +1 -1
  135. package/dist/{chunk-U6LQ6Z3P.cjs → chunk-SP3IKIPA.cjs} +6 -6
  136. package/dist/{chunk-U6LQ6Z3P.cjs.map → chunk-SP3IKIPA.cjs.map} +1 -1
  137. package/dist/{chunk-GX75YCWJ.cjs → chunk-SQUOXOY3.cjs} +560 -560
  138. package/dist/chunk-SQUOXOY3.cjs.map +1 -0
  139. package/dist/{chunk-6ZYOUT73.js → chunk-T5LORFHL.js} +7 -7
  140. package/dist/{chunk-6ZYOUT73.js.map → chunk-T5LORFHL.js.map} +1 -1
  141. package/dist/{chunk-45OU2UAA.cjs → chunk-TEMTKBBL.cjs} +10 -10
  142. package/dist/{chunk-45OU2UAA.cjs.map → chunk-TEMTKBBL.cjs.map} +1 -1
  143. package/dist/{chunk-PHDUN4SG.cjs → chunk-THCMGAFX.cjs} +41 -41
  144. package/dist/{chunk-PHDUN4SG.cjs.map → chunk-THCMGAFX.cjs.map} +1 -1
  145. package/dist/{chunk-HTGEAQOA.js → chunk-TOMDMKOD.js} +7 -7
  146. package/dist/{chunk-HTGEAQOA.js.map → chunk-TOMDMKOD.js.map} +1 -1
  147. package/dist/{chunk-WJHRWXWJ.js → chunk-TXIAF4PX.js} +3 -3
  148. package/dist/{chunk-WJHRWXWJ.js.map → chunk-TXIAF4PX.js.map} +1 -1
  149. package/dist/{chunk-6M5NAAWX.js → chunk-UCSEE52D.js} +3 -3
  150. package/dist/{chunk-6M5NAAWX.js.map → chunk-UCSEE52D.js.map} +1 -1
  151. package/dist/{chunk-I7CJDF3V.cjs → chunk-UHMP6S7M.cjs} +104 -103
  152. package/dist/chunk-UHMP6S7M.cjs.map +1 -0
  153. package/dist/{chunk-PGCKTXYH.js → chunk-UHUI6A36.js} +3 -3
  154. package/dist/{chunk-PGCKTXYH.js.map → chunk-UHUI6A36.js.map} +1 -1
  155. package/dist/{chunk-6KQVTMRL.cjs → chunk-UOGXKHTJ.cjs} +3 -3
  156. package/dist/{chunk-6KQVTMRL.cjs.map → chunk-UOGXKHTJ.cjs.map} +1 -1
  157. package/dist/{chunk-7S7YVBFK.js → chunk-VDSDG4FR.js} +3 -3
  158. package/dist/{chunk-7S7YVBFK.js.map → chunk-VDSDG4FR.js.map} +1 -1
  159. package/dist/{chunk-3GFQNJYE.js → chunk-VGWCHX6G.js} +104 -103
  160. package/dist/chunk-VGWCHX6G.js.map +1 -0
  161. package/dist/{chunk-VY3HTT37.js → chunk-VUH547VQ.js} +3 -3
  162. package/dist/{chunk-VY3HTT37.js.map → chunk-VUH547VQ.js.map} +1 -1
  163. package/dist/{chunk-AZCMKGDG.js → chunk-W37PFYFL.js} +4 -4
  164. package/dist/{chunk-AZCMKGDG.js.map → chunk-W37PFYFL.js.map} +1 -1
  165. package/dist/{chunk-JGUM4EXE.cjs → chunk-W3IX3GZS.cjs} +8 -8
  166. package/dist/{chunk-JGUM4EXE.cjs.map → chunk-W3IX3GZS.cjs.map} +1 -1
  167. package/dist/{chunk-UCA4JLLJ.cjs → chunk-X7GT57KW.cjs} +3 -3
  168. package/dist/{chunk-UCA4JLLJ.cjs.map → chunk-X7GT57KW.cjs.map} +1 -1
  169. package/dist/{chunk-IXL2KJOZ.cjs → chunk-XBEGD33U.cjs} +40 -40
  170. package/dist/{chunk-IXL2KJOZ.cjs.map → chunk-XBEGD33U.cjs.map} +1 -1
  171. package/dist/{chunk-FDNIK5YS.cjs → chunk-XBKIFGBB.cjs} +8 -8
  172. package/dist/{chunk-FDNIK5YS.cjs.map → chunk-XBKIFGBB.cjs.map} +1 -1
  173. package/dist/{chunk-HZE5MHQO.js → chunk-XT7HKQ4H.js} +3 -3
  174. package/dist/{chunk-HZE5MHQO.js.map → chunk-XT7HKQ4H.js.map} +1 -1
  175. package/dist/{chunk-M3OK6KGR.js → chunk-ZGQKED5T.js} +3 -3
  176. package/dist/{chunk-M3OK6KGR.js.map → chunk-ZGQKED5T.js.map} +1 -1
  177. package/dist/{chunk-NWBCZ4PA.js → chunk-ZKBYG6MN.js} +4 -4
  178. package/dist/{chunk-NWBCZ4PA.js.map → chunk-ZKBYG6MN.js.map} +1 -1
  179. package/dist/collaboration/index.cjs +1 -1
  180. package/dist/collaboration/index.js +1 -1
  181. package/dist/connect/docx.cjs +19 -19
  182. package/dist/connect/docx.js +15 -15
  183. package/dist/connect/index.cjs +762 -762
  184. package/dist/connect/index.js +63 -63
  185. package/dist/connect/viewer.cjs +14 -14
  186. package/dist/connect/viewer.js +13 -13
  187. package/dist/connection/dashboards/ConnectedDashboardsPage.d.ts +6 -0
  188. package/dist/dashboards/chartModel.d.ts +12 -0
  189. package/dist/dashboards/index.cjs +113 -42
  190. package/dist/dashboards/index.cjs.map +1 -1
  191. package/dist/dashboards/index.js +95 -24
  192. package/dist/dashboards/index.js.map +1 -1
  193. package/dist/embed/index.cjs +29 -29
  194. package/dist/embed/index.js +23 -23
  195. package/dist/facts/index.cjs +43 -43
  196. package/dist/facts/index.js +2 -2
  197. package/dist/files/index.cjs +1 -1
  198. package/dist/files/index.js +1 -1
  199. package/dist/home/index.cjs +31 -31
  200. package/dist/home/index.js +3 -3
  201. package/dist/index.cjs +383 -383
  202. package/dist/index.js +21 -21
  203. package/dist/settings/index.cjs +153 -153
  204. package/dist/settings/index.js +4 -4
  205. package/dist/shell/index.cjs +36 -36
  206. package/dist/shell/index.js +4 -4
  207. package/dist/site/index.cjs +5 -5
  208. package/dist/site/index.js +1 -1
  209. package/dist/studio/index.cjs +19 -19
  210. package/dist/studio/index.js +14 -14
  211. package/dist/styles.css +1 -1
  212. package/dist/workflow-canvas/index.cjs +33 -33
  213. package/dist/workflow-canvas/index.js +22 -22
  214. package/node_modules/@arbidocs/coedit/package.json +2 -2
  215. package/node_modules/@docx-editor.dev/core/dist/automation.cjs +1 -1
  216. package/node_modules/@docx-editor.dev/core/dist/automation.d.ts +60 -13
  217. package/node_modules/@docx-editor.dev/core/dist/automation.js +1 -1
  218. package/node_modules/@docx-editor.dev/core/dist/binding.cjs +1 -1
  219. package/node_modules/@docx-editor.dev/core/dist/binding.d.ts +21 -13
  220. package/node_modules/@docx-editor.dev/core/dist/binding.js +1 -1
  221. package/node_modules/@docx-editor.dev/core/dist/{index-Bsg7oIKP.d.ts → chrome-print-CAs51cpq.d.ts} +31 -21
  222. package/node_modules/@docx-editor.dev/core/dist/{chunk-VDNNLG6X.js → chunk-236O4YQW.js} +1 -1
  223. package/node_modules/@docx-editor.dev/core/dist/chunk-4HENIAFG.js +1 -0
  224. package/node_modules/@docx-editor.dev/core/dist/{chunk-SRPILEWV.cjs → chunk-6JPL6ZAS.cjs} +5 -5
  225. package/node_modules/@docx-editor.dev/core/dist/{chunk-2RC2EPND.js → chunk-6ZQP4HQ7.js} +1 -1
  226. package/node_modules/@docx-editor.dev/core/dist/{chunk-ZUHOMK52.cjs → chunk-7WQ7AAHW.cjs} +1 -1
  227. package/node_modules/@docx-editor.dev/core/dist/{chunk-Z6WBFXJU.js → chunk-BCXH4BXB.js} +3 -3
  228. package/node_modules/@docx-editor.dev/core/dist/{chunk-QMLCVPCD.cjs → chunk-BY2ACZZ6.cjs} +1 -1
  229. package/node_modules/@docx-editor.dev/core/dist/chunk-CAJEXXVG.cjs +4 -0
  230. package/node_modules/@docx-editor.dev/core/dist/chunk-CPWLFPWC.js +30 -0
  231. package/node_modules/@docx-editor.dev/core/dist/{chunk-6APGXLBB.cjs → chunk-D7ZMDMPX.cjs} +2 -2
  232. package/node_modules/@docx-editor.dev/core/dist/chunk-DOHF6FA7.cjs +30 -0
  233. package/node_modules/@docx-editor.dev/core/dist/chunk-DVX32P2P.js +27 -0
  234. package/node_modules/@docx-editor.dev/core/dist/{chunk-6EYYL7FL.js → chunk-E4LOMDNL.js} +1 -1
  235. package/node_modules/@docx-editor.dev/core/dist/chunk-EKLM7NWB.cjs +7 -0
  236. package/node_modules/@docx-editor.dev/core/dist/chunk-G3K63G7P.cjs +27 -0
  237. package/node_modules/@docx-editor.dev/core/dist/{chunk-5CSUYANV.js → chunk-G4HOFIKJ.js} +1 -1
  238. package/node_modules/@docx-editor.dev/core/dist/{chunk-K5U2PLDP.cjs → chunk-JLVBDYVQ.cjs} +1 -1
  239. package/node_modules/@docx-editor.dev/core/dist/chunk-LQX36Z5P.js +7 -0
  240. package/node_modules/@docx-editor.dev/core/dist/{chunk-TSLBZ26X.js → chunk-LSZ6KPKK.js} +1 -1
  241. package/node_modules/@docx-editor.dev/core/dist/{chunk-O2AL2HSJ.cjs → chunk-MM5QBMTE.cjs} +1 -1
  242. package/node_modules/@docx-editor.dev/core/dist/{chunk-ETTO6GK3.js → chunk-OMCG63ZF.js} +1 -1
  243. package/node_modules/@docx-editor.dev/core/dist/chunk-OSFOJTHU.cjs +18 -0
  244. package/node_modules/@docx-editor.dev/core/dist/{chunk-E7BQA6UP.js → chunk-RCLZXP3B.js} +1 -1
  245. package/node_modules/@docx-editor.dev/core/dist/chunk-T6K2QYNZ.cjs +2 -0
  246. package/node_modules/@docx-editor.dev/core/dist/chunk-TRGAVV2Y.js +4 -0
  247. package/node_modules/@docx-editor.dev/core/dist/chunk-U4JZVSOE.js +2 -0
  248. package/node_modules/@docx-editor.dev/core/dist/{chunk-2GO5T2JU.cjs → chunk-UHHYFIDT.cjs} +1 -1
  249. package/node_modules/@docx-editor.dev/core/dist/chunk-V3N4SOAK.cjs +1 -0
  250. package/node_modules/@docx-editor.dev/core/dist/{chunk-6AWEKBLB.cjs → chunk-W35WTWAO.cjs} +1 -1
  251. package/node_modules/@docx-editor.dev/core/dist/chunk-YQ5G6LC7.js +18 -0
  252. package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.cjs +1 -1
  253. package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.d.ts +5 -5
  254. package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.js +1 -1
  255. package/node_modules/@docx-editor.dev/core/dist/collaboration.d.ts +4 -4
  256. package/node_modules/@docx-editor.dev/core/dist/contracts/document.d.ts +3 -3
  257. package/node_modules/@docx-editor.dev/core/dist/contracts/editor.d.ts +9 -10
  258. package/node_modules/@docx-editor.dev/core/dist/contracts/interaction.d.ts +2 -2
  259. package/node_modules/@docx-editor.dev/core/dist/contracts/modules.cjs +1 -1
  260. package/node_modules/@docx-editor.dev/core/dist/contracts/modules.d.ts +33 -9
  261. package/node_modules/@docx-editor.dev/core/dist/contracts/modules.js +1 -1
  262. package/node_modules/@docx-editor.dev/core/dist/contracts/types.d.ts +2 -2
  263. package/node_modules/@docx-editor.dev/core/dist/{custom-node-writes-cvL5rhcD.d.ts → custom-node-writes-Bn6uciLb.d.ts} +2 -2
  264. package/node_modules/@docx-editor.dev/core/dist/diagnostic-context-B8M79cfK.d.ts +30 -0
  265. package/node_modules/@docx-editor.dev/core/dist/diagnostic-hints-BeVjfNOv.d.ts +113 -0
  266. package/node_modules/@docx-editor.dev/core/dist/{document-protection-BAGVGqaP.d.ts → document-protection-CUb55pl_.d.ts} +2 -2
  267. package/node_modules/@docx-editor.dev/core/dist/{editor-Ci7IZGmG.d.ts → editor-CZQZmTIU.d.ts} +386 -9
  268. package/node_modules/@docx-editor.dev/core/dist/{editor-scope-OHPwVQ5l.d.ts → editor-scope-7o9xweiJ.d.ts} +1 -1
  269. package/node_modules/@docx-editor.dev/core/dist/editor.cjs +1 -1
  270. package/node_modules/@docx-editor.dev/core/dist/editor.d.ts +54 -33
  271. package/node_modules/@docx-editor.dev/core/dist/editor.js +1 -1
  272. package/node_modules/@docx-editor.dev/core/dist/export.cjs +2 -2
  273. package/node_modules/@docx-editor.dev/core/dist/export.d.ts +13 -14
  274. package/node_modules/@docx-editor.dev/core/dist/export.js +1 -1
  275. package/node_modules/@docx-editor.dev/core/dist/{font-resolver-BVQB14qT.d.ts → font-resolver-lSBLirLR.d.ts} +3 -3
  276. package/node_modules/@docx-editor.dev/core/dist/{headless-document-view-qH331moE.d.ts → headless-document-view-pp3q7wIh.d.ts} +2 -2
  277. package/node_modules/@docx-editor.dev/core/dist/{image-resources-BN-hUgCn.d.ts → image-resources-tXLQShoC.d.ts} +2 -2
  278. package/node_modules/@docx-editor.dev/core/dist/index.cjs +1 -1
  279. package/node_modules/@docx-editor.dev/core/dist/index.d.ts +65 -20
  280. package/node_modules/@docx-editor.dev/core/dist/index.js +1 -1
  281. package/node_modules/@docx-editor.dev/core/dist/{layout-shaping-BEyuiQOk.d.ts → layout-shaping-BD-dF_rn.d.ts} +1 -1
  282. package/node_modules/@docx-editor.dev/core/dist/layout.cjs +1 -1
  283. package/node_modules/@docx-editor.dev/core/dist/layout.d.ts +17 -20
  284. package/node_modules/@docx-editor.dev/core/dist/layout.js +1 -1
  285. package/node_modules/@docx-editor.dev/core/dist/{note-properties-4Y9o6Gyk.d.ts → note-properties-qQUjO1GQ.d.ts} +3 -3
  286. package/node_modules/@docx-editor.dev/core/dist/{omml-equation-CuzBL5DD.d.ts → omml-equation-BUbU0utM.d.ts} +1 -1
  287. package/node_modules/@docx-editor.dev/core/dist/output.cjs +1 -1
  288. package/node_modules/@docx-editor.dev/core/dist/output.d.ts +8 -9
  289. package/node_modules/@docx-editor.dev/core/dist/output.js +1 -1
  290. package/node_modules/@docx-editor.dev/core/dist/{protocol-Bqk4Izjc.d.ts → protocol-DYzzz2ej.d.ts} +2 -2
  291. package/node_modules/@docx-editor.dev/core/dist/{review-paragraph-order-DT-n6ouC.d.ts → review-paragraph-order-CN_0l2Cb.d.ts} +1 -1
  292. package/node_modules/@docx-editor.dev/core/dist/{semantic-cell-selection-D9D1KSXq.d.ts → semantic-cell-selection-eYag3P47.d.ts} +4 -211
  293. package/node_modules/@docx-editor.dev/core/dist/{semantic-interaction-CIC-PooQ.d.ts → semantic-interaction-kR_QB845.d.ts} +1 -1
  294. package/node_modules/@docx-editor.dev/core/dist/{semantic-paint-BME37OMv.d.ts → semantic-paint-ZayFF3tD.d.ts} +17 -5
  295. package/node_modules/@docx-editor.dev/core/dist/{semantic-record-queries-CBlZqZNa.d.ts → semantic-record-queries-Bsgth6lv.d.ts} +1 -1
  296. package/node_modules/@docx-editor.dev/core/dist/{semantic-records-4B3WwFAi.d.ts → semantic-records-DQmumPgL.d.ts} +1279 -828
  297. package/node_modules/@docx-editor.dev/core/dist/store.cjs +1 -1
  298. package/node_modules/@docx-editor.dev/core/dist/store.d.ts +1466 -1464
  299. package/node_modules/@docx-editor.dev/core/dist/store.js +1 -1
  300. package/node_modules/@docx-editor.dev/core/dist/{tree-package-fragment-BeeKxDw8.d.ts → tree-package-store-CovjNARF.d.ts} +83 -83
  301. package/node_modules/@docx-editor.dev/core/dist/{tree-session-contract-CVbmlMlq.d.ts → tree-session-contract-CZVAGl51.d.ts} +6 -6
  302. package/node_modules/@docx-editor.dev/core/dist/{types-barrel-D3xCgQX6.d.ts → types-barrel-DuC5QBNC.d.ts} +548 -527
  303. package/node_modules/@docx-editor.dev/core/package.json +3 -3
  304. package/node_modules/@docx-editor.dev/react/dist/index.js +3 -3
  305. package/node_modules/@docx-editor.dev/react/dist/index.mjs +3 -3
  306. package/node_modules/@docx-editor.dev/react/package.json +4 -4
  307. package/package.json +8 -8
  308. package/dist/ConnectedStreamedWordArtifact-HLJ5IIOU.js.map +0 -1
  309. package/dist/ConnectedStreamedWordArtifact-JQ34AOUU.cjs.map +0 -1
  310. package/dist/RechartsRenderer-23OF4H6X.js.map +0 -1
  311. package/dist/RechartsRenderer-GIRCW7DB.cjs.map +0 -1
  312. package/dist/ai-ADS6YSS2.cjs.map +0 -1
  313. package/dist/ai-KHWTGBT5.js.map +0 -1
  314. package/dist/chunk-3GFQNJYE.js.map +0 -1
  315. package/dist/chunk-5AC52BHL.cjs.map +0 -1
  316. package/dist/chunk-AVGHTUPE.js.map +0 -1
  317. package/dist/chunk-BAUZUIHB.js.map +0 -1
  318. package/dist/chunk-CHQMVIHR.js.map +0 -1
  319. package/dist/chunk-D35EHOK5.cjs.map +0 -1
  320. package/dist/chunk-FPOKWML2.js.map +0 -1
  321. package/dist/chunk-GX75YCWJ.cjs.map +0 -1
  322. package/dist/chunk-I7CJDF3V.cjs.map +0 -1
  323. package/dist/chunk-OAIOOVFN.cjs.map +0 -1
  324. package/dist/chunk-UQ2OBHMV.js.map +0 -1
  325. package/dist/chunk-ZMVF7EYJ.cjs.map +0 -1
  326. package/node_modules/@docx-editor.dev/core/dist/chunk-4GBTELJV.cjs +0 -28
  327. package/node_modules/@docx-editor.dev/core/dist/chunk-4R3TEXMN.js +0 -18
  328. package/node_modules/@docx-editor.dev/core/dist/chunk-EO4C5QJW.cjs +0 -2
  329. package/node_modules/@docx-editor.dev/core/dist/chunk-FIJZIQXA.cjs +0 -18
  330. package/node_modules/@docx-editor.dev/core/dist/chunk-FRXAOVTB.js +0 -28
  331. package/node_modules/@docx-editor.dev/core/dist/chunk-J6BVWIDB.js +0 -2
  332. package/node_modules/@docx-editor.dev/core/dist/chunk-JGNVNT2A.cjs +0 -2
  333. package/node_modules/@docx-editor.dev/core/dist/chunk-KKIJG3C6.js +0 -2
  334. package/node_modules/@docx-editor.dev/core/dist/chunk-LWDSDCMO.js +0 -27
  335. package/node_modules/@docx-editor.dev/core/dist/chunk-NBCVVZOM.cjs +0 -1
  336. package/node_modules/@docx-editor.dev/core/dist/chunk-O5INAWZQ.js +0 -1
  337. package/node_modules/@docx-editor.dev/core/dist/chunk-RCHS4ZEH.cjs +0 -27
  338. package/node_modules/@docx-editor.dev/core/dist/chunk-VHAVHCQY.js +0 -7
  339. package/node_modules/@docx-editor.dev/core/dist/chunk-VX43VBAX.cjs +0 -7
  340. package/node_modules/@docx-editor.dev/core/dist/review-pane-D9jm8DcY.d.ts +0 -128
  341. package/node_modules/@docx-editor.dev/core/dist/revision-projection-DZ4kKVev.d.ts +0 -242
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { PanelEditor, DashboardGrid, DashboardCell, DashboardPanel } from '../chunk-AVGHTUPE.js';
3
- export { ChartRenderer, ChartTable, DEFAULT_CHART_RENDERER_LABELS, DEFAULT_DASHBOARD_PANEL_LABELS, DEFAULT_PANEL_EDITOR_LABELS, DEFAULT_PANEL_VIEW_LABELS, DashboardCell, DashboardGrid, DashboardPanel, PANEL_FORMATTERS, PanelEditor, PanelView, clampPanelWidth } from '../chunk-AVGHTUPE.js';
4
- export { DEFAULT_UNIT_FORMATTERS, chartModelOf, formatBucketLabel, formatterOf, metricValueOf } from '../chunk-FPOKWML2.js';
2
+ import { PanelEditor, DashboardGrid, DashboardCell, DashboardPanel } from '../chunk-5PWLXLHY.js';
3
+ export { ChartRenderer, ChartTable, DEFAULT_CHART_RENDERER_LABELS, DEFAULT_DASHBOARD_PANEL_LABELS, DEFAULT_PANEL_EDITOR_LABELS, DEFAULT_PANEL_VIEW_LABELS, DashboardCell, DashboardGrid, DashboardPanel, PANEL_FORMATTERS, PanelEditor, PanelView, clampPanelWidth } from '../chunk-5PWLXLHY.js';
4
+ export { DEFAULT_UNIT_FORMATTERS, chartModelOf, formatBucketLabel, formatterOf, metricValueOf } from '../chunk-MIVNNQO3.js';
5
5
  import '../chunk-653XMGF4.js';
6
6
  import '../chunk-I46XTM3W.js';
7
7
  import '../chunk-AMTWY22T.js';
@@ -15,9 +15,9 @@ import '../chunk-WTTPZMZ7.js';
15
15
  import '../chunk-TX2ZICS7.js';
16
16
  import '../chunk-UP3GCNPM.js';
17
17
  import '../chunk-VUNV25KB.js';
18
- import { useState, useMemo, useEffect } from 'react';
18
+ import { useState, useRef, useEffect, useMemo } from 'react';
19
19
  import { Plus, Pencil, MoreHorizontal, Trash2, ArrowLeft, LayoutDashboard, ArrowUp, ArrowDown } from 'lucide-react';
20
- import { DEFAULT_DOCUMENTS_SOURCE_LABELS, DEFAULT_WORKFLOWS_SOURCE_LABELS, DEFAULT_ACTIVITY_SOURCE_LABELS, useFeature, useDashboardStore, useSavedDashboards, useSaveDashboard, useDeleteDashboard } from '@arbidocs/react';
20
+ import { DEFAULT_DOCUMENTS_SOURCE_LABELS, DEFAULT_WORKFLOWS_SOURCE_LABELS, DEFAULT_ACTIVITY_SOURCE_LABELS, useFeature, useDashboardStore, useSavedDashboards, useSaveDashboard, useDeleteDashboard, useSessionView } from '@arbidocs/react';
21
21
  import { Button, Label, Input, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, Card, cn } from '@arbidocs/react/ui';
22
22
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
23
23
 
@@ -313,12 +313,16 @@ var DEFAULT_DASHBOARDS_PAGE_LABELS = {
313
313
  empty: "No dashboards yet",
314
314
  emptyDescription: "Start from a template or a blank page, then add charts, figures and tables.",
315
315
  loadError: "The dashboards could not be loaded.",
316
+ offline: "You are offline. Your dashboards show when the connection is back.",
317
+ retry: "Try again",
316
318
  panels: (count) => `${count} ${count === 1 ? "panel" : "panels"}`,
317
319
  back: "All dashboards",
318
320
  edit: "Edit",
319
321
  more: "More dashboard actions",
320
322
  delete: "Delete",
321
323
  confirmDelete: (title) => `Delete the dashboard \u201C${title}\u201D? Its panels go with it.`,
324
+ deleteFailed: "The dashboard could not be deleted",
325
+ confirmDiscard: "Discard the changes to this dashboard?",
322
326
  save: "Save",
323
327
  saving: "Saving\u2026",
324
328
  cancel: "Cancel",
@@ -401,24 +405,29 @@ function PanelsGrid({
401
405
  function NewDashboardButton({
402
406
  templates,
403
407
  l,
404
- onCreate,
408
+ onBlank,
409
+ onTemplate,
410
+ busy,
405
411
  testId
406
412
  }) {
407
- const blank = { version: 1, title: l.untitled, panels: [] };
408
413
  return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
409
- /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { "data-testid": testId && `${testId}-new`, children: [
414
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { disabled: busy, "data-testid": `${testId}-new`, children: [
410
415
  /* @__PURE__ */ jsx(Plus, { className: "size-4" }),
411
416
  " ",
412
- l.newDashboard
417
+ busy ? l.saving : l.newDashboard
413
418
  ] }) }),
414
- /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", children: [
415
- /* @__PURE__ */ jsx(DropdownMenuItem, { onSelect: () => onCreate(blank), children: l.blank }),
416
- templates.map((t, i) => /* @__PURE__ */ jsx(
419
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", className: "max-w-[min(20rem,calc(100vw-1rem))]", children: [
420
+ /* @__PURE__ */ jsx(DropdownMenuItem, { onSelect: onBlank, "data-testid": `${testId}-blank`, children: l.blank }),
421
+ templates.map((t, i) => /* @__PURE__ */ jsxs(
417
422
  DropdownMenuItem,
418
423
  {
419
- onSelect: () => onCreate(t),
420
- "data-testid": testId && `${testId}-template-${i}`,
421
- children: t.title
424
+ onSelect: () => onTemplate(t),
425
+ className: "flex-col items-start gap-0.5",
426
+ "data-testid": `${testId}-template-${i}`,
427
+ children: [
428
+ /* @__PURE__ */ jsx("span", { children: t.title }),
429
+ t.description && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: t.description })
430
+ ]
422
431
  },
423
432
  `${t.title}-${i}`
424
433
  ))
@@ -443,20 +452,52 @@ function ConnectedDashboardsPage({
443
452
  const saved = useSavedDashboards(store);
444
453
  const save = useSaveDashboard(store);
445
454
  const remove = useDeleteDashboard(store);
446
- const [ownOpenId, setOwnOpenId] = useState(null);
455
+ const [ownOpenId, setOwnOpenId] = useSessionView(
456
+ `dashboards.open:${store.scope ?? ""}`,
457
+ null
458
+ );
447
459
  const openId = dashboardId === void 0 ? ownOpenId : dashboardId;
448
460
  const setOpenId = (id) => {
449
461
  setOwnOpenId(id);
450
462
  onDashboardChange?.(id);
451
463
  };
452
464
  const [draft, setDraft] = useState(null);
465
+ const [creating, setCreating] = useState(false);
466
+ const openIdRef = useRef(openId);
467
+ useEffect(() => {
468
+ openIdRef.current = openId;
469
+ }, [openId]);
453
470
  const [editingPanel, setEditingPanel] = useState(null);
454
471
  const open = useMemo(() => saved.data?.find((d) => d.id === openId), [saved.data, openId]);
455
472
  useEffect(() => {
456
473
  if (openId && saved.data && !open && !draft) setOwnOpenId(null);
457
474
  }, [openId, saved.data, open, draft]);
458
- const startEditing = (d) => setDraft({ id: d.id, spec: d.spec });
459
- const createFrom = (spec) => setDraft({ spec: { ...spec, panels: spec.panels.map((p) => ({ ...p })) } });
475
+ const startEditing = (d) => setDraft({ id: d.id, spec: d.spec, base: d.spec });
476
+ const createBlank = () => {
477
+ const spec = { version: 1, title: l.untitled, panels: [] };
478
+ setDraft({ spec, base: spec });
479
+ };
480
+ const createFromTemplate = async (template) => {
481
+ if (creating) return;
482
+ setCreating(true);
483
+ const openWhenStarted = openIdRef.current;
484
+ try {
485
+ const result = await save.mutateAsync({
486
+ spec: { ...template, panels: template.panels.map((p) => ({ ...p })) }
487
+ });
488
+ if (openIdRef.current === openWhenStarted) setOpenId(result.id);
489
+ notify(l.saved, "success");
490
+ } catch (error) {
491
+ notify(`${l.saveFailed}: ${error instanceof Error ? error.message : String(error)}`, "error");
492
+ } finally {
493
+ setCreating(false);
494
+ }
495
+ };
496
+ const cancelEditing = async () => {
497
+ const changed = draft && JSON.stringify(draft.spec) !== JSON.stringify(draft.base);
498
+ if (changed && !await confirm({ message: l.confirmDiscard, kind: "yesno" })) return;
499
+ setDraft(null);
500
+ };
460
501
  const updateDraft = (patch) => setDraft((d) => d ? { ...d, spec: { ...d.spec, ...patch } } : d);
461
502
  const setPanels = (panels) => updateDraft({ panels });
462
503
  const commit = async () => {
@@ -475,8 +516,15 @@ function ConnectedDashboardsPage({
475
516
  };
476
517
  const deleteOpen = async (d) => {
477
518
  if (!await confirm({ message: l.confirmDelete(d.spec.title), kind: "yesno" })) return;
478
- await remove.mutateAsync(d.id);
479
- setOpenId(null);
519
+ try {
520
+ await remove.mutateAsync(d.id);
521
+ setOpenId(null);
522
+ } catch (error) {
523
+ notify(
524
+ `${l.deleteFailed}: ${error instanceof Error ? error.message : String(error)}`,
525
+ "error"
526
+ );
527
+ }
480
528
  };
481
529
  let content;
482
530
  if (draft) {
@@ -487,7 +535,15 @@ function ConnectedDashboardsPage({
487
535
  {
488
536
  title: draft.spec.title || l.untitled,
489
537
  actions: /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
490
- /* @__PURE__ */ jsx(Button, { variant: "ghost", onClick: () => setDraft(null), children: l.cancel }),
538
+ /* @__PURE__ */ jsx(
539
+ Button,
540
+ {
541
+ variant: "ghost",
542
+ onClick: () => void cancelEditing(),
543
+ "data-testid": `${testId}-cancel`,
544
+ children: l.cancel
545
+ }
546
+ ),
491
547
  /* @__PURE__ */ jsx(
492
548
  Button,
493
549
  {
@@ -644,22 +700,37 @@ function ConnectedDashboardsPage({
644
700
  ] });
645
701
  } else {
646
702
  const list = saved.data ?? [];
703
+ const newButton = /* @__PURE__ */ jsx(
704
+ NewDashboardButton,
705
+ {
706
+ templates,
707
+ l,
708
+ onBlank: createBlank,
709
+ onTemplate: (t) => void createFromTemplate(t),
710
+ busy: creating,
711
+ testId
712
+ }
713
+ );
714
+ const isEmpty = !!saved.data && list.length === 0;
647
715
  content = /* @__PURE__ */ jsxs("div", { className: "space-y-6", "data-testid": `${testId}-list`, children: [
648
716
  /* @__PURE__ */ jsx(
649
717
  PageHeader,
650
718
  {
651
719
  title: l.title,
652
720
  description: l.description,
653
- actions: /* @__PURE__ */ jsx(NewDashboardButton, { templates, l, onCreate: createFrom, testId })
721
+ actions: saved.isError || saved.data && !isEmpty ? newButton : void 0
654
722
  }
655
723
  ),
656
- saved.isError ? /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", role: "alert", children: l.loadError }) : saved.isLoading ? /* @__PURE__ */ jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: [0, 1, 2].map((i) => /* @__PURE__ */ jsx("div", { className: "h-24 animate-pulse rounded-xl bg-muted" }, i)) }) : list.length === 0 ? /* @__PURE__ */ jsx(
724
+ saved.isError && !saved.data ? /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", role: "alert", children: [
725
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: l.loadError }),
726
+ /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: () => void saved.refetch(), children: l.retry })
727
+ ] }) : !saved.data && saved.fetchStatus === "paused" ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", "data-testid": `${testId}-offline`, children: l.offline }) : !saved.data ? /* @__PURE__ */ jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: [0, 1, 2].map((i) => /* @__PURE__ */ jsx("div", { className: "h-24 animate-pulse rounded-xl bg-muted" }, i)) }) : isEmpty ? /* @__PURE__ */ jsx(
657
728
  EmptyState,
658
729
  {
659
730
  icon: LayoutDashboard,
660
731
  title: l.empty,
661
732
  description: l.emptyDescription,
662
- action: /* @__PURE__ */ jsx(NewDashboardButton, { templates, l, onCreate: createFrom }),
733
+ action: newButton,
663
734
  testId: `${testId}-empty`
664
735
  }
665
736
  ) : /* @__PURE__ */ jsx("ul", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: list.map((d) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Card, { variant: "elevated", className: "card-hover h-full rounded-xl p-0", children: /* @__PURE__ */ jsxs(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/connection/dashboards/templates.ts","../../src/connection/dashboards/ConnectedDashboardsPage.tsx"],"names":["panel"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The starting points a new dashboard is offered by default (`DASHBOARD_TEMPLATES`): an overview,\n * then one dashboard per area (documents, tags and facts, workflows, AI usage, recent activity),\n * over the built-in sources and their default words. A site passes its own\n * (`ConnectedDashboardsPage templates`), in its words.\n */\nimport {\n DEFAULT_ACTIVITY_SOURCE_LABELS,\n DEFAULT_DOCUMENTS_SOURCE_LABELS,\n DEFAULT_WORKFLOWS_SOURCE_LABELS,\n type ChartSpec,\n type DashboardSpec,\n type PanelSpec,\n} from '@arbidocs/react'\n\n/** A fresh panel id. */\nexport function newPanelId(): string {\n return `pnl-${Math.random().toString(36).slice(2, 10)}`\n}\n\n/** A new panel: a bar chart of the documents by type, ready to be changed. */\nexport function newPanel(): PanelSpec {\n return {\n id: newPanelId(),\n title: 'New panel',\n source: { id: 'documents' },\n chart: { type: 'bar', x: 'type' },\n width: 6,\n }\n}\n\n/** A panel of `source`, `width` columns wide. */\nconst panel = (\n id: string,\n title: string,\n source: string,\n chart: ChartSpec,\n width = 6\n): PanelSpec => ({ id, title, source: { id: source }, chart, width })\n\n/** One figure, a quarter of the row by default. */\nconst metric = (\n id: string,\n title: string,\n source: string,\n chart: Omit<ChartSpec, 'type'> = {},\n width = 3\n): PanelSpec => panel(id, title, source, { type: 'metric', ...chart }, width)\n\nconst FAILED_DOCUMENT = DEFAULT_DOCUMENTS_SOURCE_LABELS.statuses.failed\nconst FAILED_RUN = DEFAULT_WORKFLOWS_SOURCE_LABELS.results.failed\nconst WORKFLOW_RUN = DEFAULT_ACTIVITY_SOURCE_LABELS.kinds.workflow_run\n\nconst DOCUMENTS_BY_TYPE = panel('documents-by-type', 'Documents by type', 'documents', {\n type: 'bar',\n x: 'type',\n limit: 8,\n})\nconst DOCUMENTS_BY_STATUS = panel('documents-by-status', 'Documents by status', 'documents', {\n type: 'donut',\n x: 'status',\n})\nconst AI_USAGE_BY_MODEL = panel('usage-by-model', 'AI usage by model', 'usage', {\n type: 'bar',\n x: 'day',\n bucket: 'day',\n series: 'model',\n y: 'spend',\n aggregate: 'sum',\n stacked: true,\n})\nconst WORKFLOW_RUNS_BY_DAY = panel(\n 'workflow-runs-by-day',\n 'Workflow runs by day',\n 'activity',\n {\n type: 'bar',\n x: 'when',\n bucket: 'day',\n series: 'status',\n stacked: true,\n filters: [{ field: 'kind', op: 'eq', value: WORKFLOW_RUN }],\n },\n 12\n)\n\nexport const OVERVIEW_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Overview',\n description: 'Documents, threads, facts and AI usage at a glance.',\n panels: [\n metric('documents', 'Documents', 'documents'),\n metric('threads', 'Threads', 'conversations'),\n metric('facts', 'Facts', 'facts'),\n metric('ai-usage', 'AI usage this period', 'usage', { aggregate: 'sum', y: 'spend' }),\n panel('threads-over-time', 'Threads started', 'conversations', {\n type: 'line',\n x: 'created',\n bucket: 'month',\n }),\n AI_USAGE_BY_MODEL,\n DOCUMENTS_BY_TYPE,\n DOCUMENTS_BY_STATUS,\n panel(\n 'due',\n 'Due dates',\n 'conversations',\n {\n type: 'table',\n columns: ['title', 'due', 'status', 'owner'],\n filters: [{ field: 'due', op: 'not_empty' }],\n orderBy: { field: 'due' },\n },\n 12\n ),\n ],\n}\n\nconst DOCUMENTS_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Documents',\n description: 'What the workspace holds: status, type, folders, who added what, and when.',\n panels: [\n metric('documents', 'Documents', 'documents'),\n metric('pages', 'Pages', 'documents', { aggregate: 'sum', y: 'pages' }),\n metric('size', 'Stored', 'documents', { aggregate: 'sum', y: 'size' }),\n metric('failed', 'Failed to process', 'documents', {\n filters: [{ field: 'status', op: 'eq', value: FAILED_DOCUMENT }],\n }),\n DOCUMENTS_BY_STATUS,\n DOCUMENTS_BY_TYPE,\n panel('documents-added', 'Documents added', 'documents', {\n type: 'line',\n x: 'created',\n bucket: 'month',\n }),\n panel('documents-by-folder', 'Documents by folder', 'documents', {\n type: 'bar',\n x: 'folder',\n limit: 10,\n }),\n panel('documents-by-person', 'Added by', 'documents', { type: 'bar', x: 'createdBy' }),\n panel('documents-by-kind', 'Kinds of document', 'documents', {\n type: 'donut',\n x: 'nature',\n limit: 8,\n }),\n panel(\n 'latest-documents',\n 'Latest documents',\n 'documents',\n {\n type: 'table',\n columns: ['name', 'type', 'status', 'createdBy', 'created'],\n orderBy: { field: 'created', direction: 'desc' },\n limit: 10,\n },\n 12\n ),\n ],\n}\n\nconst TAGS_FACTS_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Tags and facts',\n description: 'How the workspace is organised: its tags and what carries them, and its facts.',\n panels: [\n metric('tags', 'Tags', 'tags'),\n metric('facts', 'Facts', 'facts'),\n metric('confirmed-facts', 'Confirmed facts', 'facts', {\n filters: [{ field: 'confirmed', op: 'eq', value: true }],\n }),\n metric('dated-facts', 'Dated facts', 'facts', {\n filters: [{ field: 'date', op: 'not_empty' }],\n }),\n panel('most-used-tags', 'Most used tags', 'tags', {\n type: 'bar',\n x: 'name',\n y: 'documents',\n aggregate: 'sum',\n limit: 10,\n // Tags on no document yet are not \"used\": none at all shows the empty state.\n filters: [{ field: 'documents', op: 'gt', value: 0 }],\n }),\n panel('tags-by-kind', 'Tags by kind', 'tags', { type: 'donut', x: 'kind' }),\n panel('facts-by-tag', 'Facts by tag', 'facts', { type: 'bar', x: 'tags', limit: 10 }),\n panel('facts-added', 'Facts added', 'facts', { type: 'line', x: 'created', bucket: 'month' }),\n panel(\n 'latest-facts',\n 'Latest facts',\n 'facts',\n {\n type: 'table',\n columns: ['text', 'tags', 'date', 'createdBy'],\n orderBy: { field: 'created', direction: 'desc' },\n limit: 10,\n },\n 12\n ),\n ],\n}\n\nconst WORKFLOWS_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Workflows',\n description: 'Your workflows: what starts them, how their runs end, and what runs next.',\n panels: [\n metric('workflows', 'Workflows', 'workflows', {}, 4),\n metric(\n 'workflows-on',\n 'Switched on',\n 'workflows',\n {\n filters: [{ field: 'active', op: 'eq', value: true }],\n },\n 4\n ),\n metric(\n 'workflows-failed',\n 'Last run failed',\n 'workflows',\n {\n filters: [{ field: 'lastResult', op: 'eq', value: FAILED_RUN }],\n },\n 4\n ),\n panel('workflows-by-result', 'Last run result', 'workflows', {\n type: 'donut',\n x: 'lastResult',\n }),\n panel('workflows-by-trigger', 'What starts them', 'workflows', { type: 'bar', x: 'trigger' }),\n WORKFLOW_RUNS_BY_DAY,\n panel(\n 'next-runs',\n 'Next runs',\n 'workflows',\n {\n type: 'table',\n columns: ['name', 'trigger', 'nextRun', 'lastResult'],\n filters: [{ field: 'nextRun', op: 'not_empty' }],\n orderBy: { field: 'nextRun' },\n limit: 10,\n },\n 12\n ),\n ],\n}\n\nconst AI_USAGE_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'AI usage',\n description: 'What the AI has done and cost this period, by day, model and project.',\n panels: [\n metric('ai-spend', 'AI usage this period', 'usage', { aggregate: 'sum', y: 'spend' }, 4),\n metric('ai-tokens', 'Tokens', 'usage', { aggregate: 'sum', y: 'tokens' }, 4),\n metric('ai-requests', 'Requests', 'usage', { aggregate: 'sum', y: 'requests' }, 4),\n panel(\n 'spend-by-day',\n 'AI usage by day',\n 'usage',\n { type: 'line', x: 'day', bucket: 'day', y: 'spend', aggregate: 'sum' },\n 12\n ),\n AI_USAGE_BY_MODEL,\n panel('tokens-by-model', 'Tokens by model', 'usage', {\n type: 'bar',\n x: 'model',\n y: 'tokens',\n aggregate: 'sum',\n limit: 6,\n }),\n panel(\n 'spend-by-project',\n 'AI usage by project',\n 'usage',\n { type: 'bar', x: 'project', y: 'spend', aggregate: 'sum' },\n 12\n ),\n ],\n}\n\nconst ACTIVITY_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Recent activity',\n description: 'The latest activity in the workspace: who did what, where, and when.',\n panels: [\n panel(\n 'activity-by-day',\n 'Activity by day',\n 'activity',\n { type: 'bar', x: 'when', bucket: 'day', series: 'area', stacked: true },\n 12\n ),\n panel('activity-by-area', 'Activity by area', 'activity', { type: 'donut', x: 'area' }),\n panel('activity-by-person', 'Activity by person', 'activity', {\n type: 'bar',\n x: 'person',\n limit: 10,\n }),\n WORKFLOW_RUNS_BY_DAY,\n panel(\n 'latest-activity',\n 'Latest activity',\n 'activity',\n {\n type: 'table',\n columns: ['when', 'person', 'kind', 'item', 'status'],\n orderBy: { field: 'when', direction: 'desc' },\n limit: 15,\n },\n 12\n ),\n ],\n}\n\n/**\n * The templates a host's features allow: one with a panel over the workflows source only while\n * the `workflows` feature is on.\n */\nexport function templatesFor(\n templates: readonly DashboardSpec[],\n features: { workflows: boolean }\n): readonly DashboardSpec[] {\n return features.workflows\n ? templates\n : templates.filter((t) => !t.panels.some((p) => p.source.id === 'workflows'))\n}\n\n/** The default templates under \"New dashboard\", in order (`templatesFor` narrows them). */\nexport const DASHBOARD_TEMPLATES: readonly DashboardSpec[] = [\n OVERVIEW_DASHBOARD,\n DOCUMENTS_DASHBOARD,\n TAGS_FACTS_DASHBOARD,\n WORKFLOWS_DASHBOARD,\n AI_USAGE_DASHBOARD,\n ACTIVITY_DASHBOARD,\n]\n","/**\n * `ConnectedDashboardsPage`: the saved dashboards, one open to read, and an editor to build them.\n * The list, a dashboard's grid of `DashboardPanel`s, and its edit mode (panels added and changed with\n * `PanelEditor`, moved, removed, then saved) are one kit. Dashboards are kept by the host's store\n * (`useDashboardStore`: by default a database of the open workspace).\n *\n * Generic: the page's words come in through `labels`, and a site's own starting points (its\n * vocabulary, its fields) through `templates`.\n */\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n ArrowDown,\n ArrowLeft,\n ArrowUp,\n LayoutDashboard,\n MoreHorizontal,\n Pencil,\n Plus,\n Trash2,\n} from 'lucide-react'\nimport {\n useFeature,\n useDashboardStore,\n useDeleteDashboard,\n useSaveDashboard,\n useSavedDashboards,\n type DashboardSpec,\n type PanelSpec,\n type SavedDashboard,\n} from '@arbidocs/react'\nimport {\n Button,\n Card,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Input,\n Label,\n} from '@arbidocs/react/ui'\nimport { EmptyState } from '../../components/EmptyState'\nimport { PageHeader } from '../../components/PageHeader'\nimport { DashboardCell, DashboardGrid } from '../../dashboards/DashboardGrid'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { DashboardPanel, type DashboardPanelLabels } from './DashboardPanel'\nimport { PanelEditor, type PanelEditorLabels } from './PanelEditor'\nimport { DASHBOARD_TEMPLATES, newPanel, templatesFor } from './templates'\n\nexport interface DashboardsPageLabels {\n title: string\n description: string\n newDashboard: string\n blank: string\n untitled: string\n empty: string\n emptyDescription: string\n loadError: string\n panels: (count: number) => string\n back: string\n edit: string\n /** The \"…\" menu of an open dashboard (its rarer actions: delete). */\n more: string\n delete: string\n confirmDelete: (title: string) => string\n save: string\n saving: string\n cancel: string\n dashboardTitle: string\n dashboardDescription: string\n addPanel: string\n editPanel: string\n editPanelDescription: string\n panelDone: string\n moveUp: string\n moveDown: string\n removePanel: string\n noPanels: string\n saved: string\n saveFailed: string\n}\n\nexport const DEFAULT_DASHBOARDS_PAGE_LABELS: DashboardsPageLabels = {\n title: 'Dashboards',\n description:\n 'Charts and figures from your documents, threads, tags, facts, workflows, AI usage and databases.',\n newDashboard: 'New dashboard',\n blank: 'Blank dashboard',\n untitled: 'Untitled dashboard',\n empty: 'No dashboards yet',\n emptyDescription: 'Start from a template or a blank page, then add charts, figures and tables.',\n loadError: 'The dashboards could not be loaded.',\n panels: (count) => `${count} ${count === 1 ? 'panel' : 'panels'}`,\n back: 'All dashboards',\n edit: 'Edit',\n more: 'More dashboard actions',\n delete: 'Delete',\n confirmDelete: (title) => `Delete the dashboard “${title}”? Its panels go with it.`,\n save: 'Save',\n saving: 'Saving…',\n cancel: 'Cancel',\n dashboardTitle: 'Name',\n dashboardDescription: 'Description',\n addPanel: 'Add a panel',\n editPanel: 'Panel',\n editPanelDescription: 'Choose the data, how to show it, and what to measure.',\n panelDone: 'Done',\n moveUp: 'Move up',\n moveDown: 'Move down',\n removePanel: 'Remove the panel',\n noPanels: 'No panels yet. Add one to start.',\n saved: 'Dashboard saved',\n saveFailed: 'The dashboard could not be saved',\n}\n\nexport interface ConnectedDashboardsPageProps {\n /**\n * Starting points for a new dashboard. Default: an overview and one per area (documents, tags and\n * facts, workflows, AI usage, recent activity) over the built-in sources; Workflows only while\n * the host's `workflows` feature is on.\n */\n templates?: readonly DashboardSpec[]\n /** The open dashboard (controlled, for a route): `null` is the list. */\n dashboardId?: string | null\n onDashboardChange?: (id: string | null) => void\n labels?: Partial<DashboardsPageLabels>\n panelLabels?: Partial<DashboardPanelLabels>\n editorLabels?: Partial<PanelEditorLabels>\n /**\n * Classes on the page's scrolling frame, merged over its padding (`p-4 sm:p-6`): a host whose\n * own frame pads its pages passes `p-0`.\n */\n className?: string\n testId?: string\n}\n\n/** What is being edited: a saved dashboard (`id`) or a new one. */\ninterface Draft {\n id?: string\n spec: DashboardSpec\n}\n\nfunction PanelsGrid({\n spec,\n panelLabels,\n editing,\n testId,\n}: {\n spec: DashboardSpec\n panelLabels?: Partial<DashboardPanelLabels>\n editing?: {\n l: DashboardsPageLabels\n onEdit: (index: number) => void\n onMove: (index: number, by: -1 | 1) => void\n onRemove: (index: number) => void\n }\n testId?: string\n}) {\n return (\n <DashboardGrid testId={testId && `${testId}-grid`}>\n {spec.panels.map((panel, i) => (\n <DashboardCell key={panel.id} width={panel.width}>\n <DashboardPanel\n panel={panel}\n labels={panelLabels}\n testId={testId && `${testId}-panel-${panel.id}`}\n actions={\n editing && (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={editing.l.editPanel}\n onClick={() => editing.onEdit(i)}\n >\n <Pencil className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={editing.l.moveUp}\n disabled={i === 0}\n onClick={() => editing.onMove(i, -1)}\n >\n <ArrowUp className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={editing.l.moveDown}\n disabled={i === spec.panels.length - 1}\n onClick={() => editing.onMove(i, 1)}\n >\n <ArrowDown className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={editing.l.removePanel}\n onClick={() => editing.onRemove(i)}\n >\n <Trash2 className=\"size-3.5\" />\n </Button>\n </>\n )\n }\n />\n </DashboardCell>\n ))}\n </DashboardGrid>\n )\n}\n\nfunction NewDashboardButton({\n templates,\n l,\n onCreate,\n testId,\n}: {\n templates: readonly DashboardSpec[]\n l: DashboardsPageLabels\n onCreate: (spec: DashboardSpec) => void\n testId?: string\n}) {\n const blank: DashboardSpec = { version: 1, title: l.untitled, panels: [] }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button data-testid={testId && `${testId}-new`}>\n <Plus className=\"size-4\" /> {l.newDashboard}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={() => onCreate(blank)}>{l.blank}</DropdownMenuItem>\n {templates.map((t, i) => (\n <DropdownMenuItem\n key={`${t.title}-${i}`}\n onSelect={() => onCreate(t)}\n data-testid={testId && `${testId}-template-${i}`}\n >\n {t.title}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport function ConnectedDashboardsPage({\n templates: siteTemplates,\n dashboardId,\n onDashboardChange,\n labels,\n panelLabels,\n editorLabels,\n className,\n testId = 'dashboards',\n}: ConnectedDashboardsPageProps) {\n const l = { ...DEFAULT_DASHBOARDS_PAGE_LABELS, ...labels }\n const { confirm, notify } = useBlocksEnvironment()\n const workflowsOn = useFeature('workflows')\n const templates = siteTemplates ?? templatesFor(DASHBOARD_TEMPLATES, { workflows: workflowsOn })\n const store = useDashboardStore()\n const saved = useSavedDashboards(store)\n const save = useSaveDashboard(store)\n const remove = useDeleteDashboard(store)\n\n const [ownOpenId, setOwnOpenId] = useState<string | null>(null)\n const openId = dashboardId === undefined ? ownOpenId : dashboardId\n const setOpenId = (id: string | null) => {\n setOwnOpenId(id)\n onDashboardChange?.(id)\n }\n const [draft, setDraft] = useState<Draft | null>(null)\n const [editingPanel, setEditingPanel] = useState<{ index: number; panel: PanelSpec } | null>(null)\n\n const open = useMemo(() => saved.data?.find((d) => d.id === openId), [saved.data, openId])\n // A dashboard deleted elsewhere (or a stale link): back to the list.\n useEffect(() => {\n if (openId && saved.data && !open && !draft) setOwnOpenId(null)\n }, [openId, saved.data, open, draft])\n\n const startEditing = (d: SavedDashboard | Draft) => setDraft({ id: d.id, spec: d.spec })\n const createFrom = (spec: DashboardSpec) =>\n setDraft({ spec: { ...spec, panels: spec.panels.map((p) => ({ ...p })) } })\n\n const updateDraft = (patch: Partial<DashboardSpec>) =>\n setDraft((d) => (d ? { ...d, spec: { ...d.spec, ...patch } } : d))\n const setPanels = (panels: PanelSpec[]) => updateDraft({ panels })\n\n const commit = async () => {\n if (!draft) return\n try {\n const result = await save.mutateAsync({\n id: draft.id,\n spec: { ...draft.spec, title: draft.spec.title.trim() || l.untitled },\n })\n setDraft(null)\n setOpenId(result.id)\n notify(l.saved, 'success')\n } catch (error) {\n notify(`${l.saveFailed}: ${error instanceof Error ? error.message : String(error)}`, 'error')\n }\n }\n\n const deleteOpen = async (d: SavedDashboard) => {\n if (!(await confirm({ message: l.confirmDelete(d.spec.title), kind: 'yesno' }))) return\n await remove.mutateAsync(d.id)\n setOpenId(null)\n }\n\n let content\n if (draft) {\n const panels = draft.spec.panels\n content = (\n <div className=\"space-y-6\" data-testid={`${testId}-editor`}>\n <PageHeader\n title={draft.spec.title || l.untitled}\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" onClick={() => setDraft(null)}>\n {l.cancel}\n </Button>\n <Button\n onClick={() => void commit()}\n disabled={save.isPending}\n data-testid={`${testId}-save`}\n >\n {save.isPending ? l.saving : l.save}\n </Button>\n </div>\n }\n />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={`${testId}-name`}>{l.dashboardTitle}</Label>\n <Input\n id={`${testId}-name`}\n value={draft.spec.title}\n onChange={(e) => updateDraft({ title: e.target.value })}\n data-testid={`${testId}-name`}\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={`${testId}-about`}>{l.dashboardDescription}</Label>\n <Input\n id={`${testId}-about`}\n value={draft.spec.description ?? ''}\n onChange={(e) => updateDraft({ description: e.target.value || undefined })}\n />\n </div>\n </div>\n {panels.length ? (\n <PanelsGrid\n spec={draft.spec}\n panelLabels={panelLabels}\n testId={testId}\n editing={{\n l,\n onEdit: (index) => setEditingPanel({ index, panel: panels[index] }),\n onMove: (index, by) => {\n const next = [...panels]\n const [moved] = next.splice(index, 1)\n next.splice(index + by, 0, moved)\n setPanels(next)\n },\n onRemove: (index) => setPanels(panels.filter((_, i) => i !== index)),\n }}\n />\n ) : (\n <p className=\"text-sm text-muted-foreground\">{l.noPanels}</p>\n )}\n <Button\n variant=\"outline\"\n onClick={() => setEditingPanel({ index: panels.length, panel: newPanel() })}\n data-testid={`${testId}-add-panel`}\n >\n <Plus className=\"size-4\" /> {l.addPanel}\n </Button>\n <Dialog open={editingPanel !== null} onOpenChange={(o) => !o && setEditingPanel(null)}>\n <DialogContent className=\"max-h-[90dvh] max-w-5xl overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{l.editPanel}</DialogTitle>\n <DialogDescription>{l.editPanelDescription}</DialogDescription>\n </DialogHeader>\n {editingPanel && (\n <PanelEditor\n value={editingPanel.panel}\n onChange={(panel) => setEditingPanel({ ...editingPanel, panel })}\n labels={editorLabels}\n testId={`${testId}-panel-editor`}\n />\n )}\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => setEditingPanel(null)}>\n {l.cancel}\n </Button>\n <Button\n data-testid={`${testId}-panel-done`}\n onClick={() => {\n if (!editingPanel) return\n const next = [...panels]\n next[editingPanel.index] = editingPanel.panel\n setPanels(next)\n setEditingPanel(null)\n }}\n >\n {l.panelDone}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n } else if (open) {\n content = (\n <div className=\"space-y-6\" data-testid={`${testId}-view`}>\n <PageHeader\n title={open.spec.title}\n description={open.spec.description}\n leading={\n <Button variant=\"ghost\" size=\"icon\" aria-label={l.back} onClick={() => setOpenId(null)}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => startEditing(open)}\n data-testid={`${testId}-edit`}\n >\n <Pencil className=\"size-4\" /> {l.edit}\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.more}\n data-testid={`${testId}-more`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n onSelect={() => void deleteOpen(open)}\n className=\"text-destructive focus:text-destructive\"\n data-testid={`${testId}-delete`}\n >\n <Trash2 className=\"size-4\" /> {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n }\n />\n <PanelsGrid spec={open.spec} panelLabels={panelLabels} testId={testId} />\n </div>\n )\n } else {\n const list = saved.data ?? []\n content = (\n <div className=\"space-y-6\" data-testid={`${testId}-list`}>\n <PageHeader\n title={l.title}\n description={l.description}\n actions={\n <NewDashboardButton templates={templates} l={l} onCreate={createFrom} testId={testId} />\n }\n />\n {saved.isError ? (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {l.loadError}\n </p>\n ) : saved.isLoading ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"h-24 animate-pulse rounded-xl bg-muted\" />\n ))}\n </div>\n ) : list.length === 0 ? (\n <EmptyState\n icon={LayoutDashboard}\n title={l.empty}\n description={l.emptyDescription}\n action={<NewDashboardButton templates={templates} l={l} onCreate={createFrom} />}\n testId={`${testId}-empty`}\n />\n ) : (\n <ul className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {list.map((d) => (\n <li key={d.id}>\n <Card variant=\"elevated\" className=\"card-hover h-full rounded-xl p-0\">\n <button\n type=\"button\"\n className=\"flex size-full flex-col items-start gap-1 rounded-xl p-5 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => setOpenId(d.id)}\n data-testid={`${testId}-open-${d.id}`}\n >\n <span className=\"flex items-center gap-2 font-medium text-foreground\">\n <LayoutDashboard className=\"size-4 text-muted-foreground\" />\n {d.spec.title}\n </span>\n {d.spec.description && (\n <span className=\"line-clamp-2 text-sm text-muted-foreground\">\n {d.spec.description}\n </span>\n )}\n <span className=\"text-xs text-muted-foreground\">\n {l.panels(d.spec.panels.length)}\n </span>\n </button>\n </Card>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n }\n\n // The page scrolls and pads itself, as the other kit pages do, so a host only mounts it.\n return (\n <div\n className={cn('h-full min-h-0 w-full overflow-y-auto p-4 sm:p-6', className)}\n data-testid={testId}\n >\n {content}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/connection/dashboards/templates.ts","../../src/connection/dashboards/ConnectedDashboardsPage.tsx"],"names":["panel"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The starting points a new dashboard is offered by default (`DASHBOARD_TEMPLATES`): an overview,\n * then one dashboard per area (documents, tags and facts, workflows, AI usage, recent activity),\n * over the built-in sources and their default words. A site passes its own\n * (`ConnectedDashboardsPage templates`), in its words.\n */\nimport {\n DEFAULT_ACTIVITY_SOURCE_LABELS,\n DEFAULT_DOCUMENTS_SOURCE_LABELS,\n DEFAULT_WORKFLOWS_SOURCE_LABELS,\n type ChartSpec,\n type DashboardSpec,\n type PanelSpec,\n} from '@arbidocs/react'\n\n/** A fresh panel id. */\nexport function newPanelId(): string {\n return `pnl-${Math.random().toString(36).slice(2, 10)}`\n}\n\n/** A new panel: a bar chart of the documents by type, ready to be changed. */\nexport function newPanel(): PanelSpec {\n return {\n id: newPanelId(),\n title: 'New panel',\n source: { id: 'documents' },\n chart: { type: 'bar', x: 'type' },\n width: 6,\n }\n}\n\n/** A panel of `source`, `width` columns wide. */\nconst panel = (\n id: string,\n title: string,\n source: string,\n chart: ChartSpec,\n width = 6\n): PanelSpec => ({ id, title, source: { id: source }, chart, width })\n\n/** One figure, a quarter of the row by default. */\nconst metric = (\n id: string,\n title: string,\n source: string,\n chart: Omit<ChartSpec, 'type'> = {},\n width = 3\n): PanelSpec => panel(id, title, source, { type: 'metric', ...chart }, width)\n\nconst FAILED_DOCUMENT = DEFAULT_DOCUMENTS_SOURCE_LABELS.statuses.failed\nconst FAILED_RUN = DEFAULT_WORKFLOWS_SOURCE_LABELS.results.failed\nconst WORKFLOW_RUN = DEFAULT_ACTIVITY_SOURCE_LABELS.kinds.workflow_run\n\nconst DOCUMENTS_BY_TYPE = panel('documents-by-type', 'Documents by type', 'documents', {\n type: 'bar',\n x: 'type',\n limit: 8,\n})\nconst DOCUMENTS_BY_STATUS = panel('documents-by-status', 'Documents by status', 'documents', {\n type: 'donut',\n x: 'status',\n})\nconst AI_USAGE_BY_MODEL = panel('usage-by-model', 'AI usage by model', 'usage', {\n type: 'bar',\n x: 'day',\n bucket: 'day',\n series: 'model',\n y: 'spend',\n aggregate: 'sum',\n stacked: true,\n})\nconst WORKFLOW_RUNS_BY_DAY = panel(\n 'workflow-runs-by-day',\n 'Workflow runs by day',\n 'activity',\n {\n type: 'bar',\n x: 'when',\n bucket: 'day',\n series: 'status',\n stacked: true,\n filters: [{ field: 'kind', op: 'eq', value: WORKFLOW_RUN }],\n },\n 12\n)\n\nexport const OVERVIEW_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Overview',\n description: 'Documents, threads, facts and AI usage at a glance.',\n panels: [\n metric('documents', 'Documents', 'documents'),\n metric('threads', 'Threads', 'conversations'),\n metric('facts', 'Facts', 'facts'),\n metric('ai-usage', 'AI usage this period', 'usage', { aggregate: 'sum', y: 'spend' }),\n panel('threads-over-time', 'Threads started', 'conversations', {\n type: 'line',\n x: 'created',\n bucket: 'month',\n }),\n AI_USAGE_BY_MODEL,\n DOCUMENTS_BY_TYPE,\n DOCUMENTS_BY_STATUS,\n panel(\n 'due',\n 'Due dates',\n 'conversations',\n {\n type: 'table',\n columns: ['title', 'due', 'status', 'owner'],\n filters: [{ field: 'due', op: 'not_empty' }],\n orderBy: { field: 'due' },\n },\n 12\n ),\n ],\n}\n\nconst DOCUMENTS_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Documents',\n description: 'What the workspace holds: status, type, folders, who added what, and when.',\n panels: [\n metric('documents', 'Documents', 'documents'),\n metric('pages', 'Pages', 'documents', { aggregate: 'sum', y: 'pages' }),\n metric('size', 'Stored', 'documents', { aggregate: 'sum', y: 'size' }),\n metric('failed', 'Failed to process', 'documents', {\n filters: [{ field: 'status', op: 'eq', value: FAILED_DOCUMENT }],\n }),\n DOCUMENTS_BY_STATUS,\n DOCUMENTS_BY_TYPE,\n panel('documents-added', 'Documents added', 'documents', {\n type: 'line',\n x: 'created',\n bucket: 'month',\n }),\n panel('documents-by-folder', 'Documents by folder', 'documents', {\n type: 'bar',\n x: 'folder',\n limit: 10,\n }),\n panel('documents-by-person', 'Added by', 'documents', { type: 'bar', x: 'createdBy' }),\n panel('documents-by-kind', 'Kinds of document', 'documents', {\n type: 'donut',\n x: 'nature',\n limit: 8,\n }),\n panel(\n 'latest-documents',\n 'Latest documents',\n 'documents',\n {\n type: 'table',\n columns: ['name', 'type', 'status', 'createdBy', 'created'],\n orderBy: { field: 'created', direction: 'desc' },\n limit: 10,\n },\n 12\n ),\n ],\n}\n\nconst TAGS_FACTS_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Tags and facts',\n description: 'How the workspace is organised: its tags and what carries them, and its facts.',\n panels: [\n metric('tags', 'Tags', 'tags'),\n metric('facts', 'Facts', 'facts'),\n metric('confirmed-facts', 'Confirmed facts', 'facts', {\n filters: [{ field: 'confirmed', op: 'eq', value: true }],\n }),\n metric('dated-facts', 'Dated facts', 'facts', {\n filters: [{ field: 'date', op: 'not_empty' }],\n }),\n panel('most-used-tags', 'Most used tags', 'tags', {\n type: 'bar',\n x: 'name',\n y: 'documents',\n aggregate: 'sum',\n limit: 10,\n // Tags on no document yet are not \"used\": none at all shows the empty state.\n filters: [{ field: 'documents', op: 'gt', value: 0 }],\n }),\n panel('tags-by-kind', 'Tags by kind', 'tags', { type: 'donut', x: 'kind' }),\n panel('facts-by-tag', 'Facts by tag', 'facts', { type: 'bar', x: 'tags', limit: 10 }),\n panel('facts-added', 'Facts added', 'facts', { type: 'line', x: 'created', bucket: 'month' }),\n panel(\n 'latest-facts',\n 'Latest facts',\n 'facts',\n {\n type: 'table',\n columns: ['text', 'tags', 'date', 'createdBy'],\n orderBy: { field: 'created', direction: 'desc' },\n limit: 10,\n },\n 12\n ),\n ],\n}\n\nconst WORKFLOWS_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Workflows',\n description: 'Your workflows: what starts them, how their runs end, and what runs next.',\n panels: [\n metric('workflows', 'Workflows', 'workflows', {}, 4),\n metric(\n 'workflows-on',\n 'Switched on',\n 'workflows',\n {\n filters: [{ field: 'active', op: 'eq', value: true }],\n },\n 4\n ),\n metric(\n 'workflows-failed',\n 'Last run failed',\n 'workflows',\n {\n filters: [{ field: 'lastResult', op: 'eq', value: FAILED_RUN }],\n },\n 4\n ),\n panel('workflows-by-result', 'Last run result', 'workflows', {\n type: 'donut',\n x: 'lastResult',\n }),\n panel('workflows-by-trigger', 'What starts them', 'workflows', { type: 'bar', x: 'trigger' }),\n WORKFLOW_RUNS_BY_DAY,\n panel(\n 'next-runs',\n 'Next runs',\n 'workflows',\n {\n type: 'table',\n columns: ['name', 'trigger', 'nextRun', 'lastResult'],\n filters: [{ field: 'nextRun', op: 'not_empty' }],\n orderBy: { field: 'nextRun' },\n limit: 10,\n },\n 12\n ),\n ],\n}\n\nconst AI_USAGE_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'AI usage',\n description: 'What the AI has done and cost this period, by day, model and project.',\n panels: [\n metric('ai-spend', 'AI usage this period', 'usage', { aggregate: 'sum', y: 'spend' }, 4),\n metric('ai-tokens', 'Tokens', 'usage', { aggregate: 'sum', y: 'tokens' }, 4),\n metric('ai-requests', 'Requests', 'usage', { aggregate: 'sum', y: 'requests' }, 4),\n panel(\n 'spend-by-day',\n 'AI usage by day',\n 'usage',\n { type: 'line', x: 'day', bucket: 'day', y: 'spend', aggregate: 'sum' },\n 12\n ),\n AI_USAGE_BY_MODEL,\n panel('tokens-by-model', 'Tokens by model', 'usage', {\n type: 'bar',\n x: 'model',\n y: 'tokens',\n aggregate: 'sum',\n limit: 6,\n }),\n panel(\n 'spend-by-project',\n 'AI usage by project',\n 'usage',\n { type: 'bar', x: 'project', y: 'spend', aggregate: 'sum' },\n 12\n ),\n ],\n}\n\nconst ACTIVITY_DASHBOARD: DashboardSpec = {\n version: 1,\n title: 'Recent activity',\n description: 'The latest activity in the workspace: who did what, where, and when.',\n panels: [\n panel(\n 'activity-by-day',\n 'Activity by day',\n 'activity',\n { type: 'bar', x: 'when', bucket: 'day', series: 'area', stacked: true },\n 12\n ),\n panel('activity-by-area', 'Activity by area', 'activity', { type: 'donut', x: 'area' }),\n panel('activity-by-person', 'Activity by person', 'activity', {\n type: 'bar',\n x: 'person',\n limit: 10,\n }),\n WORKFLOW_RUNS_BY_DAY,\n panel(\n 'latest-activity',\n 'Latest activity',\n 'activity',\n {\n type: 'table',\n columns: ['when', 'person', 'kind', 'item', 'status'],\n orderBy: { field: 'when', direction: 'desc' },\n limit: 15,\n },\n 12\n ),\n ],\n}\n\n/**\n * The templates a host's features allow: one with a panel over the workflows source only while\n * the `workflows` feature is on.\n */\nexport function templatesFor(\n templates: readonly DashboardSpec[],\n features: { workflows: boolean }\n): readonly DashboardSpec[] {\n return features.workflows\n ? templates\n : templates.filter((t) => !t.panels.some((p) => p.source.id === 'workflows'))\n}\n\n/** The default templates under \"New dashboard\", in order (`templatesFor` narrows them). */\nexport const DASHBOARD_TEMPLATES: readonly DashboardSpec[] = [\n OVERVIEW_DASHBOARD,\n DOCUMENTS_DASHBOARD,\n TAGS_FACTS_DASHBOARD,\n WORKFLOWS_DASHBOARD,\n AI_USAGE_DASHBOARD,\n ACTIVITY_DASHBOARD,\n]\n","/**\n * `ConnectedDashboardsPage`: the saved dashboards, one open to read, and an editor to build them.\n * The list, a dashboard's grid of `DashboardPanel`s, and its edit mode (panels added and changed with\n * `PanelEditor`, moved, removed, then saved) are one kit. Dashboards are kept by the host's store\n * (`useDashboardStore`: by default a database of the open workspace).\n *\n * Generic: the page's words come in through `labels`, and a site's own starting points (its\n * vocabulary, its fields) through `templates`.\n */\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n ArrowDown,\n ArrowLeft,\n ArrowUp,\n LayoutDashboard,\n MoreHorizontal,\n Pencil,\n Plus,\n Trash2,\n} from 'lucide-react'\nimport {\n useFeature,\n useSessionView,\n useDashboardStore,\n useDeleteDashboard,\n useSaveDashboard,\n useSavedDashboards,\n type DashboardSpec,\n type PanelSpec,\n type SavedDashboard,\n} from '@arbidocs/react'\nimport {\n Button,\n Card,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Input,\n Label,\n} from '@arbidocs/react/ui'\nimport { EmptyState } from '../../components/EmptyState'\nimport { PageHeader } from '../../components/PageHeader'\nimport { DashboardCell, DashboardGrid } from '../../dashboards/DashboardGrid'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { DashboardPanel, type DashboardPanelLabels } from './DashboardPanel'\nimport { PanelEditor, type PanelEditorLabels } from './PanelEditor'\nimport { DASHBOARD_TEMPLATES, newPanel, templatesFor } from './templates'\n\nexport interface DashboardsPageLabels {\n title: string\n description: string\n newDashboard: string\n blank: string\n untitled: string\n empty: string\n emptyDescription: string\n loadError: string\n /** Offline with no dashboards cached. */\n offline: string\n retry: string\n panels: (count: number) => string\n back: string\n edit: string\n /** The \"…\" menu of an open dashboard (its rarer actions: delete). */\n more: string\n delete: string\n confirmDelete: (title: string) => string\n deleteFailed: string\n /** Leaving the editor with changes not saved. */\n confirmDiscard: string\n save: string\n saving: string\n cancel: string\n dashboardTitle: string\n dashboardDescription: string\n addPanel: string\n editPanel: string\n editPanelDescription: string\n panelDone: string\n moveUp: string\n moveDown: string\n removePanel: string\n noPanels: string\n saved: string\n saveFailed: string\n}\n\nexport const DEFAULT_DASHBOARDS_PAGE_LABELS: DashboardsPageLabels = {\n title: 'Dashboards',\n description:\n 'Charts and figures from your documents, threads, tags, facts, workflows, AI usage and databases.',\n newDashboard: 'New dashboard',\n blank: 'Blank dashboard',\n untitled: 'Untitled dashboard',\n empty: 'No dashboards yet',\n emptyDescription: 'Start from a template or a blank page, then add charts, figures and tables.',\n loadError: 'The dashboards could not be loaded.',\n offline: 'You are offline. Your dashboards show when the connection is back.',\n retry: 'Try again',\n panels: (count) => `${count} ${count === 1 ? 'panel' : 'panels'}`,\n back: 'All dashboards',\n edit: 'Edit',\n more: 'More dashboard actions',\n delete: 'Delete',\n confirmDelete: (title) => `Delete the dashboard “${title}”? Its panels go with it.`,\n deleteFailed: 'The dashboard could not be deleted',\n confirmDiscard: 'Discard the changes to this dashboard?',\n save: 'Save',\n saving: 'Saving…',\n cancel: 'Cancel',\n dashboardTitle: 'Name',\n dashboardDescription: 'Description',\n addPanel: 'Add a panel',\n editPanel: 'Panel',\n editPanelDescription: 'Choose the data, how to show it, and what to measure.',\n panelDone: 'Done',\n moveUp: 'Move up',\n moveDown: 'Move down',\n removePanel: 'Remove the panel',\n noPanels: 'No panels yet. Add one to start.',\n saved: 'Dashboard saved',\n saveFailed: 'The dashboard could not be saved',\n}\n\nexport interface ConnectedDashboardsPageProps {\n /**\n * Starting points for a new dashboard. Default: an overview and one per area (documents, tags and\n * facts, workflows, AI usage, recent activity) over the built-in sources; Workflows only while\n * the host's `workflows` feature is on.\n */\n templates?: readonly DashboardSpec[]\n /** The open dashboard (controlled, for a route): `null` is the list. */\n dashboardId?: string | null\n onDashboardChange?: (id: string | null) => void\n labels?: Partial<DashboardsPageLabels>\n panelLabels?: Partial<DashboardPanelLabels>\n editorLabels?: Partial<PanelEditorLabels>\n /**\n * Classes on the page's scrolling frame, merged over its padding (`p-4 sm:p-6`): a host whose\n * own frame pads its pages passes `p-0`.\n */\n className?: string\n testId?: string\n}\n\n/** What is being edited: a saved dashboard (`id`) or a new one, and the spec it started from. */\ninterface Draft {\n id?: string\n spec: DashboardSpec\n base: DashboardSpec\n}\n\nfunction PanelsGrid({\n spec,\n panelLabels,\n editing,\n testId,\n}: {\n spec: DashboardSpec\n panelLabels?: Partial<DashboardPanelLabels>\n editing?: {\n l: DashboardsPageLabels\n onEdit: (index: number) => void\n onMove: (index: number, by: -1 | 1) => void\n onRemove: (index: number) => void\n }\n testId?: string\n}) {\n return (\n <DashboardGrid testId={testId && `${testId}-grid`}>\n {spec.panels.map((panel, i) => (\n <DashboardCell key={panel.id} width={panel.width}>\n <DashboardPanel\n panel={panel}\n labels={panelLabels}\n testId={testId && `${testId}-panel-${panel.id}`}\n actions={\n editing && (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={editing.l.editPanel}\n onClick={() => editing.onEdit(i)}\n >\n <Pencil className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={editing.l.moveUp}\n disabled={i === 0}\n onClick={() => editing.onMove(i, -1)}\n >\n <ArrowUp className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={editing.l.moveDown}\n disabled={i === spec.panels.length - 1}\n onClick={() => editing.onMove(i, 1)}\n >\n <ArrowDown className=\"size-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7\"\n aria-label={editing.l.removePanel}\n onClick={() => editing.onRemove(i)}\n >\n <Trash2 className=\"size-3.5\" />\n </Button>\n </>\n )\n }\n />\n </DashboardCell>\n ))}\n </DashboardGrid>\n )\n}\n\n/**\n * \"New dashboard\": a blank one opens in the editor; a template is saved and opened at once (it is\n * a finished dashboard; Edit changes it), so each menu item says what the template shows.\n */\nfunction NewDashboardButton({\n templates,\n l,\n onBlank,\n onTemplate,\n busy,\n testId,\n}: {\n templates: readonly DashboardSpec[]\n l: DashboardsPageLabels\n onBlank: () => void\n onTemplate: (spec: DashboardSpec) => void\n /** A template is being saved: the button waits. */\n busy: boolean\n testId: string\n}) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button disabled={busy} data-testid={`${testId}-new`}>\n <Plus className=\"size-4\" /> {busy ? l.saving : l.newDashboard}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"max-w-[min(20rem,calc(100vw-1rem))]\">\n <DropdownMenuItem onSelect={onBlank} data-testid={`${testId}-blank`}>\n {l.blank}\n </DropdownMenuItem>\n {templates.map((t, i) => (\n <DropdownMenuItem\n key={`${t.title}-${i}`}\n onSelect={() => onTemplate(t)}\n className=\"flex-col items-start gap-0.5\"\n data-testid={`${testId}-template-${i}`}\n >\n <span>{t.title}</span>\n {t.description && (\n <span className=\"text-xs text-muted-foreground\">{t.description}</span>\n )}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport function ConnectedDashboardsPage({\n templates: siteTemplates,\n dashboardId,\n onDashboardChange,\n labels,\n panelLabels,\n editorLabels,\n className,\n testId = 'dashboards',\n}: ConnectedDashboardsPageProps) {\n const l = { ...DEFAULT_DASHBOARDS_PAGE_LABELS, ...labels }\n const { confirm, notify } = useBlocksEnvironment()\n const workflowsOn = useFeature('workflows')\n const templates = siteTemplates ?? templatesFor(DASHBOARD_TEMPLATES, { workflows: workflowsOn })\n const store = useDashboardStore()\n const saved = useSavedDashboards(store)\n const save = useSaveDashboard(store)\n const remove = useDeleteDashboard(store)\n\n // Uncontrolled, the open dashboard is a view of the session (one per workspace), so a reload\n // reopens it.\n const [ownOpenId, setOwnOpenId] = useSessionView<string | null>(\n `dashboards.open:${store.scope ?? ''}`,\n null\n )\n const openId = dashboardId === undefined ? ownOpenId : dashboardId\n const setOpenId = (id: string | null) => {\n setOwnOpenId(id)\n onDashboardChange?.(id)\n }\n const [draft, setDraft] = useState<Draft | null>(null)\n const [creating, setCreating] = useState(false)\n // The open dashboard as of now, for a save that finishes later.\n const openIdRef = useRef(openId)\n useEffect(() => {\n openIdRef.current = openId\n }, [openId])\n const [editingPanel, setEditingPanel] = useState<{ index: number; panel: PanelSpec } | null>(null)\n\n const open = useMemo(() => saved.data?.find((d) => d.id === openId), [saved.data, openId])\n // A dashboard deleted elsewhere (or a stale link): back to the list.\n useEffect(() => {\n if (openId && saved.data && !open && !draft) setOwnOpenId(null)\n }, [openId, saved.data, open, draft])\n\n const startEditing = (d: SavedDashboard) => setDraft({ id: d.id, spec: d.spec, base: d.spec })\n const createBlank = () => {\n const spec: DashboardSpec = { version: 1, title: l.untitled, panels: [] }\n setDraft({ spec, base: spec })\n }\n const createFromTemplate = async (template: DashboardSpec) => {\n if (creating) return\n setCreating(true)\n const openWhenStarted = openIdRef.current\n try {\n const result = await save.mutateAsync({\n spec: { ...template, panels: template.panels.map((p) => ({ ...p })) },\n })\n // Opened only if the person has not opened another one meanwhile.\n if (openIdRef.current === openWhenStarted) setOpenId(result.id)\n notify(l.saved, 'success')\n } catch (error) {\n notify(`${l.saveFailed}: ${error instanceof Error ? error.message : String(error)}`, 'error')\n } finally {\n setCreating(false)\n }\n }\n const cancelEditing = async () => {\n const changed = draft && JSON.stringify(draft.spec) !== JSON.stringify(draft.base)\n if (changed && !(await confirm({ message: l.confirmDiscard, kind: 'yesno' }))) return\n setDraft(null)\n }\n\n const updateDraft = (patch: Partial<DashboardSpec>) =>\n setDraft((d) => (d ? { ...d, spec: { ...d.spec, ...patch } } : d))\n const setPanels = (panels: PanelSpec[]) => updateDraft({ panels })\n\n const commit = async () => {\n if (!draft) return\n try {\n const result = await save.mutateAsync({\n id: draft.id,\n spec: { ...draft.spec, title: draft.spec.title.trim() || l.untitled },\n })\n setDraft(null)\n setOpenId(result.id)\n notify(l.saved, 'success')\n } catch (error) {\n notify(`${l.saveFailed}: ${error instanceof Error ? error.message : String(error)}`, 'error')\n }\n }\n\n const deleteOpen = async (d: SavedDashboard) => {\n if (!(await confirm({ message: l.confirmDelete(d.spec.title), kind: 'yesno' }))) return\n try {\n await remove.mutateAsync(d.id)\n setOpenId(null)\n } catch (error) {\n notify(\n `${l.deleteFailed}: ${error instanceof Error ? error.message : String(error)}`,\n 'error'\n )\n }\n }\n\n let content\n if (draft) {\n const panels = draft.spec.panels\n content = (\n <div className=\"space-y-6\" data-testid={`${testId}-editor`}>\n <PageHeader\n title={draft.spec.title || l.untitled}\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"ghost\"\n onClick={() => void cancelEditing()}\n data-testid={`${testId}-cancel`}\n >\n {l.cancel}\n </Button>\n <Button\n onClick={() => void commit()}\n disabled={save.isPending}\n data-testid={`${testId}-save`}\n >\n {save.isPending ? l.saving : l.save}\n </Button>\n </div>\n }\n />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={`${testId}-name`}>{l.dashboardTitle}</Label>\n <Input\n id={`${testId}-name`}\n value={draft.spec.title}\n onChange={(e) => updateDraft({ title: e.target.value })}\n data-testid={`${testId}-name`}\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={`${testId}-about`}>{l.dashboardDescription}</Label>\n <Input\n id={`${testId}-about`}\n value={draft.spec.description ?? ''}\n onChange={(e) => updateDraft({ description: e.target.value || undefined })}\n />\n </div>\n </div>\n {panels.length ? (\n <PanelsGrid\n spec={draft.spec}\n panelLabels={panelLabels}\n testId={testId}\n editing={{\n l,\n onEdit: (index) => setEditingPanel({ index, panel: panels[index] }),\n onMove: (index, by) => {\n const next = [...panels]\n const [moved] = next.splice(index, 1)\n next.splice(index + by, 0, moved)\n setPanels(next)\n },\n onRemove: (index) => setPanels(panels.filter((_, i) => i !== index)),\n }}\n />\n ) : (\n <p className=\"text-sm text-muted-foreground\">{l.noPanels}</p>\n )}\n <Button\n variant=\"outline\"\n onClick={() => setEditingPanel({ index: panels.length, panel: newPanel() })}\n data-testid={`${testId}-add-panel`}\n >\n <Plus className=\"size-4\" /> {l.addPanel}\n </Button>\n <Dialog open={editingPanel !== null} onOpenChange={(o) => !o && setEditingPanel(null)}>\n <DialogContent className=\"max-h-[90dvh] max-w-5xl overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{l.editPanel}</DialogTitle>\n <DialogDescription>{l.editPanelDescription}</DialogDescription>\n </DialogHeader>\n {editingPanel && (\n <PanelEditor\n value={editingPanel.panel}\n onChange={(panel) => setEditingPanel({ ...editingPanel, panel })}\n labels={editorLabels}\n testId={`${testId}-panel-editor`}\n />\n )}\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => setEditingPanel(null)}>\n {l.cancel}\n </Button>\n <Button\n data-testid={`${testId}-panel-done`}\n onClick={() => {\n if (!editingPanel) return\n const next = [...panels]\n next[editingPanel.index] = editingPanel.panel\n setPanels(next)\n setEditingPanel(null)\n }}\n >\n {l.panelDone}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n } else if (open) {\n content = (\n <div className=\"space-y-6\" data-testid={`${testId}-view`}>\n <PageHeader\n title={open.spec.title}\n description={open.spec.description}\n leading={\n <Button variant=\"ghost\" size=\"icon\" aria-label={l.back} onClick={() => setOpenId(null)}>\n <ArrowLeft className=\"size-4\" />\n </Button>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => startEditing(open)}\n data-testid={`${testId}-edit`}\n >\n <Pencil className=\"size-4\" /> {l.edit}\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.more}\n data-testid={`${testId}-more`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n onSelect={() => void deleteOpen(open)}\n className=\"text-destructive focus:text-destructive\"\n data-testid={`${testId}-delete`}\n >\n <Trash2 className=\"size-4\" /> {l.delete}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n }\n />\n <PanelsGrid spec={open.spec} panelLabels={panelLabels} testId={testId} />\n </div>\n )\n } else {\n const list = saved.data ?? []\n const newButton = (\n <NewDashboardButton\n templates={templates}\n l={l}\n onBlank={createBlank}\n onTemplate={(t) => void createFromTemplate(t)}\n busy={creating}\n testId={testId}\n />\n )\n // Empty only once the list is in: offline with nothing cached, the read is paused (not\n // loading), and saying \"No dashboards yet\" then would be wrong.\n const isEmpty = !!saved.data && list.length === 0\n content = (\n <div className=\"space-y-6\" data-testid={`${testId}-list`}>\n {/* With none yet, the empty state holds the one \"New dashboard\" (and none shows while the\n list loads, so it does not appear and vanish). */}\n <PageHeader\n title={l.title}\n description={l.description}\n actions={saved.isError || (saved.data && !isEmpty) ? newButton : undefined}\n />\n {saved.isError && !saved.data ? (\n <div className=\"flex flex-wrap items-center gap-3\" role=\"alert\">\n <p className=\"text-sm text-destructive\">{l.loadError}</p>\n <Button variant=\"outline\" size=\"sm\" onClick={() => void saved.refetch()}>\n {l.retry}\n </Button>\n </div>\n ) : !saved.data && saved.fetchStatus === 'paused' ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-offline`}>\n {l.offline}\n </p>\n ) : !saved.data ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"h-24 animate-pulse rounded-xl bg-muted\" />\n ))}\n </div>\n ) : isEmpty ? (\n <EmptyState\n icon={LayoutDashboard}\n title={l.empty}\n description={l.emptyDescription}\n action={newButton}\n testId={`${testId}-empty`}\n />\n ) : (\n <ul className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {list.map((d) => (\n <li key={d.id}>\n <Card variant=\"elevated\" className=\"card-hover h-full rounded-xl p-0\">\n <button\n type=\"button\"\n className=\"flex size-full flex-col items-start gap-1 rounded-xl p-5 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={() => setOpenId(d.id)}\n data-testid={`${testId}-open-${d.id}`}\n >\n <span className=\"flex items-center gap-2 font-medium text-foreground\">\n <LayoutDashboard className=\"size-4 text-muted-foreground\" />\n {d.spec.title}\n </span>\n {d.spec.description && (\n <span className=\"line-clamp-2 text-sm text-muted-foreground\">\n {d.spec.description}\n </span>\n )}\n <span className=\"text-xs text-muted-foreground\">\n {l.panels(d.spec.panels.length)}\n </span>\n </button>\n </Card>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n }\n\n // The page scrolls and pads itself, as the other kit pages do, so a host only mounts it.\n return (\n <div\n className={cn('h-full min-h-0 w-full overflow-y-auto p-4 sm:p-6', className)}\n data-testid={testId}\n >\n {content}\n </div>\n )\n}\n"]}