@arbidocs/blocks 0.5.115 → 0.5.117
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-WER7R222.cjs → ConnectedCallDock-OZBTU3IT.cjs} +20 -20
- package/dist/{ConnectedCallDock-WER7R222.cjs.map → ConnectedCallDock-OZBTU3IT.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-VMZE2NFP.cjs} +13 -13
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-VMZE2NFP.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs → ConnectedNativeDocxComparison-7OUKTKYP.cjs} +20 -20
- package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs.map → ConnectedNativeDocxComparison-7OUKTKYP.cjs.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs → ConnectedStreamedWordArtifact-7V24ZDAC.cjs} +20 -20
- package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs.map → ConnectedStreamedWordArtifact-7V24ZDAC.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-OCPFVMLD.cjs} +15 -15
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs.map → DocumentReviewCard-OCPFVMLD.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-I5QIHQZT.cjs → FilesViewerDialog-KLRDIYEH.cjs} +45 -45
- package/dist/{FilesViewerDialog-I5QIHQZT.cjs.map → FilesViewerDialog-KLRDIYEH.cjs.map} +1 -1
- package/dist/{NativeDocxEditor-H6TAEVGY.cjs → NativeDocxEditor-2LQY2CTV.cjs} +6 -6
- package/dist/{NativeDocxEditor-H6TAEVGY.cjs.map → NativeDocxEditor-2LQY2CTV.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-IMAZICIZ.cjs} +8 -8
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs.map → WorkspaceTableView-IMAZICIZ.cjs.map} +1 -1
- package/dist/agents/index.cjs +297 -297
- package/dist/{ai-IM4A23YT.cjs → ai-7U4B4CVF.cjs} +24 -24
- package/dist/ai-7U4B4CVF.cjs.map +1 -0
- package/dist/calls/index.cjs +121 -121
- package/dist/chat/index.cjs +1 -1
- package/dist/{chunk-M6IKVKU5.cjs → chunk-2CSLFAGF.cjs} +392 -149
- package/dist/chunk-2CSLFAGF.cjs.map +1 -0
- package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
- package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
- package/dist/{chunk-P77YTTJ3.cjs → chunk-3ODEWSRO.cjs} +4 -4
- package/dist/{chunk-P77YTTJ3.cjs.map → chunk-3ODEWSRO.cjs.map} +1 -1
- package/dist/{chunk-DDIW4HLU.cjs → chunk-3U36VYMD.cjs} +27 -27
- package/dist/{chunk-DDIW4HLU.cjs.map → chunk-3U36VYMD.cjs.map} +1 -1
- package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
- package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
- package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
- package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
- package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
- package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
- package/dist/{chunk-Y24V6HPR.cjs → chunk-57EE6CMW.cjs} +15 -15
- package/dist/{chunk-Y24V6HPR.cjs.map → chunk-57EE6CMW.cjs.map} +1 -1
- package/dist/{chunk-NNUK5ZM7.cjs → chunk-5QUL5BZO.cjs} +4 -4
- package/dist/{chunk-NNUK5ZM7.cjs.map → chunk-5QUL5BZO.cjs.map} +1 -1
- package/dist/{chunk-OEREKAAP.cjs → chunk-6DCIZA3X.cjs} +75 -75
- package/dist/{chunk-OEREKAAP.cjs.map → chunk-6DCIZA3X.cjs.map} +1 -1
- package/dist/{chunk-YGXOKB5Z.cjs → chunk-7TEUGFIL.cjs} +4 -4
- package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-7TEUGFIL.cjs.map} +1 -1
- package/dist/{chunk-TT4IF52H.cjs → chunk-7X3FS5HQ.cjs} +35 -35
- package/dist/{chunk-TT4IF52H.cjs.map → chunk-7X3FS5HQ.cjs.map} +1 -1
- package/dist/{chunk-CPR6EHG7.cjs → chunk-7XT5B2DZ.cjs} +47 -47
- package/dist/{chunk-CPR6EHG7.cjs.map → chunk-7XT5B2DZ.cjs.map} +1 -1
- package/dist/chunk-BKY2LAV2.cjs +18 -0
- package/dist/{chunk-CIHERNDO.cjs.map → chunk-BKY2LAV2.cjs.map} +1 -1
- package/dist/{chunk-XKVPSOKP.cjs → chunk-BW5MF464.cjs} +4 -4
- package/dist/{chunk-XKVPSOKP.cjs.map → chunk-BW5MF464.cjs.map} +1 -1
- package/dist/{chunk-IW7CDJTA.cjs → chunk-COD5ENHK.cjs} +4 -4
- package/dist/{chunk-IW7CDJTA.cjs.map → chunk-COD5ENHK.cjs.map} +1 -1
- package/dist/{chunk-A3T3IC3K.cjs → chunk-D7ICHGWM.cjs} +239 -85
- package/dist/chunk-D7ICHGWM.cjs.map +1 -0
- package/dist/{chunk-TDO5UWXF.cjs → chunk-E4BLRF2L.cjs} +5 -5
- package/dist/{chunk-TDO5UWXF.cjs.map → chunk-E4BLRF2L.cjs.map} +1 -1
- package/dist/{chunk-WR2SF44W.cjs → chunk-E4DUXU5K.cjs} +9 -9
- package/dist/{chunk-WR2SF44W.cjs.map → chunk-E4DUXU5K.cjs.map} +1 -1
- package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
- package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
- package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
- package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
- package/dist/{chunk-6UTKM5AB.cjs → chunk-JSQQV23D.cjs} +3 -3
- package/dist/{chunk-6UTKM5AB.cjs.map → chunk-JSQQV23D.cjs.map} +1 -1
- package/dist/{chunk-557MJ4IH.cjs → chunk-LFRNBT2I.cjs} +20 -20
- package/dist/{chunk-557MJ4IH.cjs.map → chunk-LFRNBT2I.cjs.map} +1 -1
- package/dist/{chunk-R7CJEIA5.cjs → chunk-LYTIQQQ2.cjs} +3 -3
- package/dist/{chunk-R7CJEIA5.cjs.map → chunk-LYTIQQQ2.cjs.map} +1 -1
- package/dist/{chunk-CPG7II4E.cjs → chunk-MC4F2URI.cjs} +28 -28
- package/dist/{chunk-CPG7II4E.cjs.map → chunk-MC4F2URI.cjs.map} +1 -1
- package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
- package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
- package/dist/{chunk-ZTXQIIFV.cjs → chunk-OZVDOAXG.cjs} +6 -6
- package/dist/{chunk-ZTXQIIFV.cjs.map → chunk-OZVDOAXG.cjs.map} +1 -1
- package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
- package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
- package/dist/{chunk-KTQOGT2L.cjs → chunk-TDN33HSK.cjs} +6 -6
- package/dist/{chunk-KTQOGT2L.cjs.map → chunk-TDN33HSK.cjs.map} +1 -1
- package/dist/{chunk-T23UTIRI.cjs → chunk-UNDQYTRF.cjs} +6 -6
- package/dist/{chunk-T23UTIRI.cjs.map → chunk-UNDQYTRF.cjs.map} +1 -1
- package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
- package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
- package/dist/{chunk-24EDG4PC.cjs → chunk-VBL3SHWX.cjs} +50 -50
- package/dist/{chunk-24EDG4PC.cjs.map → chunk-VBL3SHWX.cjs.map} +1 -1
- package/dist/{chunk-3A7QWUAW.cjs → chunk-VKH3BEZE.cjs} +3 -3
- package/dist/{chunk-3A7QWUAW.cjs.map → chunk-VKH3BEZE.cjs.map} +1 -1
- package/dist/{chunk-X5LANJDZ.cjs → chunk-VTYJAZDU.cjs} +23 -15
- package/dist/chunk-VTYJAZDU.cjs.map +1 -0
- package/dist/{chunk-B3LZITVF.cjs → chunk-WW6LXQY6.cjs} +12 -12
- package/dist/{chunk-B3LZITVF.cjs.map → chunk-WW6LXQY6.cjs.map} +1 -1
- package/dist/{chunk-NJCK6V6U.cjs → chunk-XKDUPU7B.cjs} +4 -4
- package/dist/{chunk-NJCK6V6U.cjs.map → chunk-XKDUPU7B.cjs.map} +1 -1
- package/dist/{chunk-42TURFHF.cjs → chunk-YGBHY67W.cjs} +5 -5
- package/dist/{chunk-42TURFHF.cjs.map → chunk-YGBHY67W.cjs.map} +1 -1
- package/dist/connect/docx.cjs +24 -24
- package/dist/connect/index.cjs +983 -983
- package/dist/connect/viewer.cjs +34 -34
- package/dist/connection/docx/ConnectedNativeDocxEditor.js +10 -2
- package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
- package/dist/connection/viewer/ConnectedDocumentViewer.js +124 -21
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/VersionDropdown.d.ts +9 -0
- package/dist/connection/viewer/VersionDropdown.js +39 -0
- package/dist/connection/viewer/VersionDropdown.js.map +7 -0
- package/dist/connection/viewer/ViewerPdfPane.js +4 -1
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/useViewerBlobs.d.ts +3 -1
- package/dist/connection/viewer/useViewerBlobs.js +14 -8
- package/dist/connection/viewer/useViewerBlobs.js.map +2 -2
- package/dist/connection/viewer/useViewerTabs.js +10 -0
- package/dist/connection/viewer/useViewerTabs.js.map +2 -2
- package/dist/dashboards/index.cjs +1 -1
- package/dist/docx/DocxCommandMenu.d.ts +8 -0
- package/dist/docx/DocxCommandMenu.js +202 -0
- package/dist/docx/DocxCommandMenu.js.map +7 -0
- package/dist/docx/NativeDocxEditor.d.ts +4 -2
- package/dist/docx/NativeDocxEditor.js +51 -12
- package/dist/docx/NativeDocxEditor.js.map +2 -2
- package/dist/docx/RibbonMenu.d.ts +3 -1
- package/dist/docx/RibbonMenu.js +10 -3
- package/dist/docx/RibbonMenu.js.map +2 -2
- package/dist/docx/RibbonOverflow.d.ts +3 -0
- package/dist/docx/RibbonOverflow.js +24 -1
- package/dist/docx/RibbonOverflow.js.map +2 -2
- package/dist/docx/index.cjs +38 -38
- package/dist/docx/signatures/SignatureFields.d.ts +3 -1
- package/dist/docx/signatures/SignatureFields.js +17 -8
- package/dist/docx/signatures/SignatureFields.js.map +2 -2
- package/dist/embed/index.cjs +38 -38
- package/dist/files/index.cjs +224 -224
- package/dist/index.cjs +1590 -1590
- package/dist/settings/index.cjs +147 -147
- package/dist/shell/index.cjs +90 -90
- package/dist/studio/index.cjs +26 -26
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +55 -55
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/src/docx/styles.css +94 -0
- package/dist/ai-IM4A23YT.cjs.map +0 -1
- package/dist/chunk-A3T3IC3K.cjs.map +0 -1
- package/dist/chunk-CIHERNDO.cjs +0 -18
- package/dist/chunk-M6IKVKU5.cjs.map +0 -1
- package/dist/chunk-X5LANJDZ.cjs.map +0 -1
package/dist/connect/viewer.cjs
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkD7ICHGWM_cjs = require('../chunk-D7ICHGWM.cjs');
|
|
5
5
|
require('../chunk-4CIVQWAX.cjs');
|
|
6
6
|
var chunkPL7HUTM3_cjs = require('../chunk-PL7HUTM3.cjs');
|
|
7
|
-
require('../chunk-
|
|
8
|
-
require('../chunk-
|
|
9
|
-
require('../chunk-
|
|
10
|
-
require('../chunk-
|
|
11
|
-
require('../chunk-
|
|
7
|
+
require('../chunk-7TEUGFIL.cjs');
|
|
8
|
+
require('../chunk-UUENH4BJ.cjs');
|
|
9
|
+
require('../chunk-7X3FS5HQ.cjs');
|
|
10
|
+
require('../chunk-XKDUPU7B.cjs');
|
|
11
|
+
require('../chunk-5QUL5BZO.cjs');
|
|
12
12
|
require('../chunk-223D4727.cjs');
|
|
13
13
|
require('../chunk-SNUBQMIS.cjs');
|
|
14
|
-
require('../chunk-
|
|
14
|
+
require('../chunk-VTYJAZDU.cjs');
|
|
15
|
+
require('../chunk-P5AQYC4D.cjs');
|
|
16
|
+
require('../chunk-GQXPNIRE.cjs');
|
|
15
17
|
require('../chunk-4ONPEVTP.cjs');
|
|
16
18
|
require('../chunk-V3KLUWQQ.cjs');
|
|
17
|
-
require('../chunk-P5AQYC4D.cjs');
|
|
18
|
-
require('../chunk-WAV762GP.cjs');
|
|
19
19
|
require('../chunk-YYPZOEED.cjs');
|
|
20
20
|
require('../chunk-GNZAH6UI.cjs');
|
|
21
21
|
require('../chunk-JH6JTI76.cjs');
|
|
@@ -24,31 +24,42 @@ require('../chunk-DTMBAFIL.cjs');
|
|
|
24
24
|
require('../chunk-ZESMRGDV.cjs');
|
|
25
25
|
require('../chunk-VCEX7COE.cjs');
|
|
26
26
|
require('../chunk-34HQO4ZQ.cjs');
|
|
27
|
-
require('../chunk-
|
|
27
|
+
require('../chunk-CT3SLXB7.cjs');
|
|
28
|
+
require('../chunk-WW6LXQY6.cjs');
|
|
28
29
|
require('../chunk-MZZ3SBQL.cjs');
|
|
29
|
-
require('../chunk-
|
|
30
|
-
require('../chunk-
|
|
30
|
+
require('../chunk-4NPCDS2X.cjs');
|
|
31
|
+
require('../chunk-Q6DQGGP4.cjs');
|
|
31
32
|
require('../chunk-ZPPMAL5P.cjs');
|
|
32
33
|
require('../chunk-ORELHENJ.cjs');
|
|
33
34
|
require('../chunk-NWNVWO6L.cjs');
|
|
34
35
|
require('../chunk-SK6HQ46Q.cjs');
|
|
35
|
-
require('../chunk-MNIQDXM6.cjs');
|
|
36
|
-
require('../chunk-E3Y7RI3J.cjs');
|
|
37
36
|
require('../chunk-VLCY46K6.cjs');
|
|
38
|
-
require('../chunk-
|
|
37
|
+
require('../chunk-DEXUL3T6.cjs');
|
|
38
|
+
require('../chunk-6WMMZLEV.cjs');
|
|
39
|
+
require('../chunk-Z2XZ2D4N.cjs');
|
|
40
|
+
require('../chunk-YZSQ7F5K.cjs');
|
|
41
|
+
require('../chunk-MCXS6X37.cjs');
|
|
42
|
+
require('../chunk-KQF7POTG.cjs');
|
|
43
|
+
require('../chunk-VKH3BEZE.cjs');
|
|
44
|
+
require('../chunk-75BNMCUX.cjs');
|
|
39
45
|
require('../chunk-OEJQFPWO.cjs');
|
|
40
46
|
require('../chunk-OYXWQTHF.cjs');
|
|
41
47
|
require('../chunk-S237ORM3.cjs');
|
|
42
48
|
require('../chunk-II2OEXHW.cjs');
|
|
43
|
-
require('../chunk-
|
|
49
|
+
require('../chunk-FX3K6LNZ.cjs');
|
|
50
|
+
require('../chunk-LYTIQQQ2.cjs');
|
|
44
51
|
require('../chunk-3YEXZX4H.cjs');
|
|
45
52
|
require('../chunk-4PA6VCCR.cjs');
|
|
46
|
-
require('../chunk-
|
|
53
|
+
require('../chunk-MZ2KZXNU.cjs');
|
|
47
54
|
require('../chunk-AHDJXIUB.cjs');
|
|
55
|
+
require('../chunk-YVCOQHCE.cjs');
|
|
48
56
|
require('../chunk-RL2HI6NP.cjs');
|
|
49
57
|
require('../chunk-6UZC4XVV.cjs');
|
|
50
|
-
require('../chunk-
|
|
58
|
+
require('../chunk-QGVOT7E4.cjs');
|
|
59
|
+
require('../chunk-QRAQZTJE.cjs');
|
|
60
|
+
require('../chunk-UDSHVNU3.cjs');
|
|
51
61
|
require('../chunk-JV5TVUOU.cjs');
|
|
62
|
+
require('../chunk-IPSHAMO2.cjs');
|
|
52
63
|
require('../chunk-E7TE2WVT.cjs');
|
|
53
64
|
require('../chunk-EG7EJFUE.cjs');
|
|
54
65
|
require('../chunk-VG24E4JJ.cjs');
|
|
@@ -60,32 +71,21 @@ require('../chunk-HQDR43JC.cjs');
|
|
|
60
71
|
require('../chunk-JR2YSBD5.cjs');
|
|
61
72
|
require('../chunk-3YZKDCWY.cjs');
|
|
62
73
|
require('../chunk-SJSGSHIT.cjs');
|
|
63
|
-
require('../chunk-ZW6FPIFC.cjs');
|
|
64
|
-
require('../chunk-CT3SLXB7.cjs');
|
|
65
|
-
require('../chunk-DEXUL3T6.cjs');
|
|
66
|
-
require('../chunk-6WMMZLEV.cjs');
|
|
67
|
-
require('../chunk-Z2XZ2D4N.cjs');
|
|
68
|
-
require('../chunk-YZSQ7F5K.cjs');
|
|
69
|
-
require('../chunk-MCXS6X37.cjs');
|
|
70
|
-
require('../chunk-KQF7POTG.cjs');
|
|
71
|
-
require('../chunk-75BNMCUX.cjs');
|
|
72
|
-
require('../chunk-FX3K6LNZ.cjs');
|
|
73
|
-
require('../chunk-QGVOT7E4.cjs');
|
|
74
|
-
require('../chunk-QRAQZTJE.cjs');
|
|
75
|
-
require('../chunk-UDSHVNU3.cjs');
|
|
76
|
-
require('../chunk-IPSHAMO2.cjs');
|
|
77
74
|
require('../chunk-PPCATBOY.cjs');
|
|
75
|
+
require('../chunk-ZW6FPIFC.cjs');
|
|
76
|
+
require('../chunk-LJJJ6CYH.cjs');
|
|
77
|
+
require('../chunk-MNIQDXM6.cjs');
|
|
78
|
+
require('../chunk-E3Y7RI3J.cjs');
|
|
78
79
|
require('../chunk-TKHCIHE2.cjs');
|
|
79
80
|
require('../chunk-JDFBEGQO.cjs');
|
|
80
81
|
require('../chunk-ULWRNGGE.cjs');
|
|
81
|
-
require('../chunk-LJJJ6CYH.cjs');
|
|
82
82
|
require('../chunk-PLIF5CUV.cjs');
|
|
83
83
|
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
Object.defineProperty(exports, "ConnectedDocumentViewer", {
|
|
87
87
|
enumerable: true,
|
|
88
|
-
get: function () { return
|
|
88
|
+
get: function () { return chunkD7ICHGWM_cjs.ConnectedDocumentViewer; }
|
|
89
89
|
});
|
|
90
90
|
Object.defineProperty(exports, "ConnectedDocumentToolsProvider", {
|
|
91
91
|
enumerable: true,
|
|
@@ -106,8 +106,16 @@ function useConnectedNativeDocxAdapter(fontBaseUrl = "/native-docx/fonts") {
|
|
|
106
106
|
onDirtyChange: support.onDirtyChange,
|
|
107
107
|
// The document's row moves to the saved version in place: through the host when it keeps
|
|
108
108
|
// the lists (its document tools refresh them), else here.
|
|
109
|
-
onVersionSaved: async (id) => {
|
|
110
|
-
|
|
109
|
+
onVersionSaved: async (id, version) => {
|
|
110
|
+
if (onDocumentsChanged) await onDocumentsChanged([id], "version");
|
|
111
|
+
if (version || !onDocumentsChanged) {
|
|
112
|
+
const fresh = await refreshDocuments(queries, arbi, [id]);
|
|
113
|
+
if (version && !fresh.some((doc) => doc.external_id === id && (doc.current_version ?? 0) >= version)) {
|
|
114
|
+
throw new Error(
|
|
115
|
+
"The version was saved, but its current status could not be confirmed. Please try again."
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
111
119
|
},
|
|
112
120
|
notify,
|
|
113
121
|
mentions: members?.map(({ user: member }) => ({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/connection/docx/ConnectedNativeDocxEditor.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useMemo, useRef, useState } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { refreshDocuments, useArbi, useWorkspaceUsers } from '@arbidocs/react'\nimport {\n fetchSavedSignature,\n storeSavedSignature,\n useOptionalDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport type { NativeDocxAdapter, NativeDocxEditorProps } from '../../docx/NativeDocxEditor'\nimport { NativeDocxEditor } from '../../docx/lazy'\nimport { useRegisterOpenDocument } from '@arbidocs/react/shell'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useDocxCommentTarget, useNativeDocxSupport } from './support'\nimport { useConnectedDocxReferences } from './useConnectedDocxReferences'\nimport { useConnectedHouseTemplate } from './useConnectedHouseTemplate'\n\nexport type ConnectedNativeDocxEditorProps = Omit<NativeDocxEditorProps, 'adapter' | 'compact'> & {\n fontBaseUrl?: string\n}\n\n/**\n * The native Word editor on the signed-in ARBI session, under any host (`defaultHost`'s sign-in\n * layer, or the host's own `arbi` and session state). Until a live session has opened, a failure to\n * open one falls back to the saved copy, read-only, so the document is still readable; later token\n * refreshes are not guarded (switching modes would drop unsaved edits).\n */\nexport function ConnectedNativeDocxEditor({\n fontBaseUrl = '/native-docx/fonts',\n ...props\n}: ConnectedNativeDocxEditorProps) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n const { workspaceId } = useConnectedWorkspace()\n const commentTarget = useDocxCommentTarget()\n const [openFailed, setOpenFailed] = useState(false)\n const hasOpened = useRef(false)\n const guardedAdapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...adapter,\n open: async (documentId) => {\n try {\n const session = await adapter.open(documentId)\n hasOpened.current = true\n return session\n } catch (error) {\n if (!hasOpened.current) setOpenFailed(true)\n throw error\n }\n },\n }),\n [adapter]\n )\n // Drafting mode: the saved Word document being edited is what the chat is about. A history\n // snapshot, a streamed preview, an unsaved draft and an embedded body field are not.\n const live = !props.snapshot && !props.stream && !props.draftContent\n useRegisterOpenDocument({ documentId: live ? props.documentId : null, workspaceId })\n const initialCommentId =\n props.initialCommentId ??\n (commentTarget?.documentId === props.documentId ? commentTarget.commentId : undefined)\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {openFailed && (\n <p role=\"status\" className=\"text-muted-foreground border-b px-3 py-2 text-xs\">\n Co-editing isn't available for this document right now, so this is a read-only copy\n of the last saved version.\n </p>\n )}\n <div className=\"min-h-0 flex-1\">\n <NativeDocxEditor\n {...props}\n snapshot={props.snapshot || openFailed}\n initialCommentId={initialCommentId}\n adapter={guardedAdapter}\n />\n </div>\n </div>\n )\n}\n\n/** The access token changed (a refresh): the live room is told the new one. */\nfunction tokenChanges(arbi: ReturnType<typeof useArbi>) {\n return (listener: () => void) => {\n if (!arbi.isLoggedIn) return () => {}\n const session = arbi.getClient().session\n let token = session.getState().accessToken\n return session.subscribe((state) => {\n if (state.accessToken === token) return\n token = state.accessToken\n listener()\n })\n }\n}\n\n/**\n * The native Word adapter on the signed-in session: the editor transport, the people to mention,\n * cross-references, the house template, and the host's extras (its host config's `docx`).\n */\nexport function useConnectedNativeDocxAdapter(fontBaseUrl = '/native-docx/fonts') {\n const arbi = useArbi()\n const { workspaceId, live, user, ensureWorkspaceOpen } = useConnectedWorkspace()\n const queries = useQueryClient()\n const { notify } = useBlocksEnvironment()\n const tools = useOptionalDocumentTools()\n const support = useNativeDocxSupport()\n const references = useConnectedDocxReferences()\n const houseTemplate = useConnectedHouseTemplate()\n const { data: members } = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const onDocumentsChanged = tools?.onDocumentsChanged\n // Tracked changes and comments are authored by the user's first name.\n const author = (live && arbi.user.profile()?.givenName) || user?.name || 'You'\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n request: async (path, options) => {\n await ensureWorkspaceOpen()\n return arbi.editor.request(path, options)\n },\n open: async (id) => {\n await ensureWorkspaceOpen()\n return (\n await arbi.editor.request(`/${encodeURIComponent(id)}/session`, { method: 'POST' })\n ).json()\n },\n save: async (id, state) =>\n (\n await arbi.editor.request(`/${encodeURIComponent(id)}/save`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ state }),\n })\n ).json(),\n loadFonts: () => import('../../docx/fonts').then((m) => m.loadDocxFonts(fontBaseUrl)),\n baseUrl: arbi.getConnectionInfo()?.baseUrl || window.location.origin,\n author,\n subscribeTokenChanges: tokenChanges(arbi),\n onDirtyChange: support.onDirtyChange,\n // The document's row moves to the saved version in place: through the host when it keeps\n // the lists (its document tools refresh them), else here.\n onVersionSaved: async (id) => {\n
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { useMemo, useRef, useState } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { refreshDocuments, useArbi, useWorkspaceUsers } from '@arbidocs/react'\nimport {\n fetchSavedSignature,\n storeSavedSignature,\n useOptionalDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport type { NativeDocxAdapter, NativeDocxEditorProps } from '../../docx/NativeDocxEditor'\nimport { NativeDocxEditor } from '../../docx/lazy'\nimport { useRegisterOpenDocument } from '@arbidocs/react/shell'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useDocxCommentTarget, useNativeDocxSupport } from './support'\nimport { useConnectedDocxReferences } from './useConnectedDocxReferences'\nimport { useConnectedHouseTemplate } from './useConnectedHouseTemplate'\n\nexport type ConnectedNativeDocxEditorProps = Omit<NativeDocxEditorProps, 'adapter' | 'compact'> & {\n fontBaseUrl?: string\n}\n\n/**\n * The native Word editor on the signed-in ARBI session, under any host (`defaultHost`'s sign-in\n * layer, or the host's own `arbi` and session state). Until a live session has opened, a failure to\n * open one falls back to the saved copy, read-only, so the document is still readable; later token\n * refreshes are not guarded (switching modes would drop unsaved edits).\n */\nexport function ConnectedNativeDocxEditor({\n fontBaseUrl = '/native-docx/fonts',\n ...props\n}: ConnectedNativeDocxEditorProps) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n const { workspaceId } = useConnectedWorkspace()\n const commentTarget = useDocxCommentTarget()\n const [openFailed, setOpenFailed] = useState(false)\n const hasOpened = useRef(false)\n const guardedAdapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...adapter,\n open: async (documentId) => {\n try {\n const session = await adapter.open(documentId)\n hasOpened.current = true\n return session\n } catch (error) {\n if (!hasOpened.current) setOpenFailed(true)\n throw error\n }\n },\n }),\n [adapter]\n )\n // Drafting mode: the saved Word document being edited is what the chat is about. A history\n // snapshot, a streamed preview, an unsaved draft and an embedded body field are not.\n const live = !props.snapshot && !props.stream && !props.draftContent\n useRegisterOpenDocument({ documentId: live ? props.documentId : null, workspaceId })\n const initialCommentId =\n props.initialCommentId ??\n (commentTarget?.documentId === props.documentId ? commentTarget.commentId : undefined)\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {openFailed && (\n <p role=\"status\" className=\"text-muted-foreground border-b px-3 py-2 text-xs\">\n Co-editing isn't available for this document right now, so this is a read-only copy\n of the last saved version.\n </p>\n )}\n <div className=\"min-h-0 flex-1\">\n <NativeDocxEditor\n {...props}\n snapshot={props.snapshot || openFailed}\n initialCommentId={initialCommentId}\n adapter={guardedAdapter}\n />\n </div>\n </div>\n )\n}\n\n/** The access token changed (a refresh): the live room is told the new one. */\nfunction tokenChanges(arbi: ReturnType<typeof useArbi>) {\n return (listener: () => void) => {\n if (!arbi.isLoggedIn) return () => {}\n const session = arbi.getClient().session\n let token = session.getState().accessToken\n return session.subscribe((state) => {\n if (state.accessToken === token) return\n token = state.accessToken\n listener()\n })\n }\n}\n\n/**\n * The native Word adapter on the signed-in session: the editor transport, the people to mention,\n * cross-references, the house template, and the host's extras (its host config's `docx`).\n */\nexport function useConnectedNativeDocxAdapter(fontBaseUrl = '/native-docx/fonts') {\n const arbi = useArbi()\n const { workspaceId, live, user, ensureWorkspaceOpen } = useConnectedWorkspace()\n const queries = useQueryClient()\n const { notify } = useBlocksEnvironment()\n const tools = useOptionalDocumentTools()\n const support = useNativeDocxSupport()\n const references = useConnectedDocxReferences()\n const houseTemplate = useConnectedHouseTemplate()\n const { data: members } = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const onDocumentsChanged = tools?.onDocumentsChanged\n // Tracked changes and comments are authored by the user's first name.\n const author = (live && arbi.user.profile()?.givenName) || user?.name || 'You'\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n request: async (path, options) => {\n await ensureWorkspaceOpen()\n return arbi.editor.request(path, options)\n },\n open: async (id) => {\n await ensureWorkspaceOpen()\n return (\n await arbi.editor.request(`/${encodeURIComponent(id)}/session`, { method: 'POST' })\n ).json()\n },\n save: async (id, state) =>\n (\n await arbi.editor.request(`/${encodeURIComponent(id)}/save`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ state }),\n })\n ).json(),\n loadFonts: () => import('../../docx/fonts').then((m) => m.loadDocxFonts(fontBaseUrl)),\n baseUrl: arbi.getConnectionInfo()?.baseUrl || window.location.origin,\n author,\n subscribeTokenChanges: tokenChanges(arbi),\n onDirtyChange: support.onDirtyChange,\n // The document's row moves to the saved version in place: through the host when it keeps\n // the lists (its document tools refresh them), else here.\n onVersionSaved: async (id, version) => {\n if (onDocumentsChanged) await onDocumentsChanged([id], 'version')\n if (version || !onDocumentsChanged) {\n const fresh = await refreshDocuments(queries, arbi, [id])\n if (\n version &&\n !fresh.some((doc) => doc.external_id === id && (doc.current_version ?? 0) >= version)\n ) {\n throw new Error(\n 'The version was saved, but its current status could not be confirmed. Please try again.'\n )\n }\n }\n },\n notify,\n mentions: members?.map(({ user: member }) => ({\n id: member.external_id,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n kind: member.external_id.startsWith('agt-') ? 'agent' : 'human',\n })),\n savedSignature: {\n load: () => fetchSavedSignature(arbi.getClient().fetch),\n save: (signature) => storeSavedSignature(arbi.getClient().fetch, signature),\n defaultName: user?.name ?? '',\n },\n signatureSigners: members\n ?.filter(({ user: member }) => member.external_id.startsWith('usr-'))\n .map(({ user: member }) => ({\n email: member.email,\n name: [member.given_name, member.family_name].filter(Boolean).join(' '),\n })),\n requestAgent: async (id, request) => {\n const response = await arbi.editor.request(`/${encodeURIComponent(id)}/mentions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n comment_id: request.commentId,\n instruction: request.instruction,\n request_id: request.requestId,\n recipient_ids: request.recipientIds,\n }),\n })\n const delivery = (await response.json()) as { response_ids: string[] }\n notify('Mention delivered.', 'success')\n return { responseIds: delivery.response_ids || [] }\n },\n getAgentStatus: async (responseId) => (await arbi.assistant.getResponse(responseId)).status,\n definitions: support.definitions,\n references,\n imageGeneration: support.imageGeneration,\n houseTemplate,\n }),\n [\n arbi,\n author,\n members,\n ensureWorkspaceOpen,\n fontBaseUrl,\n queries,\n notify,\n onDocumentsChanged,\n support,\n references,\n houseTemplate,\n user?.name,\n ]\n )\n return adapter\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -92,6 +92,7 @@ import { useViewedDocument } from "./useViewedDocument.js";
|
|
|
92
92
|
import { useViewerBlobs } from "./useViewerBlobs.js";
|
|
93
93
|
import { useViewerTabs } from "./useViewerTabs.js";
|
|
94
94
|
import { useViewerVersions } from "./useViewerVersions.js";
|
|
95
|
+
import { VersionDropdown } from "./VersionDropdown.js";
|
|
95
96
|
import { ParsedTextView } from "./parsed/ParsedTextView.js";
|
|
96
97
|
import { ViewerPdfPane } from "./ViewerPdfPane.js";
|
|
97
98
|
import { ConnectedNativeDocxEditor as NativeDocxEditor } from "../docx/ConnectedNativeDocxEditor.js";
|
|
@@ -205,10 +206,15 @@ function DocumentViewerContent({
|
|
|
205
206
|
const threadTitle = (id) => conversations.find((c) => c.external_id === id)?.title?.trim() || "Its thread";
|
|
206
207
|
const madeInId = documentData?.conversation_ext_id ?? null;
|
|
207
208
|
const madeIn = madeInId ? { id: madeInId, title: threadTitle(madeInId) } : null;
|
|
208
|
-
const pdfSnapshotId = snapshotDocumentId && !
|
|
209
|
+
const pdfSnapshotId = snapshotDocumentId && (!isArtifact || isDocx) ? snapshotDocumentId : null;
|
|
209
210
|
const shownDocumentId = pdfSnapshotId || documentId;
|
|
210
211
|
const blobs = useViewerBlobs(shownDocumentId, doc);
|
|
211
|
-
const
|
|
212
|
+
const [minimumPdfVersion, setMinimumPdfVersion] = useState(null);
|
|
213
|
+
useEffect(() => setMinimumPdfVersion(null), [documentId]);
|
|
214
|
+
const versionReady = !!pdfSnapshotId || minimumPdfVersion === null || (documentData?.current_version ?? 0) >= minimumPdfVersion;
|
|
215
|
+
const { xlsxBlob, xlsxError, handleDirectDownload } = blobs;
|
|
216
|
+
const pdfBlob = versionReady ? blobs.pdfBlob : null;
|
|
217
|
+
const pdfVerified = !!pdfBlob && blobs.pdfVerified !== false;
|
|
212
218
|
const [annotating, setAnnotating] = useState(false);
|
|
213
219
|
const [sharingFile, setSharingFile] = useState(false);
|
|
214
220
|
useEffect(() => setAnnotating(false), [documentId]);
|
|
@@ -216,7 +222,52 @@ function DocumentViewerContent({
|
|
|
216
222
|
null
|
|
217
223
|
);
|
|
218
224
|
const hasHistory = versions.length > 1 || (documentData?.current_version ?? 1) > 1 || translations.length > 0;
|
|
219
|
-
const {
|
|
225
|
+
const {
|
|
226
|
+
activeTab,
|
|
227
|
+
handleTabChange: changeTab,
|
|
228
|
+
viewerTabs
|
|
229
|
+
} = useViewerTabs(doc, isCompact, hasHistory);
|
|
230
|
+
const saveWordRef = useRef(null);
|
|
231
|
+
const transitionPending = useRef(false);
|
|
232
|
+
const transitionKey = JSON.stringify([openedId, doc.workspaceId]);
|
|
233
|
+
const transitionScope = useRef({ key: transitionKey, generation: 0 });
|
|
234
|
+
if (transitionScope.current.key !== transitionKey) {
|
|
235
|
+
transitionScope.current = {
|
|
236
|
+
key: transitionKey,
|
|
237
|
+
generation: transitionScope.current.generation + 1
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
useEffect(
|
|
241
|
+
() => () => {
|
|
242
|
+
transitionScope.current.generation += 1;
|
|
243
|
+
},
|
|
244
|
+
[]
|
|
245
|
+
);
|
|
246
|
+
const requestViewerTransition = async (transition) => {
|
|
247
|
+
if (transitionPending.current) return false;
|
|
248
|
+
const leavingWord = isDocx && !isDraft && !isStreaming && !snapshotDocumentId && (activeTab === "docx" || isArtifact && !liveKind && activeTab === "edit");
|
|
249
|
+
if (leavingWord) {
|
|
250
|
+
transitionPending.current = true;
|
|
251
|
+
const generation = transitionScope.current.generation;
|
|
252
|
+
try {
|
|
253
|
+
const saved = saveWordRef.current && await saveWordRef.current();
|
|
254
|
+
if (!saved) {
|
|
255
|
+
notify("Could not save the current document. Stay in the editor and try again.", "error");
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
if (generation !== transitionScope.current.generation) return false;
|
|
259
|
+
if (typeof saved === "number") setMinimumPdfVersion(saved);
|
|
260
|
+
} finally {
|
|
261
|
+
transitionPending.current = false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
transition();
|
|
265
|
+
return true;
|
|
266
|
+
};
|
|
267
|
+
const handleTabChange = (tab) => {
|
|
268
|
+
if (tab === activeTab) return;
|
|
269
|
+
void requestViewerTransition(() => changeTab(tab));
|
|
270
|
+
};
|
|
220
271
|
const crop = useImageCrop(
|
|
221
272
|
documentId,
|
|
222
273
|
documentData?.file_name,
|
|
@@ -226,15 +277,31 @@ function DocumentViewerContent({
|
|
|
226
277
|
const [placingSignature, setPlacingSignature] = useState(false);
|
|
227
278
|
const [signAppearance, setSignAppearance] = useState();
|
|
228
279
|
const [isSignOpen, setIsSignOpen] = useState(false);
|
|
229
|
-
|
|
280
|
+
const signingScope = JSON.stringify([
|
|
281
|
+
documentId,
|
|
282
|
+
snapshotDocumentId,
|
|
283
|
+
documentData?.current_version
|
|
284
|
+
]);
|
|
285
|
+
const signingScopeRef = useRef(signingScope);
|
|
286
|
+
const signingScopeMatches = signingScopeRef.current === signingScope;
|
|
287
|
+
useEffect(() => {
|
|
288
|
+
setPlacingSignature(false);
|
|
289
|
+
setIsSignOpen(false);
|
|
290
|
+
setSignAppearance(void 0);
|
|
291
|
+
signingScopeRef.current = signingScope;
|
|
292
|
+
}, [signingScope]);
|
|
230
293
|
const [signatureFlow, setSignatureFlow] = useState(null);
|
|
231
|
-
useEffect(() => setSignatureFlow(null), [
|
|
232
|
-
const
|
|
294
|
+
useEffect(() => setSignatureFlow(null), [signingScope]);
|
|
295
|
+
const signatureDocumentId = pdfSnapshotId || (documentData?.current_version ? `${documentId}@v${documentData.current_version}` : documentId);
|
|
296
|
+
const { data: signatureStatus } = useDocumentSignatures(
|
|
297
|
+
signatureDocumentId,
|
|
298
|
+
!isDraft && !liveKind
|
|
299
|
+
);
|
|
233
300
|
const isCoEditing = !snapshotDocumentId && !compareDocumentId && !isDraft && (activeTab === "docx" && isDocx || activeTab === "edit" && isArtifact && !liveKind && !isStreaming);
|
|
234
301
|
const currentVersionLabel = isCoEditing ? void 0 : !snapshotDocumentId && !compareDocumentId && (isDocx || isArtifact && !liveKind) ? "Live" : versionLabel(versions, snapshotDocumentId || documentId);
|
|
235
302
|
const compareVersionLabel = versionLabel(versions, compareDocumentId);
|
|
236
303
|
const snapshotNumber = findVersion(versions, snapshotDocumentId)?.number;
|
|
237
|
-
const pdfSnapshotNumber = pdfSnapshotId ?
|
|
304
|
+
const pdfSnapshotNumber = pdfSnapshotId ? parseVersionRef(pdfSnapshotId).version ?? void 0 : void 0;
|
|
238
305
|
const isSigned = !!signatureStatus?.signed;
|
|
239
306
|
const markup = useDocumentMarkup(documentData, pdfSnapshotNumber, isSigned);
|
|
240
307
|
useEffect(() => {
|
|
@@ -314,12 +381,37 @@ function DocumentViewerContent({
|
|
|
314
381
|
// A draft's kind replaces the tabs: neither Versions nor the text view means anything
|
|
315
382
|
// before the first save.
|
|
316
383
|
/* @__PURE__ */ jsx(ViewerDraftKind, { documentId })
|
|
317
|
-
) : /* @__PURE__ */
|
|
384
|
+
) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
385
|
+
/* @__PURE__ */ jsx(
|
|
386
|
+
ViewerTabBar,
|
|
387
|
+
{
|
|
388
|
+
tabs: viewerTabs.filter((tab) => tab.id !== "versions"),
|
|
389
|
+
activeId: activeTab,
|
|
390
|
+
onChange: handleTabChange
|
|
391
|
+
}
|
|
392
|
+
),
|
|
393
|
+
(isArtifact || isDocx || hasHistory) && !liveKind && !isComparing && /* @__PURE__ */ jsx(
|
|
394
|
+
VersionDropdown,
|
|
395
|
+
{
|
|
396
|
+
versions,
|
|
397
|
+
activeId: snapshotDocumentId ?? (currentVersionId === documentId && documentData?.current_version ? `${documentId}@v${documentData.current_version}` : currentVersionId),
|
|
398
|
+
isSnapshot: !!snapshotDocumentId,
|
|
399
|
+
onOpen: (id) => {
|
|
400
|
+
void requestViewerTransition(() => {
|
|
401
|
+
setSnapshotDocumentId(id === currentVersionId ? null : id);
|
|
402
|
+
if (activeTab === "versions")
|
|
403
|
+
setActiveTab(isArtifact ? "edit" : isDocx ? "docx" : "pdf");
|
|
404
|
+
});
|
|
405
|
+
},
|
|
406
|
+
onHistory: () => handleTabChange("versions")
|
|
407
|
+
}
|
|
408
|
+
)
|
|
409
|
+
] }),
|
|
318
410
|
!isCompact && titleBlock
|
|
319
411
|
] });
|
|
320
412
|
const annotatable = canAnnotate({
|
|
321
413
|
activeTab,
|
|
322
|
-
hasPdf:
|
|
414
|
+
hasPdf: pdfVerified,
|
|
323
415
|
isImage,
|
|
324
416
|
isVideo,
|
|
325
417
|
isAudio,
|
|
@@ -335,14 +427,18 @@ function DocumentViewerContent({
|
|
|
335
427
|
documentId,
|
|
336
428
|
hidden: !!signatureFlow,
|
|
337
429
|
onSign: (request) => {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
430
|
+
void requestViewerTransition(() => {
|
|
431
|
+
setAnnotating(false);
|
|
432
|
+
setPlacingSignature(false);
|
|
433
|
+
if (activeTab !== "pdf") changeTab("pdf");
|
|
434
|
+
setSignatureFlow({ kind: "sign", request });
|
|
435
|
+
});
|
|
342
436
|
},
|
|
343
437
|
onEditDraft: (draft) => {
|
|
344
|
-
|
|
345
|
-
|
|
438
|
+
void requestViewerTransition(() => {
|
|
439
|
+
if (activeTab !== "pdf") changeTab("pdf");
|
|
440
|
+
setSignatureFlow({ kind: "prepare", draft });
|
|
441
|
+
});
|
|
346
442
|
}
|
|
347
443
|
}
|
|
348
444
|
);
|
|
@@ -579,7 +675,7 @@ function DocumentViewerContent({
|
|
|
579
675
|
] })
|
|
580
676
|
] })
|
|
581
677
|
] }),
|
|
582
|
-
isSignOpen && pdfBlob && /* @__PURE__ */ jsx(
|
|
678
|
+
isSignOpen && pdfBlob && pdfVerified && signingScopeMatches && /* @__PURE__ */ jsx(
|
|
583
679
|
SignDocumentDialog,
|
|
584
680
|
{
|
|
585
681
|
open: isSignOpen,
|
|
@@ -654,9 +750,14 @@ function DocumentViewerContent({
|
|
|
654
750
|
}
|
|
655
751
|
) }),
|
|
656
752
|
isCaptureDraft && /* @__PURE__ */ jsx(ViewerCaptureDraft, { documentId }),
|
|
657
|
-
!isCaptureDraft && (activeTab === "pdf" || isMedia && activeTab === "html") && !isArtifact && !isComparing && /* @__PURE__ */ jsxs(ViewerPane, { hidden: activeTab !== "pdf", children: [
|
|
753
|
+
!isCaptureDraft && (activeTab === "pdf" || isMedia && activeTab === "html") && (!isArtifact || isDocx && !isDraft && !isStreaming && !liveKind) && !isComparing && /* @__PURE__ */ jsxs(ViewerPane, { hidden: activeTab !== "pdf", children: [
|
|
658
754
|
/* @__PURE__ */ jsx(DocumentLabelBar, { summaries: labelSummaries }),
|
|
659
755
|
!isMedia && !isImage && signatureBanner,
|
|
756
|
+
activeTab === "pdf" && pdfBlob && !pdfVerified && /* @__PURE__ */ jsxs(ViewerMessage, { children: [
|
|
757
|
+
"Offline copy: its version cannot be verified. Reconnect before signing.",
|
|
758
|
+
" ",
|
|
759
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => void blobs.retryPdf(), className: "underline", children: "Retry loading the current PDF" })
|
|
760
|
+
] }),
|
|
660
761
|
activeTab === "pdf" && !isMedia && !isImage && /* @__PURE__ */ jsx(
|
|
661
762
|
MarkupNotices,
|
|
662
763
|
{
|
|
@@ -671,14 +772,14 @@ function DocumentViewerContent({
|
|
|
671
772
|
documentId,
|
|
672
773
|
doc,
|
|
673
774
|
pdfBlob,
|
|
674
|
-
isPdfLoading: blobs.isPdfLoading,
|
|
775
|
+
isPdfLoading: !versionReady || blobs.isPdfLoading,
|
|
675
776
|
pdfError: blobs.pdfError,
|
|
676
777
|
onDownload: () => void handleDirectDownload(),
|
|
677
778
|
viewerProps,
|
|
678
|
-
signatureFlow,
|
|
779
|
+
signatureFlow: pdfVerified && signingScopeMatches ? signatureFlow : null,
|
|
679
780
|
onSignatureFlow: setSignatureFlow,
|
|
680
781
|
currentUserId,
|
|
681
|
-
placingSignature,
|
|
782
|
+
placingSignature: pdfVerified && signingScopeMatches && placingSignature,
|
|
682
783
|
onPlacingDone: (appearance) => {
|
|
683
784
|
setPlacingSignature(false);
|
|
684
785
|
if (!appearance) return;
|
|
@@ -713,6 +814,7 @@ function DocumentViewerContent({
|
|
|
713
814
|
title: documentTitle,
|
|
714
815
|
draftContent: isDraft ? draftDoc?.content || "" : void 0,
|
|
715
816
|
snapshot: !!snapshotDocumentId,
|
|
817
|
+
saveRef: saveWordRef,
|
|
716
818
|
onSaved: (id) => {
|
|
717
819
|
if (!isDraft) return;
|
|
718
820
|
session.clearDraftDocument(documentId);
|
|
@@ -756,7 +858,8 @@ function DocumentViewerContent({
|
|
|
756
858
|
{
|
|
757
859
|
documentId: snapshotDocumentId || documentId,
|
|
758
860
|
title: documentTitle,
|
|
759
|
-
snapshot: !!snapshotDocumentId
|
|
861
|
+
snapshot: !!snapshotDocumentId,
|
|
862
|
+
saveRef: saveWordRef
|
|
760
863
|
},
|
|
761
864
|
`${snapshotDocumentId || documentId}-${snapshotDocumentId ? "snapshot" : "live"}`
|
|
762
865
|
)
|