@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.
Files changed (127) hide show
  1. package/dist/{ConnectedNativeDocxComparison-S25BPUH5.cjs → ConnectedNativeDocxComparison-R6RU5TZE.cjs} +8 -7
  2. package/dist/{ConnectedNativeDocxComparison-S25BPUH5.cjs.map → ConnectedNativeDocxComparison-R6RU5TZE.cjs.map} +1 -1
  3. package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js → ConnectedNativeDocxComparison-XMZ5KLD4.js} +7 -6
  4. package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js.map → ConnectedNativeDocxComparison-XMZ5KLD4.js.map} +1 -1
  5. package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs → ConnectedNativeDocxEditor-LBATSM3M.cjs} +7 -6
  6. package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs.map → ConnectedNativeDocxEditor-LBATSM3M.cjs.map} +1 -1
  7. package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js → ConnectedNativeDocxEditor-NGUK2AX6.js} +5 -4
  8. package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js.map → ConnectedNativeDocxEditor-NGUK2AX6.js.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-EXYZAU4Y.cjs → ConnectedStreamedWordArtifact-CWFR6A37.cjs} +8 -7
  10. package/dist/ConnectedStreamedWordArtifact-CWFR6A37.cjs.map +1 -0
  11. package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js → ConnectedStreamedWordArtifact-IXRJ7MUE.js} +7 -6
  12. package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js.map → ConnectedStreamedWordArtifact-IXRJ7MUE.js.map} +1 -1
  13. package/dist/{NativeDocxEditor-M3I776GD.cjs → NativeDocxEditor-T2PJIZMU.cjs} +9 -7
  14. package/dist/{NativeDocxEditor-M3I776GD.cjs.map → NativeDocxEditor-T2PJIZMU.cjs.map} +1 -1
  15. package/dist/{NativeDocxEditor-JBQMH3MP.js → NativeDocxEditor-TBTBD6TC.js} +5 -3
  16. package/dist/{NativeDocxEditor-JBQMH3MP.js.map → NativeDocxEditor-TBTBD6TC.js.map} +1 -1
  17. package/dist/{WorkspaceTableView-5OWX53R5.js → WorkspaceTableView-DWUE4VQF.js} +19 -9
  18. package/dist/WorkspaceTableView-DWUE4VQF.js.map +1 -0
  19. package/dist/{WorkspaceTableView-ZFMAYHUD.cjs → WorkspaceTableView-EYLEUZZT.cjs} +21 -11
  20. package/dist/WorkspaceTableView-EYLEUZZT.cjs.map +1 -0
  21. package/dist/{chunk-IJEISII2.cjs → chunk-2BHDRVVL.cjs} +17 -7
  22. package/dist/chunk-2BHDRVVL.cjs.map +1 -0
  23. package/dist/chunk-2R3GGNPA.js +151 -0
  24. package/dist/chunk-2R3GGNPA.js.map +1 -0
  25. package/dist/{chunk-F3EZDBDJ.js → chunk-3OCNUKGX.js} +4 -4
  26. package/dist/{chunk-F3EZDBDJ.js.map → chunk-3OCNUKGX.js.map} +1 -1
  27. package/dist/{chunk-D3WFIFRY.cjs → chunk-3VW7ZXQ6.cjs} +211 -5
  28. package/dist/chunk-3VW7ZXQ6.cjs.map +1 -0
  29. package/dist/{chunk-JSQEAPTC.cjs → chunk-4GITK3Q5.cjs} +398 -75
  30. package/dist/chunk-4GITK3Q5.cjs.map +1 -0
  31. package/dist/{chunk-2CWM2CFZ.js → chunk-7UENVUA6.js} +4 -4
  32. package/dist/{chunk-2CWM2CFZ.js.map → chunk-7UENVUA6.js.map} +1 -1
  33. package/dist/{chunk-EWCJXUBP.js → chunk-AVXRXPII.js} +3 -3
  34. package/dist/{chunk-EWCJXUBP.js.map → chunk-AVXRXPII.js.map} +1 -1
  35. package/dist/{chunk-7IRSCMNK.js → chunk-BGXWPVHR.js} +3 -3
  36. package/dist/{chunk-7IRSCMNK.js.map → chunk-BGXWPVHR.js.map} +1 -1
  37. package/dist/chunk-DAN7EJ4O.js +482 -0
  38. package/dist/chunk-DAN7EJ4O.js.map +1 -0
  39. package/dist/chunk-E4H5H2C3.cjs +18 -0
  40. package/dist/{chunk-OTU5KGQ6.cjs.map → chunk-E4H5H2C3.cjs.map} +1 -1
  41. package/dist/{chunk-VY4UFXTM.cjs → chunk-ETJFC6MO.cjs} +4 -4
  42. package/dist/{chunk-VY4UFXTM.cjs.map → chunk-ETJFC6MO.cjs.map} +1 -1
  43. package/dist/{chunk-TQIY2SVY.cjs → chunk-GFVIFXWT.cjs} +5 -5
  44. package/dist/{chunk-TQIY2SVY.cjs.map → chunk-GFVIFXWT.cjs.map} +1 -1
  45. package/dist/chunk-JPWPR6QU.cjs +485 -0
  46. package/dist/chunk-JPWPR6QU.cjs.map +1 -0
  47. package/dist/{chunk-KQYPP72K.js → chunk-JTJCCL2E.js} +212 -9
  48. package/dist/chunk-JTJCCL2E.js.map +1 -0
  49. package/dist/{chunk-PGOSIJ2I.js → chunk-KFMRBZQK.js} +15 -5
  50. package/dist/chunk-KFMRBZQK.js.map +1 -0
  51. package/dist/chunk-NMZI3K6R.cjs +159 -0
  52. package/dist/chunk-NMZI3K6R.cjs.map +1 -0
  53. package/dist/{chunk-53RCZPMR.cjs → chunk-P2YM67Y5.cjs} +5 -5
  54. package/dist/{chunk-53RCZPMR.cjs.map → chunk-P2YM67Y5.cjs.map} +1 -1
  55. package/dist/chunk-Q2XGM372.cjs +18 -0
  56. package/dist/{chunk-S74QMZVZ.cjs.map → chunk-Q2XGM372.cjs.map} +1 -1
  57. package/dist/{chunk-7HHYMDPE.js → chunk-RATEAOKT.js} +3 -3
  58. package/dist/{chunk-7HHYMDPE.js.map → chunk-RATEAOKT.js.map} +1 -1
  59. package/dist/{chunk-SN2GZ4ZM.cjs → chunk-TQUYWUEE.cjs} +10 -156
  60. package/dist/chunk-TQUYWUEE.cjs.map +1 -0
  61. package/dist/{chunk-ONTUMV74.js → chunk-XER3JLC7.js} +398 -78
  62. package/dist/chunk-XER3JLC7.js.map +1 -0
  63. package/dist/{chunk-HP2C4MD3.js → chunk-ZDOKJD44.js} +4 -143
  64. package/dist/chunk-ZDOKJD44.js.map +1 -0
  65. package/dist/connect/docx.cjs +11 -10
  66. package/dist/connect/docx.js +7 -6
  67. package/dist/connect/index.cjs +406 -384
  68. package/dist/connect/index.cjs.map +1 -1
  69. package/dist/connect/index.js +69 -47
  70. package/dist/connect/index.js.map +1 -1
  71. package/dist/connect/viewer.cjs +41 -20
  72. package/dist/connect/viewer.cjs.map +1 -1
  73. package/dist/connect/viewer.js +29 -8
  74. package/dist/connect/viewer.js.map +1 -1
  75. package/dist/connection/viewer/ViewerPdfPane.d.ts +7 -1
  76. package/dist/connection/workspace-list/ConnectedWorkspaceList.d.ts +4 -2
  77. package/dist/connection/workspace-list/WorkspaceCardsView.d.ts +3 -2
  78. package/dist/connection/workspace-list/WorkspaceTableView.d.ts +3 -2
  79. package/dist/connection/workspace-list/index.d.ts +1 -1
  80. package/dist/connection/workspace-list/useConnectedWorkspaceList.d.ts +19 -0
  81. package/dist/connection/workspace-list/workspaceTable.d.ts +3 -1
  82. package/dist/connection/workspace-settings/ConnectedWorkspaceSettings.d.ts +3 -1
  83. package/dist/document-tools/AdoptSignatureDialog.d.ts +39 -4
  84. package/dist/document-tools/PlaceMySignatureButton.d.ts +16 -0
  85. package/dist/document-tools/SavedSignatureSettings.d.ts +10 -0
  86. package/dist/document-tools/index.cjs +37 -22
  87. package/dist/document-tools/index.d.ts +2 -0
  88. package/dist/document-tools/index.js +5 -2
  89. package/dist/document-tools/viewer/AnnotatedPdfViewer.d.ts +10 -1
  90. package/dist/document-tools/viewer/SignatureRequestEditor.d.ts +7 -4
  91. package/dist/document-tools/viewer/index.cjs +184 -18
  92. package/dist/document-tools/viewer/index.cjs.map +1 -1
  93. package/dist/document-tools/viewer/index.js +184 -18
  94. package/dist/document-tools/viewer/index.js.map +1 -1
  95. package/dist/docx/NativeDocxEditor.d.ts +5 -0
  96. package/dist/docx/index.cjs +61 -47
  97. package/dist/docx/index.d.ts +1 -0
  98. package/dist/docx/index.js +5 -3
  99. package/dist/docx/signatures/SignatureFields.d.ts +50 -0
  100. package/dist/settings/index.cjs +183 -182
  101. package/dist/settings/index.js +2 -1
  102. package/node_modules/@arbidocs/coedit/dist/commands.cjs +109 -16
  103. package/node_modules/@arbidocs/coedit/dist/commands.cjs.map +1 -1
  104. package/node_modules/@arbidocs/coedit/dist/commands.d.cts +84 -1
  105. package/node_modules/@arbidocs/coedit/dist/commands.d.ts +84 -1
  106. package/node_modules/@arbidocs/coedit/dist/commands.js +99 -17
  107. package/node_modules/@arbidocs/coedit/dist/commands.js.map +1 -1
  108. package/node_modules/@arbidocs/coedit/package.json +1 -1
  109. package/package.json +5 -5
  110. package/src/docx/styles.css +50 -0
  111. package/dist/ConnectedStreamedWordArtifact-EXYZAU4Y.cjs.map +0 -1
  112. package/dist/WorkspaceTableView-5OWX53R5.js.map +0 -1
  113. package/dist/WorkspaceTableView-ZFMAYHUD.cjs.map +0 -1
  114. package/dist/chunk-6MG62I5B.cjs +0 -272
  115. package/dist/chunk-6MG62I5B.cjs.map +0 -1
  116. package/dist/chunk-D3WFIFRY.cjs.map +0 -1
  117. package/dist/chunk-EQB3WELX.js +0 -269
  118. package/dist/chunk-EQB3WELX.js.map +0 -1
  119. package/dist/chunk-HP2C4MD3.js.map +0 -1
  120. package/dist/chunk-IJEISII2.cjs.map +0 -1
  121. package/dist/chunk-JSQEAPTC.cjs.map +0 -1
  122. package/dist/chunk-KQYPP72K.js.map +0 -1
  123. package/dist/chunk-ONTUMV74.js.map +0 -1
  124. package/dist/chunk-OTU5KGQ6.cjs +0 -18
  125. package/dist/chunk-PGOSIJ2I.js.map +0 -1
  126. package/dist/chunk-S74QMZVZ.cjs +0 -18
  127. package/dist/chunk-SN2GZ4ZM.cjs.map +0 -1
@@ -1,13 +1,13 @@
1
1
  "use client";
2
- import { TYPED_SIGNATURE_STYLE, AdoptSignatureDialog } from '../../chunk-EQB3WELX.js';
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, suggestSignatureFields, fieldsFromSuggestions } from '@arbidocs/react/document-tools';
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
- if (field.type === "signature" && signatureUrl) {
575
- return /* @__PURE__ */ jsx("img", { src: signatureUrl, alt: "Your signature", className: "h-full w-full object-contain" });
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 nameOf = useCallback(
893
- (ext) => people.find((p) => p.externalId === ext)?.name ?? ext,
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 = (ext) => {
906
- if (!ext || signers.includes(ext)) return;
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 }) })