@arbidocs/blocks 0.5.113 → 0.5.115
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-VCJ6Q7WE.cjs → ConnectedCallDock-WER7R222.cjs} +27 -27
- package/dist/{ConnectedCallDock-VCJ6Q7WE.cjs.map → ConnectedCallDock-WER7R222.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-BUI3ILJD.cjs → ConnectedCallRoom-T7OBQTYP.cjs} +19 -19
- package/dist/{ConnectedCallRoom-BUI3ILJD.cjs.map → ConnectedCallRoom-T7OBQTYP.cjs.map} +1 -1
- package/dist/{ConnectedMailInviteCard-P65MQM6J.cjs → ConnectedMailInviteCard-EINB3THA.cjs} +5 -5
- package/dist/{ConnectedMailInviteCard-P65MQM6J.cjs.map → ConnectedMailInviteCard-EINB3THA.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-JO2H4QIP.cjs → ConnectedNativeDocxComparison-YXMYJWXY.cjs} +24 -24
- package/dist/{ConnectedNativeDocxComparison-JO2H4QIP.cjs.map → ConnectedNativeDocxComparison-YXMYJWXY.cjs.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-BSPM4NQC.cjs → ConnectedProductionSetDialog-LHB4VQWC.cjs} +9 -9
- package/dist/{ConnectedProductionSetDialog-BSPM4NQC.cjs.map → ConnectedProductionSetDialog-LHB4VQWC.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-DMQEJFCA.cjs → ConnectedStreamedWordArtifact-2RTCHVPI.cjs} +24 -24
- package/dist/{ConnectedStreamedWordArtifact-DMQEJFCA.cjs.map → ConnectedStreamedWordArtifact-2RTCHVPI.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-UBE2DVAC.cjs → DocumentReviewCard-ZSBZBGFK.cjs} +23 -23
- package/dist/{DocumentReviewCard-UBE2DVAC.cjs.map → DocumentReviewCard-ZSBZBGFK.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-EBYRA3ZZ.cjs → FilesViewerDialog-I5QIHQZT.cjs} +55 -55
- package/dist/{FilesViewerDialog-EBYRA3ZZ.cjs.map → FilesViewerDialog-I5QIHQZT.cjs.map} +1 -1
- package/dist/{NativeDocxEditor-EJEIJDOC.cjs → NativeDocxEditor-H6TAEVGY.cjs} +6 -6
- package/dist/{NativeDocxEditor-EJEIJDOC.cjs.map → NativeDocxEditor-H6TAEVGY.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-BO2OJO7A.cjs → WorkspaceTableView-J3C6VH4T.cjs} +9 -9
- package/dist/{WorkspaceTableView-BO2OJO7A.cjs.map → WorkspaceTableView-J3C6VH4T.cjs.map} +1 -1
- package/dist/agents/index.cjs +298 -298
- package/dist/{ai-EMNMGDAN.cjs → ai-IM4A23YT.cjs} +27 -27
- package/dist/ai-IM4A23YT.cjs.map +1 -0
- package/dist/calls/index.cjs +149 -149
- package/dist/chat/DraftingDocChip.d.ts +3 -1
- package/dist/chat/DraftingDocChip.js +7 -4
- package/dist/chat/DraftingDocChip.js.map +2 -2
- package/dist/chat/index.cjs +65 -65
- package/dist/{chunk-AJVZYRAJ.cjs → chunk-24EDG4PC.cjs} +68 -68
- package/dist/{chunk-AJVZYRAJ.cjs.map → chunk-24EDG4PC.cjs.map} +1 -1
- package/dist/{chunk-GTTDJMWX.cjs → chunk-325GVZE6.cjs} +6 -6
- package/dist/{chunk-GTTDJMWX.cjs.map → chunk-325GVZE6.cjs.map} +1 -1
- package/dist/{chunk-HM5L4SBC.cjs → chunk-3A7QWUAW.cjs} +3 -3
- package/dist/{chunk-HM5L4SBC.cjs.map → chunk-3A7QWUAW.cjs.map} +1 -1
- package/dist/{chunk-ET3NVY27.cjs → chunk-42TURFHF.cjs} +5 -5
- package/dist/{chunk-ET3NVY27.cjs.map → chunk-42TURFHF.cjs.map} +1 -1
- package/dist/{chunk-J2RXQVVF.cjs → chunk-4EK7TAP7.cjs} +5 -5
- package/dist/{chunk-J2RXQVVF.cjs.map → chunk-4EK7TAP7.cjs.map} +1 -1
- package/dist/{chunk-BHTEKYWJ.cjs → chunk-557MJ4IH.cjs} +23 -23
- package/dist/{chunk-BHTEKYWJ.cjs.map → chunk-557MJ4IH.cjs.map} +1 -1
- package/dist/{chunk-Y45VRNSZ.cjs → chunk-57NHXEU2.cjs} +4 -4
- package/dist/{chunk-Y45VRNSZ.cjs.map → chunk-57NHXEU2.cjs.map} +1 -1
- package/dist/{chunk-MUA5PJGX.cjs → chunk-5SKHK3BG.cjs} +4 -4
- package/dist/{chunk-MUA5PJGX.cjs.map → chunk-5SKHK3BG.cjs.map} +1 -1
- package/dist/{chunk-AFXDLDPU.cjs → chunk-5UYFLFNR.cjs} +4 -4
- package/dist/{chunk-AFXDLDPU.cjs.map → chunk-5UYFLFNR.cjs.map} +1 -1
- package/dist/{chunk-OTG5T5Z5.cjs → chunk-6UTKM5AB.cjs} +5 -5
- package/dist/{chunk-OTG5T5Z5.cjs.map → chunk-6UTKM5AB.cjs.map} +1 -1
- package/dist/{chunk-H5OLHP2U.cjs → chunk-7OPOPYV6.cjs} +3 -3
- package/dist/{chunk-H5OLHP2U.cjs.map → chunk-7OPOPYV6.cjs.map} +1 -1
- package/dist/{chunk-MQANCZOD.cjs → chunk-A3T3IC3K.cjs} +78 -78
- package/dist/{chunk-MQANCZOD.cjs.map → chunk-A3T3IC3K.cjs.map} +1 -1
- package/dist/{chunk-5VCID67B.cjs → chunk-B3LZITVF.cjs} +12 -12
- package/dist/{chunk-5VCID67B.cjs.map → chunk-B3LZITVF.cjs.map} +1 -1
- package/dist/{chunk-OZWYCRRK.cjs → chunk-BQ5RIWWT.cjs} +30 -30
- package/dist/{chunk-OZWYCRRK.cjs.map → chunk-BQ5RIWWT.cjs.map} +1 -1
- package/dist/chunk-CIHERNDO.cjs +18 -0
- package/dist/{chunk-L52N2LVE.cjs.map → chunk-CIHERNDO.cjs.map} +1 -1
- package/dist/{chunk-NP4EWPIP.cjs → chunk-CJYWHUZR.cjs} +6 -6
- package/dist/{chunk-NP4EWPIP.cjs.map → chunk-CJYWHUZR.cjs.map} +1 -1
- package/dist/{chunk-6W4X4EFI.cjs → chunk-CMGNRMPA.cjs} +5 -5
- package/dist/{chunk-6W4X4EFI.cjs.map → chunk-CMGNRMPA.cjs.map} +1 -1
- package/dist/{chunk-YONJRX6N.cjs → chunk-CPG7II4E.cjs} +28 -28
- package/dist/{chunk-YONJRX6N.cjs.map → chunk-CPG7II4E.cjs.map} +1 -1
- package/dist/{chunk-GGBNUDLK.cjs → chunk-CPR6EHG7.cjs} +70 -70
- package/dist/{chunk-GGBNUDLK.cjs.map → chunk-CPR6EHG7.cjs.map} +1 -1
- package/dist/{chunk-DZWIVRYP.cjs → chunk-DDIW4HLU.cjs} +36 -36
- package/dist/{chunk-DZWIVRYP.cjs.map → chunk-DDIW4HLU.cjs.map} +1 -1
- package/dist/{chunk-Z3VNKPPH.cjs → chunk-E3Y7RI3J.cjs} +4 -4
- package/dist/{chunk-Z3VNKPPH.cjs.map → chunk-E3Y7RI3J.cjs.map} +1 -1
- package/dist/{chunk-WT7CCCIN.cjs → chunk-GNX3FBBX.cjs} +4 -4
- package/dist/{chunk-WT7CCCIN.cjs.map → chunk-GNX3FBBX.cjs.map} +1 -1
- package/dist/{chunk-IIWJQEBC.cjs → chunk-H7PHOTX2.cjs} +10 -10
- package/dist/{chunk-IIWJQEBC.cjs.map → chunk-H7PHOTX2.cjs.map} +1 -1
- package/dist/{chunk-LQHXUSWZ.cjs → chunk-HQDR43JC.cjs} +6 -6
- package/dist/{chunk-LQHXUSWZ.cjs.map → chunk-HQDR43JC.cjs.map} +1 -1
- package/dist/{chunk-6LQN4BMX.cjs → chunk-IDCD5TEZ.cjs} +5 -5
- package/dist/{chunk-6LQN4BMX.cjs.map → chunk-IDCD5TEZ.cjs.map} +1 -1
- package/dist/{chunk-INEPPS4H.cjs → chunk-IW7CDJTA.cjs} +4 -4
- package/dist/{chunk-INEPPS4H.cjs.map → chunk-IW7CDJTA.cjs.map} +1 -1
- package/dist/{chunk-6YOZKXV6.cjs → chunk-JR2YSBD5.cjs} +4 -4
- package/dist/{chunk-6YOZKXV6.cjs.map → chunk-JR2YSBD5.cjs.map} +1 -1
- package/dist/{chunk-ZFKWCGA5.cjs → chunk-JV5TVUOU.cjs} +4 -4
- package/dist/{chunk-ZFKWCGA5.cjs.map → chunk-JV5TVUOU.cjs.map} +1 -1
- package/dist/{chunk-IFOGBMAE.cjs → chunk-KLMNCBLY.cjs} +9 -6
- package/dist/chunk-KLMNCBLY.cjs.map +1 -0
- package/dist/{chunk-JDI7E4RI.cjs → chunk-KTQOGT2L.cjs} +14 -14
- package/dist/{chunk-JDI7E4RI.cjs.map → chunk-KTQOGT2L.cjs.map} +1 -1
- package/dist/{chunk-OKHKJ5ML.cjs → chunk-KXIRVKCJ.cjs} +11 -11
- package/dist/{chunk-OKHKJ5ML.cjs.map → chunk-KXIRVKCJ.cjs.map} +1 -1
- package/dist/{chunk-4ED7CNOX.cjs → chunk-M6IKVKU5.cjs} +40 -3
- package/dist/chunk-M6IKVKU5.cjs.map +1 -0
- package/dist/{chunk-XKDUPU7B.cjs → chunk-NJCK6V6U.cjs} +4 -4
- package/dist/{chunk-XKDUPU7B.cjs.map → chunk-NJCK6V6U.cjs.map} +1 -1
- package/dist/{chunk-OVKJ7OVZ.cjs → chunk-NNUK5ZM7.cjs} +6 -6
- package/dist/{chunk-OVKJ7OVZ.cjs.map → chunk-NNUK5ZM7.cjs.map} +1 -1
- package/dist/{chunk-MJHIBCF7.cjs → chunk-NY3YUCOW.cjs} +4 -4
- package/dist/{chunk-MJHIBCF7.cjs.map → chunk-NY3YUCOW.cjs.map} +1 -1
- package/dist/{chunk-R4TP3VS3.cjs → chunk-OEREKAAP.cjs} +101 -101
- package/dist/{chunk-R4TP3VS3.cjs.map → chunk-OEREKAAP.cjs.map} +1 -1
- package/dist/{chunk-ENUZ35NR.cjs → chunk-P5AQYC4D.cjs} +4 -4
- package/dist/{chunk-ENUZ35NR.cjs.map → chunk-P5AQYC4D.cjs.map} +1 -1
- package/dist/{chunk-ZZZ6AZDR.cjs → chunk-P77YTTJ3.cjs} +4 -4
- package/dist/{chunk-ZZZ6AZDR.cjs.map → chunk-P77YTTJ3.cjs.map} +1 -1
- package/dist/{chunk-5I2VUNZR.cjs → chunk-PGJYD67F.cjs} +6 -6
- package/dist/{chunk-5I2VUNZR.cjs.map → chunk-PGJYD67F.cjs.map} +1 -1
- package/dist/{chunk-BYN7UMC5.cjs → chunk-PL7HUTM3.cjs} +8 -8
- package/dist/{chunk-BYN7UMC5.cjs.map → chunk-PL7HUTM3.cjs.map} +1 -1
- package/dist/{chunk-T7J352JD.cjs → chunk-QMIHLJMH.cjs} +6 -6
- package/dist/{chunk-T7J352JD.cjs.map → chunk-QMIHLJMH.cjs.map} +1 -1
- package/dist/{chunk-WJP6ICDM.cjs → chunk-R7CJEIA5.cjs} +4 -4
- package/dist/{chunk-WJP6ICDM.cjs.map → chunk-R7CJEIA5.cjs.map} +1 -1
- package/dist/{chunk-IE677C4I.cjs → chunk-SBWIA4PL.cjs} +21 -21
- package/dist/{chunk-IE677C4I.cjs.map → chunk-SBWIA4PL.cjs.map} +1 -1
- package/dist/{chunk-GVTKFVXH.cjs → chunk-SGYSDABK.cjs} +6 -6
- package/dist/{chunk-GVTKFVXH.cjs.map → chunk-SGYSDABK.cjs.map} +1 -1
- package/dist/{chunk-PIB7K7HI.cjs → chunk-T23UTIRI.cjs} +8 -8
- package/dist/{chunk-PIB7K7HI.cjs.map → chunk-T23UTIRI.cjs.map} +1 -1
- package/dist/{chunk-E4BLRF2L.cjs → chunk-TDO5UWXF.cjs} +5 -5
- package/dist/{chunk-E4BLRF2L.cjs.map → chunk-TDO5UWXF.cjs.map} +1 -1
- package/dist/{chunk-U5T46QCS.cjs → chunk-TKHCIHE2.cjs} +3 -3
- package/dist/chunk-TKHCIHE2.cjs.map +1 -0
- package/dist/{chunk-4IOYQLKG.cjs → chunk-TP5PGWIO.cjs} +3 -3
- package/dist/{chunk-4IOYQLKG.cjs.map → chunk-TP5PGWIO.cjs.map} +1 -1
- package/dist/{chunk-A4Z5CTLF.cjs → chunk-TT4IF52H.cjs} +39 -39
- package/dist/{chunk-A4Z5CTLF.cjs.map → chunk-TT4IF52H.cjs.map} +1 -1
- package/dist/{chunk-WIAWHETB.cjs → chunk-ULPTSXXO.cjs} +4 -4
- package/dist/{chunk-WIAWHETB.cjs.map → chunk-ULPTSXXO.cjs.map} +1 -1
- package/dist/{chunk-K5MYEWD5.cjs → chunk-UZHWXKS6.cjs} +7 -7
- package/dist/{chunk-K5MYEWD5.cjs.map → chunk-UZHWXKS6.cjs.map} +1 -1
- package/dist/{chunk-XW524KUX.cjs → chunk-VJCSEMXT.cjs} +4 -4
- package/dist/{chunk-XW524KUX.cjs.map → chunk-VJCSEMXT.cjs.map} +1 -1
- package/dist/{chunk-B5442TKX.cjs → chunk-VRK3IQAP.cjs} +4 -4
- package/dist/{chunk-B5442TKX.cjs.map → chunk-VRK3IQAP.cjs.map} +1 -1
- package/dist/{chunk-MYRKL3JO.cjs → chunk-VWTOIGX4.cjs} +4 -4
- package/dist/{chunk-MYRKL3JO.cjs.map → chunk-VWTOIGX4.cjs.map} +1 -1
- package/dist/{chunk-KZKGZ7IG.cjs → chunk-WAV762GP.cjs} +14 -14
- package/dist/{chunk-KZKGZ7IG.cjs.map → chunk-WAV762GP.cjs.map} +1 -1
- package/dist/{chunk-DMNX556N.cjs → chunk-WR2SF44W.cjs} +10 -10
- package/dist/{chunk-DMNX556N.cjs.map → chunk-WR2SF44W.cjs.map} +1 -1
- package/dist/{chunk-M2D4POJV.cjs → chunk-WXUU3COI.cjs} +9 -9
- package/dist/{chunk-M2D4POJV.cjs.map → chunk-WXUU3COI.cjs.map} +1 -1
- package/dist/{chunk-FGEBA3TL.cjs → chunk-X5LANJDZ.cjs} +26 -26
- package/dist/{chunk-FGEBA3TL.cjs.map → chunk-X5LANJDZ.cjs.map} +1 -1
- package/dist/{chunk-MY7Q3QE2.cjs → chunk-XKVPSOKP.cjs} +4 -4
- package/dist/{chunk-MY7Q3QE2.cjs.map → chunk-XKVPSOKP.cjs.map} +1 -1
- package/dist/{chunk-ONZOVO2B.cjs → chunk-Y24V6HPR.cjs} +24 -24
- package/dist/{chunk-ONZOVO2B.cjs.map → chunk-Y24V6HPR.cjs.map} +1 -1
- package/dist/{chunk-KGGSBJMU.cjs → chunk-YGXOKB5Z.cjs} +4 -4
- package/dist/{chunk-KGGSBJMU.cjs.map → chunk-YGXOKB5Z.cjs.map} +1 -1
- package/dist/{chunk-YAPXIANR.cjs → chunk-YVCOQHCE.cjs} +5 -5
- package/dist/{chunk-YAPXIANR.cjs.map → chunk-YVCOQHCE.cjs.map} +1 -1
- package/dist/{chunk-LCNKKSN3.cjs → chunk-ZTXQIIFV.cjs} +6 -6
- package/dist/{chunk-LCNKKSN3.cjs.map → chunk-ZTXQIIFV.cjs.map} +1 -1
- package/dist/citations/index.cjs +8 -8
- package/dist/connect/docx.cjs +28 -28
- package/dist/connect/index.cjs +1683 -1497
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/viewer.cjs +41 -41
- package/dist/connection/ConnectedWorkflowBuilder.d.ts +11 -0
- package/dist/connection/ConnectedWorkflowBuilder.js +42 -3
- package/dist/connection/ConnectedWorkflowBuilder.js.map +2 -2
- package/dist/connection/conversation/ConnectedConversation.js +143 -55
- package/dist/connection/conversation/ConnectedConversation.js.map +2 -2
- package/dist/connection/conversation/ConnectedConversationPage.js +36 -2
- package/dist/connection/conversation/ConnectedConversationPage.js.map +2 -2
- package/dist/connection/conversation/ConversationSendButton.d.ts +1 -0
- package/dist/connection/conversation/ConversationSendButton.js +3 -2
- package/dist/connection/conversation/ConversationSendButton.js.map +2 -2
- package/dist/connection/conversation/DocumentTargetNotice.d.ts +7 -0
- package/dist/connection/conversation/DocumentTargetNotice.js +45 -0
- package/dist/connection/conversation/DocumentTargetNotice.js.map +7 -0
- package/dist/connection/conversation/documentSwitch.d.ts +9 -0
- package/dist/connection/conversation/documentSwitch.js +40 -0
- package/dist/connection/conversation/documentSwitch.js.map +7 -0
- package/dist/connection/workflows/ConnectedWorkflowsPage.js +10 -3
- package/dist/connection/workflows/ConnectedWorkflowsPage.js.map +2 -2
- package/dist/connection/workflows/useWorkflowsPageState.d.ts +1 -0
- package/dist/connection/workflows/useWorkflowsPageState.js.map +2 -2
- package/dist/dashboards/index.cjs +23 -23
- package/dist/docx/NativeDocxEditor.js +3 -1
- package/dist/docx/NativeDocxEditor.js.map +2 -2
- package/dist/docx/index.cjs +38 -38
- package/dist/docx/signatures/SignatureFields.d.ts +2 -0
- package/dist/docx/signatures/SignatureFields.js +40 -2
- package/dist/docx/signatures/SignatureFields.js.map +2 -2
- package/dist/embed/index.cjs +50 -50
- package/dist/facts/index.cjs +44 -44
- package/dist/files/index.cjs +226 -226
- package/dist/home/index.cjs +32 -32
- package/dist/index.cjs +1694 -1694
- package/dist/provider/environment.d.ts +5 -0
- package/dist/provider/environment.js +1 -1
- package/dist/provider/environment.js.map +2 -2
- package/dist/provider/requests.d.ts +2 -0
- package/dist/provider/requests.js.map +2 -2
- package/dist/retrieval/index.cjs +4 -4
- package/dist/settings/index.cjs +147 -147
- package/dist/shell/index.cjs +91 -91
- package/dist/studio/index.cjs +42 -42
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +116 -74
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workspaces/index.cjs +27 -27
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ai-EMNMGDAN.cjs.map +0 -1
- package/dist/chunk-4ED7CNOX.cjs.map +0 -1
- package/dist/chunk-IFOGBMAE.cjs.map +0 -1
- package/dist/chunk-L52N2LVE.cjs +0 -18
- package/dist/chunk-U5T46QCS.cjs.map +0 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunkPBPO54KZ_cjs = require('./chunk-PBPO54KZ.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunkULPTSXXO_cjs = require('./chunk-ULPTSXXO.cjs');
|
|
6
6
|
var chunkIPSHAMO2_cjs = require('./chunk-IPSHAMO2.cjs');
|
|
7
|
-
var
|
|
7
|
+
var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
|
|
8
8
|
var ui = require('@arbidocs/react/ui');
|
|
9
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
10
10
|
var react = require('react');
|
|
@@ -189,7 +189,7 @@ function RecordsTable({
|
|
|
189
189
|
}));
|
|
190
190
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
191
191
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
192
|
-
|
|
192
|
+
chunkULPTSXXO_cjs.DataTable,
|
|
193
193
|
{
|
|
194
194
|
columns,
|
|
195
195
|
rows: shown,
|
|
@@ -256,7 +256,7 @@ function PanelView({
|
|
|
256
256
|
] }) : state === "empty" ? l.empty : description;
|
|
257
257
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn("relative h-full", className), "data-slot": "dashboard-panel", children: [
|
|
258
258
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
259
|
-
|
|
259
|
+
chunkULPTSXXO_cjs.MetricCard,
|
|
260
260
|
{
|
|
261
261
|
label: title,
|
|
262
262
|
value: metric && metric.value !== null && state === "ready" ? metric.format(metric.value) : "\u2014",
|
|
@@ -433,7 +433,7 @@ function SourcePanel({
|
|
|
433
433
|
className,
|
|
434
434
|
testId
|
|
435
435
|
}) {
|
|
436
|
-
const environment =
|
|
436
|
+
const environment = chunkTKHCIHE2_cjs.useBlocksEnvironment();
|
|
437
437
|
const { chart } = panel;
|
|
438
438
|
const { dataset, fields, isLoading, error } = react$1.usePanelDataset(
|
|
439
439
|
source,
|
|
@@ -561,5 +561,5 @@ exports.kindRows = kindRows;
|
|
|
561
561
|
exports.reducedRateNote = reducedRateNote;
|
|
562
562
|
exports.usedOfLimit = usedOfLimit;
|
|
563
563
|
exports.usedPct = usedPct;
|
|
564
|
-
//# sourceMappingURL=chunk-
|
|
565
|
-
//# sourceMappingURL=chunk-
|
|
564
|
+
//# sourceMappingURL=chunk-UZHWXKS6.cjs.map
|
|
565
|
+
//# sourceMappingURL=chunk-UZHWXKS6.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dashboards/DashboardGrid.tsx","../src/dashboards/ChartRenderer.tsx","../src/dashboards/PanelView.tsx","../src/connection/storage/storage-labels.ts","../src/connection/dashboards/DashboardPanel.tsx"],"names":["jsx","cn","lazy","jsxs","sliceColors","useState","useId","Suspense","formatterOf","fmtDate","DataTable","AlertTriangle","ChartNoAxesColumn","MetricCard","Card","formatFileSize","DEFAULT_UNIT_FORMATTERS","formatGbp","useBlocksEnvironment","usePanelDataset","useMemo","metricValueOf","chartModelOf","Button","useDataSources","useArbiSessionState"],"mappings":"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","file":"chunk-K5MYEWD5.cjs","sourcesContent":["/**\n * `DashboardGrid`: a responsive 12-column grid of panels. Each child spans `width` columns on a wide\n * screen and the full width on a phone, where panels stack in order.\n */\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Literal classes (the stylesheet is generated from the source): `md:col-span-1…12`. */\nconst SPANS = [\n 'md:col-span-1',\n 'md:col-span-2',\n 'md:col-span-3',\n 'md:col-span-4',\n 'md:col-span-5',\n 'md:col-span-6',\n 'md:col-span-7',\n 'md:col-span-8',\n 'md:col-span-9',\n 'md:col-span-10',\n 'md:col-span-11',\n 'md:col-span-12',\n] as const\n\n/** A width in grid columns, kept within 1…12 (default 6, half the row). */\nexport function clampPanelWidth(width: number | undefined): number {\n return Math.min(12, Math.max(1, Math.round(width ?? 6)))\n}\n\nexport interface DashboardGridProps {\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/** The grid. Wrap each panel in a `DashboardCell`. */\nexport function DashboardGrid({ children, className, testId }: DashboardGridProps) {\n return (\n <div\n className={cn('grid grid-cols-1 gap-4 md:grid-cols-12', className)}\n data-slot=\"dashboard\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\n/** One cell of the grid, `width` columns wide on a wide screen. */\nexport function DashboardCell({\n width,\n children,\n className,\n}: {\n width?: number\n children?: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('col-span-1 min-w-0', SPANS[clampPanelWidth(width) - 1], className)}\n data-slot=\"dashboard-cell\"\n >\n {children}\n </div>\n )\n}\n","/**\n * `ChartRenderer`: draws a `ChartModel`. The drawing library is loaded on demand (a skeleton shows\n * meanwhile), so a page fetches it only when a chart is on screen. Beside the drawing: a legend in\n * the theme's text colours, and a table of the same values one click away (for screen readers,\n * copying, or when colours are hard to tell apart).\n */\nimport { lazy, Suspense, useId, useState } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { sliceColors, type ChartModel } from './chartModel'\n\nconst RechartsRenderer = lazy(() => import('./RechartsRenderer'))\n\nexport interface ChartRendererLabels {\n showTable: string\n showChart: string\n other: string\n}\n\nexport const DEFAULT_CHART_RENDERER_LABELS: ChartRendererLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n}\n\nexport interface ChartRendererProps {\n model: ChartModel\n ariaLabel: string\n /** The plot's height in px. Default 240. */\n height?: number\n /** Start on the table. */\n defaultView?: 'chart' | 'table'\n labels?: Partial<ChartRendererLabels>\n className?: string\n testId?: string\n}\n\n/** The values as a table: a row per category, a column per series. */\nexport function ChartTable({\n model,\n caption,\n id,\n}: {\n model: ChartModel\n caption: string\n id?: string\n}) {\n return (\n <div className=\"max-h-72 overflow-auto\">\n <table id={id} className=\"w-full text-left text-xs\" data-slot=\"chart-table\">\n <caption className=\"sr-only\">{caption}</caption>\n <thead>\n <tr className=\"border-b border-border text-muted-foreground\">\n <th scope=\"col\" className=\"py-1.5 pr-3 font-medium\">\n {model.xLabel}\n </th>\n {model.series.map((s) => (\n <th key={s.id} scope=\"col\" className=\"py-1.5 pr-3 text-right font-medium\">\n {s.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {model.categories.map((category, i) => (\n <tr key={`${category}-${i}`} className=\"border-b border-border/60 last:border-0\">\n <th scope=\"row\" className=\"py-1.5 pr-3 font-normal text-foreground\">\n {category}\n </th>\n {model.series.map((s) => (\n <td key={s.id} className=\"py-1.5 pr-3 text-right tabular-nums text-foreground\">\n {s.values[i] === null ? '–' : model.format(s.values[i] as number)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction Legend({ model, other }: { model: ChartModel; other: string }) {\n const pie = model.type === 'pie' || model.type === 'donut'\n const items = pie\n ? model.categories.map((label, i) => ({ label, color: sliceColors(model, other)[i] }))\n : model.series.map((s) => ({ label: s.label, color: s.color }))\n if (!pie && items.length < 2) return null\n return (\n <ul className=\"flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"inline-flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"inline-block size-2 rounded-full\"\n style={{ background: item.color }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n )\n}\n\nexport function ChartRenderer({\n model,\n ariaLabel,\n height = 240,\n defaultView = 'chart',\n labels,\n className,\n testId,\n}: ChartRendererProps) {\n const l = { ...DEFAULT_CHART_RENDERER_LABELS, ...labels }\n const [view, setView] = useState(defaultView)\n const tableId = useId()\n return (\n <figure\n className={cn('flex min-w-0 max-w-full flex-col gap-2', className)}\n data-slot=\"dashboard-chart\"\n data-type={model.type}\n data-testid={testId}\n >\n {view === 'table' ? (\n <ChartTable model={model} caption={ariaLabel} id={tableId} />\n ) : (\n <div className=\"min-w-0\" style={{ height }} role=\"figure\" aria-label={ariaLabel}>\n <Suspense\n fallback={\n <div\n className=\"size-full animate-pulse rounded-md bg-muted\"\n data-slot=\"chart-loading\"\n />\n }\n >\n <RechartsRenderer\n model={model}\n ariaLabel={ariaLabel}\n height={height}\n otherLabel={l.other}\n />\n </Suspense>\n </div>\n )}\n <figcaption className=\"flex flex-wrap items-center justify-between gap-2\">\n <Legend model={model} other={l.other} />\n <button\n type=\"button\"\n className=\"ml-auto rounded-sm text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring print:hidden\"\n aria-controls={view === 'table' ? tableId : undefined}\n aria-pressed={view === 'table'}\n onClick={() => setView(view === 'table' ? 'chart' : 'table')}\n >\n {view === 'table' ? l.showChart : l.showTable}\n </button>\n </figcaption>\n </figure>\n )\n}\n","/**\n * `PanelView`: one dashboard panel as it looks, from data already in hand: a metric tile, a chart\n * or a table, each with its loading, empty and error state. Presentational: `DashboardPanel` reads\n * the data and renders this.\n */\nimport type { ReactNode } from 'react'\nimport { AlertTriangle, ChartNoAxesColumn } from 'lucide-react'\nimport type { DatasetField, DatasetRow, DatasetValue } from '@arbidocs/react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { DataTable, type Column } from '../components/DataTable'\nimport { MetricCard } from '../components/MetricCard'\nimport { fmtDate } from '../lib/format'\nimport { ChartRenderer, ChartTable, type ChartRendererLabels } from './ChartRenderer'\nimport { formatterOf, type ChartModel, type UnitFormatters } from './chartModel'\n\nexport type PanelState = 'loading' | 'empty' | 'error' | 'ready'\n\nexport interface PanelViewLabels extends ChartRendererLabels {\n empty: string\n error: string\n /** Under a table cut short: \"Showing 50 of 1,200 rows\". */\n showingRows: (shown: number, total: number) => string\n yes: string\n no: string\n}\n\nexport const DEFAULT_PANEL_VIEW_LABELS: PanelViewLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n empty: 'Nothing to show yet.',\n error: 'This panel could not be loaded.',\n showingRows: (shown, total) =>\n `Showing ${shown.toLocaleString('en-GB')} of ${total.toLocaleString('en-GB')} rows`,\n yes: 'Yes',\n no: 'No',\n}\n\n/** What a panel shows when ready. */\nexport type PanelBody =\n | { kind: 'metric'; value: number | null; format: (value: number) => string }\n | { kind: 'chart'; model: ChartModel }\n /** A table of groups (a chart model shown as a table). */\n | { kind: 'groups'; model: ChartModel }\n /** A table of records. */\n | { kind: 'records'; fields: readonly DatasetField[]; rows: readonly DatasetRow[] }\n\nexport interface PanelViewProps {\n /** What the panel is (it shows as one before its data is in). */\n kind: 'metric' | 'chart' | 'table'\n title: string\n description?: string\n state: PanelState\n body?: PanelBody\n /** The error's own words, shown under the panel's. */\n errorDetail?: string\n /** Shown in the empty state (a link to where data comes from). */\n emptyAction?: ReactNode\n /** Buttons in the panel's corner (edit, remove), for a dashboard being edited. */\n actions?: ReactNode\n /** A metric's tile, with the theme accent token of its icon. */\n metricAccent?: string\n /** `card` (default): a card with the title; `plain`: no card (a chart placed in a page). */\n variant?: 'card' | 'plain'\n /** Most records a table shows. Default 50. */\n maxRows?: number\n formatters?: UnitFormatters\n labels?: Partial<PanelViewLabels>\n className?: string\n testId?: string\n}\n\nfunction cellText(\n value: DatasetValue | undefined,\n field: DatasetField,\n l: PanelViewLabels,\n formatters?: UnitFormatters\n): string {\n if (value === null || value === undefined || value === '') return '–'\n if (Array.isArray(value)) return value.join(', ')\n if (typeof value === 'boolean') return value ? l.yes : l.no\n if (field.type === 'number' && typeof value === 'number')\n return formatterOf(field, formatters)(value)\n if (field.type === 'date' && typeof value === 'string') return fmtDate(value)\n return String(value)\n}\n\nfunction RecordsTable({\n fields,\n rows,\n maxRows,\n l,\n formatters,\n testId,\n}: {\n fields: readonly DatasetField[]\n rows: readonly DatasetRow[]\n maxRows: number\n l: PanelViewLabels\n formatters?: UnitFormatters\n testId?: string\n}) {\n const shown = rows.slice(0, maxRows).map((row, i) => ({ row, i }))\n const columns: Column<{ row: DatasetRow; i: number }>[] = fields.map((field) => ({\n key: field.id,\n header: field.label,\n align: field.type === 'number' ? 'right' : 'left',\n render: ({ row }) => cellText(row[field.id], field, l, formatters),\n className: field.type === 'number' ? 'tabular-nums' : undefined,\n }))\n return (\n <div className=\"space-y-1\">\n <div className=\"max-h-80 overflow-auto\">\n <DataTable\n columns={columns}\n rows={shown}\n getRowId={({ i }) => String(i)}\n area={testId ?? 'dashboard-panel'}\n emptyTitle={l.empty}\n className=\"border-0\"\n />\n </div>\n {rows.length > maxRows && (\n <p className=\"text-xs text-muted-foreground\">{l.showingRows(maxRows, rows.length)}</p>\n )}\n </div>\n )\n}\n\nfunction Message({\n tone,\n text,\n detail,\n action,\n testId,\n}: {\n tone: 'empty' | 'error'\n text: string\n detail?: string\n action?: ReactNode\n testId?: string\n}) {\n const Icon = tone === 'error' ? AlertTriangle : ChartNoAxesColumn\n return (\n <div\n className=\"flex min-h-40 flex-col items-center justify-center gap-2 py-6 text-center\"\n role={tone === 'error' ? 'alert' : undefined}\n data-testid={testId}\n >\n <Icon\n className={cn('size-6', tone === 'error' ? 'text-destructive' : 'text-muted-foreground/50')}\n />\n <p className={cn('text-sm', tone === 'error' ? 'text-destructive' : 'text-muted-foreground')}>\n {text}\n </p>\n {detail && <p className=\"max-w-sm text-xs text-muted-foreground\">{detail}</p>}\n {action}\n </div>\n )\n}\n\nexport function PanelView({\n kind,\n title,\n description,\n state,\n body,\n errorDetail,\n emptyAction,\n actions,\n metricAccent,\n variant = 'card',\n maxRows = 50,\n formatters,\n labels,\n className,\n testId,\n}: PanelViewProps) {\n const l = { ...DEFAULT_PANEL_VIEW_LABELS, ...labels }\n\n // A metric is the KPI tile itself.\n if (kind === 'metric') {\n const metric = body?.kind === 'metric' ? body : undefined\n const hint =\n state === 'error' ? (\n <span className=\"text-destructive\">\n {l.error}\n {errorDetail && ` ${errorDetail}`}\n </span>\n ) : state === 'empty' ? (\n l.empty\n ) : (\n description\n )\n return (\n <div className={cn('relative h-full', className)} data-slot=\"dashboard-panel\">\n <MetricCard\n label={title}\n value={\n metric && metric.value !== null && state === 'ready' ? metric.format(metric.value) : '—'\n }\n hint={hint}\n isLoading={state === 'loading'}\n accent={metricAccent}\n // The edit buttons sit in the corner: the label starts below them.\n className={cn('h-full', actions && 'pt-11')}\n testId={testId}\n />\n {actions && <div className=\"absolute right-2 top-2 flex gap-1\">{actions}</div>}\n </div>\n )\n }\n\n let content: ReactNode\n if (state === 'loading') {\n content = (\n <div className=\"h-60 animate-pulse rounded-md bg-muted\" data-slot=\"panel-loading\" aria-busy />\n )\n } else if (state === 'error') {\n content = (\n <Message\n tone=\"error\"\n text={l.error}\n detail={errorDetail}\n testId={testId && `${testId}-error`}\n />\n )\n } else if (state === 'empty' || !body || body.kind === 'metric') {\n content = (\n <Message\n tone=\"empty\"\n text={l.empty}\n action={emptyAction}\n testId={testId && `${testId}-empty`}\n />\n )\n } else if (body.kind === 'chart') {\n content = (\n <ChartRenderer\n model={body.model}\n ariaLabel={title}\n labels={l}\n testId={testId && `${testId}-chart`}\n />\n )\n } else if (body.kind === 'groups') {\n content = <ChartTable model={body.model} caption={title} />\n } else {\n content = (\n <RecordsTable\n fields={body.fields}\n rows={body.rows}\n maxRows={maxRows}\n l={l}\n formatters={formatters}\n testId={testId}\n />\n )\n }\n\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">{title}</h3>\n {description && <p className=\"mt-0.5 text-xs text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 gap-1\">{actions}</div>}\n </div>\n )\n if (variant === 'plain') {\n return (\n <section\n className={cn('flex min-w-0 flex-col gap-3', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0\">{content}</div>\n </section>\n )\n }\n return (\n <Card\n variant=\"elevated\"\n className={cn('flex h-full min-w-0 flex-col gap-3 rounded-xl p-5', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0 flex-1\">{content}</div>\n </Card>\n )\n}\n","/**\n * How storage kinds read to people. A document's objects come as `document` (its current file), `version`\n * (earlier versions' files) and `derived` (previews, thumbnails, search index files), plus `coedit` (live\n * editing state); everything a person stores outside a project's workspaces is billed to their personal project.\n */\n\nimport { formatFileSize } from '@arbidocs/sdk/browser'\nimport type { StorageItem, StorageKindUsage } from '@arbidocs/react'\n\nexport const KIND_LABELS: Record<string, string> = {\n document: 'Documents',\n version: 'Earlier versions',\n derived: 'Previews & processing',\n coedit: 'Editing state',\n mail: 'Mail',\n mail_draft: 'Mail drafts',\n chat_attachment: 'Chat attachments',\n recording: 'Call recordings',\n other: 'Other',\n}\n\n/** One item's kind, singular (\"Document\", \"Email\", …). */\nexport const ITEM_LABELS: Record<string, string> = {\n document: 'Document',\n mail: 'Email',\n mail_draft: 'Mail draft',\n chat_attachment: 'Chat attachment',\n recording: 'Call recording',\n other: 'Other file',\n}\n\nexport const MAIL_FOLDER_LABELS: Record<string, string> = {\n inbox: 'Inbox',\n sent: 'Sent',\n outbox: 'Outbox',\n drafts: 'Drafts',\n archive: 'Archive',\n trash: 'Trash',\n}\n\nexport const formatBytes = (bytes: number | null | undefined) => formatFileSize(bytes ?? 0)\n\n/** \"1.2 GB of 5.0 GB\" — or just the used part when there is no limit. */\nexport function usedOfLimit(bytes: number, limit: number | null | undefined): string {\n return limit ? `${formatBytes(bytes)} of ${formatBytes(limit)}` : `${formatBytes(bytes)} used`\n}\n\nexport function usedPct(bytes: number, limit: number | null | undefined): number {\n return limit ? (bytes / limit) * 100 : 0\n}\n\nexport interface KindRow {\n kind: string\n label: string\n bytes: number\n trashBytes: number\n}\n\n/** A project's kinds, largest first, each labelled. */\nexport function kindRows(kinds: StorageKindUsage[]): KindRow[] {\n return [...kinds]\n .filter((k) => k.bytes > 0)\n .sort((a, b) => b.bytes - a.bytes)\n .map((k) => ({\n kind: k.kind,\n label: KIND_LABELS[k.kind] ?? k.kind,\n bytes: k.bytes,\n trashBytes: k.trash_bytes,\n }))\n}\n\n/** Deletion keeps things in Recently deleted (in archive storage, counted at 10%) until the monthly purge. */\nexport const RECENTLY_DELETED_NOTE =\n 'Deleted items stay in Recently deleted, counted at 10% of their size, until they are removed for good 30–60 days later.'\n\n/** \"Archived and Recently deleted count at 10% of their size.\" — the server's reduced rate. */\nexport function reducedRateNote(rate: number): string {\n return `Archived workspaces and Recently deleted count at ${Math.round(rate * 100)}% of their size.`\n}\n\nexport interface StorageItemRow {\n item: StorageItem\n /** A document's decrypted name (when its workspace's key is available), else undefined. */\n name?: string\n}\n\n/** What an item is called: its name when known, else what it is and where. */\nexport function itemTitle({ item, name }: StorageItemRow): string {\n if (name) return name\n if (item.kind === 'mail') {\n return `Email in ${MAIL_FOLDER_LABELS[item.folder ?? ''] ?? item.folder ?? 'Mail'}`\n }\n return ITEM_LABELS[item.kind] ?? item.kind\n}\n","/**\n * `DashboardPanel`: one panel of a dashboard, from its `PanelSpec`. It looks its source up in the\n * host's registry (`useDataSources`), reads the dataset the spec asks for (`usePanelDataset`:\n * grouped and measured by the source) and shows it through `PanelView`.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport {\n formatGbp,\n useArbiSessionState,\n useDataSources,\n usePanelDataset,\n type DataSource,\n type PanelSpec,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { formatBytes } from '../storage/storage-labels'\nimport {\n chartModelOf,\n DEFAULT_UNIT_FORMATTERS,\n formatterOf,\n metricValueOf,\n type DrawnChartType,\n type UnitFormatters,\n} from '../../dashboards/chartModel'\nimport { PanelView, type PanelBody, type PanelViewLabels } from '../../dashboards/PanelView'\n\n/** The package's formatters: the one £ formatter for AI usage, and file sizes. */\nexport const PANEL_FORMATTERS: UnitFormatters = {\n ...DEFAULT_UNIT_FORMATTERS,\n gbp: (v) => formatGbp(v),\n bytes: (v) => formatBytes(v),\n}\n\nexport interface DashboardPanelLabels extends PanelViewLabels {\n /** A panel whose source the host does not offer. */\n unknownSource: (id: string) => string\n /** The empty state's link to the databases (where data is created or imported). */\n openDatabases: string\n /** A panel over workspace data (documents, threads…) while no workspace is open. */\n noWorkspace: string\n}\n\nexport const DEFAULT_DASHBOARD_PANEL_LABELS: Partial<DashboardPanelLabels> = {\n unknownSource: (id) => `This panel reads “${id}”, which is not available here.`,\n openDatabases: 'Open databases',\n noWorkspace: 'Open a workspace to see this.',\n}\n\nexport interface DashboardPanelProps {\n panel: PanelSpec\n /** Buttons in the panel's corner (a dashboard being edited). */\n actions?: ReactNode\n /** Don't read data (an editor showing the panel's frame only). */\n enabled?: boolean\n /** `plain`: no card around it (a chart placed in a page). */\n variant?: 'card' | 'plain'\n formatters?: UnitFormatters\n labels?: Partial<DashboardPanelLabels>\n className?: string\n testId?: string\n}\n\nconst DRAWN = new Set(['bar', 'line', 'area', 'pie', 'donut'])\n\nfunction kindOf(panel: PanelSpec): 'metric' | 'chart' | 'table' {\n return panel.chart.type === 'metric' ? 'metric' : panel.chart.type === 'table' ? 'table' : 'chart'\n}\n\nfunction SourcePanel({\n source,\n panel,\n actions,\n enabled,\n variant,\n formatters,\n labels,\n className,\n testId,\n}: DashboardPanelProps & { source: DataSource; labels: Partial<DashboardPanelLabels> }) {\n const environment = useBlocksEnvironment()\n const { chart } = panel\n const { dataset, fields, isLoading, error } = usePanelDataset(\n source,\n panel.source.params,\n chart,\n { enabled }\n )\n const body = useMemo((): PanelBody | undefined => {\n if (!dataset) return undefined\n const other = labels.other\n if (chart.type === 'metric') {\n const valueField = dataset.fields.find((f) => f.id === 'value')\n // Nothing matched: a count or a sum of nothing is 0; an average of nothing has no value.\n const op = chart.aggregate ?? 'count'\n return {\n kind: 'metric',\n value: metricValueOf(dataset) ?? (op === 'count' || op === 'sum' ? 0 : null),\n format: formatterOf(valueField, formatters),\n }\n }\n if (DRAWN.has(chart.type)) {\n return {\n kind: 'chart',\n model: chartModelOf({ ...chart, type: chart.type as DrawnChartType }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n if (chart.x) {\n return {\n kind: 'groups',\n model: chartModelOf({ ...chart, type: 'bar' }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n const shown = chart.columns?.length\n ? chart.columns.flatMap((id) => dataset.fields.filter((f) => f.id === id))\n : dataset.fields\n return { kind: 'records', fields: shown, rows: dataset.rows }\n }, [dataset, chart, fields, formatters, labels.other])\n\n const state = error\n ? 'error'\n : !dataset\n ? isLoading\n ? 'loading'\n : 'empty'\n : chart.type !== 'metric' && dataset.rows.length === 0\n ? 'empty'\n : 'ready'\n\n const emptyAction =\n source.id === 'database' && environment.openDatabases ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => environment.openDatabases?.()}>\n {labels.openDatabases}\n </Button>\n ) : undefined\n\n return (\n <PanelView\n kind={kindOf(panel)}\n title={panel.title}\n description={panel.description}\n state={state}\n body={body}\n errorDetail={error instanceof Error ? error.message : undefined}\n emptyAction={emptyAction}\n actions={actions}\n variant={variant}\n formatters={formatters}\n labels={labels}\n className={className}\n testId={testId}\n />\n )\n}\n\nexport function DashboardPanel({\n formatters = PANEL_FORMATTERS,\n labels,\n ...props\n}: DashboardPanelProps) {\n const registry = useDataSources()\n const l = { ...DEFAULT_DASHBOARD_PANEL_LABELS, ...labels }\n const source = registry.get(props.panel.source.id)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const scope =\n typeof source?.scope === 'function'\n ? source.scope(props.panel.source.params ?? {})\n : source?.scope\n if (scope === 'workspace' && !workspaceId) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"empty\"\n actions={props.actions}\n labels={{ ...l, empty: l.noWorkspace ?? l.empty }}\n variant={props.variant}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n if (!source) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"error\"\n errorDetail={l.unknownSource?.(props.panel.source.id)}\n actions={props.actions}\n labels={l}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n // Keyed by source: a source's hooks differ from another's, so a new source mounts afresh.\n return (\n <SourcePanel key={source.id} source={source} formatters={formatters} labels={l} {...props} />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dashboards/DashboardGrid.tsx","../src/dashboards/ChartRenderer.tsx","../src/dashboards/PanelView.tsx","../src/connection/storage/storage-labels.ts","../src/connection/dashboards/DashboardPanel.tsx"],"names":["jsx","cn","lazy","jsxs","sliceColors","useState","useId","Suspense","formatterOf","fmtDate","DataTable","AlertTriangle","ChartNoAxesColumn","MetricCard","Card","formatFileSize","DEFAULT_UNIT_FORMATTERS","formatGbp","useBlocksEnvironment","usePanelDataset","useMemo","metricValueOf","chartModelOf","Button","useDataSources","useArbiSessionState"],"mappings":"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","file":"chunk-UZHWXKS6.cjs","sourcesContent":["/**\n * `DashboardGrid`: a responsive 12-column grid of panels. Each child spans `width` columns on a wide\n * screen and the full width on a phone, where panels stack in order.\n */\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Literal classes (the stylesheet is generated from the source): `md:col-span-1…12`. */\nconst SPANS = [\n 'md:col-span-1',\n 'md:col-span-2',\n 'md:col-span-3',\n 'md:col-span-4',\n 'md:col-span-5',\n 'md:col-span-6',\n 'md:col-span-7',\n 'md:col-span-8',\n 'md:col-span-9',\n 'md:col-span-10',\n 'md:col-span-11',\n 'md:col-span-12',\n] as const\n\n/** A width in grid columns, kept within 1…12 (default 6, half the row). */\nexport function clampPanelWidth(width: number | undefined): number {\n return Math.min(12, Math.max(1, Math.round(width ?? 6)))\n}\n\nexport interface DashboardGridProps {\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/** The grid. Wrap each panel in a `DashboardCell`. */\nexport function DashboardGrid({ children, className, testId }: DashboardGridProps) {\n return (\n <div\n className={cn('grid grid-cols-1 gap-4 md:grid-cols-12', className)}\n data-slot=\"dashboard\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\n/** One cell of the grid, `width` columns wide on a wide screen. */\nexport function DashboardCell({\n width,\n children,\n className,\n}: {\n width?: number\n children?: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('col-span-1 min-w-0', SPANS[clampPanelWidth(width) - 1], className)}\n data-slot=\"dashboard-cell\"\n >\n {children}\n </div>\n )\n}\n","/**\n * `ChartRenderer`: draws a `ChartModel`. The drawing library is loaded on demand (a skeleton shows\n * meanwhile), so a page fetches it only when a chart is on screen. Beside the drawing: a legend in\n * the theme's text colours, and a table of the same values one click away (for screen readers,\n * copying, or when colours are hard to tell apart).\n */\nimport { lazy, Suspense, useId, useState } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { sliceColors, type ChartModel } from './chartModel'\n\nconst RechartsRenderer = lazy(() => import('./RechartsRenderer'))\n\nexport interface ChartRendererLabels {\n showTable: string\n showChart: string\n other: string\n}\n\nexport const DEFAULT_CHART_RENDERER_LABELS: ChartRendererLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n}\n\nexport interface ChartRendererProps {\n model: ChartModel\n ariaLabel: string\n /** The plot's height in px. Default 240. */\n height?: number\n /** Start on the table. */\n defaultView?: 'chart' | 'table'\n labels?: Partial<ChartRendererLabels>\n className?: string\n testId?: string\n}\n\n/** The values as a table: a row per category, a column per series. */\nexport function ChartTable({\n model,\n caption,\n id,\n}: {\n model: ChartModel\n caption: string\n id?: string\n}) {\n return (\n <div className=\"max-h-72 overflow-auto\">\n <table id={id} className=\"w-full text-left text-xs\" data-slot=\"chart-table\">\n <caption className=\"sr-only\">{caption}</caption>\n <thead>\n <tr className=\"border-b border-border text-muted-foreground\">\n <th scope=\"col\" className=\"py-1.5 pr-3 font-medium\">\n {model.xLabel}\n </th>\n {model.series.map((s) => (\n <th key={s.id} scope=\"col\" className=\"py-1.5 pr-3 text-right font-medium\">\n {s.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {model.categories.map((category, i) => (\n <tr key={`${category}-${i}`} className=\"border-b border-border/60 last:border-0\">\n <th scope=\"row\" className=\"py-1.5 pr-3 font-normal text-foreground\">\n {category}\n </th>\n {model.series.map((s) => (\n <td key={s.id} className=\"py-1.5 pr-3 text-right tabular-nums text-foreground\">\n {s.values[i] === null ? '–' : model.format(s.values[i] as number)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction Legend({ model, other }: { model: ChartModel; other: string }) {\n const pie = model.type === 'pie' || model.type === 'donut'\n const items = pie\n ? model.categories.map((label, i) => ({ label, color: sliceColors(model, other)[i] }))\n : model.series.map((s) => ({ label: s.label, color: s.color }))\n if (!pie && items.length < 2) return null\n return (\n <ul className=\"flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"inline-flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"inline-block size-2 rounded-full\"\n style={{ background: item.color }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n )\n}\n\nexport function ChartRenderer({\n model,\n ariaLabel,\n height = 240,\n defaultView = 'chart',\n labels,\n className,\n testId,\n}: ChartRendererProps) {\n const l = { ...DEFAULT_CHART_RENDERER_LABELS, ...labels }\n const [view, setView] = useState(defaultView)\n const tableId = useId()\n return (\n <figure\n className={cn('flex min-w-0 max-w-full flex-col gap-2', className)}\n data-slot=\"dashboard-chart\"\n data-type={model.type}\n data-testid={testId}\n >\n {view === 'table' ? (\n <ChartTable model={model} caption={ariaLabel} id={tableId} />\n ) : (\n <div className=\"min-w-0\" style={{ height }} role=\"figure\" aria-label={ariaLabel}>\n <Suspense\n fallback={\n <div\n className=\"size-full animate-pulse rounded-md bg-muted\"\n data-slot=\"chart-loading\"\n />\n }\n >\n <RechartsRenderer\n model={model}\n ariaLabel={ariaLabel}\n height={height}\n otherLabel={l.other}\n />\n </Suspense>\n </div>\n )}\n <figcaption className=\"flex flex-wrap items-center justify-between gap-2\">\n <Legend model={model} other={l.other} />\n <button\n type=\"button\"\n className=\"ml-auto rounded-sm text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring print:hidden\"\n aria-controls={view === 'table' ? tableId : undefined}\n aria-pressed={view === 'table'}\n onClick={() => setView(view === 'table' ? 'chart' : 'table')}\n >\n {view === 'table' ? l.showChart : l.showTable}\n </button>\n </figcaption>\n </figure>\n )\n}\n","/**\n * `PanelView`: one dashboard panel as it looks, from data already in hand: a metric tile, a chart\n * or a table, each with its loading, empty and error state. Presentational: `DashboardPanel` reads\n * the data and renders this.\n */\nimport type { ReactNode } from 'react'\nimport { AlertTriangle, ChartNoAxesColumn } from 'lucide-react'\nimport type { DatasetField, DatasetRow, DatasetValue } from '@arbidocs/react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { DataTable, type Column } from '../components/DataTable'\nimport { MetricCard } from '../components/MetricCard'\nimport { fmtDate } from '../lib/format'\nimport { ChartRenderer, ChartTable, type ChartRendererLabels } from './ChartRenderer'\nimport { formatterOf, type ChartModel, type UnitFormatters } from './chartModel'\n\nexport type PanelState = 'loading' | 'empty' | 'error' | 'ready'\n\nexport interface PanelViewLabels extends ChartRendererLabels {\n empty: string\n error: string\n /** Under a table cut short: \"Showing 50 of 1,200 rows\". */\n showingRows: (shown: number, total: number) => string\n yes: string\n no: string\n}\n\nexport const DEFAULT_PANEL_VIEW_LABELS: PanelViewLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n empty: 'Nothing to show yet.',\n error: 'This panel could not be loaded.',\n showingRows: (shown, total) =>\n `Showing ${shown.toLocaleString('en-GB')} of ${total.toLocaleString('en-GB')} rows`,\n yes: 'Yes',\n no: 'No',\n}\n\n/** What a panel shows when ready. */\nexport type PanelBody =\n | { kind: 'metric'; value: number | null; format: (value: number) => string }\n | { kind: 'chart'; model: ChartModel }\n /** A table of groups (a chart model shown as a table). */\n | { kind: 'groups'; model: ChartModel }\n /** A table of records. */\n | { kind: 'records'; fields: readonly DatasetField[]; rows: readonly DatasetRow[] }\n\nexport interface PanelViewProps {\n /** What the panel is (it shows as one before its data is in). */\n kind: 'metric' | 'chart' | 'table'\n title: string\n description?: string\n state: PanelState\n body?: PanelBody\n /** The error's own words, shown under the panel's. */\n errorDetail?: string\n /** Shown in the empty state (a link to where data comes from). */\n emptyAction?: ReactNode\n /** Buttons in the panel's corner (edit, remove), for a dashboard being edited. */\n actions?: ReactNode\n /** A metric's tile, with the theme accent token of its icon. */\n metricAccent?: string\n /** `card` (default): a card with the title; `plain`: no card (a chart placed in a page). */\n variant?: 'card' | 'plain'\n /** Most records a table shows. Default 50. */\n maxRows?: number\n formatters?: UnitFormatters\n labels?: Partial<PanelViewLabels>\n className?: string\n testId?: string\n}\n\nfunction cellText(\n value: DatasetValue | undefined,\n field: DatasetField,\n l: PanelViewLabels,\n formatters?: UnitFormatters\n): string {\n if (value === null || value === undefined || value === '') return '–'\n if (Array.isArray(value)) return value.join(', ')\n if (typeof value === 'boolean') return value ? l.yes : l.no\n if (field.type === 'number' && typeof value === 'number')\n return formatterOf(field, formatters)(value)\n if (field.type === 'date' && typeof value === 'string') return fmtDate(value)\n return String(value)\n}\n\nfunction RecordsTable({\n fields,\n rows,\n maxRows,\n l,\n formatters,\n testId,\n}: {\n fields: readonly DatasetField[]\n rows: readonly DatasetRow[]\n maxRows: number\n l: PanelViewLabels\n formatters?: UnitFormatters\n testId?: string\n}) {\n const shown = rows.slice(0, maxRows).map((row, i) => ({ row, i }))\n const columns: Column<{ row: DatasetRow; i: number }>[] = fields.map((field) => ({\n key: field.id,\n header: field.label,\n align: field.type === 'number' ? 'right' : 'left',\n render: ({ row }) => cellText(row[field.id], field, l, formatters),\n className: field.type === 'number' ? 'tabular-nums' : undefined,\n }))\n return (\n <div className=\"space-y-1\">\n <div className=\"max-h-80 overflow-auto\">\n <DataTable\n columns={columns}\n rows={shown}\n getRowId={({ i }) => String(i)}\n area={testId ?? 'dashboard-panel'}\n emptyTitle={l.empty}\n className=\"border-0\"\n />\n </div>\n {rows.length > maxRows && (\n <p className=\"text-xs text-muted-foreground\">{l.showingRows(maxRows, rows.length)}</p>\n )}\n </div>\n )\n}\n\nfunction Message({\n tone,\n text,\n detail,\n action,\n testId,\n}: {\n tone: 'empty' | 'error'\n text: string\n detail?: string\n action?: ReactNode\n testId?: string\n}) {\n const Icon = tone === 'error' ? AlertTriangle : ChartNoAxesColumn\n return (\n <div\n className=\"flex min-h-40 flex-col items-center justify-center gap-2 py-6 text-center\"\n role={tone === 'error' ? 'alert' : undefined}\n data-testid={testId}\n >\n <Icon\n className={cn('size-6', tone === 'error' ? 'text-destructive' : 'text-muted-foreground/50')}\n />\n <p className={cn('text-sm', tone === 'error' ? 'text-destructive' : 'text-muted-foreground')}>\n {text}\n </p>\n {detail && <p className=\"max-w-sm text-xs text-muted-foreground\">{detail}</p>}\n {action}\n </div>\n )\n}\n\nexport function PanelView({\n kind,\n title,\n description,\n state,\n body,\n errorDetail,\n emptyAction,\n actions,\n metricAccent,\n variant = 'card',\n maxRows = 50,\n formatters,\n labels,\n className,\n testId,\n}: PanelViewProps) {\n const l = { ...DEFAULT_PANEL_VIEW_LABELS, ...labels }\n\n // A metric is the KPI tile itself.\n if (kind === 'metric') {\n const metric = body?.kind === 'metric' ? body : undefined\n const hint =\n state === 'error' ? (\n <span className=\"text-destructive\">\n {l.error}\n {errorDetail && ` ${errorDetail}`}\n </span>\n ) : state === 'empty' ? (\n l.empty\n ) : (\n description\n )\n return (\n <div className={cn('relative h-full', className)} data-slot=\"dashboard-panel\">\n <MetricCard\n label={title}\n value={\n metric && metric.value !== null && state === 'ready' ? metric.format(metric.value) : '—'\n }\n hint={hint}\n isLoading={state === 'loading'}\n accent={metricAccent}\n // The edit buttons sit in the corner: the label starts below them.\n className={cn('h-full', actions && 'pt-11')}\n testId={testId}\n />\n {actions && <div className=\"absolute right-2 top-2 flex gap-1\">{actions}</div>}\n </div>\n )\n }\n\n let content: ReactNode\n if (state === 'loading') {\n content = (\n <div className=\"h-60 animate-pulse rounded-md bg-muted\" data-slot=\"panel-loading\" aria-busy />\n )\n } else if (state === 'error') {\n content = (\n <Message\n tone=\"error\"\n text={l.error}\n detail={errorDetail}\n testId={testId && `${testId}-error`}\n />\n )\n } else if (state === 'empty' || !body || body.kind === 'metric') {\n content = (\n <Message\n tone=\"empty\"\n text={l.empty}\n action={emptyAction}\n testId={testId && `${testId}-empty`}\n />\n )\n } else if (body.kind === 'chart') {\n content = (\n <ChartRenderer\n model={body.model}\n ariaLabel={title}\n labels={l}\n testId={testId && `${testId}-chart`}\n />\n )\n } else if (body.kind === 'groups') {\n content = <ChartTable model={body.model} caption={title} />\n } else {\n content = (\n <RecordsTable\n fields={body.fields}\n rows={body.rows}\n maxRows={maxRows}\n l={l}\n formatters={formatters}\n testId={testId}\n />\n )\n }\n\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">{title}</h3>\n {description && <p className=\"mt-0.5 text-xs text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 gap-1\">{actions}</div>}\n </div>\n )\n if (variant === 'plain') {\n return (\n <section\n className={cn('flex min-w-0 flex-col gap-3', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0\">{content}</div>\n </section>\n )\n }\n return (\n <Card\n variant=\"elevated\"\n className={cn('flex h-full min-w-0 flex-col gap-3 rounded-xl p-5', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0 flex-1\">{content}</div>\n </Card>\n )\n}\n","/**\n * How storage kinds read to people. A document's objects come as `document` (its current file), `version`\n * (earlier versions' files) and `derived` (previews, thumbnails, search index files), plus `coedit` (live\n * editing state); everything a person stores outside a project's workspaces is billed to their personal project.\n */\n\nimport { formatFileSize } from '@arbidocs/sdk/browser'\nimport type { StorageItem, StorageKindUsage } from '@arbidocs/react'\n\nexport const KIND_LABELS: Record<string, string> = {\n document: 'Documents',\n version: 'Earlier versions',\n derived: 'Previews & processing',\n coedit: 'Editing state',\n mail: 'Mail',\n mail_draft: 'Mail drafts',\n chat_attachment: 'Chat attachments',\n recording: 'Call recordings',\n other: 'Other',\n}\n\n/** One item's kind, singular (\"Document\", \"Email\", …). */\nexport const ITEM_LABELS: Record<string, string> = {\n document: 'Document',\n mail: 'Email',\n mail_draft: 'Mail draft',\n chat_attachment: 'Chat attachment',\n recording: 'Call recording',\n other: 'Other file',\n}\n\nexport const MAIL_FOLDER_LABELS: Record<string, string> = {\n inbox: 'Inbox',\n sent: 'Sent',\n outbox: 'Outbox',\n drafts: 'Drafts',\n archive: 'Archive',\n trash: 'Trash',\n}\n\nexport const formatBytes = (bytes: number | null | undefined) => formatFileSize(bytes ?? 0)\n\n/** \"1.2 GB of 5.0 GB\" — or just the used part when there is no limit. */\nexport function usedOfLimit(bytes: number, limit: number | null | undefined): string {\n return limit ? `${formatBytes(bytes)} of ${formatBytes(limit)}` : `${formatBytes(bytes)} used`\n}\n\nexport function usedPct(bytes: number, limit: number | null | undefined): number {\n return limit ? (bytes / limit) * 100 : 0\n}\n\nexport interface KindRow {\n kind: string\n label: string\n bytes: number\n trashBytes: number\n}\n\n/** A project's kinds, largest first, each labelled. */\nexport function kindRows(kinds: StorageKindUsage[]): KindRow[] {\n return [...kinds]\n .filter((k) => k.bytes > 0)\n .sort((a, b) => b.bytes - a.bytes)\n .map((k) => ({\n kind: k.kind,\n label: KIND_LABELS[k.kind] ?? k.kind,\n bytes: k.bytes,\n trashBytes: k.trash_bytes,\n }))\n}\n\n/** Deletion keeps things in Recently deleted (in archive storage, counted at 10%) until the monthly purge. */\nexport const RECENTLY_DELETED_NOTE =\n 'Deleted items stay in Recently deleted, counted at 10% of their size, until they are removed for good 30–60 days later.'\n\n/** \"Archived and Recently deleted count at 10% of their size.\" — the server's reduced rate. */\nexport function reducedRateNote(rate: number): string {\n return `Archived workspaces and Recently deleted count at ${Math.round(rate * 100)}% of their size.`\n}\n\nexport interface StorageItemRow {\n item: StorageItem\n /** A document's decrypted name (when its workspace's key is available), else undefined. */\n name?: string\n}\n\n/** What an item is called: its name when known, else what it is and where. */\nexport function itemTitle({ item, name }: StorageItemRow): string {\n if (name) return name\n if (item.kind === 'mail') {\n return `Email in ${MAIL_FOLDER_LABELS[item.folder ?? ''] ?? item.folder ?? 'Mail'}`\n }\n return ITEM_LABELS[item.kind] ?? item.kind\n}\n","/**\n * `DashboardPanel`: one panel of a dashboard, from its `PanelSpec`. It looks its source up in the\n * host's registry (`useDataSources`), reads the dataset the spec asks for (`usePanelDataset`:\n * grouped and measured by the source) and shows it through `PanelView`.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport {\n formatGbp,\n useArbiSessionState,\n useDataSources,\n usePanelDataset,\n type DataSource,\n type PanelSpec,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { formatBytes } from '../storage/storage-labels'\nimport {\n chartModelOf,\n DEFAULT_UNIT_FORMATTERS,\n formatterOf,\n metricValueOf,\n type DrawnChartType,\n type UnitFormatters,\n} from '../../dashboards/chartModel'\nimport { PanelView, type PanelBody, type PanelViewLabels } from '../../dashboards/PanelView'\n\n/** The package's formatters: the one £ formatter for AI usage, and file sizes. */\nexport const PANEL_FORMATTERS: UnitFormatters = {\n ...DEFAULT_UNIT_FORMATTERS,\n gbp: (v) => formatGbp(v),\n bytes: (v) => formatBytes(v),\n}\n\nexport interface DashboardPanelLabels extends PanelViewLabels {\n /** A panel whose source the host does not offer. */\n unknownSource: (id: string) => string\n /** The empty state's link to the databases (where data is created or imported). */\n openDatabases: string\n /** A panel over workspace data (documents, threads…) while no workspace is open. */\n noWorkspace: string\n}\n\nexport const DEFAULT_DASHBOARD_PANEL_LABELS: Partial<DashboardPanelLabels> = {\n unknownSource: (id) => `This panel reads “${id}”, which is not available here.`,\n openDatabases: 'Open databases',\n noWorkspace: 'Open a workspace to see this.',\n}\n\nexport interface DashboardPanelProps {\n panel: PanelSpec\n /** Buttons in the panel's corner (a dashboard being edited). */\n actions?: ReactNode\n /** Don't read data (an editor showing the panel's frame only). */\n enabled?: boolean\n /** `plain`: no card around it (a chart placed in a page). */\n variant?: 'card' | 'plain'\n formatters?: UnitFormatters\n labels?: Partial<DashboardPanelLabels>\n className?: string\n testId?: string\n}\n\nconst DRAWN = new Set(['bar', 'line', 'area', 'pie', 'donut'])\n\nfunction kindOf(panel: PanelSpec): 'metric' | 'chart' | 'table' {\n return panel.chart.type === 'metric' ? 'metric' : panel.chart.type === 'table' ? 'table' : 'chart'\n}\n\nfunction SourcePanel({\n source,\n panel,\n actions,\n enabled,\n variant,\n formatters,\n labels,\n className,\n testId,\n}: DashboardPanelProps & { source: DataSource; labels: Partial<DashboardPanelLabels> }) {\n const environment = useBlocksEnvironment()\n const { chart } = panel\n const { dataset, fields, isLoading, error } = usePanelDataset(\n source,\n panel.source.params,\n chart,\n { enabled }\n )\n const body = useMemo((): PanelBody | undefined => {\n if (!dataset) return undefined\n const other = labels.other\n if (chart.type === 'metric') {\n const valueField = dataset.fields.find((f) => f.id === 'value')\n // Nothing matched: a count or a sum of nothing is 0; an average of nothing has no value.\n const op = chart.aggregate ?? 'count'\n return {\n kind: 'metric',\n value: metricValueOf(dataset) ?? (op === 'count' || op === 'sum' ? 0 : null),\n format: formatterOf(valueField, formatters),\n }\n }\n if (DRAWN.has(chart.type)) {\n return {\n kind: 'chart',\n model: chartModelOf({ ...chart, type: chart.type as DrawnChartType }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n if (chart.x) {\n return {\n kind: 'groups',\n model: chartModelOf({ ...chart, type: 'bar' }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n const shown = chart.columns?.length\n ? chart.columns.flatMap((id) => dataset.fields.filter((f) => f.id === id))\n : dataset.fields\n return { kind: 'records', fields: shown, rows: dataset.rows }\n }, [dataset, chart, fields, formatters, labels.other])\n\n const state = error\n ? 'error'\n : !dataset\n ? isLoading\n ? 'loading'\n : 'empty'\n : chart.type !== 'metric' && dataset.rows.length === 0\n ? 'empty'\n : 'ready'\n\n const emptyAction =\n source.id === 'database' && environment.openDatabases ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => environment.openDatabases?.()}>\n {labels.openDatabases}\n </Button>\n ) : undefined\n\n return (\n <PanelView\n kind={kindOf(panel)}\n title={panel.title}\n description={panel.description}\n state={state}\n body={body}\n errorDetail={error instanceof Error ? error.message : undefined}\n emptyAction={emptyAction}\n actions={actions}\n variant={variant}\n formatters={formatters}\n labels={labels}\n className={className}\n testId={testId}\n />\n )\n}\n\nexport function DashboardPanel({\n formatters = PANEL_FORMATTERS,\n labels,\n ...props\n}: DashboardPanelProps) {\n const registry = useDataSources()\n const l = { ...DEFAULT_DASHBOARD_PANEL_LABELS, ...labels }\n const source = registry.get(props.panel.source.id)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const scope =\n typeof source?.scope === 'function'\n ? source.scope(props.panel.source.params ?? {})\n : source?.scope\n if (scope === 'workspace' && !workspaceId) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"empty\"\n actions={props.actions}\n labels={{ ...l, empty: l.noWorkspace ?? l.empty }}\n variant={props.variant}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n if (!source) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"error\"\n errorDetail={l.unknownSource?.(props.panel.source.id)}\n actions={props.actions}\n labels={l}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n // Keyed by source: a source's hooks differ from another's, so a new source mounts afresh.\n return (\n <SourcePanel key={source.id} source={source} formatters={formatters} labels={l} {...props} />\n )\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkQMIHLJMH_cjs = require('./chunk-QMIHLJMH.cjs');
|
|
5
5
|
var chunkZBP4ZSAJ_cjs = require('./chunk-ZBP4ZSAJ.cjs');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
var react = require('react');
|
|
@@ -26,7 +26,7 @@ function TranscriptEntry({
|
|
|
26
26
|
{
|
|
27
27
|
speakerId,
|
|
28
28
|
speakerName,
|
|
29
|
-
speaker: /* @__PURE__ */ jsxRuntime.jsx(
|
|
29
|
+
speaker: /* @__PURE__ */ jsxRuntime.jsx(chunkQMIHLJMH_cjs.CallUserPill, { identity: speakerId, name: speakerName }),
|
|
30
30
|
time: formatTime(at),
|
|
31
31
|
text,
|
|
32
32
|
continued,
|
|
@@ -57,5 +57,5 @@ exports.TranscriptEntry = TranscriptEntry;
|
|
|
57
57
|
exports.TranscriptRunsContext = TranscriptRunsContext;
|
|
58
58
|
exports.threadTranscriptRuns = threadTranscriptRuns;
|
|
59
59
|
exports.useTranscriptRuns = useTranscriptRuns;
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-VJCSEMXT.cjs.map
|
|
61
|
+
//# sourceMappingURL=chunk-VJCSEMXT.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/calls/connected/TranscriptEntry.tsx","../src/calls/connected/transcript-runs-context.ts"],"names":["jsx","TranscriptLine","CallUserPill","createContext","useContext","transcriptSegmentOf","transcriptRuns"],"mappings":";;;;;;;;AAUA,SAAS,WAAW,GAAA,EAAwC;AAC1D,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACzB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,OAAO,IAAI,IAAA,CAAK,EAAE,CAAA,CAAE,kBAAA,CAAmB,EAAC,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AACnF;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAWiB;AACf,EAAA,uBACEA,cAAA;AAAA,IAACC,gCAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAA;AAAA,MACA,yBAASD,cAAA,CAACE,8BAAA,EAAA,EAAa,QAAA,EAAU,SAAA,EAAW,MAAM,WAAA,EAAa,CAAA;AAAA,MAC/D,IAAA,EAAM,WAAW,EAAE,CAAA;AAAA,MACnB,IAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AClCA,IAAM,KAAA,GAA2B,EAAE,SAAA,kBAAW,IAAI,KAAI,EAAE;AAEjD,IAAM,qBAAA,GAAwBC,oBAAiC,KAAK;AAEpE,SAAS,iBAAA,GAAuC;AACrD,EAAA,OAAOC,iBAAW,qBAAqB,CAAA;AACzC;AAUO,SAAS,qBAAqB,QAAA,EAAkD;AACrF,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAyBC,2BAAA,CAAoB,EAAE,KAAA,IAAS,CAAA,CAAE,MAAM,KAAK,CAAA;AACxF,EAAA,MAAM,cAAA,GAAiBC,gCAAA;AAAA,IACrB,QAAA;AAAA,IACA,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,GAAG,cAAA,IAAkB,IAAA;AAAA,IACvC,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,UAAA,IAAc,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,IAAK;AAAA,GACvE;AACA,EAAA,OAAO;AAAA,IACL,WAAW,IAAI,GAAA;AAAA,MACb,CAAC,GAAG,cAAc,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,EAAE,MAAA,CAAO,CAAC,EAAA,KAAqB,CAAC,CAAC,EAAE;AAAA;AACjF,GACF;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/calls/connected/TranscriptEntry.tsx","../src/calls/connected/transcript-runs-context.ts"],"names":["jsx","TranscriptLine","CallUserPill","createContext","useContext","transcriptSegmentOf","transcriptRuns"],"mappings":";;;;;;;;AAUA,SAAS,WAAW,GAAA,EAAwC;AAC1D,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACzB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,OAAO,IAAI,IAAA,CAAK,EAAE,CAAA,CAAE,kBAAA,CAAmB,EAAC,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AACnF;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAWiB;AACf,EAAA,uBACEA,cAAA;AAAA,IAACC,gCAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAA;AAAA,MACA,yBAASD,cAAA,CAACE,8BAAA,EAAA,EAAa,QAAA,EAAU,SAAA,EAAW,MAAM,WAAA,EAAa,CAAA;AAAA,MAC/D,IAAA,EAAM,WAAW,EAAE,CAAA;AAAA,MACnB,IAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AClCA,IAAM,KAAA,GAA2B,EAAE,SAAA,kBAAW,IAAI,KAAI,EAAE;AAEjD,IAAM,qBAAA,GAAwBC,oBAAiC,KAAK;AAEpE,SAAS,iBAAA,GAAuC;AACrD,EAAA,OAAOC,iBAAW,qBAAqB,CAAA;AACzC;AAUO,SAAS,qBAAqB,QAAA,EAAkD;AACrF,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAyBC,2BAAA,CAAoB,EAAE,KAAA,IAAS,CAAA,CAAE,MAAM,KAAK,CAAA;AACxF,EAAA,MAAM,cAAA,GAAiBC,gCAAA;AAAA,IACrB,QAAA;AAAA,IACA,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,GAAG,cAAA,IAAkB,IAAA;AAAA,IACvC,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,UAAA,IAAc,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,IAAK;AAAA,GACvE;AACA,EAAA,OAAO;AAAA,IACL,WAAW,IAAI,GAAA;AAAA,MACb,CAAC,GAAG,cAAc,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,EAAE,MAAA,CAAO,CAAC,EAAA,KAAqB,CAAC,CAAC,EAAE;AAAA;AACjF,GACF;AACF","file":"chunk-VJCSEMXT.cjs","sourcesContent":["/**\n * One stored line of a call transcript in its conversation (meeting chat or workspace meeting\n * thread): `TranscriptLine` from `@arbidocs/blocks`, centred for everyone. What someone is saying\n * right now shows as a provisional \"is speaking…\" row below, not as a highlight on a past line.\n */\n\nimport type { ReactElement } from 'react'\nimport { TranscriptLine } from '../../chat/TranscriptLine'\nimport { CallUserPill } from './CallUserPill'\n\nfunction formatTime(iso: string | null | undefined): string {\n if (!iso) return ''\n const at = Date.parse(iso)\n if (Number.isNaN(at)) return ''\n return new Date(at).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n}\n\nexport function TranscriptEntry({\n speakerId,\n speakerName,\n text,\n at,\n continued = false,\n className,\n}: {\n /** The speaker's identity (user ext id), for `data-speaker`. */\n speakerId: string\n /** The name to show (\"Me\" for my own lines). */\n speakerName: string\n text: string\n /** ISO time the segment started (or the message was stored). */\n at: string | null | undefined\n /** A further line of the same speaker's run (no name repeated). */\n continued?: boolean\n className?: string\n}): ReactElement {\n return (\n <TranscriptLine\n speakerId={speakerId}\n speakerName={speakerName}\n speaker={<CallUserPill identity={speakerId} name={speakerName} />}\n time={formatTime(at)}\n text={text}\n continued={continued}\n className={className}\n />\n )\n}\n","/**\n * How a meeting thread's transcript lines group: which messages continue their speaker's run (the\n * name is not repeated). Provided by the conversation page, read by each transcript message.\n */\n\nimport { createContext, useContext } from 'react'\nimport { transcriptRuns } from '../../chat/transcript-runs'\nimport { transcriptSegmentOf } from '@arbidocs/react'\n\nexport interface TranscriptRunInfo {\n continued: ReadonlySet<string>\n}\n\nconst EMPTY: TranscriptRunInfo = { continued: new Set() }\n\nexport const TranscriptRunsContext = createContext<TranscriptRunInfo>(EMPTY)\n\nexport function useTranscriptRuns(): TranscriptRunInfo {\n return useContext(TranscriptRunsContext)\n}\n\ninterface ThreadMessageLike {\n external_id?: string | null\n created_at?: string | null\n tools?: unknown\n meta?: { tools?: unknown } | null\n}\n\n/** Runs of a thread's messages (in display order). */\nexport function threadTranscriptRuns(messages: ThreadMessageLike[]): TranscriptRunInfo {\n const segmentOf = (m: ThreadMessageLike) => transcriptSegmentOf(m.tools ?? m.meta?.tools)\n const continuedItems = transcriptRuns(\n messages,\n (m) => segmentOf(m)?.speaker_ext_id ?? null,\n (m) => Date.parse(segmentOf(m)?.started_at ?? m.created_at ?? '') || 0\n )\n return {\n continued: new Set(\n [...continuedItems].map((m) => m.external_id).filter((id): id is string => !!id)\n ),\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkULPTSXXO_cjs = require('./chunk-ULPTSXXO.cjs');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
var ui = require('@arbidocs/react/ui');
|
|
7
7
|
|
|
@@ -24,7 +24,7 @@ function DataTableBlock({ columns, rows, caption, emptyText, testId }) {
|
|
|
24
24
|
}
|
|
25
25
|
) : null,
|
|
26
26
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
27
|
-
|
|
27
|
+
chunkULPTSXXO_cjs.DataTable,
|
|
28
28
|
{
|
|
29
29
|
columns: tableColumns,
|
|
30
30
|
rows: tableRows,
|
|
@@ -54,5 +54,5 @@ function StatGroup({ items, testId }) {
|
|
|
54
54
|
|
|
55
55
|
exports.DataTableBlock = DataTableBlock;
|
|
56
56
|
exports.StatGroup = StatGroup;
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
58
|
-
//# sourceMappingURL=chunk-
|
|
57
|
+
//# sourceMappingURL=chunk-VRK3IQAP.cjs.map
|
|
58
|
+
//# sourceMappingURL=chunk-VRK3IQAP.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/DataTableBlock.tsx","../src/components/StatGroup.tsx"],"names":["jsxs","jsx","DataTable","cn"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/DataTableBlock.tsx","../src/components/StatGroup.tsx"],"names":["jsxs","jsx","DataTable","cn"],"mappings":"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","file":"chunk-VRK3IQAP.cjs","sourcesContent":["/**\n * A **serializable** data table for the Puck builder.\n *\n * The library's developer-facing {@link DataTable} is driven by `Column<T>` whose\n * `header`/`render` are React nodes and functions — powerful, but non-serializable,\n * so it can never be a Puck block. `DataTableBlock` closes that gap with a flat,\n * JSON-safe schema (string headers, string field keys, string cells) and rebuilds\n * the non-serializable `Column<Row>[]` internally, rendering through the very same\n * {@link DataTable} so it inherits the library's markup and tokens verbatim.\n */\nimport { DataTable, type Column } from './DataTable'\n\nexport interface DataTableBlockColumn {\n /** Column heading text. */\n header: string\n /** Key used to look a cell up in each row record. */\n field: string\n /** Cell/heading alignment. */\n align?: 'left' | 'right' | 'center'\n}\n\nexport interface DataTableBlockProps {\n /** Serializable column schema. */\n columns: DataTableBlockColumn[]\n /** One record per row; cells are looked up by each column's `field`. */\n rows: Array<Record<string, string>>\n /** Optional caption rendered above the table. */\n caption?: string\n /** Empty-state title shown when there are no rows. */\n emptyText?: string\n /** testid area prefix; also set on the wrapper element. */\n testId?: string\n}\n\n/** A row wrapper so {@link DataTable} gets a stable id without polluting the record. */\ninterface TableRowData {\n __id: string\n cells: Record<string, string>\n}\n\n/**\n * Renders a {@link DataTable} from a flat, serializable schema. Columns are mapped\n * to `Column<TableRowData>[]` (header string, positional-stable key, alignment) and\n * each cell is resolved by `field`; rows carry a synthetic id for React keys/testids.\n */\nexport function DataTableBlock({ columns, rows, caption, emptyText, testId }: DataTableBlockProps) {\n const area = testId ?? 'data-table-block'\n\n const tableColumns: Column<TableRowData>[] = columns.map((col, index) => ({\n key: col.field || `col-${index}`,\n header: col.header,\n align: col.align,\n render: (row) => row.cells[col.field] ?? '',\n }))\n\n const tableRows: TableRowData[] = rows.map((cells, index) => ({ __id: String(index), cells }))\n\n return (\n <div data-testid={testId}>\n {caption ? (\n <p\n className=\"mb-2 text-sm text-muted-foreground\"\n data-testid={testId ? `${testId}-caption` : undefined}\n >\n {caption}\n </p>\n ) : null}\n <DataTable\n columns={tableColumns}\n rows={tableRows}\n getRowId={(row) => row.__id}\n area={area}\n emptyTitle={emptyText}\n />\n </div>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\nexport interface StatItem {\n value: string\n label: string\n /** Optional caption under the label (e.g. a qualifier or unit). */\n sub?: string\n}\n\nexport interface StatGroupProps {\n items: StatItem[]\n testId?: string\n}\n\nconst GRID: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 sm:grid-cols-3',\n 4: 'grid-cols-2 lg:grid-cols-4',\n}\n\n/** Big-number stat group — headline metrics with captions. */\nexport function StatGroup({ items, testId }: StatGroupProps) {\n const list = items ?? []\n const cols = GRID[Math.min(list.length, 4)] ?? GRID[4]\n return (\n <dl className={cn('grid gap-8', cols)} data-testid={testId}>\n {list.map((item, i) => (\n <div key={i} className=\"min-w-0 text-center\" data-testid={testId && `${testId}-item-${i}`}>\n <dt className=\"sr-only\">{item.label}</dt>\n <dd className=\"text-4xl font-semibold tracking-tight [overflow-wrap:anywhere] sm:text-5xl\">\n {item.value}\n </dd>\n <p className=\"mt-2 text-sm text-muted-foreground\">{item.label}</p>\n {item.sub && <p className=\"mt-1 text-xs text-muted-foreground/80\">{item.sub}</p>}\n </div>\n ))}\n </dl>\n )\n}\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
var chunk4M3OIBIS_cjs = require('./chunk-4M3OIBIS.cjs');
|
|
5
5
|
var chunkQUMUAJ2P_cjs = require('./chunk-QUMUAJ2P.cjs');
|
|
6
|
-
var
|
|
6
|
+
var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
|
|
7
7
|
var react$1 = require('react');
|
|
8
8
|
var lucideReact = require('lucide-react');
|
|
9
9
|
var ui = require('@arbidocs/react/ui');
|
|
@@ -23,7 +23,7 @@ function ConnectedMailInviteCard({
|
|
|
23
23
|
isOnline,
|
|
24
24
|
onOpenEvent
|
|
25
25
|
}) {
|
|
26
|
-
const { notify } =
|
|
26
|
+
const { notify } = chunkTKHCIHE2_cjs.useBlocksEnvironment();
|
|
27
27
|
const part = attachments.find(chunk4M3OIBIS_cjs.isCalendarAttachment);
|
|
28
28
|
const { data: settings } = react.useCalendarSettings(!!part);
|
|
29
29
|
const zone = chunkQUMUAJ2P_cjs.safeZone(settings?.time_zone, chunkQUMUAJ2P_cjs.detectTimeZone());
|
|
@@ -132,5 +132,5 @@ function ConnectedMailInviteCard({
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
exports.ConnectedMailInviteCard = ConnectedMailInviteCard;
|
|
135
|
-
//# sourceMappingURL=chunk-
|
|
136
|
-
//# sourceMappingURL=chunk-
|
|
135
|
+
//# sourceMappingURL=chunk-VWTOIGX4.cjs.map
|
|
136
|
+
//# sourceMappingURL=chunk-VWTOIGX4.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/calendar/ConnectedMailInviteCard.tsx"],"names":["useBlocksEnvironment","isCalendarAttachment","useCalendarSettings","safeZone","detectTimeZone","useMailAttachmentText","parseIcsInvite","useCalendarEventByUid","useRespondToEvent","useState","useEffect","formatEventWhen","isQueuedCalendarWrite","jsxs","jsx","CalendarDays","cn","Fragment","Button"],"mappings":"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","file":"chunk-MYRKL3JO.cjs","sourcesContent":["/**\n * Invitation card in the Mail message view: when the message carries an iCalendar part, show the event\n * (parsed client-side) and, if it is in my calendar (GET /lookup?uid=), Accept / Maybe / Decline and\n * Open in calendar. Self-contained so the mail view only mounts it.\n */\nimport { useEffect, useState } from 'react'\nimport { CalendarDays } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n isQueuedCalendarWrite,\n useCalendarEventByUid,\n useCalendarSettings,\n useMailAttachmentText,\n useRespondToEvent,\n type MailAttachment,\n} from '@arbidocs/react'\nimport {\n detectTimeZone,\n formatEventWhen,\n isCalendarAttachment,\n parseIcsInvite,\n safeZone,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\nexport interface ConnectedMailInviteCardProps {\n accountId: string\n messageId: string\n attachments: MailAttachment[]\n isOnline: boolean\n /** Open the event in the host's calendar (\"Open in calendar\"); without it the button is hidden. */\n onOpenEvent?: (event: { id: string }) => void\n}\n\nconst PARTSTAT_TEXT: Record<string, string> = {\n accepted: 'You accepted',\n declined: 'You declined',\n tentative: 'You said maybe',\n needs_action: 'Not answered yet',\n}\n\nexport function ConnectedMailInviteCard({\n accountId,\n messageId,\n attachments,\n isOnline,\n onOpenEvent,\n}: ConnectedMailInviteCardProps) {\n const { notify } = useBlocksEnvironment()\n const part = attachments.find(isCalendarAttachment)\n const { data: settings } = useCalendarSettings(!!part)\n const zone = safeZone(settings?.time_zone, detectTimeZone())\n const { data: ics } = useMailAttachmentText(accountId, messageId, part, { enabled: isOnline })\n const invite = ics ? parseIcsInvite(ics, zone) : null\n const lookup = useCalendarEventByUid(invite?.uid && invite.method !== 'REPLY' ? invite.uid : null)\n const respond = useRespondToEvent()\n const [partstat, setPartstat] = useState<string | null>(null)\n const event = lookup.data ?? null\n useEffect(() => setPartstat(event?.my_partstat ?? null), [event?.my_partstat])\n\n if (!part || !invite) return null\n const cancelled = invite.method === 'CANCEL' || invite.status === 'CANCELLED'\n const when =\n invite.startUtc && invite.endUtc\n ? formatEventWhen(\n {\n all_day: invite.allDay,\n start_utc: invite.startUtc,\n end_utc: invite.endUtc,\n start: { date: invite.startDate },\n end: { date: invite.endDate },\n },\n zone\n )\n : ''\n const canRespond = !!event && !event.is_organizer && event.my_partstat != null && !cancelled\n\n const answer = (p: 'accepted' | 'tentative' | 'declined') =>\n event &&\n respond.mutate(\n { id: event.id, partstat: p },\n {\n onSuccess: (updated) =>\n setPartstat(isQueuedCalendarWrite(updated) ? p : (updated.my_partstat ?? p)),\n onError: (err) => notify(`Could not send your response: ${err.message}`, 'error'),\n }\n )\n\n return (\n <div\n className=\"mb-4 flex gap-3 rounded-lg border border-border bg-muted/20 p-3\"\n data-testid=\"mail-invite-card\"\n >\n <CalendarDays className=\"mt-0.5 size-5 shrink-0 text-primary\" aria-hidden />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <div\n className={cn('font-medium', cancelled && 'line-through')}\n data-testid=\"mail-invite-title\"\n >\n {invite.title || 'Untitled event'}\n </div>\n <div className=\"text-sm text-muted-foreground\">{when}</div>\n {invite.location && <div className=\"text-sm text-muted-foreground\">{invite.location}</div>}\n {invite.organizer && (\n <div className=\"text-xs text-muted-foreground\">\n Organiser: {invite.organizer.name || invite.organizer.email}\n </div>\n )}\n {cancelled && <div className=\"text-sm text-destructive\">This event was cancelled.</div>}\n {invite.method === 'REPLY' && (\n <div className=\"text-sm text-muted-foreground\">A guest replied to your invitation.</div>\n )}\n {!cancelled && invite.method !== 'REPLY' && !lookup.isLoading && !event && isOnline && (\n <div className=\"text-xs text-muted-foreground\">Not in your calendar yet.</div>\n )}\n {canRespond && partstat && (\n <div className=\"text-xs text-muted-foreground\" data-testid=\"mail-invite-status\">\n {PARTSTAT_TEXT[partstat] ?? partstat}\n </div>\n )}\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {canRespond && (\n <>\n <Button\n size=\"sm\"\n variant={partstat === 'accepted' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('accepted')}\n data-testid=\"mail-invite-accept\"\n >\n Accept\n </Button>\n <Button\n size=\"sm\"\n variant={partstat === 'tentative' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('tentative')}\n >\n Maybe\n </Button>\n <Button\n size=\"sm\"\n variant={partstat === 'declined' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('declined')}\n >\n Decline\n </Button>\n </>\n )}\n {event && onOpenEvent && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onOpenEvent({ id: event.id })}\n data-testid=\"mail-invite-open\"\n >\n Open in calendar\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/connection/calendar/ConnectedMailInviteCard.tsx"],"names":["useBlocksEnvironment","isCalendarAttachment","useCalendarSettings","safeZone","detectTimeZone","useMailAttachmentText","parseIcsInvite","useCalendarEventByUid","useRespondToEvent","useState","useEffect","formatEventWhen","isQueuedCalendarWrite","jsxs","jsx","CalendarDays","cn","Fragment","Button"],"mappings":"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","file":"chunk-VWTOIGX4.cjs","sourcesContent":["/**\n * Invitation card in the Mail message view: when the message carries an iCalendar part, show the event\n * (parsed client-side) and, if it is in my calendar (GET /lookup?uid=), Accept / Maybe / Decline and\n * Open in calendar. Self-contained so the mail view only mounts it.\n */\nimport { useEffect, useState } from 'react'\nimport { CalendarDays } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n isQueuedCalendarWrite,\n useCalendarEventByUid,\n useCalendarSettings,\n useMailAttachmentText,\n useRespondToEvent,\n type MailAttachment,\n} from '@arbidocs/react'\nimport {\n detectTimeZone,\n formatEventWhen,\n isCalendarAttachment,\n parseIcsInvite,\n safeZone,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\nexport interface ConnectedMailInviteCardProps {\n accountId: string\n messageId: string\n attachments: MailAttachment[]\n isOnline: boolean\n /** Open the event in the host's calendar (\"Open in calendar\"); without it the button is hidden. */\n onOpenEvent?: (event: { id: string }) => void\n}\n\nconst PARTSTAT_TEXT: Record<string, string> = {\n accepted: 'You accepted',\n declined: 'You declined',\n tentative: 'You said maybe',\n needs_action: 'Not answered yet',\n}\n\nexport function ConnectedMailInviteCard({\n accountId,\n messageId,\n attachments,\n isOnline,\n onOpenEvent,\n}: ConnectedMailInviteCardProps) {\n const { notify } = useBlocksEnvironment()\n const part = attachments.find(isCalendarAttachment)\n const { data: settings } = useCalendarSettings(!!part)\n const zone = safeZone(settings?.time_zone, detectTimeZone())\n const { data: ics } = useMailAttachmentText(accountId, messageId, part, { enabled: isOnline })\n const invite = ics ? parseIcsInvite(ics, zone) : null\n const lookup = useCalendarEventByUid(invite?.uid && invite.method !== 'REPLY' ? invite.uid : null)\n const respond = useRespondToEvent()\n const [partstat, setPartstat] = useState<string | null>(null)\n const event = lookup.data ?? null\n useEffect(() => setPartstat(event?.my_partstat ?? null), [event?.my_partstat])\n\n if (!part || !invite) return null\n const cancelled = invite.method === 'CANCEL' || invite.status === 'CANCELLED'\n const when =\n invite.startUtc && invite.endUtc\n ? formatEventWhen(\n {\n all_day: invite.allDay,\n start_utc: invite.startUtc,\n end_utc: invite.endUtc,\n start: { date: invite.startDate },\n end: { date: invite.endDate },\n },\n zone\n )\n : ''\n const canRespond = !!event && !event.is_organizer && event.my_partstat != null && !cancelled\n\n const answer = (p: 'accepted' | 'tentative' | 'declined') =>\n event &&\n respond.mutate(\n { id: event.id, partstat: p },\n {\n onSuccess: (updated) =>\n setPartstat(isQueuedCalendarWrite(updated) ? p : (updated.my_partstat ?? p)),\n onError: (err) => notify(`Could not send your response: ${err.message}`, 'error'),\n }\n )\n\n return (\n <div\n className=\"mb-4 flex gap-3 rounded-lg border border-border bg-muted/20 p-3\"\n data-testid=\"mail-invite-card\"\n >\n <CalendarDays className=\"mt-0.5 size-5 shrink-0 text-primary\" aria-hidden />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <div\n className={cn('font-medium', cancelled && 'line-through')}\n data-testid=\"mail-invite-title\"\n >\n {invite.title || 'Untitled event'}\n </div>\n <div className=\"text-sm text-muted-foreground\">{when}</div>\n {invite.location && <div className=\"text-sm text-muted-foreground\">{invite.location}</div>}\n {invite.organizer && (\n <div className=\"text-xs text-muted-foreground\">\n Organiser: {invite.organizer.name || invite.organizer.email}\n </div>\n )}\n {cancelled && <div className=\"text-sm text-destructive\">This event was cancelled.</div>}\n {invite.method === 'REPLY' && (\n <div className=\"text-sm text-muted-foreground\">A guest replied to your invitation.</div>\n )}\n {!cancelled && invite.method !== 'REPLY' && !lookup.isLoading && !event && isOnline && (\n <div className=\"text-xs text-muted-foreground\">Not in your calendar yet.</div>\n )}\n {canRespond && partstat && (\n <div className=\"text-xs text-muted-foreground\" data-testid=\"mail-invite-status\">\n {PARTSTAT_TEXT[partstat] ?? partstat}\n </div>\n )}\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {canRespond && (\n <>\n <Button\n size=\"sm\"\n variant={partstat === 'accepted' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('accepted')}\n data-testid=\"mail-invite-accept\"\n >\n Accept\n </Button>\n <Button\n size=\"sm\"\n variant={partstat === 'tentative' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('tentative')}\n >\n Maybe\n </Button>\n <Button\n size=\"sm\"\n variant={partstat === 'declined' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('declined')}\n >\n Decline\n </Button>\n </>\n )}\n {event && onOpenEvent && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onOpenEvent({ id: event.id })}\n data-testid=\"mail-invite-open\"\n >\n Open in calendar\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
4
|
+
var chunkWXUU3COI_cjs = require('./chunk-WXUU3COI.cjs');
|
|
5
|
+
var chunkHQDR43JC_cjs = require('./chunk-HQDR43JC.cjs');
|
|
6
|
+
var chunkJR2YSBD5_cjs = require('./chunk-JR2YSBD5.cjs');
|
|
7
|
+
var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
|
|
8
8
|
var react = require('react');
|
|
9
9
|
var react$1 = require('@arbidocs/react');
|
|
10
10
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -23,9 +23,9 @@ function toWorkflowFieldDocument(doc) {
|
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
function useConnectedWorkflowScopeSource() {
|
|
26
|
-
const { data: docs } =
|
|
27
|
-
const { data: tags } =
|
|
28
|
-
return react.useMemo(() =>
|
|
26
|
+
const { data: docs } = chunkHQDR43JC_cjs.useListedDocuments();
|
|
27
|
+
const { data: tags } = chunkHQDR43JC_cjs.useConnectedTags();
|
|
28
|
+
return react.useMemo(() => chunkWXUU3COI_cjs.buildWorkflowScopeSource(docs, chunkWXUU3COI_cjs.documentScopeLabels(tags)), [docs, tags]);
|
|
29
29
|
}
|
|
30
30
|
function useConnectedAgentOptions() {
|
|
31
31
|
const { data: agents } = react$1.useAgents();
|
|
@@ -41,9 +41,9 @@ function ConnectedWorkflowDocumentsField({
|
|
|
41
41
|
onAddFiles,
|
|
42
42
|
labels
|
|
43
43
|
}) {
|
|
44
|
-
const { notify } =
|
|
45
|
-
const { ensureWorkspaceOpen } =
|
|
46
|
-
const { data: docs, loaded } =
|
|
44
|
+
const { notify } = chunkTKHCIHE2_cjs.useBlocksEnvironment();
|
|
45
|
+
const { ensureWorkspaceOpen } = chunkJR2YSBD5_cjs.useConnectedWorkspace();
|
|
46
|
+
const { data: docs, loaded } = chunkHQDR43JC_cjs.useListedDocuments();
|
|
47
47
|
const uploadDocuments = react$1.useUploadDocuments();
|
|
48
48
|
const documents = react.useMemo(() => docs.map(toWorkflowFieldDocument), [docs]);
|
|
49
49
|
const chosen = value.documents ?? [];
|
|
@@ -82,7 +82,7 @@ function ConnectedWorkflowDocumentsField({
|
|
|
82
82
|
}
|
|
83
83
|
),
|
|
84
84
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
85
|
-
|
|
85
|
+
chunkWXUU3COI_cjs.WorkflowDocumentsField,
|
|
86
86
|
{
|
|
87
87
|
field,
|
|
88
88
|
value,
|
|
@@ -104,7 +104,7 @@ function ConnectedWorkflowLauncher({
|
|
|
104
104
|
const scopeSource = useConnectedWorkflowScopeSource();
|
|
105
105
|
const agents = useConnectedAgentOptions();
|
|
106
106
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
107
|
-
|
|
107
|
+
chunkWXUU3COI_cjs.WorkflowLauncher,
|
|
108
108
|
{
|
|
109
109
|
...props,
|
|
110
110
|
scopeSource,
|
|
@@ -126,5 +126,5 @@ exports.ConnectedWorkflowDocumentsField = ConnectedWorkflowDocumentsField;
|
|
|
126
126
|
exports.ConnectedWorkflowLauncher = ConnectedWorkflowLauncher;
|
|
127
127
|
exports.toWorkflowFieldDocument = toWorkflowFieldDocument;
|
|
128
128
|
exports.useConnectedWorkflowScopeSource = useConnectedWorkflowScopeSource;
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
//# sourceMappingURL=chunk-WAV762GP.cjs.map
|
|
130
|
+
//# sourceMappingURL=chunk-WAV762GP.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/ConnectedWorkflowLauncher.tsx"],"names":["useListedDocuments","useConnectedTags","useMemo","buildWorkflowScopeSource","documentScopeLabels","useAgents","useBlocksEnvironment","useConnectedWorkspace","useUploadDocuments","useThumbnails","useRef","useState","useCallback","jsxs","Fragment","jsx","WorkflowDocumentsField","WorkflowLauncher"],"mappings":"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","file":"chunk-KZKGZ7IG.cjs","sourcesContent":["/**\n * The workflow launcher bound to the connection: the open workspace's folders, labels and files\n * behind its scope and `documents` fields (files can be added right there), and the user's agents\n * behind \"Run as\". The host still says what a launch does (`onLaunch`): open a chat, start a task.\n */\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport { useAgents, useThumbnails, useUploadDocuments } from '@arbidocs/react'\nimport { WorkflowLauncher, type WorkflowLauncherProps } from '../agents/workflows/WorkflowLauncher'\nimport {\n WorkflowDocumentsField,\n type WorkflowDocumentsFieldLabels,\n type WorkflowFieldDocument,\n} from '../agents/workflows/WorkflowDocumentsField'\nimport type { WorkflowScopeSource } from '../agents/workflows/WorkflowConfigDialog'\nimport { buildWorkflowScopeSource, documentScopeLabels } from '../agents/workflows/workspaceScope'\nimport type { AgentOption } from '../agents/workflows/AgentSelect'\nimport type { WorkflowField, WorkflowScope } from '../agents/workflows/types'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedTags, useListedDocuments, type ConnectedDocument } from './workspaceData'\n\nconst IMAGE_FILE_TYPES = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'webp'])\n\n/** A workspace document as a `documents` field offers it. */\nexport function toWorkflowFieldDocument(doc: ConnectedDocument): WorkflowFieldDocument {\n // Pages and tokens are a text-parsing concept: never meaningful for an image.\n const isImage = IMAGE_FILE_TYPES.has((doc.file_type ?? '').toLowerCase())\n return {\n id: doc.external_id,\n title: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n fileName: doc.file_name,\n pages: isImage ? null : (doc.n_pages ?? null),\n tokens: isImage ? null : (doc.tokens ?? null),\n status: doc.status,\n isImage,\n }\n}\n\n/** The open workspace's folders and labels for a workflow's scope field. */\nexport function useConnectedWorkflowScopeSource(): WorkflowScopeSource {\n const { data: docs } = useListedDocuments()\n const { data: tags } = useConnectedTags()\n return useMemo(() => buildWorkflowScopeSource(docs, documentScopeLabels(tags)), [docs, tags])\n}\n\n/** The user's agents, for \"Run as\". */\nfunction useConnectedAgentOptions(): AgentOption[] {\n const { data: agents } = useAgents()\n return useMemo(\n () => (agents ?? []).map((a) => ({ id: a.external_id, label: a.given_name || a.email })),\n [agents]\n )\n}\n\nexport interface ConnectedWorkflowDocumentsFieldProps {\n field: WorkflowField\n value: WorkflowScope\n onChange: (value: WorkflowScope) => void\n /** Add files the host's way (its upload dialog). Absent: they are uploaded here. */\n onAddFiles?: (files?: File[]) => void\n labels?: Partial<WorkflowDocumentsFieldLabels>\n}\n\n/**\n * A workflow `documents` field over the open workspace's files: pick, add (or drop) files, see the\n * chosen images. A launcher's or a task composer's `renderDocuments`.\n */\nexport function ConnectedWorkflowDocumentsField({\n field,\n value,\n onChange,\n onAddFiles,\n labels,\n}: ConnectedWorkflowDocumentsFieldProps) {\n const { notify } = useBlocksEnvironment()\n const { ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: docs, loaded } = useListedDocuments()\n const uploadDocuments = useUploadDocuments()\n const documents = useMemo(() => docs.map(toWorkflowFieldDocument), [docs])\n const chosen = value.documents ?? []\n const { data: thumbnails } = useThumbnails(chosen, { enabled: (field.max ?? 1) > 1 })\n const input = useRef<HTMLInputElement>(null)\n const [adding, setAdding] = useState(false)\n\n const upload = useCallback(\n async (files: File[]) => {\n setAdding(true)\n try {\n await ensureWorkspaceOpen()\n // Each new document joins the shared list as it lands.\n for (const file of files) await uploadDocuments.mutateAsync({ files: [file] })\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : String(error), 'error')\n } finally {\n setAdding(false)\n }\n },\n [uploadDocuments, ensureWorkspaceOpen, notify]\n )\n\n return (\n <>\n {!onAddFiles && (\n <input\n ref={input}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Add files\"\n data-testid=\"workflow-add-files-input\"\n onChange={(e) => {\n const files = Array.from(e.target.files ?? [])\n e.target.value = ''\n if (files.length) void upload(files)\n }}\n />\n )}\n <WorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n documents={documents}\n loaded={loaded}\n thumbnailOf={(id) => thumbnails?.[id]}\n onAddFiles={\n onAddFiles ?? ((files) => (files?.length ? void upload(files) : input.current?.click()))\n }\n adding={adding}\n labels={labels}\n />\n </>\n )\n}\n\nexport interface ConnectedWorkflowLauncherProps extends Omit<\n WorkflowLauncherProps,\n 'scopeSource' | 'renderDocuments' | 'agents'\n> {\n /** Add files from a `documents` field the host's way (its upload dialog). Absent: uploaded here. */\n onAddFiles?: (files?: File[]) => void\n}\n\nexport function ConnectedWorkflowLauncher({\n onAddFiles,\n ...props\n}: ConnectedWorkflowLauncherProps) {\n const scopeSource = useConnectedWorkflowScopeSource()\n const agents = useConnectedAgentOptions()\n return (\n <WorkflowLauncher\n {...props}\n scopeSource={scopeSource}\n agents={agents}\n renderDocuments={(field, value, onChange) => (\n <ConnectedWorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n onAddFiles={onAddFiles}\n />\n )}\n />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/connection/ConnectedWorkflowLauncher.tsx"],"names":["useListedDocuments","useConnectedTags","useMemo","buildWorkflowScopeSource","documentScopeLabels","useAgents","useBlocksEnvironment","useConnectedWorkspace","useUploadDocuments","useThumbnails","useRef","useState","useCallback","jsxs","Fragment","jsx","WorkflowDocumentsField","WorkflowLauncher"],"mappings":"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","file":"chunk-WAV762GP.cjs","sourcesContent":["/**\n * The workflow launcher bound to the connection: the open workspace's folders, labels and files\n * behind its scope and `documents` fields (files can be added right there), and the user's agents\n * behind \"Run as\". The host still says what a launch does (`onLaunch`): open a chat, start a task.\n */\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport { useAgents, useThumbnails, useUploadDocuments } from '@arbidocs/react'\nimport { WorkflowLauncher, type WorkflowLauncherProps } from '../agents/workflows/WorkflowLauncher'\nimport {\n WorkflowDocumentsField,\n type WorkflowDocumentsFieldLabels,\n type WorkflowFieldDocument,\n} from '../agents/workflows/WorkflowDocumentsField'\nimport type { WorkflowScopeSource } from '../agents/workflows/WorkflowConfigDialog'\nimport { buildWorkflowScopeSource, documentScopeLabels } from '../agents/workflows/workspaceScope'\nimport type { AgentOption } from '../agents/workflows/AgentSelect'\nimport type { WorkflowField, WorkflowScope } from '../agents/workflows/types'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedTags, useListedDocuments, type ConnectedDocument } from './workspaceData'\n\nconst IMAGE_FILE_TYPES = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'webp'])\n\n/** A workspace document as a `documents` field offers it. */\nexport function toWorkflowFieldDocument(doc: ConnectedDocument): WorkflowFieldDocument {\n // Pages and tokens are a text-parsing concept: never meaningful for an image.\n const isImage = IMAGE_FILE_TYPES.has((doc.file_type ?? '').toLowerCase())\n return {\n id: doc.external_id,\n title: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n fileName: doc.file_name,\n pages: isImage ? null : (doc.n_pages ?? null),\n tokens: isImage ? null : (doc.tokens ?? null),\n status: doc.status,\n isImage,\n }\n}\n\n/** The open workspace's folders and labels for a workflow's scope field. */\nexport function useConnectedWorkflowScopeSource(): WorkflowScopeSource {\n const { data: docs } = useListedDocuments()\n const { data: tags } = useConnectedTags()\n return useMemo(() => buildWorkflowScopeSource(docs, documentScopeLabels(tags)), [docs, tags])\n}\n\n/** The user's agents, for \"Run as\". */\nfunction useConnectedAgentOptions(): AgentOption[] {\n const { data: agents } = useAgents()\n return useMemo(\n () => (agents ?? []).map((a) => ({ id: a.external_id, label: a.given_name || a.email })),\n [agents]\n )\n}\n\nexport interface ConnectedWorkflowDocumentsFieldProps {\n field: WorkflowField\n value: WorkflowScope\n onChange: (value: WorkflowScope) => void\n /** Add files the host's way (its upload dialog). Absent: they are uploaded here. */\n onAddFiles?: (files?: File[]) => void\n labels?: Partial<WorkflowDocumentsFieldLabels>\n}\n\n/**\n * A workflow `documents` field over the open workspace's files: pick, add (or drop) files, see the\n * chosen images. A launcher's or a task composer's `renderDocuments`.\n */\nexport function ConnectedWorkflowDocumentsField({\n field,\n value,\n onChange,\n onAddFiles,\n labels,\n}: ConnectedWorkflowDocumentsFieldProps) {\n const { notify } = useBlocksEnvironment()\n const { ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: docs, loaded } = useListedDocuments()\n const uploadDocuments = useUploadDocuments()\n const documents = useMemo(() => docs.map(toWorkflowFieldDocument), [docs])\n const chosen = value.documents ?? []\n const { data: thumbnails } = useThumbnails(chosen, { enabled: (field.max ?? 1) > 1 })\n const input = useRef<HTMLInputElement>(null)\n const [adding, setAdding] = useState(false)\n\n const upload = useCallback(\n async (files: File[]) => {\n setAdding(true)\n try {\n await ensureWorkspaceOpen()\n // Each new document joins the shared list as it lands.\n for (const file of files) await uploadDocuments.mutateAsync({ files: [file] })\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : String(error), 'error')\n } finally {\n setAdding(false)\n }\n },\n [uploadDocuments, ensureWorkspaceOpen, notify]\n )\n\n return (\n <>\n {!onAddFiles && (\n <input\n ref={input}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Add files\"\n data-testid=\"workflow-add-files-input\"\n onChange={(e) => {\n const files = Array.from(e.target.files ?? [])\n e.target.value = ''\n if (files.length) void upload(files)\n }}\n />\n )}\n <WorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n documents={documents}\n loaded={loaded}\n thumbnailOf={(id) => thumbnails?.[id]}\n onAddFiles={\n onAddFiles ?? ((files) => (files?.length ? void upload(files) : input.current?.click()))\n }\n adding={adding}\n labels={labels}\n />\n </>\n )\n}\n\nexport interface ConnectedWorkflowLauncherProps extends Omit<\n WorkflowLauncherProps,\n 'scopeSource' | 'renderDocuments' | 'agents'\n> {\n /** Add files from a `documents` field the host's way (its upload dialog). Absent: uploaded here. */\n onAddFiles?: (files?: File[]) => void\n}\n\nexport function ConnectedWorkflowLauncher({\n onAddFiles,\n ...props\n}: ConnectedWorkflowLauncherProps) {\n const scopeSource = useConnectedWorkflowScopeSource()\n const agents = useConnectedAgentOptions()\n return (\n <WorkflowLauncher\n {...props}\n scopeSource={scopeSource}\n agents={agents}\n renderDocuments={(field, value, onChange) => (\n <ConnectedWorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n onAddFiles={onAddFiles}\n />\n )}\n />\n )\n}\n"]}
|