@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.
- package/dist/{ConnectedCallDock-TDYRHPAK.js → ConnectedCallDock-DV4FU376.js} +8 -8
- package/dist/{ConnectedCallDock-TDYRHPAK.js.map → ConnectedCallDock-DV4FU376.js.map} +1 -1
- package/dist/{ConnectedCallDock-H3WWFGXF.cjs → ConnectedCallDock-EM2VVGZK.cjs} +10 -10
- package/dist/{ConnectedCallDock-H3WWFGXF.cjs.map → ConnectedCallDock-EM2VVGZK.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-55O5OUN7.cjs → ConnectedCallRoom-7WEPEWUJ.cjs} +9 -9
- package/dist/{ConnectedCallRoom-55O5OUN7.cjs.map → ConnectedCallRoom-7WEPEWUJ.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-Z6F6WCLH.js → ConnectedCallRoom-RYTZP34O.js} +8 -8
- package/dist/{ConnectedCallRoom-Z6F6WCLH.js.map → ConnectedCallRoom-RYTZP34O.js.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-NVZRVNOS.js → ConnectedNativeDocxComparison-2NDXXZLQ.js} +15 -15
- package/dist/{ConnectedNativeDocxComparison-NVZRVNOS.js.map → ConnectedNativeDocxComparison-2NDXXZLQ.js.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-DGBZJ4XA.cjs → ConnectedNativeDocxComparison-7HOY3AVI.cjs} +16 -16
- package/dist/{ConnectedNativeDocxComparison-DGBZJ4XA.cjs.map → ConnectedNativeDocxComparison-7HOY3AVI.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-R4WINUUB.cjs → ConnectedNativeDocxEditor-CUWDPHXN.cjs} +16 -16
- package/dist/{ConnectedNativeDocxEditor-R4WINUUB.cjs.map → ConnectedNativeDocxEditor-CUWDPHXN.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-RSVBN7DY.js → ConnectedNativeDocxEditor-SPZB6Y27.js} +14 -14
- package/dist/{ConnectedNativeDocxEditor-RSVBN7DY.js.map → ConnectedNativeDocxEditor-SPZB6Y27.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-2DFBXE2X.js → ConnectedProductionSetDialog-N3EDG3SU.js} +4 -4
- package/dist/{ConnectedProductionSetDialog-2DFBXE2X.js.map → ConnectedProductionSetDialog-N3EDG3SU.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-KYDPQ7SG.cjs → ConnectedProductionSetDialog-XAEFEN3N.cjs} +4 -4
- package/dist/{ConnectedProductionSetDialog-KYDPQ7SG.cjs.map → ConnectedProductionSetDialog-XAEFEN3N.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-HLJ5IIOU.js → ConnectedStreamedWordArtifact-6LTGEAJO.js} +15 -15
- package/dist/ConnectedStreamedWordArtifact-6LTGEAJO.js.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-JQ34AOUU.cjs → ConnectedStreamedWordArtifact-HNCRKZTV.cjs} +16 -16
- package/dist/ConnectedStreamedWordArtifact-HNCRKZTV.cjs.map +1 -0
- package/dist/{DocumentReviewCard-7JSXRJZ2.js → DocumentReviewCard-RJD3CO32.js} +8 -8
- package/dist/{DocumentReviewCard-7JSXRJZ2.js.map → DocumentReviewCard-RJD3CO32.js.map} +1 -1
- package/dist/{DocumentReviewCard-C4HVT3WM.cjs → DocumentReviewCard-VON7LOOY.cjs} +8 -8
- package/dist/{DocumentReviewCard-C4HVT3WM.cjs.map → DocumentReviewCard-VON7LOOY.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-IMQTZWKD.js → FilesViewerDialog-7SJGY72Q.js} +21 -21
- package/dist/{FilesViewerDialog-IMQTZWKD.js.map → FilesViewerDialog-7SJGY72Q.js.map} +1 -1
- package/dist/{FilesViewerDialog-UP7GFHYN.cjs → FilesViewerDialog-VIPTC6OT.cjs} +27 -27
- package/dist/{FilesViewerDialog-UP7GFHYN.cjs.map → FilesViewerDialog-VIPTC6OT.cjs.map} +1 -1
- package/dist/{RechartsRenderer-GIRCW7DB.cjs → RechartsRenderer-THES2SE5.cjs} +6 -5
- package/dist/RechartsRenderer-THES2SE5.cjs.map +1 -0
- package/dist/{RechartsRenderer-23OF4H6X.js → RechartsRenderer-XIZLV6GH.js} +6 -5
- package/dist/RechartsRenderer-XIZLV6GH.js.map +1 -0
- package/dist/{WorkspaceTableView-PJM47B5F.cjs → WorkspaceTableView-FNME7TL6.cjs} +9 -9
- package/dist/{WorkspaceTableView-PJM47B5F.cjs.map → WorkspaceTableView-FNME7TL6.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-YDA7A4UJ.js → WorkspaceTableView-XQ6J2JKI.js} +7 -7
- package/dist/{WorkspaceTableView-YDA7A4UJ.js.map → WorkspaceTableView-XQ6J2JKI.js.map} +1 -1
- package/dist/agents/index.cjs +202 -202
- package/dist/agents/index.js +8 -8
- package/dist/{ai-ADS6YSS2.cjs → ai-3SAMEYBB.cjs} +20 -20
- package/dist/ai-3SAMEYBB.cjs.map +1 -0
- package/dist/{ai-KHWTGBT5.js → ai-OTQWSYVK.js} +12 -12
- package/dist/ai-OTQWSYVK.js.map +1 -0
- package/dist/calls/index.cjs +57 -57
- package/dist/calls/index.js +9 -9
- package/dist/chat/index.cjs +3 -3
- package/dist/chat/index.js +3 -3
- package/dist/{chunk-O27K7KTZ.cjs → chunk-2TBQBF4Y.cjs} +5 -5
- package/dist/{chunk-O27K7KTZ.cjs.map → chunk-2TBQBF4Y.cjs.map} +1 -1
- package/dist/{chunk-YJWAGXYM.js → chunk-4ZA2RSQH.js} +3 -3
- package/dist/{chunk-YJWAGXYM.js.map → chunk-4ZA2RSQH.js.map} +1 -1
- package/dist/{chunk-6A4GNM4T.cjs → chunk-5D2ZINOJ.cjs} +16 -16
- package/dist/{chunk-6A4GNM4T.cjs.map → chunk-5D2ZINOJ.cjs.map} +1 -1
- package/dist/{chunk-BFVCYBND.cjs → chunk-5HXQOM3I.cjs} +5 -5
- package/dist/{chunk-BFVCYBND.cjs.map → chunk-5HXQOM3I.cjs.map} +1 -1
- package/dist/{chunk-GSD5U553.cjs → chunk-5KKT65WU.cjs} +3 -3
- package/dist/{chunk-GSD5U553.cjs.map → chunk-5KKT65WU.cjs.map} +1 -1
- package/dist/{chunk-AVGHTUPE.js → chunk-5PWLXLHY.js} +5 -5
- package/dist/chunk-5PWLXLHY.js.map +1 -0
- package/dist/{chunk-BBWLFK3C.js → chunk-5XIMUQ63.js} +3 -3
- package/dist/{chunk-BBWLFK3C.js.map → chunk-5XIMUQ63.js.map} +1 -1
- package/dist/{chunk-AHMRYY7J.cjs → chunk-6DAJXQZZ.cjs} +13 -13
- package/dist/{chunk-AHMRYY7J.cjs.map → chunk-6DAJXQZZ.cjs.map} +1 -1
- package/dist/{chunk-3PV25ICC.js → chunk-6KKVJ2V6.js} +3 -3
- package/dist/{chunk-3PV25ICC.js.map → chunk-6KKVJ2V6.js.map} +1 -1
- package/dist/{chunk-OLAYDOPC.js → chunk-6LUHNFEE.js} +6 -6
- package/dist/{chunk-OLAYDOPC.js.map → chunk-6LUHNFEE.js.map} +1 -1
- package/dist/{chunk-FSXQHEFQ.cjs → chunk-7CDV7Y4U.cjs} +25 -25
- package/dist/{chunk-FSXQHEFQ.cjs.map → chunk-7CDV7Y4U.cjs.map} +1 -1
- package/dist/{chunk-OAIOOVFN.cjs → chunk-7SJXYEZI.cjs} +36 -36
- package/dist/chunk-7SJXYEZI.cjs.map +1 -0
- package/dist/{chunk-LFYKB7KF.cjs → chunk-7V6APLF7.cjs} +19 -19
- package/dist/{chunk-LFYKB7KF.cjs.map → chunk-7V6APLF7.cjs.map} +1 -1
- package/dist/{chunk-4WMGFGYP.cjs → chunk-AJZ66VJC.cjs} +4 -4
- package/dist/{chunk-4WMGFGYP.cjs.map → chunk-AJZ66VJC.cjs.map} +1 -1
- package/dist/{chunk-KCP42W67.cjs → chunk-ARGQ5YZ5.cjs} +3 -3
- package/dist/{chunk-KCP42W67.cjs.map → chunk-ARGQ5YZ5.cjs.map} +1 -1
- package/dist/{chunk-BH6IKGZ3.js → chunk-AUAHGQY6.js} +5 -5
- package/dist/{chunk-BH6IKGZ3.js.map → chunk-AUAHGQY6.js.map} +1 -1
- package/dist/{chunk-KIXFXCHL.js → chunk-CEOCA7ID.js} +3 -3
- package/dist/{chunk-KIXFXCHL.js.map → chunk-CEOCA7ID.js.map} +1 -1
- package/dist/{chunk-TNKPQ3EF.js → chunk-CIRSOYGK.js} +12 -12
- package/dist/{chunk-TNKPQ3EF.js.map → chunk-CIRSOYGK.js.map} +1 -1
- package/dist/{chunk-BAUZUIHB.js → chunk-COL2TJGO.js} +83 -83
- package/dist/chunk-COL2TJGO.js.map +1 -0
- package/dist/{chunk-XHN5KOI2.cjs → chunk-DRLD4P2C.cjs} +8 -8
- package/dist/{chunk-XHN5KOI2.cjs.map → chunk-DRLD4P2C.cjs.map} +1 -1
- package/dist/{chunk-5AC52BHL.cjs → chunk-DYPFNQTQ.cjs} +140 -140
- package/dist/chunk-DYPFNQTQ.cjs.map +1 -0
- package/dist/{chunk-SCLGUHLU.cjs → chunk-E7TGSOPR.cjs} +4 -4
- package/dist/{chunk-SCLGUHLU.cjs.map → chunk-E7TGSOPR.cjs.map} +1 -1
- package/dist/{chunk-CRLFLMTK.cjs → chunk-EOXA4VJH.cjs} +3 -3
- package/dist/{chunk-CRLFLMTK.cjs.map → chunk-EOXA4VJH.cjs.map} +1 -1
- package/dist/{chunk-DBKZANTC.js → chunk-GA47YVW5.js} +3 -3
- package/dist/{chunk-DBKZANTC.js.map → chunk-GA47YVW5.js.map} +1 -1
- package/dist/{chunk-RCZRI72J.cjs → chunk-GMODJT4N.cjs} +4 -4
- package/dist/{chunk-RCZRI72J.cjs.map → chunk-GMODJT4N.cjs.map} +1 -1
- package/dist/{chunk-22KAKJ3W.cjs → chunk-GS5MFUPC.cjs} +4 -4
- package/dist/{chunk-22KAKJ3W.cjs.map → chunk-GS5MFUPC.cjs.map} +1 -1
- package/dist/{chunk-62OMGQHS.js → chunk-H6W3VXHU.js} +3 -3
- package/dist/{chunk-62OMGQHS.js.map → chunk-H6W3VXHU.js.map} +1 -1
- package/dist/{chunk-DX3Z2COD.cjs → chunk-HUYKO2ES.cjs} +3 -3
- package/dist/{chunk-DX3Z2COD.cjs.map → chunk-HUYKO2ES.cjs.map} +1 -1
- package/dist/{chunk-U5F5P4YU.js → chunk-IK234EFX.js} +12 -12
- package/dist/{chunk-U5F5P4YU.js.map → chunk-IK234EFX.js.map} +1 -1
- package/dist/{chunk-UQ2OBHMV.js → chunk-JUGEFTRC.js} +1010 -1010
- package/dist/chunk-JUGEFTRC.js.map +1 -0
- package/dist/{chunk-CHQMVIHR.js → chunk-LPGBRMYS.js} +36 -36
- package/dist/chunk-LPGBRMYS.js.map +1 -0
- package/dist/{chunk-D35EHOK5.cjs → chunk-M23W7IID.cjs} +12 -12
- package/dist/chunk-M23W7IID.cjs.map +1 -0
- package/dist/{chunk-FPOKWML2.js → chunk-MIVNNQO3.js} +21 -4
- package/dist/chunk-MIVNNQO3.js.map +1 -0
- package/dist/{chunk-WI3BVKEC.cjs → chunk-MNFI66H5.cjs} +5 -5
- package/dist/{chunk-WI3BVKEC.cjs.map → chunk-MNFI66H5.cjs.map} +1 -1
- package/dist/{chunk-T5ZMG6MC.js → chunk-NF4M7PUB.js} +3 -3
- package/dist/{chunk-T5ZMG6MC.js.map → chunk-NF4M7PUB.js.map} +1 -1
- package/dist/{chunk-ZNY5W3VX.js → chunk-NPSFPBIB.js} +3 -3
- package/dist/{chunk-ZNY5W3VX.js.map → chunk-NPSFPBIB.js.map} +1 -1
- package/dist/{chunk-LYW5A35J.js → chunk-OMIYTUVR.js} +12 -12
- package/dist/{chunk-LYW5A35J.js.map → chunk-OMIYTUVR.js.map} +1 -1
- package/dist/{chunk-ZMVF7EYJ.cjs → chunk-PBPO54KZ.cjs} +21 -3
- package/dist/chunk-PBPO54KZ.cjs.map +1 -0
- package/dist/{chunk-7V4OCZS6.cjs → chunk-RA3EGF6K.cjs} +6 -6
- package/dist/{chunk-7V4OCZS6.cjs.map → chunk-RA3EGF6K.cjs.map} +1 -1
- package/dist/{chunk-PL7O3RJJ.cjs → chunk-RKBAY7GZ.cjs} +3 -3
- package/dist/{chunk-PL7O3RJJ.cjs.map → chunk-RKBAY7GZ.cjs.map} +1 -1
- package/dist/{chunk-J3E5CSSC.js → chunk-RKFWBIKS.js} +3 -3
- package/dist/{chunk-J3E5CSSC.js.map → chunk-RKFWBIKS.js.map} +1 -1
- package/dist/{chunk-YLKHTBYA.js → chunk-RRP7MQAO.js} +3 -3
- package/dist/{chunk-YLKHTBYA.js.map → chunk-RRP7MQAO.js.map} +1 -1
- package/dist/{chunk-U6LQ6Z3P.cjs → chunk-SP3IKIPA.cjs} +6 -6
- package/dist/{chunk-U6LQ6Z3P.cjs.map → chunk-SP3IKIPA.cjs.map} +1 -1
- package/dist/{chunk-GX75YCWJ.cjs → chunk-SQUOXOY3.cjs} +560 -560
- package/dist/chunk-SQUOXOY3.cjs.map +1 -0
- package/dist/{chunk-6ZYOUT73.js → chunk-T5LORFHL.js} +7 -7
- package/dist/{chunk-6ZYOUT73.js.map → chunk-T5LORFHL.js.map} +1 -1
- package/dist/{chunk-45OU2UAA.cjs → chunk-TEMTKBBL.cjs} +10 -10
- package/dist/{chunk-45OU2UAA.cjs.map → chunk-TEMTKBBL.cjs.map} +1 -1
- package/dist/{chunk-PHDUN4SG.cjs → chunk-THCMGAFX.cjs} +41 -41
- package/dist/{chunk-PHDUN4SG.cjs.map → chunk-THCMGAFX.cjs.map} +1 -1
- package/dist/{chunk-HTGEAQOA.js → chunk-TOMDMKOD.js} +7 -7
- package/dist/{chunk-HTGEAQOA.js.map → chunk-TOMDMKOD.js.map} +1 -1
- package/dist/{chunk-WJHRWXWJ.js → chunk-TXIAF4PX.js} +3 -3
- package/dist/{chunk-WJHRWXWJ.js.map → chunk-TXIAF4PX.js.map} +1 -1
- package/dist/{chunk-6M5NAAWX.js → chunk-UCSEE52D.js} +3 -3
- package/dist/{chunk-6M5NAAWX.js.map → chunk-UCSEE52D.js.map} +1 -1
- package/dist/{chunk-I7CJDF3V.cjs → chunk-UHMP6S7M.cjs} +104 -103
- package/dist/chunk-UHMP6S7M.cjs.map +1 -0
- package/dist/{chunk-PGCKTXYH.js → chunk-UHUI6A36.js} +3 -3
- package/dist/{chunk-PGCKTXYH.js.map → chunk-UHUI6A36.js.map} +1 -1
- package/dist/{chunk-6KQVTMRL.cjs → chunk-UOGXKHTJ.cjs} +3 -3
- package/dist/{chunk-6KQVTMRL.cjs.map → chunk-UOGXKHTJ.cjs.map} +1 -1
- package/dist/{chunk-7S7YVBFK.js → chunk-VDSDG4FR.js} +3 -3
- package/dist/{chunk-7S7YVBFK.js.map → chunk-VDSDG4FR.js.map} +1 -1
- package/dist/{chunk-3GFQNJYE.js → chunk-VGWCHX6G.js} +104 -103
- package/dist/chunk-VGWCHX6G.js.map +1 -0
- package/dist/{chunk-VY3HTT37.js → chunk-VUH547VQ.js} +3 -3
- package/dist/{chunk-VY3HTT37.js.map → chunk-VUH547VQ.js.map} +1 -1
- package/dist/{chunk-AZCMKGDG.js → chunk-W37PFYFL.js} +4 -4
- package/dist/{chunk-AZCMKGDG.js.map → chunk-W37PFYFL.js.map} +1 -1
- package/dist/{chunk-JGUM4EXE.cjs → chunk-W3IX3GZS.cjs} +8 -8
- package/dist/{chunk-JGUM4EXE.cjs.map → chunk-W3IX3GZS.cjs.map} +1 -1
- package/dist/{chunk-UCA4JLLJ.cjs → chunk-X7GT57KW.cjs} +3 -3
- package/dist/{chunk-UCA4JLLJ.cjs.map → chunk-X7GT57KW.cjs.map} +1 -1
- package/dist/{chunk-IXL2KJOZ.cjs → chunk-XBEGD33U.cjs} +40 -40
- package/dist/{chunk-IXL2KJOZ.cjs.map → chunk-XBEGD33U.cjs.map} +1 -1
- package/dist/{chunk-FDNIK5YS.cjs → chunk-XBKIFGBB.cjs} +8 -8
- package/dist/{chunk-FDNIK5YS.cjs.map → chunk-XBKIFGBB.cjs.map} +1 -1
- package/dist/{chunk-HZE5MHQO.js → chunk-XT7HKQ4H.js} +3 -3
- package/dist/{chunk-HZE5MHQO.js.map → chunk-XT7HKQ4H.js.map} +1 -1
- package/dist/{chunk-M3OK6KGR.js → chunk-ZGQKED5T.js} +3 -3
- package/dist/{chunk-M3OK6KGR.js.map → chunk-ZGQKED5T.js.map} +1 -1
- package/dist/{chunk-NWBCZ4PA.js → chunk-ZKBYG6MN.js} +4 -4
- package/dist/{chunk-NWBCZ4PA.js.map → chunk-ZKBYG6MN.js.map} +1 -1
- package/dist/collaboration/index.cjs +1 -1
- package/dist/collaboration/index.js +1 -1
- package/dist/connect/docx.cjs +19 -19
- package/dist/connect/docx.js +15 -15
- package/dist/connect/index.cjs +762 -762
- package/dist/connect/index.js +63 -63
- package/dist/connect/viewer.cjs +14 -14
- package/dist/connect/viewer.js +13 -13
- package/dist/connection/dashboards/ConnectedDashboardsPage.d.ts +6 -0
- package/dist/dashboards/chartModel.d.ts +12 -0
- package/dist/dashboards/index.cjs +113 -42
- package/dist/dashboards/index.cjs.map +1 -1
- package/dist/dashboards/index.js +95 -24
- package/dist/dashboards/index.js.map +1 -1
- package/dist/embed/index.cjs +29 -29
- package/dist/embed/index.js +23 -23
- package/dist/facts/index.cjs +43 -43
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +1 -1
- package/dist/files/index.js +1 -1
- package/dist/home/index.cjs +31 -31
- package/dist/home/index.js +3 -3
- package/dist/index.cjs +383 -383
- package/dist/index.js +21 -21
- package/dist/settings/index.cjs +153 -153
- package/dist/settings/index.js +4 -4
- package/dist/shell/index.cjs +36 -36
- package/dist/shell/index.js +4 -4
- package/dist/site/index.cjs +5 -5
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +19 -19
- package/dist/studio/index.js +14 -14
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +33 -33
- package/dist/workflow-canvas/index.js +22 -22
- package/node_modules/@arbidocs/coedit/package.json +2 -2
- package/node_modules/@docx-editor.dev/core/dist/automation.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/automation.d.ts +60 -13
- package/node_modules/@docx-editor.dev/core/dist/automation.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/binding.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/binding.d.ts +21 -13
- package/node_modules/@docx-editor.dev/core/dist/binding.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{index-Bsg7oIKP.d.ts → chrome-print-CAs51cpq.d.ts} +31 -21
- package/node_modules/@docx-editor.dev/core/dist/{chunk-VDNNLG6X.js → chunk-236O4YQW.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-4HENIAFG.js +1 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-SRPILEWV.cjs → chunk-6JPL6ZAS.cjs} +5 -5
- package/node_modules/@docx-editor.dev/core/dist/{chunk-2RC2EPND.js → chunk-6ZQP4HQ7.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-ZUHOMK52.cjs → chunk-7WQ7AAHW.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-Z6WBFXJU.js → chunk-BCXH4BXB.js} +3 -3
- package/node_modules/@docx-editor.dev/core/dist/{chunk-QMLCVPCD.cjs → chunk-BY2ACZZ6.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-CAJEXXVG.cjs +4 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-CPWLFPWC.js +30 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-6APGXLBB.cjs → chunk-D7ZMDMPX.cjs} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-DOHF6FA7.cjs +30 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-DVX32P2P.js +27 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-6EYYL7FL.js → chunk-E4LOMDNL.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-EKLM7NWB.cjs +7 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-G3K63G7P.cjs +27 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-5CSUYANV.js → chunk-G4HOFIKJ.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-K5U2PLDP.cjs → chunk-JLVBDYVQ.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-LQX36Z5P.js +7 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-TSLBZ26X.js → chunk-LSZ6KPKK.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-O2AL2HSJ.cjs → chunk-MM5QBMTE.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-ETTO6GK3.js → chunk-OMCG63ZF.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-OSFOJTHU.cjs +18 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-E7BQA6UP.js → chunk-RCLZXP3B.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-T6K2QYNZ.cjs +2 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-TRGAVV2Y.js +4 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-U4JZVSOE.js +2 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-2GO5T2JU.cjs → chunk-UHHYFIDT.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-V3N4SOAK.cjs +1 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-6AWEKBLB.cjs → chunk-W35WTWAO.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-YQ5G6LC7.js +18 -0
- package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.d.ts +5 -5
- package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/collaboration.d.ts +4 -4
- package/node_modules/@docx-editor.dev/core/dist/contracts/document.d.ts +3 -3
- package/node_modules/@docx-editor.dev/core/dist/contracts/editor.d.ts +9 -10
- package/node_modules/@docx-editor.dev/core/dist/contracts/interaction.d.ts +2 -2
- package/node_modules/@docx-editor.dev/core/dist/contracts/modules.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/contracts/modules.d.ts +33 -9
- package/node_modules/@docx-editor.dev/core/dist/contracts/modules.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/contracts/types.d.ts +2 -2
- package/node_modules/@docx-editor.dev/core/dist/{custom-node-writes-cvL5rhcD.d.ts → custom-node-writes-Bn6uciLb.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/diagnostic-context-B8M79cfK.d.ts +30 -0
- package/node_modules/@docx-editor.dev/core/dist/diagnostic-hints-BeVjfNOv.d.ts +113 -0
- package/node_modules/@docx-editor.dev/core/dist/{document-protection-BAGVGqaP.d.ts → document-protection-CUb55pl_.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/{editor-Ci7IZGmG.d.ts → editor-CZQZmTIU.d.ts} +386 -9
- package/node_modules/@docx-editor.dev/core/dist/{editor-scope-OHPwVQ5l.d.ts → editor-scope-7o9xweiJ.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/editor.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/editor.d.ts +54 -33
- package/node_modules/@docx-editor.dev/core/dist/editor.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/export.cjs +2 -2
- package/node_modules/@docx-editor.dev/core/dist/export.d.ts +13 -14
- package/node_modules/@docx-editor.dev/core/dist/export.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{font-resolver-BVQB14qT.d.ts → font-resolver-lSBLirLR.d.ts} +3 -3
- package/node_modules/@docx-editor.dev/core/dist/{headless-document-view-qH331moE.d.ts → headless-document-view-pp3q7wIh.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/{image-resources-BN-hUgCn.d.ts → image-resources-tXLQShoC.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/index.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/index.d.ts +65 -20
- package/node_modules/@docx-editor.dev/core/dist/index.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{layout-shaping-BEyuiQOk.d.ts → layout-shaping-BD-dF_rn.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/layout.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/layout.d.ts +17 -20
- package/node_modules/@docx-editor.dev/core/dist/layout.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{note-properties-4Y9o6Gyk.d.ts → note-properties-qQUjO1GQ.d.ts} +3 -3
- package/node_modules/@docx-editor.dev/core/dist/{omml-equation-CuzBL5DD.d.ts → omml-equation-BUbU0utM.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/output.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/output.d.ts +8 -9
- package/node_modules/@docx-editor.dev/core/dist/output.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{protocol-Bqk4Izjc.d.ts → protocol-DYzzz2ej.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/{review-paragraph-order-DT-n6ouC.d.ts → review-paragraph-order-CN_0l2Cb.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{semantic-cell-selection-D9D1KSXq.d.ts → semantic-cell-selection-eYag3P47.d.ts} +4 -211
- package/node_modules/@docx-editor.dev/core/dist/{semantic-interaction-CIC-PooQ.d.ts → semantic-interaction-kR_QB845.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{semantic-paint-BME37OMv.d.ts → semantic-paint-ZayFF3tD.d.ts} +17 -5
- package/node_modules/@docx-editor.dev/core/dist/{semantic-record-queries-CBlZqZNa.d.ts → semantic-record-queries-Bsgth6lv.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{semantic-records-4B3WwFAi.d.ts → semantic-records-DQmumPgL.d.ts} +1279 -828
- package/node_modules/@docx-editor.dev/core/dist/store.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/store.d.ts +1466 -1464
- package/node_modules/@docx-editor.dev/core/dist/store.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{tree-package-fragment-BeeKxDw8.d.ts → tree-package-store-CovjNARF.d.ts} +83 -83
- package/node_modules/@docx-editor.dev/core/dist/{tree-session-contract-CVbmlMlq.d.ts → tree-session-contract-CZVAGl51.d.ts} +6 -6
- package/node_modules/@docx-editor.dev/core/dist/{types-barrel-D3xCgQX6.d.ts → types-barrel-DuC5QBNC.d.ts} +548 -527
- package/node_modules/@docx-editor.dev/core/package.json +3 -3
- package/node_modules/@docx-editor.dev/react/dist/index.js +3 -3
- package/node_modules/@docx-editor.dev/react/dist/index.mjs +3 -3
- package/node_modules/@docx-editor.dev/react/package.json +4 -4
- package/package.json +8 -8
- package/dist/ConnectedStreamedWordArtifact-HLJ5IIOU.js.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-JQ34AOUU.cjs.map +0 -1
- package/dist/RechartsRenderer-23OF4H6X.js.map +0 -1
- package/dist/RechartsRenderer-GIRCW7DB.cjs.map +0 -1
- package/dist/ai-ADS6YSS2.cjs.map +0 -1
- package/dist/ai-KHWTGBT5.js.map +0 -1
- package/dist/chunk-3GFQNJYE.js.map +0 -1
- package/dist/chunk-5AC52BHL.cjs.map +0 -1
- package/dist/chunk-AVGHTUPE.js.map +0 -1
- package/dist/chunk-BAUZUIHB.js.map +0 -1
- package/dist/chunk-CHQMVIHR.js.map +0 -1
- package/dist/chunk-D35EHOK5.cjs.map +0 -1
- package/dist/chunk-FPOKWML2.js.map +0 -1
- package/dist/chunk-GX75YCWJ.cjs.map +0 -1
- package/dist/chunk-I7CJDF3V.cjs.map +0 -1
- package/dist/chunk-OAIOOVFN.cjs.map +0 -1
- package/dist/chunk-UQ2OBHMV.js.map +0 -1
- package/dist/chunk-ZMVF7EYJ.cjs.map +0 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-4GBTELJV.cjs +0 -28
- package/node_modules/@docx-editor.dev/core/dist/chunk-4R3TEXMN.js +0 -18
- package/node_modules/@docx-editor.dev/core/dist/chunk-EO4C5QJW.cjs +0 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-FIJZIQXA.cjs +0 -18
- package/node_modules/@docx-editor.dev/core/dist/chunk-FRXAOVTB.js +0 -28
- package/node_modules/@docx-editor.dev/core/dist/chunk-J6BVWIDB.js +0 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-JGNVNT2A.cjs +0 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-KKIJG3C6.js +0 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-LWDSDCMO.js +0 -27
- package/node_modules/@docx-editor.dev/core/dist/chunk-NBCVVZOM.cjs +0 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-O5INAWZQ.js +0 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-RCHS4ZEH.cjs +0 -27
- package/node_modules/@docx-editor.dev/core/dist/chunk-VHAVHCQY.js +0 -7
- package/node_modules/@docx-editor.dev/core/dist/chunk-VX43VBAX.cjs +0 -7
- package/node_modules/@docx-editor.dev/core/dist/review-pane-D9jm8DcY.d.ts +0 -128
- package/node_modules/@docx-editor.dev/core/dist/revision-projection-DZ4kKVev.d.ts +0 -242
package/dist/dashboards/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { PanelEditor, DashboardGrid, DashboardCell, DashboardPanel } from '../chunk-
|
|
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-
|
|
4
|
-
export { DEFAULT_UNIT_FORMATTERS, chartModelOf, formatBucketLabel, formatterOf, metricValueOf } from '../chunk-
|
|
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,
|
|
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
|
-
|
|
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":
|
|
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:
|
|
416
|
-
templates.map((t, i) => /* @__PURE__ */
|
|
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: () =>
|
|
420
|
-
"
|
|
421
|
-
|
|
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] =
|
|
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
|
|
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
|
-
|
|
479
|
-
|
|
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(
|
|
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:
|
|
721
|
+
actions: saved.isError || saved.data && !isEmpty ? newButton : void 0
|
|
654
722
|
}
|
|
655
723
|
),
|
|
656
|
-
saved.isError
|
|
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:
|
|
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"]}
|