@arbidocs/blocks 0.4.157 → 0.4.159
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/{ConnectedNativeDocxComparison-S25BPUH5.cjs → ConnectedNativeDocxComparison-R6RU5TZE.cjs} +8 -7
- package/dist/{ConnectedNativeDocxComparison-S25BPUH5.cjs.map → ConnectedNativeDocxComparison-R6RU5TZE.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js → ConnectedNativeDocxComparison-XMZ5KLD4.js} +7 -6
- package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js.map → ConnectedNativeDocxComparison-XMZ5KLD4.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs → ConnectedNativeDocxEditor-LBATSM3M.cjs} +7 -6
- package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs.map → ConnectedNativeDocxEditor-LBATSM3M.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js → ConnectedNativeDocxEditor-NGUK2AX6.js} +5 -4
- package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js.map → ConnectedNativeDocxEditor-NGUK2AX6.js.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-EXYZAU4Y.cjs → ConnectedStreamedWordArtifact-CWFR6A37.cjs} +8 -7
- package/dist/ConnectedStreamedWordArtifact-CWFR6A37.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js → ConnectedStreamedWordArtifact-IXRJ7MUE.js} +7 -6
- package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js.map → ConnectedStreamedWordArtifact-IXRJ7MUE.js.map} +1 -1
- package/dist/{NativeDocxEditor-M3I776GD.cjs → NativeDocxEditor-T2PJIZMU.cjs} +9 -7
- package/dist/{NativeDocxEditor-M3I776GD.cjs.map → NativeDocxEditor-T2PJIZMU.cjs.map} +1 -1
- package/dist/{NativeDocxEditor-JBQMH3MP.js → NativeDocxEditor-TBTBD6TC.js} +5 -3
- package/dist/{NativeDocxEditor-JBQMH3MP.js.map → NativeDocxEditor-TBTBD6TC.js.map} +1 -1
- package/dist/{WorkspaceTableView-5OWX53R5.js → WorkspaceTableView-DWUE4VQF.js} +19 -9
- package/dist/WorkspaceTableView-DWUE4VQF.js.map +1 -0
- package/dist/{WorkspaceTableView-ZFMAYHUD.cjs → WorkspaceTableView-EYLEUZZT.cjs} +21 -11
- package/dist/WorkspaceTableView-EYLEUZZT.cjs.map +1 -0
- package/dist/{chunk-IJEISII2.cjs → chunk-2BHDRVVL.cjs} +17 -7
- package/dist/chunk-2BHDRVVL.cjs.map +1 -0
- package/dist/chunk-2R3GGNPA.js +151 -0
- package/dist/chunk-2R3GGNPA.js.map +1 -0
- package/dist/{chunk-F3EZDBDJ.js → chunk-3OCNUKGX.js} +4 -4
- package/dist/{chunk-F3EZDBDJ.js.map → chunk-3OCNUKGX.js.map} +1 -1
- package/dist/{chunk-D3WFIFRY.cjs → chunk-3VW7ZXQ6.cjs} +211 -5
- package/dist/chunk-3VW7ZXQ6.cjs.map +1 -0
- package/dist/{chunk-JSQEAPTC.cjs → chunk-4GITK3Q5.cjs} +398 -75
- package/dist/chunk-4GITK3Q5.cjs.map +1 -0
- package/dist/{chunk-2CWM2CFZ.js → chunk-7UENVUA6.js} +4 -4
- package/dist/{chunk-2CWM2CFZ.js.map → chunk-7UENVUA6.js.map} +1 -1
- package/dist/{chunk-EWCJXUBP.js → chunk-AVXRXPII.js} +3 -3
- package/dist/{chunk-EWCJXUBP.js.map → chunk-AVXRXPII.js.map} +1 -1
- package/dist/{chunk-7IRSCMNK.js → chunk-BGXWPVHR.js} +3 -3
- package/dist/{chunk-7IRSCMNK.js.map → chunk-BGXWPVHR.js.map} +1 -1
- package/dist/chunk-DAN7EJ4O.js +482 -0
- package/dist/chunk-DAN7EJ4O.js.map +1 -0
- package/dist/chunk-E4H5H2C3.cjs +18 -0
- package/dist/{chunk-OTU5KGQ6.cjs.map → chunk-E4H5H2C3.cjs.map} +1 -1
- package/dist/{chunk-VY4UFXTM.cjs → chunk-ETJFC6MO.cjs} +4 -4
- package/dist/{chunk-VY4UFXTM.cjs.map → chunk-ETJFC6MO.cjs.map} +1 -1
- package/dist/{chunk-TQIY2SVY.cjs → chunk-GFVIFXWT.cjs} +5 -5
- package/dist/{chunk-TQIY2SVY.cjs.map → chunk-GFVIFXWT.cjs.map} +1 -1
- package/dist/chunk-JPWPR6QU.cjs +485 -0
- package/dist/chunk-JPWPR6QU.cjs.map +1 -0
- package/dist/{chunk-KQYPP72K.js → chunk-JTJCCL2E.js} +212 -9
- package/dist/chunk-JTJCCL2E.js.map +1 -0
- package/dist/{chunk-PGOSIJ2I.js → chunk-KFMRBZQK.js} +15 -5
- package/dist/chunk-KFMRBZQK.js.map +1 -0
- package/dist/chunk-NMZI3K6R.cjs +159 -0
- package/dist/chunk-NMZI3K6R.cjs.map +1 -0
- package/dist/{chunk-53RCZPMR.cjs → chunk-P2YM67Y5.cjs} +5 -5
- package/dist/{chunk-53RCZPMR.cjs.map → chunk-P2YM67Y5.cjs.map} +1 -1
- package/dist/chunk-Q2XGM372.cjs +18 -0
- package/dist/{chunk-S74QMZVZ.cjs.map → chunk-Q2XGM372.cjs.map} +1 -1
- package/dist/{chunk-7HHYMDPE.js → chunk-RATEAOKT.js} +3 -3
- package/dist/{chunk-7HHYMDPE.js.map → chunk-RATEAOKT.js.map} +1 -1
- package/dist/{chunk-SN2GZ4ZM.cjs → chunk-TQUYWUEE.cjs} +10 -156
- package/dist/chunk-TQUYWUEE.cjs.map +1 -0
- package/dist/{chunk-ONTUMV74.js → chunk-XER3JLC7.js} +398 -78
- package/dist/chunk-XER3JLC7.js.map +1 -0
- package/dist/{chunk-HP2C4MD3.js → chunk-ZDOKJD44.js} +4 -143
- package/dist/chunk-ZDOKJD44.js.map +1 -0
- package/dist/connect/docx.cjs +11 -10
- package/dist/connect/docx.js +7 -6
- package/dist/connect/index.cjs +406 -384
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +69 -47
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +41 -20
- package/dist/connect/viewer.cjs.map +1 -1
- package/dist/connect/viewer.js +29 -8
- package/dist/connect/viewer.js.map +1 -1
- package/dist/connection/viewer/ViewerPdfPane.d.ts +7 -1
- package/dist/connection/workspace-list/ConnectedWorkspaceList.d.ts +4 -2
- package/dist/connection/workspace-list/WorkspaceCardsView.d.ts +3 -2
- package/dist/connection/workspace-list/WorkspaceTableView.d.ts +3 -2
- package/dist/connection/workspace-list/index.d.ts +1 -1
- package/dist/connection/workspace-list/useConnectedWorkspaceList.d.ts +19 -0
- package/dist/connection/workspace-list/workspaceTable.d.ts +3 -1
- package/dist/connection/workspace-settings/ConnectedWorkspaceSettings.d.ts +3 -1
- package/dist/document-tools/AdoptSignatureDialog.d.ts +39 -4
- package/dist/document-tools/PlaceMySignatureButton.d.ts +16 -0
- package/dist/document-tools/SavedSignatureSettings.d.ts +10 -0
- package/dist/document-tools/index.cjs +37 -22
- package/dist/document-tools/index.d.ts +2 -0
- package/dist/document-tools/index.js +5 -2
- package/dist/document-tools/viewer/AnnotatedPdfViewer.d.ts +10 -1
- package/dist/document-tools/viewer/SignatureRequestEditor.d.ts +7 -4
- package/dist/document-tools/viewer/index.cjs +184 -18
- package/dist/document-tools/viewer/index.cjs.map +1 -1
- package/dist/document-tools/viewer/index.js +184 -18
- package/dist/document-tools/viewer/index.js.map +1 -1
- package/dist/docx/NativeDocxEditor.d.ts +5 -0
- package/dist/docx/index.cjs +61 -47
- package/dist/docx/index.d.ts +1 -0
- package/dist/docx/index.js +5 -3
- package/dist/docx/signatures/SignatureFields.d.ts +50 -0
- package/dist/settings/index.cjs +183 -182
- package/dist/settings/index.js +2 -1
- package/node_modules/@arbidocs/coedit/dist/commands.cjs +109 -16
- package/node_modules/@arbidocs/coedit/dist/commands.cjs.map +1 -1
- package/node_modules/@arbidocs/coedit/dist/commands.d.cts +84 -1
- package/node_modules/@arbidocs/coedit/dist/commands.d.ts +84 -1
- package/node_modules/@arbidocs/coedit/dist/commands.js +99 -17
- package/node_modules/@arbidocs/coedit/dist/commands.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/src/docx/styles.css +50 -0
- package/dist/ConnectedStreamedWordArtifact-EXYZAU4Y.cjs.map +0 -1
- package/dist/WorkspaceTableView-5OWX53R5.js.map +0 -1
- package/dist/WorkspaceTableView-ZFMAYHUD.cjs.map +0 -1
- package/dist/chunk-6MG62I5B.cjs +0 -272
- package/dist/chunk-6MG62I5B.cjs.map +0 -1
- package/dist/chunk-D3WFIFRY.cjs.map +0 -1
- package/dist/chunk-EQB3WELX.js +0 -269
- package/dist/chunk-EQB3WELX.js.map +0 -1
- package/dist/chunk-HP2C4MD3.js.map +0 -1
- package/dist/chunk-IJEISII2.cjs.map +0 -1
- package/dist/chunk-JSQEAPTC.cjs.map +0 -1
- package/dist/chunk-KQYPP72K.js.map +0 -1
- package/dist/chunk-ONTUMV74.js.map +0 -1
- package/dist/chunk-OTU5KGQ6.cjs +0 -18
- package/dist/chunk-PGOSIJ2I.js.map +0 -1
- package/dist/chunk-S74QMZVZ.cjs +0 -18
- package/dist/chunk-SN2GZ4ZM.cjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkJPWPR6QU_cjs = require('../../chunk-JPWPR6QU.cjs');
|
|
5
5
|
var chunkULWRNGGE_cjs = require('../../chunk-ULWRNGGE.cjs');
|
|
6
6
|
require('../../chunk-DES3K4SD.cjs');
|
|
7
7
|
var react = require('react');
|
|
@@ -32,6 +32,7 @@ function AnnotatedPdfViewer({
|
|
|
32
32
|
store: storeOverride,
|
|
33
33
|
viewer: PdfViewer = viewers.PdfViewer,
|
|
34
34
|
signed = false,
|
|
35
|
+
placeStamp = null,
|
|
35
36
|
...viewerProps
|
|
36
37
|
}) {
|
|
37
38
|
const { client, user, notify, saveFile, uploadDocument, openDocument, onDocumentsChanged } = documentTools.useDocumentTools();
|
|
@@ -63,6 +64,12 @@ function AnnotatedPdfViewer({
|
|
|
63
64
|
() => editing && !controller.readOnly ? controller : viewOnly(controller),
|
|
64
65
|
[editing, controller]
|
|
65
66
|
);
|
|
67
|
+
const { setSettings, setTool } = controller;
|
|
68
|
+
react.useEffect(() => {
|
|
69
|
+
if (!placeStamp) return;
|
|
70
|
+
setSettings({ stampImage: { image: placeStamp.image, label: placeStamp.label } });
|
|
71
|
+
setTool("stamp");
|
|
72
|
+
}, [placeStamp?.key]);
|
|
66
73
|
const { flush } = controller;
|
|
67
74
|
react.useEffect(() => {
|
|
68
75
|
if (!editing) void flush();
|
|
@@ -493,6 +500,8 @@ function GuidedSigningViewer({
|
|
|
493
500
|
}) {
|
|
494
501
|
const { user, notify } = documentTools.useDocumentTools();
|
|
495
502
|
const sign = documentTools.useSignSignatureRequest();
|
|
503
|
+
const savedSignature = documentTools.useSavedSignature();
|
|
504
|
+
const storeSignature = documentTools.useStoreSavedSignature();
|
|
496
505
|
const decline = documentTools.useDeclineSignatureRequest();
|
|
497
506
|
const mine = react.useMemo(() => documentTools.fieldsInSigningOrder(request.fields, signer), [request.fields, signer]);
|
|
498
507
|
const [mark, setMark] = react.useState(null);
|
|
@@ -572,9 +581,17 @@ function GuidedSigningViewer({
|
|
|
572
581
|
const renderContent = react.useCallback(
|
|
573
582
|
(field) => {
|
|
574
583
|
if (!applied.has(field.id) || !mark) return null;
|
|
575
|
-
const { adopted, signatureUrl } = mark;
|
|
576
|
-
|
|
577
|
-
|
|
584
|
+
const { adopted, signatureUrl, initialsUrl } = mark;
|
|
585
|
+
const image = field.type === "signature" ? signatureUrl : field.type === "initials" ? initialsUrl : null;
|
|
586
|
+
if (image) {
|
|
587
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
588
|
+
"img",
|
|
589
|
+
{
|
|
590
|
+
src: image,
|
|
591
|
+
alt: field.type === "signature" ? "Your signature" : "Your initials",
|
|
592
|
+
className: "h-full w-full object-contain"
|
|
593
|
+
}
|
|
594
|
+
);
|
|
578
595
|
}
|
|
579
596
|
const text = field.type === "signature" ? adopted.name : field.type === "initials" ? adopted.initials : field.type === "date" ? signingDate() : adopted.name;
|
|
580
597
|
const typed = documentTools.MARK_FIELD_TYPES.includes(field.type);
|
|
@@ -582,7 +599,7 @@ function GuidedSigningViewer({
|
|
|
582
599
|
"span",
|
|
583
600
|
{
|
|
584
601
|
className: "flex h-full w-full items-center px-1 whitespace-nowrap [container-type:size]",
|
|
585
|
-
style: typed ?
|
|
602
|
+
style: typed ? chunkJPWPR6QU_cjs.TYPED_SIGNATURE_STYLE : { color: "#1a1a26" },
|
|
586
603
|
children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: typed ? "70cqh" : "62cqh", lineHeight: 1 }, children: text })
|
|
587
604
|
}
|
|
588
605
|
);
|
|
@@ -772,12 +789,14 @@ function GuidedSigningViewer({
|
|
|
772
789
|
}
|
|
773
790
|
) }),
|
|
774
791
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
775
|
-
|
|
792
|
+
chunkJPWPR6QU_cjs.AdoptSignatureDialog,
|
|
776
793
|
{
|
|
777
794
|
open: !!adoptFor,
|
|
778
795
|
onOpenChange: (open) => !open && setAdoptFor(null),
|
|
779
796
|
defaultName: user?.name ?? "",
|
|
780
|
-
onAdopt
|
|
797
|
+
onAdopt,
|
|
798
|
+
saved: savedSignature.data ?? null,
|
|
799
|
+
onSave: async (signature) => void await storeSignature.mutateAsync(signature)
|
|
781
800
|
}
|
|
782
801
|
),
|
|
783
802
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -875,9 +894,10 @@ function SignatureRequestEditor({
|
|
|
875
894
|
viewer: PdfViewer = viewers.PdfViewer,
|
|
876
895
|
...viewerProps
|
|
877
896
|
}) {
|
|
878
|
-
const { client, notify } = documentTools.useDocumentTools();
|
|
897
|
+
const { client, notify, user } = documentTools.useDocumentTools();
|
|
879
898
|
const candidates = documentTools.useSignerCandidates();
|
|
880
899
|
const save = documentTools.useSaveSignatureRequest();
|
|
900
|
+
const invite = documentTools.useInviteSigners();
|
|
881
901
|
const [fields, setFields] = react.useState(() => draft?.fields ?? []);
|
|
882
902
|
const [signers, setSigners] = react.useState(() => [
|
|
883
903
|
...new Set((draft?.fields ?? []).map((f) => f.signer))
|
|
@@ -890,11 +910,31 @@ function SignatureRequestEditor({
|
|
|
890
910
|
const [assign, setAssign] = react.useState({});
|
|
891
911
|
const [finding, setFinding] = react.useState(false);
|
|
892
912
|
const [error, setError] = react.useState(null);
|
|
913
|
+
const [newEmail, setNewEmail] = react.useState("");
|
|
914
|
+
const [givenNames, setGivenNames] = react.useState({});
|
|
915
|
+
const [confirmInvite, setConfirmInvite] = react.useState(null);
|
|
893
916
|
const people = react.useMemo(() => candidates.data ?? [], [candidates.data]);
|
|
894
|
-
const
|
|
895
|
-
(
|
|
917
|
+
const members = react.useMemo(
|
|
918
|
+
() => new Map(people.map((p) => [p.email.toLowerCase(), p.externalId])),
|
|
896
919
|
[people]
|
|
897
920
|
);
|
|
921
|
+
const me = people.find((p) => p.email.toLowerCase() === user?.email?.toLowerCase());
|
|
922
|
+
const nameOf = react.useCallback(
|
|
923
|
+
(token) => {
|
|
924
|
+
const person = people.find((p) => p.externalId === token);
|
|
925
|
+
if (person) return person.name;
|
|
926
|
+
const invited = draft?.signers.find((s) => s.external_id === token);
|
|
927
|
+
if (invited) return invited.name || invited.email || token;
|
|
928
|
+
const email = token.toLowerCase();
|
|
929
|
+
const member = people.find((p) => p.email.toLowerCase() === email);
|
|
930
|
+
return member?.name ?? givenNames[email] ?? token;
|
|
931
|
+
},
|
|
932
|
+
[people, draft, givenNames]
|
|
933
|
+
);
|
|
934
|
+
const isInvitee = react.useCallback(
|
|
935
|
+
(token) => documentTools.isEmailSigner(token) && !members.has(token.toLowerCase()) || draft?.signers.find((s) => s.external_id === token)?.progress === "invited",
|
|
936
|
+
[members, draft]
|
|
937
|
+
);
|
|
898
938
|
const colorOf = react.useCallback(
|
|
899
939
|
(ext) => {
|
|
900
940
|
const i = signers.indexOf(ext);
|
|
@@ -904,8 +944,10 @@ function SignatureRequestEditor({
|
|
|
904
944
|
);
|
|
905
945
|
const selected = fields.find((f) => f.id === selectedId) ?? null;
|
|
906
946
|
const blocker = signers.length === 0 ? "Add a signer." : documentTools.sendBlocker(fields);
|
|
907
|
-
const addSigner = (
|
|
908
|
-
if (!
|
|
947
|
+
const addSigner = (token) => {
|
|
948
|
+
if (!token) return;
|
|
949
|
+
const ext = documentTools.isEmailSigner(token) ? members.get(token.trim().toLowerCase()) ?? token.trim().toLowerCase() : token;
|
|
950
|
+
if (signers.includes(ext)) return;
|
|
909
951
|
setSigners((s) => [...s, ext]);
|
|
910
952
|
setCurrent(ext);
|
|
911
953
|
setPlacing((p) => p ?? "signature");
|
|
@@ -916,6 +958,41 @@ function SignatureRequestEditor({
|
|
|
916
958
|
if (current === ext) setCurrent(signers.find((x) => x !== ext) ?? null);
|
|
917
959
|
};
|
|
918
960
|
const updateField = (id, patch) => setFields((fs) => fs.map((f) => f.id === id ? { ...f, ...patch } : f));
|
|
961
|
+
const placedOnce = react.useRef(false);
|
|
962
|
+
react.useEffect(() => {
|
|
963
|
+
if (draft || placedOnce.current || candidates.isLoading) return;
|
|
964
|
+
placedOnce.current = true;
|
|
965
|
+
let live = true;
|
|
966
|
+
void documentTools.suggestSignatureFields(client, documentId, version).then((found) => {
|
|
967
|
+
if (!live) return;
|
|
968
|
+
const { placed, extras } = documentTools.splitSuggestions(found ?? []);
|
|
969
|
+
if (!placed.length) return;
|
|
970
|
+
const named = Object.fromEntries(
|
|
971
|
+
placed.flatMap(
|
|
972
|
+
(s) => s.signer_email && s.signer_name ? [[s.signer_email.toLowerCase(), s.signer_name]] : []
|
|
973
|
+
)
|
|
974
|
+
);
|
|
975
|
+
setGivenNames((n) => ({ ...n, ...named }));
|
|
976
|
+
const added = documentTools.fieldsFromSuggestions(placed, {}, members);
|
|
977
|
+
setFields((fs) => [...fs, ...added]);
|
|
978
|
+
const assigned = [...new Set(added.map((f) => f.signer))];
|
|
979
|
+
setSigners((s) => [...s, ...assigned.filter((t) => !s.includes(t))]);
|
|
980
|
+
setCurrent((c) => c ?? assigned[0] ?? null);
|
|
981
|
+
const open = placed.filter((s) => !s.signer_email);
|
|
982
|
+
if (open.length || extras.length) {
|
|
983
|
+
setSuggestions([...open, ...extras]);
|
|
984
|
+
setAssign({});
|
|
985
|
+
}
|
|
986
|
+
notify(
|
|
987
|
+
`${added.length} field${added.length === 1 ? "" : "s"} placed from the document.`,
|
|
988
|
+
"success"
|
|
989
|
+
);
|
|
990
|
+
}).catch(() => {
|
|
991
|
+
});
|
|
992
|
+
return () => {
|
|
993
|
+
live = false;
|
|
994
|
+
};
|
|
995
|
+
}, [draft, candidates.isLoading, client, documentId, version, members, notify]);
|
|
919
996
|
const findBlocks = async () => {
|
|
920
997
|
setFinding(true);
|
|
921
998
|
setError(null);
|
|
@@ -933,7 +1010,7 @@ function SignatureRequestEditor({
|
|
|
933
1010
|
};
|
|
934
1011
|
const applySuggestions = () => {
|
|
935
1012
|
if (!suggestions) return;
|
|
936
|
-
const added = documentTools.fieldsFromSuggestions(suggestions, assign);
|
|
1013
|
+
const added = documentTools.fieldsFromSuggestions(suggestions, assign, members);
|
|
937
1014
|
setFields((fs) => [...fs, ...added]);
|
|
938
1015
|
const assigned = [...new Set(added.map((f) => f.signer))];
|
|
939
1016
|
setSigners((s) => [...s, ...assigned.filter((ext) => !s.includes(ext))]);
|
|
@@ -941,9 +1018,17 @@ function SignatureRequestEditor({
|
|
|
941
1018
|
setSuggestions(null);
|
|
942
1019
|
notify(`${added.length} field${added.length === 1 ? "" : "s"} added.`, "success");
|
|
943
1020
|
};
|
|
944
|
-
const submit = async (send) => {
|
|
1021
|
+
const submit = async (send, invited = false) => {
|
|
945
1022
|
setError(null);
|
|
1023
|
+
const invitees = signers.filter((t) => documentTools.isEmailSigner(t) && !members.has(t.toLowerCase()));
|
|
1024
|
+
if (send && invitees.length && !invited) {
|
|
1025
|
+
setConfirmInvite(invitees);
|
|
1026
|
+
return;
|
|
1027
|
+
}
|
|
946
1028
|
try {
|
|
1029
|
+
if (send && invitees.length && me?.role === "owner") {
|
|
1030
|
+
await invite.mutateAsync({ documentId, emails: invitees });
|
|
1031
|
+
}
|
|
947
1032
|
const request = await save.mutateAsync({
|
|
948
1033
|
documentId,
|
|
949
1034
|
version,
|
|
@@ -952,10 +1037,12 @@ function SignatureRequestEditor({
|
|
|
952
1037
|
requestId: draft?.status === "draft" ? draft.external_id : void 0,
|
|
953
1038
|
send
|
|
954
1039
|
});
|
|
1040
|
+
const waiting = request.signers.filter((s) => s.progress === "invited").length;
|
|
955
1041
|
notify(
|
|
956
|
-
send ? `Sent for signature to ${request.signers.length} signer${request.signers.length === 1 ? "" : "s"}.` : "Draft saved.",
|
|
1042
|
+
send ? `Sent for signature to ${request.signers.length} signer${request.signers.length === 1 ? "" : "s"}.` + (waiting ? ` ${waiting} ${waiting === 1 ? "is" : "are"} asked once they join the workspace.` : "") : "Draft saved.",
|
|
957
1043
|
"success"
|
|
958
1044
|
);
|
|
1045
|
+
setConfirmInvite(null);
|
|
959
1046
|
onSaved(request);
|
|
960
1047
|
} catch (err) {
|
|
961
1048
|
setError(err instanceof Error ? err.message : "The request could not be saved");
|
|
@@ -1019,7 +1106,8 @@ function SignatureRequestEditor({
|
|
|
1019
1106
|
"data-testid": `signer-chip-${ext}`,
|
|
1020
1107
|
children: [
|
|
1021
1108
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-2.5 rounded-full", style: { background: colorOf(ext) } }),
|
|
1022
|
-
nameOf(ext)
|
|
1109
|
+
nameOf(ext),
|
|
1110
|
+
isInvitee(ext) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", "data-testid": "signer-invited", children: "(to invite)" })
|
|
1023
1111
|
]
|
|
1024
1112
|
}
|
|
1025
1113
|
),
|
|
@@ -1059,7 +1147,45 @@ function SignatureRequestEditor({
|
|
|
1059
1147
|
]
|
|
1060
1148
|
}
|
|
1061
1149
|
)
|
|
1062
|
-
] })
|
|
1150
|
+
] }),
|
|
1151
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1152
|
+
"form",
|
|
1153
|
+
{
|
|
1154
|
+
className: "inline-flex items-center gap-1",
|
|
1155
|
+
onSubmit: (e) => {
|
|
1156
|
+
e.preventDefault();
|
|
1157
|
+
if (!documentTools.isEmailSigner(newEmail)) return;
|
|
1158
|
+
addSigner(newEmail);
|
|
1159
|
+
setNewEmail("");
|
|
1160
|
+
},
|
|
1161
|
+
children: [
|
|
1162
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1163
|
+
ui.Input,
|
|
1164
|
+
{
|
|
1165
|
+
type: "email",
|
|
1166
|
+
value: newEmail,
|
|
1167
|
+
onChange: (e) => setNewEmail(e.target.value),
|
|
1168
|
+
placeholder: "Or anyone, by email",
|
|
1169
|
+
"aria-label": "Signer's email",
|
|
1170
|
+
className: "h-8 w-52",
|
|
1171
|
+
"data-testid": "signature-add-email"
|
|
1172
|
+
}
|
|
1173
|
+
),
|
|
1174
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1175
|
+
ui.Button,
|
|
1176
|
+
{
|
|
1177
|
+
type: "submit",
|
|
1178
|
+
size: "sm",
|
|
1179
|
+
variant: "ghost",
|
|
1180
|
+
disabled: !documentTools.isEmailSigner(newEmail),
|
|
1181
|
+
"aria-label": "Add this signer",
|
|
1182
|
+
"data-testid": "signature-add-email-submit",
|
|
1183
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MailPlus, { className: "size-4", "aria-hidden": true })
|
|
1184
|
+
}
|
|
1185
|
+
)
|
|
1186
|
+
]
|
|
1187
|
+
}
|
|
1188
|
+
)
|
|
1063
1189
|
] }),
|
|
1064
1190
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
1065
1191
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: current ? `Place for ${nameOf(current)}:` : "Add a signer, then place their fields." }),
|
|
@@ -1216,7 +1342,8 @@ function SignatureRequestEditor({
|
|
|
1216
1342
|
"data-testid": `signature-suggestion-signer-${g}`,
|
|
1217
1343
|
children: [
|
|
1218
1344
|
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "Skip" }),
|
|
1219
|
-
people.map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.externalId, children: p.name }, p.externalId))
|
|
1345
|
+
people.map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.externalId, children: p.name }, p.externalId)),
|
|
1346
|
+
signers.filter((t) => !people.some((p) => p.externalId === t)).map((t) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: t, children: nameOf(t) }, t))
|
|
1220
1347
|
]
|
|
1221
1348
|
}
|
|
1222
1349
|
)
|
|
@@ -1237,6 +1364,45 @@ function SignatureRequestEditor({
|
|
|
1237
1364
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { type: "button", size: "sm", variant: "ghost", onClick: () => setSuggestions(null), children: "Dismiss" })
|
|
1238
1365
|
] })
|
|
1239
1366
|
] }),
|
|
1367
|
+
confirmInvite && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1368
|
+
"div",
|
|
1369
|
+
{
|
|
1370
|
+
className: "space-y-1.5 rounded-md border border-amber-300 bg-amber-50 p-2 text-amber-950 dark:border-amber-800 dark:bg-amber-950/40 dark:text-amber-100",
|
|
1371
|
+
"data-testid": "signature-invite-confirm",
|
|
1372
|
+
children: [
|
|
1373
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
1374
|
+
"Not in this workspace yet: ",
|
|
1375
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: confirmInvite.map(nameOf).join(", ") }),
|
|
1376
|
+
".",
|
|
1377
|
+
" ",
|
|
1378
|
+
me?.role === "owner" ? "They are invited as guests and asked to sign when they join." : "Ask a workspace owner to invite them: they are asked to sign when they join."
|
|
1379
|
+
] }),
|
|
1380
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
|
|
1381
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1382
|
+
ui.Button,
|
|
1383
|
+
{
|
|
1384
|
+
type: "button",
|
|
1385
|
+
size: "sm",
|
|
1386
|
+
onClick: () => submit(true, true),
|
|
1387
|
+
disabled: save.isPending || invite.isPending,
|
|
1388
|
+
"data-testid": "signature-invite-send",
|
|
1389
|
+
children: me?.role === "owner" ? "Invite and send" : "Send"
|
|
1390
|
+
}
|
|
1391
|
+
),
|
|
1392
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1393
|
+
ui.Button,
|
|
1394
|
+
{
|
|
1395
|
+
type: "button",
|
|
1396
|
+
size: "sm",
|
|
1397
|
+
variant: "ghost",
|
|
1398
|
+
onClick: () => setConfirmInvite(null),
|
|
1399
|
+
children: "Cancel"
|
|
1400
|
+
}
|
|
1401
|
+
)
|
|
1402
|
+
] })
|
|
1403
|
+
]
|
|
1404
|
+
}
|
|
1405
|
+
),
|
|
1240
1406
|
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-text", role: "alert", "data-testid": "signature-editor-error", children: error })
|
|
1241
1407
|
] }),
|
|
1242
1408
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(PdfViewer, { ...viewerProps, file, renderPageOverlay }) })
|