@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,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { TYPED_SIGNATURE_STYLE, AdoptSignatureDialog } from '../../chunk-
|
|
2
|
+
import { TYPED_SIGNATURE_STYLE, AdoptSignatureDialog } from '../../chunk-DAN7EJ4O.js';
|
|
3
3
|
import { ModalScaffold } from '../../chunk-TX2ZICS7.js';
|
|
4
4
|
import '../../chunk-VUNV25KB.js';
|
|
5
5
|
import { useRef, useMemo, useEffect, useState, useCallback } from 'react';
|
|
6
6
|
import { useAnnotationLayer, redactionLogCsv, AnnotationPageOverlay, AnnotationToolbar, FreezeDialog, createMemoryStore } from '@arbidocs/react/annotations';
|
|
7
7
|
import { freezePdfInBrowser } from '@arbidocs/react/annotations/freeze';
|
|
8
|
-
import { useDocumentTools, useIsOnline, createMarkupStore, fetchMarkupPdf, uploadFrozenCopy, redactionLogName, SIGNED_LOCKED_REASON, isLegibleSignatureBox, toAppearance, FIELD_TYPE_LABELS, useSignSignatureRequest, useDeclineSignatureRequest, fieldsInSigningOrder, MARK_FIELD_TYPES, intentText, useSignerCandidates, useSaveSignatureRequest, sendBlocker, newFieldId, SIGNATURE_FIELD_TYPES, SigningError, DEFAULT_FIELD_SIZE
|
|
8
|
+
import { useDocumentTools, useIsOnline, createMarkupStore, fetchMarkupPdf, uploadFrozenCopy, redactionLogName, SIGNED_LOCKED_REASON, isLegibleSignatureBox, toAppearance, FIELD_TYPE_LABELS, useSignSignatureRequest, useSavedSignature, useStoreSavedSignature, useDeclineSignatureRequest, fieldsInSigningOrder, MARK_FIELD_TYPES, intentText, useSignerCandidates, useSaveSignatureRequest, useInviteSigners, isEmailSigner, sendBlocker, suggestSignatureFields, splitSuggestions, fieldsFromSuggestions, newFieldId, SIGNATURE_FIELD_TYPES, SigningError, DEFAULT_FIELD_SIZE } from '@arbidocs/react/document-tools';
|
|
9
9
|
import { PdfViewer } from '@arbidocs/react/viewers';
|
|
10
|
-
import { Download, X, ArrowRight, ArrowLeft, Check, UserPlus, ScanSearch, Send, PenLine } from 'lucide-react';
|
|
10
|
+
import { Download, X, ArrowRight, ArrowLeft, Check, UserPlus, MailPlus, ScanSearch, Send, PenLine } from 'lucide-react';
|
|
11
11
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
12
12
|
import { Button, cn, Progress, Label, Input, Checkbox } from '@arbidocs/react/ui';
|
|
13
13
|
|
|
@@ -30,6 +30,7 @@ function AnnotatedPdfViewer({
|
|
|
30
30
|
store: storeOverride,
|
|
31
31
|
viewer: PdfViewer$1 = PdfViewer,
|
|
32
32
|
signed = false,
|
|
33
|
+
placeStamp = null,
|
|
33
34
|
...viewerProps
|
|
34
35
|
}) {
|
|
35
36
|
const { client, user, notify, saveFile, uploadDocument, openDocument, onDocumentsChanged } = useDocumentTools();
|
|
@@ -61,6 +62,12 @@ function AnnotatedPdfViewer({
|
|
|
61
62
|
() => editing && !controller.readOnly ? controller : viewOnly(controller),
|
|
62
63
|
[editing, controller]
|
|
63
64
|
);
|
|
65
|
+
const { setSettings, setTool } = controller;
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!placeStamp) return;
|
|
68
|
+
setSettings({ stampImage: { image: placeStamp.image, label: placeStamp.label } });
|
|
69
|
+
setTool("stamp");
|
|
70
|
+
}, [placeStamp?.key]);
|
|
64
71
|
const { flush } = controller;
|
|
65
72
|
useEffect(() => {
|
|
66
73
|
if (!editing) void flush();
|
|
@@ -491,6 +498,8 @@ function GuidedSigningViewer({
|
|
|
491
498
|
}) {
|
|
492
499
|
const { user, notify } = useDocumentTools();
|
|
493
500
|
const sign = useSignSignatureRequest();
|
|
501
|
+
const savedSignature = useSavedSignature();
|
|
502
|
+
const storeSignature = useStoreSavedSignature();
|
|
494
503
|
const decline = useDeclineSignatureRequest();
|
|
495
504
|
const mine = useMemo(() => fieldsInSigningOrder(request.fields, signer), [request.fields, signer]);
|
|
496
505
|
const [mark, setMark] = useState(null);
|
|
@@ -570,9 +579,17 @@ function GuidedSigningViewer({
|
|
|
570
579
|
const renderContent = useCallback(
|
|
571
580
|
(field) => {
|
|
572
581
|
if (!applied.has(field.id) || !mark) return null;
|
|
573
|
-
const { adopted, signatureUrl } = mark;
|
|
574
|
-
|
|
575
|
-
|
|
582
|
+
const { adopted, signatureUrl, initialsUrl } = mark;
|
|
583
|
+
const image = field.type === "signature" ? signatureUrl : field.type === "initials" ? initialsUrl : null;
|
|
584
|
+
if (image) {
|
|
585
|
+
return /* @__PURE__ */ jsx(
|
|
586
|
+
"img",
|
|
587
|
+
{
|
|
588
|
+
src: image,
|
|
589
|
+
alt: field.type === "signature" ? "Your signature" : "Your initials",
|
|
590
|
+
className: "h-full w-full object-contain"
|
|
591
|
+
}
|
|
592
|
+
);
|
|
576
593
|
}
|
|
577
594
|
const text = field.type === "signature" ? adopted.name : field.type === "initials" ? adopted.initials : field.type === "date" ? signingDate() : adopted.name;
|
|
578
595
|
const typed = MARK_FIELD_TYPES.includes(field.type);
|
|
@@ -775,7 +792,9 @@ function GuidedSigningViewer({
|
|
|
775
792
|
open: !!adoptFor,
|
|
776
793
|
onOpenChange: (open) => !open && setAdoptFor(null),
|
|
777
794
|
defaultName: user?.name ?? "",
|
|
778
|
-
onAdopt
|
|
795
|
+
onAdopt,
|
|
796
|
+
saved: savedSignature.data ?? null,
|
|
797
|
+
onSave: async (signature) => void await storeSignature.mutateAsync(signature)
|
|
779
798
|
}
|
|
780
799
|
),
|
|
781
800
|
/* @__PURE__ */ jsx(
|
|
@@ -873,9 +892,10 @@ function SignatureRequestEditor({
|
|
|
873
892
|
viewer: PdfViewer$1 = PdfViewer,
|
|
874
893
|
...viewerProps
|
|
875
894
|
}) {
|
|
876
|
-
const { client, notify } = useDocumentTools();
|
|
895
|
+
const { client, notify, user } = useDocumentTools();
|
|
877
896
|
const candidates = useSignerCandidates();
|
|
878
897
|
const save = useSaveSignatureRequest();
|
|
898
|
+
const invite = useInviteSigners();
|
|
879
899
|
const [fields, setFields] = useState(() => draft?.fields ?? []);
|
|
880
900
|
const [signers, setSigners] = useState(() => [
|
|
881
901
|
...new Set((draft?.fields ?? []).map((f) => f.signer))
|
|
@@ -888,11 +908,31 @@ function SignatureRequestEditor({
|
|
|
888
908
|
const [assign, setAssign] = useState({});
|
|
889
909
|
const [finding, setFinding] = useState(false);
|
|
890
910
|
const [error, setError] = useState(null);
|
|
911
|
+
const [newEmail, setNewEmail] = useState("");
|
|
912
|
+
const [givenNames, setGivenNames] = useState({});
|
|
913
|
+
const [confirmInvite, setConfirmInvite] = useState(null);
|
|
891
914
|
const people = useMemo(() => candidates.data ?? [], [candidates.data]);
|
|
892
|
-
const
|
|
893
|
-
(
|
|
915
|
+
const members = useMemo(
|
|
916
|
+
() => new Map(people.map((p) => [p.email.toLowerCase(), p.externalId])),
|
|
894
917
|
[people]
|
|
895
918
|
);
|
|
919
|
+
const me = people.find((p) => p.email.toLowerCase() === user?.email?.toLowerCase());
|
|
920
|
+
const nameOf = useCallback(
|
|
921
|
+
(token) => {
|
|
922
|
+
const person = people.find((p) => p.externalId === token);
|
|
923
|
+
if (person) return person.name;
|
|
924
|
+
const invited = draft?.signers.find((s) => s.external_id === token);
|
|
925
|
+
if (invited) return invited.name || invited.email || token;
|
|
926
|
+
const email = token.toLowerCase();
|
|
927
|
+
const member = people.find((p) => p.email.toLowerCase() === email);
|
|
928
|
+
return member?.name ?? givenNames[email] ?? token;
|
|
929
|
+
},
|
|
930
|
+
[people, draft, givenNames]
|
|
931
|
+
);
|
|
932
|
+
const isInvitee = useCallback(
|
|
933
|
+
(token) => isEmailSigner(token) && !members.has(token.toLowerCase()) || draft?.signers.find((s) => s.external_id === token)?.progress === "invited",
|
|
934
|
+
[members, draft]
|
|
935
|
+
);
|
|
896
936
|
const colorOf = useCallback(
|
|
897
937
|
(ext) => {
|
|
898
938
|
const i = signers.indexOf(ext);
|
|
@@ -902,8 +942,10 @@ function SignatureRequestEditor({
|
|
|
902
942
|
);
|
|
903
943
|
const selected = fields.find((f) => f.id === selectedId) ?? null;
|
|
904
944
|
const blocker = signers.length === 0 ? "Add a signer." : sendBlocker(fields);
|
|
905
|
-
const addSigner = (
|
|
906
|
-
if (!
|
|
945
|
+
const addSigner = (token) => {
|
|
946
|
+
if (!token) return;
|
|
947
|
+
const ext = isEmailSigner(token) ? members.get(token.trim().toLowerCase()) ?? token.trim().toLowerCase() : token;
|
|
948
|
+
if (signers.includes(ext)) return;
|
|
907
949
|
setSigners((s) => [...s, ext]);
|
|
908
950
|
setCurrent(ext);
|
|
909
951
|
setPlacing((p) => p ?? "signature");
|
|
@@ -914,6 +956,41 @@ function SignatureRequestEditor({
|
|
|
914
956
|
if (current === ext) setCurrent(signers.find((x) => x !== ext) ?? null);
|
|
915
957
|
};
|
|
916
958
|
const updateField = (id, patch) => setFields((fs) => fs.map((f) => f.id === id ? { ...f, ...patch } : f));
|
|
959
|
+
const placedOnce = useRef(false);
|
|
960
|
+
useEffect(() => {
|
|
961
|
+
if (draft || placedOnce.current || candidates.isLoading) return;
|
|
962
|
+
placedOnce.current = true;
|
|
963
|
+
let live = true;
|
|
964
|
+
void suggestSignatureFields(client, documentId, version).then((found) => {
|
|
965
|
+
if (!live) return;
|
|
966
|
+
const { placed, extras } = splitSuggestions(found ?? []);
|
|
967
|
+
if (!placed.length) return;
|
|
968
|
+
const named = Object.fromEntries(
|
|
969
|
+
placed.flatMap(
|
|
970
|
+
(s) => s.signer_email && s.signer_name ? [[s.signer_email.toLowerCase(), s.signer_name]] : []
|
|
971
|
+
)
|
|
972
|
+
);
|
|
973
|
+
setGivenNames((n) => ({ ...n, ...named }));
|
|
974
|
+
const added = fieldsFromSuggestions(placed, {}, members);
|
|
975
|
+
setFields((fs) => [...fs, ...added]);
|
|
976
|
+
const assigned = [...new Set(added.map((f) => f.signer))];
|
|
977
|
+
setSigners((s) => [...s, ...assigned.filter((t) => !s.includes(t))]);
|
|
978
|
+
setCurrent((c) => c ?? assigned[0] ?? null);
|
|
979
|
+
const open = placed.filter((s) => !s.signer_email);
|
|
980
|
+
if (open.length || extras.length) {
|
|
981
|
+
setSuggestions([...open, ...extras]);
|
|
982
|
+
setAssign({});
|
|
983
|
+
}
|
|
984
|
+
notify(
|
|
985
|
+
`${added.length} field${added.length === 1 ? "" : "s"} placed from the document.`,
|
|
986
|
+
"success"
|
|
987
|
+
);
|
|
988
|
+
}).catch(() => {
|
|
989
|
+
});
|
|
990
|
+
return () => {
|
|
991
|
+
live = false;
|
|
992
|
+
};
|
|
993
|
+
}, [draft, candidates.isLoading, client, documentId, version, members, notify]);
|
|
917
994
|
const findBlocks = async () => {
|
|
918
995
|
setFinding(true);
|
|
919
996
|
setError(null);
|
|
@@ -931,7 +1008,7 @@ function SignatureRequestEditor({
|
|
|
931
1008
|
};
|
|
932
1009
|
const applySuggestions = () => {
|
|
933
1010
|
if (!suggestions) return;
|
|
934
|
-
const added = fieldsFromSuggestions(suggestions, assign);
|
|
1011
|
+
const added = fieldsFromSuggestions(suggestions, assign, members);
|
|
935
1012
|
setFields((fs) => [...fs, ...added]);
|
|
936
1013
|
const assigned = [...new Set(added.map((f) => f.signer))];
|
|
937
1014
|
setSigners((s) => [...s, ...assigned.filter((ext) => !s.includes(ext))]);
|
|
@@ -939,9 +1016,17 @@ function SignatureRequestEditor({
|
|
|
939
1016
|
setSuggestions(null);
|
|
940
1017
|
notify(`${added.length} field${added.length === 1 ? "" : "s"} added.`, "success");
|
|
941
1018
|
};
|
|
942
|
-
const submit = async (send) => {
|
|
1019
|
+
const submit = async (send, invited = false) => {
|
|
943
1020
|
setError(null);
|
|
1021
|
+
const invitees = signers.filter((t) => isEmailSigner(t) && !members.has(t.toLowerCase()));
|
|
1022
|
+
if (send && invitees.length && !invited) {
|
|
1023
|
+
setConfirmInvite(invitees);
|
|
1024
|
+
return;
|
|
1025
|
+
}
|
|
944
1026
|
try {
|
|
1027
|
+
if (send && invitees.length && me?.role === "owner") {
|
|
1028
|
+
await invite.mutateAsync({ documentId, emails: invitees });
|
|
1029
|
+
}
|
|
945
1030
|
const request = await save.mutateAsync({
|
|
946
1031
|
documentId,
|
|
947
1032
|
version,
|
|
@@ -950,10 +1035,12 @@ function SignatureRequestEditor({
|
|
|
950
1035
|
requestId: draft?.status === "draft" ? draft.external_id : void 0,
|
|
951
1036
|
send
|
|
952
1037
|
});
|
|
1038
|
+
const waiting = request.signers.filter((s) => s.progress === "invited").length;
|
|
953
1039
|
notify(
|
|
954
|
-
send ? `Sent for signature to ${request.signers.length} signer${request.signers.length === 1 ? "" : "s"}.` : "Draft saved.",
|
|
1040
|
+
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.",
|
|
955
1041
|
"success"
|
|
956
1042
|
);
|
|
1043
|
+
setConfirmInvite(null);
|
|
957
1044
|
onSaved(request);
|
|
958
1045
|
} catch (err) {
|
|
959
1046
|
setError(err instanceof Error ? err.message : "The request could not be saved");
|
|
@@ -1017,7 +1104,8 @@ function SignatureRequestEditor({
|
|
|
1017
1104
|
"data-testid": `signer-chip-${ext}`,
|
|
1018
1105
|
children: [
|
|
1019
1106
|
/* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full", style: { background: colorOf(ext) } }),
|
|
1020
|
-
nameOf(ext)
|
|
1107
|
+
nameOf(ext),
|
|
1108
|
+
isInvitee(ext) && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", "data-testid": "signer-invited", children: "(to invite)" })
|
|
1021
1109
|
]
|
|
1022
1110
|
}
|
|
1023
1111
|
),
|
|
@@ -1057,7 +1145,45 @@ function SignatureRequestEditor({
|
|
|
1057
1145
|
]
|
|
1058
1146
|
}
|
|
1059
1147
|
)
|
|
1060
|
-
] })
|
|
1148
|
+
] }),
|
|
1149
|
+
/* @__PURE__ */ jsxs(
|
|
1150
|
+
"form",
|
|
1151
|
+
{
|
|
1152
|
+
className: "inline-flex items-center gap-1",
|
|
1153
|
+
onSubmit: (e) => {
|
|
1154
|
+
e.preventDefault();
|
|
1155
|
+
if (!isEmailSigner(newEmail)) return;
|
|
1156
|
+
addSigner(newEmail);
|
|
1157
|
+
setNewEmail("");
|
|
1158
|
+
},
|
|
1159
|
+
children: [
|
|
1160
|
+
/* @__PURE__ */ jsx(
|
|
1161
|
+
Input,
|
|
1162
|
+
{
|
|
1163
|
+
type: "email",
|
|
1164
|
+
value: newEmail,
|
|
1165
|
+
onChange: (e) => setNewEmail(e.target.value),
|
|
1166
|
+
placeholder: "Or anyone, by email",
|
|
1167
|
+
"aria-label": "Signer's email",
|
|
1168
|
+
className: "h-8 w-52",
|
|
1169
|
+
"data-testid": "signature-add-email"
|
|
1170
|
+
}
|
|
1171
|
+
),
|
|
1172
|
+
/* @__PURE__ */ jsx(
|
|
1173
|
+
Button,
|
|
1174
|
+
{
|
|
1175
|
+
type: "submit",
|
|
1176
|
+
size: "sm",
|
|
1177
|
+
variant: "ghost",
|
|
1178
|
+
disabled: !isEmailSigner(newEmail),
|
|
1179
|
+
"aria-label": "Add this signer",
|
|
1180
|
+
"data-testid": "signature-add-email-submit",
|
|
1181
|
+
children: /* @__PURE__ */ jsx(MailPlus, { className: "size-4", "aria-hidden": true })
|
|
1182
|
+
}
|
|
1183
|
+
)
|
|
1184
|
+
]
|
|
1185
|
+
}
|
|
1186
|
+
)
|
|
1061
1187
|
] }),
|
|
1062
1188
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
1063
1189
|
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: current ? `Place for ${nameOf(current)}:` : "Add a signer, then place their fields." }),
|
|
@@ -1214,7 +1340,8 @@ function SignatureRequestEditor({
|
|
|
1214
1340
|
"data-testid": `signature-suggestion-signer-${g}`,
|
|
1215
1341
|
children: [
|
|
1216
1342
|
/* @__PURE__ */ jsx("option", { value: "", children: "Skip" }),
|
|
1217
|
-
people.map((p) => /* @__PURE__ */ jsx("option", { value: p.externalId, children: p.name }, p.externalId))
|
|
1343
|
+
people.map((p) => /* @__PURE__ */ jsx("option", { value: p.externalId, children: p.name }, p.externalId)),
|
|
1344
|
+
signers.filter((t) => !people.some((p) => p.externalId === t)).map((t) => /* @__PURE__ */ jsx("option", { value: t, children: nameOf(t) }, t))
|
|
1218
1345
|
]
|
|
1219
1346
|
}
|
|
1220
1347
|
)
|
|
@@ -1235,6 +1362,45 @@ function SignatureRequestEditor({
|
|
|
1235
1362
|
/* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "ghost", onClick: () => setSuggestions(null), children: "Dismiss" })
|
|
1236
1363
|
] })
|
|
1237
1364
|
] }),
|
|
1365
|
+
confirmInvite && /* @__PURE__ */ jsxs(
|
|
1366
|
+
"div",
|
|
1367
|
+
{
|
|
1368
|
+
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",
|
|
1369
|
+
"data-testid": "signature-invite-confirm",
|
|
1370
|
+
children: [
|
|
1371
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
1372
|
+
"Not in this workspace yet: ",
|
|
1373
|
+
/* @__PURE__ */ jsx("strong", { children: confirmInvite.map(nameOf).join(", ") }),
|
|
1374
|
+
".",
|
|
1375
|
+
" ",
|
|
1376
|
+
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."
|
|
1377
|
+
] }),
|
|
1378
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
1379
|
+
/* @__PURE__ */ jsx(
|
|
1380
|
+
Button,
|
|
1381
|
+
{
|
|
1382
|
+
type: "button",
|
|
1383
|
+
size: "sm",
|
|
1384
|
+
onClick: () => submit(true, true),
|
|
1385
|
+
disabled: save.isPending || invite.isPending,
|
|
1386
|
+
"data-testid": "signature-invite-send",
|
|
1387
|
+
children: me?.role === "owner" ? "Invite and send" : "Send"
|
|
1388
|
+
}
|
|
1389
|
+
),
|
|
1390
|
+
/* @__PURE__ */ jsx(
|
|
1391
|
+
Button,
|
|
1392
|
+
{
|
|
1393
|
+
type: "button",
|
|
1394
|
+
size: "sm",
|
|
1395
|
+
variant: "ghost",
|
|
1396
|
+
onClick: () => setConfirmInvite(null),
|
|
1397
|
+
children: "Cancel"
|
|
1398
|
+
}
|
|
1399
|
+
)
|
|
1400
|
+
] })
|
|
1401
|
+
]
|
|
1402
|
+
}
|
|
1403
|
+
),
|
|
1238
1404
|
error && /* @__PURE__ */ jsx("p", { className: "text-sm text-red-text", role: "alert", "data-testid": "signature-editor-error", children: error })
|
|
1239
1405
|
] }),
|
|
1240
1406
|
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx(PdfViewer$1, { ...viewerProps, file, renderPageOverlay }) })
|