Compare commits

..
Author SHA1 Message Date
RaktimaandGitHub 08d3589c1b Merge pull request #2248 from OpenSignLabs/staging
v2.41.3
2026-08-21 17:58:57 +05:30
RaktimaandGitHub e5f2c5c0a9 Merge pull request #2247 from OpenSignLabs/updates-32480718420
Merge pull request #2737 from nxglabs/sync-to-public_repo-32459158600
2026-08-21 17:50:18 +05:30
raktima-opensignlabs 7e0c2517f2 Merge pull request #2737 from nxglabs/sync-to-public_repo-32459158600
Merge pull request #2736 from nxglabs/raktima-main-patch-security
2026-08-21 12:11:59 +00:00
RaktimaandGitHub b0d82574a8 Merge pull request #2246 from OpenSignLabs/staging
fix: update lockfile
2026-08-19 15:29:54 +05:30
RaktimaandGitHub a5456dadcf Merge pull request #2245 from OpenSignLabs/updates-32235783890
Merge pull request #2730 from nxglabs/sync-to-public_repo-32233884118
2026-08-19 15:14:23 +05:30
raktima-opensignlabs 0158b0e176 Merge pull request #2730 from nxglabs/sync-to-public_repo-32233884118
Merge pull request #2729 from nxglabs/raktima-main-patch-security
2026-08-19 09:05:08 +00:00
RaktimaandGitHub 489499e3e2 Merge pull request #2244 from OpenSignLabs/staging
fix: update lockfile
2026-08-17 13:32:13 +05:30
RaktimaNXG 5d385a0ea3 Merge branch 'main' of https://github.com/OpenSignLabs/OpenSign into staging 2026-08-17 13:29:58 +05:30
RaktimaandGitHub 82584d6be9 Merge pull request #2243 from OpenSignLabs/raktima-patch-24
fix: update lockfile
2026-08-17 13:15:27 +05:30
RaktimaNXG cba774a336 fix: update lockfile 2026-08-17 13:14:44 +05:30
RaktimaNXG c44351ea67 fix: update lockfile 2026-08-17 12:48:00 +05:30
RaktimaandGitHub 3a861f3e0f v2.41.2 (#2241) 2026-08-14 23:15:48 +05:30
RaktimaNXG 348ff6de70 Merge branch 'main' of https://github.com/OpenSignLabs/OpenSign into staging 2026-08-14 22:24:09 +05:30
AmolandGitHub a773c50774 Merge pull request #2240 from OpenSignLabs/updates-31819970805 2026-08-14 22:08:53 +05:30
raktima-opensignlabs 7c414157dd Merge pull request #2717 from nxglabs/sync-to-public_repo-31818759561
Merge pull request #2716 from nxglabs/raktima-main-patch-security
2026-08-14 16:34:38 +00:00
RaktimaandGitHub 7b4785461c v2.41.1 (#2233) 2026-08-11 17:09:48 +05:30
AmolandGitHub 7f114dc124 Merge pull request #2234 from OpenSignLabs/updates-31487056035 2026-08-11 17:06:37 +05:30
raktima-opensignlabs 50cc654166 Merge pull request #2709 from nxglabs/sync-to-public_repo-31486925834
Merge pull request #2708 from nxglabs/raktima-patch-main-7
2026-08-11 11:32:14 +00:00
RaktimaNXG dc8555dfec Merge branch 'main' of https://github.com/OpenSignLabs/OpenSign into staging 2026-08-11 16:09:43 +05:30
AmolandGitHub 43e911dfdc Merge pull request #2232 from OpenSignLabs/updates-31406529761 2026-08-11 12:40:51 +05:30
raktima-opensignlabs 05f472ace8 Merge pull request #2707 from nxglabs/sync-to-public_repo-31405962035
Merge pull request #2706 from nxglabs/raktima-patch-main-7
2026-08-10 15:59:21 +00:00
AmolandGitHub 3729564878 Merge pull request #2705 from nxglabs/sync-to-public_repo-31391986146 (#2231) 2026-08-10 20:21:00 +05:30
raktima-opensignlabsandAmol 8140588898 Merge pull request #2611 from nxglabs/sync-to-public_repo-28355409725
Merge pull request #2610 from nxglabs/staging
2026-06-30 16:28:06 +05:30
RaktimaandGitHub d97b353a81 Merge pull request #2194 from OpenSignLabs/staging
Merge pull request #2192 from OpenSignLabs/updates-27678195317
2026-06-22 10:43:43 +05:30
15 changed files with 4816 additions and 5572 deletions
+2898 -2634
View File
File diff suppressed because it is too large Load Diff
+5 -2
View File
@@ -136,7 +136,7 @@
"eslint-plugin-react": "^7.37.5",
"jsdom": "^29.0.2",
"lint-staged": "^16.4.0",
"postcss": "^8.5.12",
"postcss": "^8.5.23",
"pretty-quick": "^4.2.2",
"rollup-plugin-node-polyfills": "^0.2.1",
"tailwindcss": "^3.4.19",
@@ -154,7 +154,10 @@
"form-data": ">=4.0.6",
"js-yaml": "^3.15.0",
"undici": "^7.29.0",
"fast-uri": "^3.1.5"
"fast-uri": "^3.1.5",
"nanoid": ">=3.3.16",
"ws": ">=8.21.0",
"protobufjs": ">=7.6.5"
},
"engines": {
"node": "18 || 20 || 22"
@@ -800,6 +800,7 @@
"quota-mail-info": "Um die Servicequalität aufrechtzuerhalten und Spam zu verhindern, erlaubt OpenSign bis zu 15 E-Mails pro Monat im kostenlosen Plan. Upgraden Sie jetzt für unbegrenzten E-Mail-Versand.",
"quota-mail-reset": "Ihre Credits für Signaturanfragen per E-Mail werden zurückgesetzt am",
"quota-mail": "Sie haben Ihr monatliches Limit von 15 Signaturanfragen per E-Mail erreicht. Jetzt upgraden, um weiter E-Mails direkt zu senden.",
"quota-mail-limit-reached": "Sie haben Ihr monatliches Limit von 15 E-Mail-Credits erreicht. Bitte upgraden Sie Ihren Tarif, um weiterhin E-Mails direkt zu senden.\nIhre E-Mail-Credits werden am {{resetDate}} zurückgesetzt.",
"quota-mail-tip": "Tipp: Sie können weiterhin <1>unbegrenzt Dokumente</1> signieren, indem Sie den Signaturanfragelink manuell teilen.",
"quota-mail-head": "Kontingent erreicht",
"unauthorized-modal": "Sie haben keine Berechtigung, diese Aktion auszuführen. Bitte kontaktieren Sie {{adminEmail}}.",
@@ -1597,15 +1598,19 @@
"access-code-set": "Zugangscode festgelegt",
"access-code-add": "Zugangscode hinzufügen",
"access-code-help": "Optionales Geheimnis, das nur dieser Unterzeichner kennt. Vor dem Anzeigen oder Unterschreiben des Dokuments wird die Eingabe verlangt. Geben Sie den Code dem Empfänger auf einem anderen Kanal weiter (Telefon, persönlich).",
"access-code-placeholder": "Mindestens 4 Zeichen",
"access-code-placeholder": "Mindestens 6 Ziffern",
"access-code-clear": "Löschen",
"access-code-must-be-numeric": "Der Zugangscode darf nur Ziffern 0-9 enthalten.",
"access-code-save": "Speichern",
"access-code-required": "Der Absender hat diesem Empfänger einen Zugangscode zugewiesen. Geben Sie ihn ein, um fortzufahren.",
"access-code-invalid": "Falscher Zugangscode. Bitte beim Absender nachfragen.",
"access-code-too-short": "Der Zugangscode muss mindestens 4 Zeichen lang sein.",
"access-code-too-short": "Der Zugangscode muss mindestens 6 Zeichen lang sein.",
"access-code-verify": "Zugangscode überprüfen",
"access-code-verified": "Zugangscode verifiziert.",
"access-code-warning": "Dieser Zugangscode kann nicht geändert oder abgerufen werden, sobald das Dokument versendet wurde.",
"copy-access-code": "Zugangscode kopieren",
"access-code-upgrade-msg": "Zugangscodes sind nur in kostenpflichtigen Tarifen verfügbar. Aktualisieren Sie Ihren Tarif, um Zugangscodes für Empfänger hinzuzufügen.",
"show-access-code": "Zugangscode anzeigen",
"hide-access-code": "Zugangscode ausblenden",
"already-copied-to-clipboard": "Bereits in die Zwischenablage kopiert"
}
@@ -800,6 +800,7 @@
"quota-mail-info": "To maintain service quality and prevent spam, OpenSign allows up to 15 emails per month on the free plan. Upgrade now for unlimited email sending.",
"quota-mail-reset": "Your signature request email credits will be reset on",
"quota-mail": "You've reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.",
"quota-mail-limit-reached": "You've reached your monthly limit of 15 email credits. Please upgrade your plan to continue sending emails directly.\nYour email credits will reset on {{resetDate}}",
"quota-mail-tip": "Tip: You can still sign <1>unlimited documents</1> by manually sharing the signing request link.",
"quota-mail-head": "Quota reached",
"unauthorized-modal": "You don't have permission to perform this action, please contact {{adminEmail}}.",
@@ -1598,16 +1599,18 @@
"access-code-set": "Access code set",
"access-code-add": "Add access code",
"access-code-help": "Optional secret only this signer knows. They will be required to enter it before viewing or signing the document. Share it with the recipient out-of-band (phone, in person).",
"access-code-placeholder": "At least 4 characters",
"access-code-placeholder": "At least 6 digits",
"access-code-clear": "Clear",
"access-code-save": "Save",
"access-code-required": "This recipient was given an access code by the sender. Enter it to continue.",
"access-code-invalid": "Incorrect access code. Please check with the sender.",
"access-code-too-short": "Access code must be at least 4 characters.",
"access-code-too-short": "Access code must be at least 6 digits.",
"access-code-must-be-numeric": "Access code must contain only digits 0-9.",
"access-code-verify": "Verify access code",
"access-code-verified": "Access code verified.",
"access-code-warning": "This access code cannot be changed or retrieved once the document is sent out.",
"copy-access-code": "Copy access code",
"access-code-upgrade-msg": "Access codes are available on paid plans only. Upgrade your plan to add access codes for recipients.",
"show-access-code": "Show access code",
"hide-access-code": "Hide access code",
"already-copied-to-clipboard": "Already copied to clipboard"
@@ -800,6 +800,7 @@
"quota-mail-info": "Para mantener la calidad del servicio y prevenir el spam, OpenSign permite hasta 15 correos electrónicos por mes en el plan gratuito. Mejora tu plan ahora para envíos ilimitados de correos electrónicos.",
"quota-mail-reset": "Los créditos de tu correo electrónico de solicitud de firma se restablecerán el",
"quota-mail": "Has alcanzado tu límite de 15 solicitudes de firma por correo para este mes. Mejora ahora para continuar enviando correos.",
"quota-mail-limit-reached": "Has alcanzado tu límite mensual de 15 créditos de correo electrónico. Mejora tu plan para continuar enviando correos directamente.\nTus créditos de correo electrónico se restablecerán el {{resetDate}}.",
"quota-mail-tip": "Consejo: Aún puedes firmar <1>documentos ilimitados</1> compartiendo manualmente el enlace de solicitud de firma.",
"quota-mail-head": "Cuota alcanzada",
"unauthorized-modal": "No tienes permisos para realizar esta acción, por favor, contacta a {{adminEmail}}.",
@@ -1598,15 +1599,19 @@
"access-code-set": "Código de acceso establecido",
"access-code-add": "Añadir código de acceso",
"access-code-help": "Secreto opcional que solo conoce este firmante. Deberá introducirlo antes de ver o firmar el documento. Compártalo con el destinatario por otro canal (teléfono, en persona).",
"access-code-placeholder": "Al menos 4 caracteres",
"access-code-placeholder": "Al menos 6 dígitos",
"access-code-clear": "Borrar",
"access-code-must-be-numeric": "El código de acceso debe contener solo dígitos 0-9.",
"access-code-save": "Guardar",
"access-code-required": "El remitente asignó un código de acceso a este destinatario. Introdúzcalo para continuar.",
"access-code-invalid": "Código de acceso incorrecto. Consulte con el remitente.",
"access-code-too-short": "El código de acceso debe tener al menos 4 caracteres.",
"access-code-too-short": "El código de acceso debe tener al menos 6 dígitos.",
"access-code-verify": "Verificar código de acceso",
"access-code-verified": "Código de acceso verificado.",
"access-code-warning": "Este código de acceso no se puede cambiar ni recuperar una vez que se envía el documento.",
"copy-access-code": "Copiar código de acceso",
"access-code-upgrade-msg": "Los códigos de acceso solo están disponibles en planes de pago. Actualice su plan para agregar códigos de acceso a los destinatarios.",
"show-access-code": "Mostrar código de acceso",
"hide-access-code": "Ocultar código de acceso",
"already-copied-to-clipboard": "Ya copiado al portapapeles"
}
@@ -798,6 +798,7 @@
"quota-mail-info": "Pour maintenir la qualité du service et prévenir le spam, OpenSign permet jusqu'à 15 e-mails par mois avec le plan gratuit. Passez à l'offre supérieure pour un envoi illimité d'e-mails.",
"quota-mail-reset": "Les crédits de votre email de demande de signature seront réinitialisés le",
"quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.",
"quota-mail-limit-reached": "Vous avez atteint votre limite mensuelle de 15 crédits e-mail. Veuillez mettre à niveau votre forfait pour continuer à envoyer des e-mails directement.\nVos crédits e-mail seront réinitialisés le {{resetDate}}.",
"quota-mail-tip": "Astuce: Vous pouvez toujours signer un nombre <1>illimité de documents</1> en partageant manuellement le lien de demande de signature.",
"quota-mail-head": "Quota atteint",
"unauthorized-modal": "Vous n'êtes pas autorisé à effectuer cette action, veuillez contacter {{adminEmail}}.",
@@ -1599,15 +1600,19 @@
"access-code-set": "Code d'accès défini",
"access-code-add": "Ajouter un code d'accès",
"access-code-help": "Secret optionnel connu uniquement de ce signataire. Il devra le saisir avant de voir ou de signer le document. Communiquez-le au destinataire par un autre canal (téléphone, en personne).",
"access-code-placeholder": "Au moins 4 caractères",
"access-code-placeholder": "Au moins 6 chiffres",
"access-code-clear": "Effacer",
"access-code-must-be-numeric": "Le code d'accès ne doit contenir que des chiffres 0-9.",
"access-code-save": "Enregistrer",
"access-code-required": "L'expéditeur a attribué un code d'accès à ce destinataire. Saisissez-le pour continuer.",
"access-code-invalid": "Code d'accès incorrect. Veuillez vérifier auprès de l'expéditeur.",
"access-code-too-short": "Le code d'accès doit comporter au moins 4 caractères.",
"access-code-too-short": "Le code d'accès doit comporter au moins 6 chiffres.",
"access-code-verify": "Vérifier le code d'accès",
"access-code-verified": "Code d'accès vérifié.",
"access-code-warning": "Ce code d'accès ne peut pas être modifié ou récupéré une fois le document envoyé.",
"copy-access-code": "Copier le code d'accès",
"access-code-upgrade-msg": "Les codes d'accès sont disponibles uniquement dans les forfaits payants. Améliorez votre forfait pour ajouter des codes d'accès aux destinataires.",
"show-access-code": "Afficher le code daccès",
"hide-access-code": "Masquer le code daccès",
"already-copied-to-clipboard": "Déjà copié dans le presse-papiers"
}
@@ -801,6 +801,7 @@
"quota-mail-reset": "आपके हस्ताक्षर अनुरोध ईमेल क्रेडिट इस पर रीसेट हो जाएंगे",
"quota-mail": "आपने इस महीने के लिए 15 हस्ताक्षर अनुरोध ईमेल की अपनी सीमा पूरी कर ली है। सीधे ईमेल भेजना जारी रखने के लिए अभी अपग्रेड करें।",
"quota-mail-tip": "सुझाव: आप अभी भी हस्ताक्षर अनुरोध लिंक को मैन्युअल रूप से साझा करके <1>असीमित दस्तावेज़ों</1> पर हस्ताक्षर कर सकते हैं।",
"quota-mail-limit-reached": "आपने 15 ईमेल क्रेडिट की अपनी मासिक सीमा पूरी कर ली है। सीधे ईमेल भेजना जारी रखने के लिए कृपया अपना प्लान अपग्रेड करें।\nआपके ईमेल क्रेडिट {{resetDate}} को रीसेट हो जाएंगे।",
"quota-mail-head": "कोटा पहुँच गया",
"unauthorized-modal": "आपको यह कार्रवाई करने की अनुमति नहीं है, कृपया {{adminEmail}} से संपर्क करें।",
"sent-this-month": "इस महीने भेजा गया",
@@ -1598,15 +1599,19 @@
"access-code-set": "एक्सेस कोड सेट किया गया",
"access-code-add": "एक्सेस कोड जोड़ें",
"access-code-help": "वैकल्पिक गुप्त कोड जो केवल इस हस्ताक्षरकर्ता को पता है। दस्तावेज़ देखने या हस्ताक्षर करने से पहले उन्हें इसे दर्ज करना होगा। इसे प्राप्तकर्ता के साथ किसी अन्य माध्यम (फ़ोन, व्यक्तिगत रूप से) से साझा करें।",
"access-code-placeholder": "कम से कम 4 अक्षर",
"access-code-placeholder": "कम से कम 6क",
"access-code-clear": "साफ़ करें",
"access-code-must-be-numeric": "एक्सेस कोड में केवल 0-9 अंक होने चाहिए।",
"access-code-save": "सहेजें",
"access-code-required": "प्रेषक ने इस प्राप्तकर्ता को एक एक्सेस कोड दिया है। जारी रखने के लिए इसे दर्ज करें।",
"access-code-invalid": "गलत एक्सेस कोड। कृपया प्रेषक से जांचें।",
"access-code-too-short": "एक्सेस कोड कम से कम 4 अक्षर का होना चाहिए।",
"access-code-too-short": "एक्सेस कोड कम से कम 6क का होना चाहिए।",
"access-code-verify": "एक्सेस कोड सत्यापित करें",
"access-code-verified": "एक्सेस कोड सत्यापित हो गया।",
"access-code-warning": "एक बार दस्तावेज़ भेज दिए जाने के बाद इस एक्सेस कोड को बदला या पुनः प्राप्त नहीं किया जा सकता।",
"copy-access-code": "एक्सेस कोड कॉपी करें",
"access-code-upgrade-msg": "एक्सेस कोड केवल भुगतान योजनाओं पर उपलब्ध हैं। प्राप्तकर्ताओं के लिए एक्सेस कोड जोड़ने के लिए अपनी योजना को अपग्रेड करें।",
"show-access-code": "एक्सेस कोड दिखाएं",
"hide-access-code": "एक्सेस कोड छिपाएं",
"already-copied-to-clipboard": "पहले से क्लिपबोर्ड में कॉपी किया गया है"
}
@@ -800,6 +800,7 @@
"quota-mail-info": "Per mantenere la qualità del servizio e prevenire lo spam, OpenSign consente fino a 15 email al mese con il piano gratuito. Esegui l'upgrade ora per l'invio illimitato di email.",
"quota-mail-reset": "I tuoi crediti email per richieste di firma saranno ripristinati il",
"quota-mail": "Hai raggiunto il limite di 15 email di richiesta di firma per questo mese. Passa al piano superiore per continuare a inviare email direttamente.",
"quota-mail-limit-reached": "Hai raggiunto il limite mensile di 15 crediti email. Effettua l'upgrade del tuo piano per continuare a inviare email direttamente.\nI tuoi crediti email verranno ripristinati il {{resetDate}}.",
"quota-mail-tip": "Suggerimento: Puoi ancora firmare un numero <1>illimitato de documenti</1> condividendo manualmente il link della richiesta di firma.",
"quota-mail-head": "Quota Raggiunta",
"unauthorized-modal": "Non hai l'autorizzazione per eseguire questa azione, contatta {{adminEmail}}.",
@@ -1598,15 +1599,19 @@
"access-code-set": "Codice di accesso impostato",
"access-code-add": "Aggiungi codice di accesso",
"access-code-help": "Codice segreto facoltativo noto solo a questo firmatario. Dovrà inserirlo prima di visualizzare o firmare il documento. Comunicalo al destinatario tramite un canale alternativo (telefono, di persona).",
"access-code-placeholder": "Almeno 4 caratteri",
"access-code-placeholder": "Almeno 6 cifre",
"access-code-clear": "Cancella",
"access-code-must-be-numeric": "Il codice di accesso deve contenere solo cifre 0-9.",
"access-code-save": "Salva",
"access-code-required": "Il mittente ha assegnato un codice di accesso a questo destinatario. Inseriscilo per continuare.",
"access-code-invalid": "Codice di accesso errato. Verifica con il mittente.",
"access-code-too-short": "Il codice di accesso deve contenere almeno 4 caratteri.",
"access-code-too-short": "Il codice di accesso deve contenere almeno 6 cifre.",
"access-code-verify": "Verifica codice di accesso",
"access-code-verified": "Codice di accesso verificato.",
"access-code-warning": "Questo codice di accesso non può essere modificato o recuperato una volta inviato il documento.",
"copy-access-code": "Copia codice di accesso",
"access-code-upgrade-msg": "I codici di accesso sono disponibili solo nei piani a pagamento. Aggiorna il tuo piano per aggiungere codici di accesso per i destinatari.",
"show-access-code": "Mostra codice di accesso",
"hide-access-code": "Nascondi codice di accesso",
"already-copied-to-clipboard": "Già copiato negli appunti"
}
@@ -800,6 +800,7 @@
"quota-mail-info": "서비스 품질을 유지하고 스팸을 방지하기 위해 OpenSign은 무료 플랜에서 월 최대 15개의 이메일을 허용합니다. 지금 업그레이드하여 무제한 이메일 전송을 이용하세요.",
"quota-mail-reset": "서명 요청 이메일 크레딧은 다음에 재설정됩니다.",
"quota-mail": "이번 달 서명 요청 이메일 15개 한도에 도달했습니다. 지금 업그레이드하여 이메일을 계속 직접 보내세요.",
"quota-mail-limit-reached": "월간 이메일 크레딧 15개 한도에 도달했습니다. 이메일을 계속 직접 보내려면 요금제를 업그레이드하세요.\n이메일 크레딧은 {{resetDate}}에 재설정됩니다.",
"quota-mail-tip": "팁: 서명 요청 링크를 수동으로 공유하여 <1>무제한 문서</1>에 계속 서명할 수 있습니다.",
"quota-mail-head": "할당량 도달",
"unauthorized-modal": "이 작업을 수행할 권한이 없습니다. {{adminEmail}}에게 문의하세요.",
@@ -1594,19 +1595,23 @@
"remove": "제거",
"attachement-note": "참고: 이 위젯을 사용하면 서명자가 서명 과정 중에 파일을 업로드할 수 있습니다. 업로드된 파일은 기존 PDF의 마지막에 추가 페이지로 첨부됩니다.",
"attachments-docx-not-supported": "현재 DOCX 파일 업로드에 문제가 발생하고 있습니다. 다른 지원되는 형식으로 문서를 업로드하시거나 잠시 후 다시 시도해 주세요.",
"access-code": "접속 코드",
"access-code": "접속 코드",
"access-code-set": "접속 코드가 설정됨",
"access-code-add": "접속 코드 추가",
"access-code-help": "이 서명자만 아는 선택적 비밀번호입니다. 문서를 보거나 서명하기 전에 반드시 입력해야 합니다. 전화 또는 직접 만나서 등 별도의 경로로 수신자에게 전달하세요.",
"access-code-placeholder": "4자 이상",
"access-code-placeholder": "6자리 이상 숫자",
"access-code-clear": "지우기",
"access-code-must-be-numeric": "접속 코드는 0-9 숫자만 포함해야 합니다.",
"access-code-save": "저장",
"access-code-required": "발신자가 이 수신자에게 접속 코드를 지정했습니다. 계속하려면 입력하세요.",
"access-code-invalid": "잘못된 접속 코드입니다. 발신자에게 문의하세요.",
"access-code-too-short": "접속 코드는 4자 이상이어야 합니다.",
"access-code-too-short": "접속 코드는 6자리 이상 숫자여야 합니다.",
"access-code-verify": "접속 코드 확인",
"access-code-verified": "접속 코드가 확인되었습니다.",
"access-code-warning": "문서가 발송된 후에는 이 접속 코드를 변경하거나 검색할 수 없습니다.",
"copy-access-code": "접속 코드 복사",
"access-code-upgrade-msg": "접속 코드는 유료 요금제에서만 사용할 수 있습니다. 수신자에게 접속 코드를 추가하려면 요금제를 업그레이드하세요.",
"show-access-code": "액세스 코드 표시",
"hide-access-code": "액세스 코드 숨기기",
"already-copied-to-clipboard": "이미 클립보드에 복사됨"
}
+1 -495
View File
@@ -230,355 +230,6 @@ function PdfRequestFiles(
}
}, [redirectTimeLeft, isredirectCanceled, redirectUrl]);
if (!docId || !signerObjId) {
throw new Error(t("something-went-wrong-mssg"));
}
const res = await Parse.Cloud.run("verifyAccessCode", {
docId,
signerObjId,
code
});
if (res?.verified) {
setAccessCodeVerified(true);
setAccessCodeRequired(false);
return true;
}
throw new Error(t("access-code-invalid"));
} catch (err) {
// Re-throw so the modal can render the message inline.
throw new Error(
err?.message === "Incorrect access code."
? t("access-code-invalid")
: err?.message || t("access-code-invalid")
);
} finally {
setAccessCodeLoader(false);
}
};
const handleNavigation = () => {
window.location.href = subscriptionpath;
};
async function checkIsSubscribed(extUserId, contactId) {
const isGuestSign = isGuestSignFlow || false;
const isPublic = props.templateId ? true : false;
const res = await fetchSubscription(
extUserId,
contactId,
isGuestSign,
isPublic
);
const plan = res.plan;
const billingDate = res?.billingDate;
const status = res?.status;
if (plan === "freeplan") {
return true;
} else if (billingDate) {
if (new Date(billingDate) > new Date()) {
if (!isSandbox) {
setPlanCode(plan);
}
setIsSubscribed(true);
return true;
} else {
if (isGuestSign) {
setIsSubscriptionExpired(true);
} else {
handleNavigation(plan);
}
}
} else if (isGuestSign) {
if (status) {
if (!isSandbox) {
setPlanCode(plan);
}
setIsSubscribed(true);
return true;
} else {
setIsSubscriptionExpired(true);
}
} else {
if (isGuestSign) {
setIsSubscriptionExpired(true);
} else {
handleNavigation(res.plan);
}
}
}
// `checkIsSubscribedPublic` this function will check owner subscription and only call in public template flow
async function checkIsSubscribedPublic(extUserId) {
const isPublic = props.templateId ? true : false;
const res = await fetchSubscription(extUserId, "", false, isPublic);
const plan = res.plan;
const billingDate = res?.billingDate;
if (plan === "freeplan") {
setIsSubscriptionExpired(false);
} else if (billingDate) {
if (new Date(billingDate) > new Date()) {
if (!isSandbox) {
setPlanCode(plan);
}
setIsSubscribed(true);
} else {
setIsSubscriptionExpired(true);
}
} else {
setIsSubscriptionExpired(true);
}
}
//function for get document details for perticular signer with signer'object id
//whenever change anything in this function check react/angular packages also in plan js
const getTemplateDetails = async () => {
try {
const params = { templateId: props.templateId, ispublic: true };
const templateDeatils = await axios.post(
`${localStorage.getItem("baseUrl")}functions/getTemplate`,
params,
{
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
sessiontoken: localStorage.getItem("accesstoken")
}
}
);
const documentData = templateDeatils?.data?.result
? [templateDeatils?.data?.result]
: [];
if (documentData && documentData[0]?.error) {
props?.setTemplateStatus &&
props?.setTemplateStatus({ status: "Invalid" });
throw new Error("error: Invalid TemplateId");
} else if (documentData && documentData.length > 0) {
await checkIsSubscribedPublic(documentData[0]?.ExtUserPtr?.objectId);
hideLiveChatWidget(
documentData?.[0]?.ExtUserPtr?.TenantId?.HideLiveChatForSigners
);
if (documentData[0]?.IsPublic) {
const prefillImg = await utils?.savePrefillImg(
documentData[0]?.Placeholders
);
if (prefillImg && Array.isArray(prefillImg)) {
prefillImg.forEach((img) => {
dispatch(setPrefillImg(img));
});
}
// Fetch prefill data from contracts_templateLinks for public mode and merge into local state
// so that prefill values saved by the admin are available without modifying the template
try {
const templateLinksQuery = new Parse.Query(
"contracts_templateLinks"
);
const templatePtr = Parse.Object.extend(
"contracts_Template"
).createWithoutData(props.templateId);
templateLinksQuery.equalTo("TemplatePtr", templatePtr);
templateLinksQuery.equalTo("Type", "public");
const templateLink = await templateLinksQuery.first();
if (templateLink) {
const savedPrefillPlaceholders =
templateLink.get("Placeholders") || [];
if (savedPrefillPlaceholders?.length) {
// Replace the prefill role in documentData prefill placeholders with the saved prefill details
const updatedPlaceholders = documentData[0].Placeholders.map(
(ph) => {
if (ph.Role === "prefill") {
return {
...ph,
placeHolder: savedPrefillPlaceholders // ✅ only update this field
};
}
return ph;
}
);
documentData[0] = {
...documentData[0],
Placeholders: updatedPlaceholders
};
// Re-run savePrefillImg with the updated placeholders so image widgets are loaded correctly
const updatedPrefillImg = await utils?.savePrefillImg(
documentData[0]?.Placeholders
);
if (updatedPrefillImg && Array.isArray(updatedPrefillImg)) {
updatedPrefillImg.forEach((img) => {
dispatch(setPrefillImg(img));
});
}
}
}
} catch (e) {
console.error("Error fetching templateLinks for public:", e);
}
const appname =
documentData?.[0]?.ExtUserPtr?.TenantId?.WhiteLabelAppName ||
appName;
localStorage.setItem("appname", appname);
//handle condition when someone use plan js then setTemplateStatus is not supporting
props?.setTemplateStatus &&
props?.setTemplateStatus({ status: "Success" });
const url =
documentData[0] &&
(documentData[0]?.SignedUrl || documentData[0]?.URL);
setSendInOrder(documentData[0]?.SendinOrder || false);
setExtUserId(documentData[0]?.ExtUserPtr?.objectId);
setOwner(documentData?.[0]?.ExtUserPtr);
// Collect all assigned widget IDs. If modification is enabled, the user can only add or modify new widgets—not the ones already assigned.
if (documentData[0]?.AllowModifications) {
const removePrefill = documentData[0]?.Placeholders.filter(
(x) => x.Role !== "prefill"
);
const firstRolePH = removePrefill[0];
const widgetId = firstRolePH.placeHolder?.flatMap((page) => {
return page.pos.map((item) => item.key);
});
setAssignedWidgetId(widgetId);
}
if (url) {
const base64Pdf = await getBase64FromUrl(url);
if (base64Pdf) {
setPdfBase64Url(base64Pdf);
}
} else {
setHandleError(t("something-went-wrong-mssg"));
}
//handle allowed signature type
const userSignatureType =
documentData?.[0]?.ExtUserPtr?.SignatureType || signatureTypes;
const docSignTypes =
documentData?.[0]?.SignatureType || userSignatureType;
setSignatureType(docSignTypes);
const removePrefill =
documentData[0]?.Placeholders.filter((x) => x.Role !== "prefill") ||
[];
const isAttachAllSigner =
removePrefill?.length > 0 &&
removePrefill?.every(
(data) => data?.signerObjId && data?.Role !== "prefill"
);
const isEnableOTP = documentData?.[0]?.IsEnableOTP || false;
if (isAttachAllSigner) {
if (isEnableOTP) {
setIsPublicTemplate(true);
} else {
setCurrentSigner(true);
setSignerObjectId(documentData?.[0]?.Signers?.[0]?.objectId);
}
} else {
setIsPublicTemplate(true);
}
setUniqueId(removePrefill[0]?.Id);
let placeholdersOrSigners = [];
for (const placeholder of removePrefill) {
//`emailExist` variable to handle condition for quick send flow and show unsigned signers list
const signerIdExist = placeholder?.signerObjId;
if (signerIdExist) {
const getSignerData = documentData[0]?.Signers?.find(
(data) => data.objectId === placeholder?.signerObjId
);
placeholdersOrSigners.push(getSignerData);
} else {
placeholdersOrSigners.push(placeholder);
}
}
const getVacantRole = documentData[0]?.Placeholders?.filter(
(x) => !x?.signerObjId && x.Role !== "prefill"
);
if (getVacantRole?.length > 0) {
setVacantRole(getVacantRole);
setFormData(
getVacantRole.map(() => ({
name: "",
email: "",
phone: "",
id: ""
}))
);
}
if (removePrefill && removePrefill.length > 0) {
//check first role attached signer or not
const getfirstSignerObjId = removePrefill[0]?.signerObjId;
//save isSignerFirstRole true if first role attached signer
if (getfirstSignerObjId) {
setIsSignerFirstRole(true);
}
}
setUnSignedSigners(placeholdersOrSigners);
setPdfDetails(documentData);
setSignerPos(
updateDateWidgetsRes(documentData[0], removePrefill[0]?.Id)
);
setIsLoading({ isLoad: false });
} else {
props?.setTemplateStatus &&
props?.setTemplateStatus({ status: "Private" });
setIsLoading({ isLoad: false });
// setHandleError(t("something-went-wrong-mssg"));
setHandleError(t("this-template-is-not-public"));
console.error("error: TemplateId is not public");
return;
}
} else {
props?.setTemplateStatus &&
props?.setTemplateStatus({ status: "Invalid" });
setIsLoading({ isLoad: false });
setHandleError(t("invalid-templateid"));
console.error("error: Invalid TemplateId");
return;
}
} catch (err) {
setIsLoading({ isLoad: false });
if (err?.response?.data?.code === 101) {
setHandleError(t("error-template"));
} else if (err?.message?.includes("Invalid")) {
setHandleError(t("invalid-templateid"));
} else {
setHandleError(t("something-went-wrong-mssg"));
}
console.error("error: Invalid TemplateId", err);
return;
}
};
const addsigner = async (contact) => {
try {
const baseURL = localStorage.getItem("baseUrl");
const url = `${baseURL}functions/publicsavecontact`;
const data = contact;
const headers = {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId")
};
await axios.post(url, data, { headers });
} catch (err) {
console.log("Err", err);
setHandleError(t("something-went-wrong-mssg"));
}
};
// `checkIfAlreadySubmitted` function will check whether signer already submitted the offline signed document to avoid multiple submission for same document by same signer.
const checkIfAlreadySubmitted = async (documentId, contactId) => {
try {
const { offlineSigned } = await Parse.Cloud.run(
"checkofflinesubmission",
{ documentId, contactId }
);
if (offlineSigned) {
setHandleError(t("offline-already-submitted-body"));
return true;
}
} catch (error) {
console.error("Error checking offline submission:", error);
}
return false;
};
const fetchTenantDetails = async (contactId) => {
const user = JSON.parse(
@@ -1772,151 +1423,6 @@ function PdfRequestFiles(
closeTour();
setIsReqSignTourDisabled(true);
};
}
setIsUiLoading(false);
} catch (e) {
console.log("e", e);
if (
e?.response?.data?.error === "Insufficient Credit" ||
e?.response?.data?.error === "Plan expired"
) {
handleCloseOtp();
setIsAlert({
title: t("insufficient-credits-title"),
isShow: true,
alertMessage: t("insufficient-credits-mssg", { appName })
});
} else {
handleCloseOtp();
setIsAlert({
title: "Error",
isShow: true,
alertMessage: t("something-went-wrong-mssg")
});
}
}
};
const handleInputChange = (e) => {
let { name, value } = e.target;
const updatedForm = [...formData];
if (name === "email") {
value = value?.toLowerCase()?.replace(/\s/g, "");
}
updatedForm[currentIndex] = {
...updatedForm[currentIndex],
[name]: value,
id: vacantRole[currentIndex]?.Id
};
setFormData(updatedForm);
};
const SendOtp = async (app, email, isLoad) => {
if (isLoad) {
setLoading(true);
setIsOtp(true);
}
const appName = app || localStorage.getItem("appname") || "OpenSign™";
try {
const params = {
email: email,
appName: appName
};
const Otp = await axios.post(
`${localStorage.getItem("baseUrl")}/functions/SendOTPMailV1`,
params,
{
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId")
}
}
);
if (Otp) {
setIsOtp(true);
setLoading(false);
}
} catch (error) {
console.log("error in verify otp in public-sign", error);
setIsAlert({
title: "Error",
isShow: true,
alertMessage: t("something-went-wrong-mssg")
});
}
};
//verify OTP send on via email
const VerifyOTP = async (e) => {
e.preventDefault();
setLoading(true);
const serverUrl =
localStorage.getItem("baseUrl") && localStorage.getItem("baseUrl");
const parseId =
localStorage.getItem("parseAppId") && localStorage.getItem("parseAppId");
if (otp) {
try {
let url = `${serverUrl}/functions/AuthLoginAsMail`;
const headers = {
"Content-Type": "application/json",
"X-Parse-Application-Id": parseId
};
let contact;
if (isSignerFirstRole) {
const firstSigner = pdfDetails?.[0]?.Signers?.[0];
contact = { email: firstSigner.Email, name: firstSigner.Name };
} else {
contact = formData[0];
}
let body = { email: contact.email, otp: otp };
let user = await axios.post(url, body, { headers: headers });
if (user.data.result === "Invalid Otp") {
alert(t("invalid-otp"));
setLoading(false);
} else if (user.data.result === "user not found!") {
alert(t("user-not-found"));
setLoading(false);
} else {
let _user = user.data.result;
const parseId = localStorage.getItem("parseAppId");
if (_user) {
localStorage.setItem("accesstoken", _user?.sessionToken);
localStorage.setItem("UserInformation", JSON.stringify(_user));
localStorage.setItem(
`Parse/${parseId}/currentUser`,
JSON.stringify(_user)
);
}
await Parse.User.become(_user.sessionToken);
const contractUserDetails = await contractUsers();
if (contractUserDetails && contractUserDetails.length > 0) {
localStorage.setItem(
"Extand_Class",
JSON.stringify(contractUserDetails)
);
}
setLoading(false);
setIsLoading({ isLoad: false });
setIsPublicContact(false);
setIsPublicTemplate(false);
const removePrefill = signerPos.filter((x) => x.Role !== "prefill");
const getSignerObjId = removePrefill[0]?.signerObjId;
setSignerObjectId(getSignerObjId);
setCurrentSigner(true);
setSignerPos(updateDateWidgetsRes(pdfDetails[0], getSignerObjId));
}
} catch (error) {
console.log("err ", error);
}
} else {
alert(t("enter-otp-alert"));
}
};
const handleCloseOtp = () => {
setIsPublicContact(false);
setLoading(false);
setIsOtp(false);
setOtp();
};
const clickOnZoomIn = () => {
onClickZoomIn(scale, setScale, scrollRef);
@@ -2335,7 +1841,7 @@ function PdfRequestFiles(
? "none"
: "auto"
}}
className={`${
className={`${
isGuestSignFlow
? "border-[0.5px] border-gray-300"
: "op-card"
@@ -327,8 +327,8 @@ export default async function createBatchDocs(request) {
const Documents = JSON.parse(strDocuments);
const Ip = request?.headers?.['x-real-ip'] || '';
// Access the host from the headers
const publicUrl = request.headers.public_url;
// Use the browser origin so signing links keep the custom domain.
let publicUrl = request.headers.origin || request.headers.public_url;
const parseConfig = {
baseURL: serverUrl,
headers: {
@@ -29,7 +29,7 @@ export default async function createDocumentFromApp(request) {
docCls.set('URL', doc?.URL);
docCls.set('ExtUserPtr', doc.ExtUserPtr);
docCls.set('CreatedBy', doc.CreatedBy);
docCls.set('OriginIp', request?.headers?.['x-real-ip'] || '');
if (doc.Description) {
docCls.set('Description', doc.Description);
}
@@ -37,6 +37,18 @@ const getGmail = async (access_token, displayName) => {
return displayName;
}
};
export const encodeMimeAddress = address => {
const value = String(address || '');
const match = value.match(/^(.*?)\s*<([^<>]+)>$/);
const displayName = match ? match[1].trim() : value;
if (/^[\x00-\x7F]*$/.test(displayName)) return value;
const encodedName = Buffer.from(displayName, 'utf8').toString('base64');
return match ? `=?UTF-8?B?${encodedName}?= <${match[2]}>` : `=?UTF-8?B?${encodedName}?=`;
};
// Function to create a raw email message
const makeEmail = async (
to,
@@ -137,7 +149,7 @@ const makeEmail = async (
'Content-Type: multipart/mixed; boundary="' + boundary + '"\n',
'MIME-Version: 1.0\n',
`To: ${to}\n`,
`From: ${from}\n`,
`From: ${encodeMimeAddress(from)}\n`,
bccHeader,
ccHeader,
replyToHeader,
@@ -155,7 +167,7 @@ const makeEmail = async (
'Content-Type: multipart/mixed; boundary="' + boundary + '"\n',
'MIME-Version: 1.0\n',
`To: ${to}\n`,
`From: ${from}\n`,
`From: ${encodeMimeAddress(from)}\n`,
bccHeader,
ccHeader,
replyToHeader,
+1837 -2414
View File
File diff suppressed because it is too large Load Diff
+10 -7
View File
@@ -40,22 +40,22 @@
"mailgun.js": "^13.0.0",
"moment": "^2.30.1",
"mongodb": "^7.2.0",
"multer": "^2.1.1",
"multer": "^2.2.0",
"multer-s3": "^3.0.1",
"node-forge": "^1.3.3",
"nodemailer": "^8.0.7",
"nodemailer": "^9.0.1",
"p-limit": "^7.3.0",
"parse": "^8.1.0",
"parse": "^8.6.0",
"parse-dbtool": "^1.2.0",
"parse-server": "^8.6.77",
"parse-server": "^8.6.84",
"parse-server-api-mail-adapter": "^5.0.5",
"pdf-lib": "^1.17.1",
"posthog-node": "^5.21.2",
"qrcode": "^1.5.4",
"rate-limiter-flexible": "^9.1.1",
"sharp": "^0.34.5",
"sharp": "^0.35.3",
"speakeasy": "^2.0.0",
"ws": ">=8.21.0"
"ws": "^8.21.0"
},
"type": "module",
"devDependencies": {
@@ -73,6 +73,7 @@
"parse": "$parse",
"form-data": "$form-data",
"@parse/push-adapter": "$@parse/push-adapter",
"@grpc/grpc-js": ">=1.14.4",
"fast-xml-builder": "1.2.0",
"protobufjs": ">=7.6.3",
"tmp": ">=0.2.7",
@@ -81,7 +82,9 @@
"websocket-driver": ">=0.7.5",
"js-yaml": "^3.15.0",
"lodash": "^4.18.0",
"undici": "^7.29.0"
"undici": "^7.29.0",
"uuid": ">=11.1.1",
"body-parser": ">=2.3.0"
},
"engines": {
"node": "18 || 20 || 22"