feat: apply multisupport language for signing flow in signyour-self, template , placeholder

This commit is contained in:
RaktimaNXG
2024-07-31 21:26:08 +05:30
parent 779d5df264
commit c6e93cd3c8
43 changed files with 1005 additions and 548 deletions
+236 -28
View File
@@ -7,14 +7,16 @@
"email":"Email",
"company":"Company",
"job-title":"Job title",
"profile":"Profile",
"log-out":"Log Out",
"is-email-verified":"Is Email verified",
"public-profile":"Public profile",
"tagline":"Tagline ",
"has-requested-you-to-sign":"has requested you to sign",
"has-requested-you-to-review-and-sign":" has requested you to review and sign",
"ascending":"Ascending",
"Action":"Action",
"add":"add",
"action":"Action",
"add":"Add",
"add-new-folder":"ajouter un nouveau dossier",
"disable-documentId":"Disable DocumentId",
"edit":"Edit",
@@ -22,14 +24,18 @@
"save":"Save",
"cancel":"Cancel",
"upgrade-now":"Upgrade now",
"pro":"PRO",
"team":"TEAM",
"user":"User",
"public-profile-help": "This is your public URL. Copy or share it with the signer, and you will be able to see all your publicly set templates.",
"docs":"Docs",
"public-profile-help":"This is your public URL. Copy or share it with the signer, and you will be able to see all your publicly set templates.",
"tagline-help":"This Tagline will appear on your OpenSign public profile for ex. https://opensign.me/alex",
"welcome":"Welcome Back!",
"Login-to-your-account":"Login to your account",
"password":"Password",
"forgot-password":"Forgot Password?",
"loading":"Loading...",
"of":"of",
"sign-SSO":"Sign in with SSO",
"login-page":"Login Page",
"or":"OR",
@@ -51,7 +57,7 @@
},
"OpenSign™ Drive":"OpenSign™ Drive",
"Reports":"Reports",
"Reports-Children" :{
"Reports-Children" :{
"Need your sign": "Need your sign",
"In Progress": "In Progress",
"Completed":"Completed",
@@ -64,7 +70,9 @@
"Settings-Children":{
"My Signature": "My Signature",
"API Token":"API Token",
"Webhook":"Webhook"
"Webhook":"Webhook",
"Teams":"Teams",
"Users":"Users"
}
},
"dashboard-card":{
@@ -82,19 +90,39 @@
"Recent signature requests":"Recent signature requests",
"Drafts":"Drafts",
"Contactbook":"Contactbook",
"Templates":"Templates"
"Templates":"Templates",
"Teams":"Teams",
"Users":"Users"
},
"btnLabel":{
"sign":"sign",
"Resend":"Resend",
"Revoke":"Revoke",
"Delete":"Delete",
"Use":"Use",
"Quick send":"Quick send",
"Edit":"Edit",
"Share with team":"Share with team",
"Share":"Share",
"View":"View",
"option":"option"
},
"report-heading":{
"Sr.No":"Sr.No",
"Title":"Title",
"Email":"Email",
"Phone":"Phone",
"File":"File",
"Owner": "Owner",
"Owner": "Owner",
"Signers":"Signers",
"Note": "Note",
"Folder": "Folder",
"Reason": "Reason"
"Reason": "Reason",
"Parent Team":"Parent Team",
"Active":"Active",
"Role":"Role",
"Team":"Team",
"Name":"Name"
},
"report-help":{
"Draft Documents": "These are documents you have started but have not finalized for sending.",
@@ -121,9 +149,9 @@
"send-in-order":"Send In Order",
"send-in-order-help":{
"p1":"Choose how you want the signing requests to be sent to the document signers:",
"p2":" Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.",
"p3":" Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.",
"p4":" Select the option that best suits the needs of your document processing."
"p2":"Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.",
"p3":"Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.",
"p4":"Select the option that best suits the needs of your document processing."
},
"no":"No",
"auto-reminder":"Auto reminder",
@@ -139,7 +167,7 @@
"create-folder":"Create Folder",
"parent-folder":"Parent Folder",
"create":"Create",
"Signers":"Signers",
"signers":"Signers",
"signers-help":"Begin typing a contact's name to see suggested signers from your saved contacts or add new ones. Arrange the signing order by adding signers in the desired sequence. Use the '+' button to include signers and the 'x' to remove them. Each signer will receive an email prompt to sign the document in the order listed.",
"add-signer":"Add Signer",
"contact-not-found":"Contact not found",
@@ -160,13 +188,82 @@
"generate-token-alert" :"Are you sure you want to regenerate token it will expire old token?",
"yes":"Yes",
"copied":"Copied",
"wrong-mssg":"Something went wrong.",
"something-went-wrong-mssg":"Something went wrong, please try again later.",
"token-generated":"Token generated successfully.",
"webhook":"Webhook",
"update-webhook":"Update Webhook",
"add-webhook":"Add Webhook",
"webhook-added" :"Webhook added successfully.",
"document-signature":{
"team-disabled":"Team disabled",
"Team enabled":"Team enabled",
"are-you-sure": "Are you sure you want to",
"disable":"disable",
"enable":"enable",
"this-team":" this team?",
"edit-team":"Edit Team",
"name-of-team":"Name of Team",
"prev":"Prev",
"no-data-avaliable":"No Data Available",
"add-team":"Add Team",
"page-not-found":"Page Not Found",
"users-from-teams":"users from Teams",
"user-status":"User status",
"activate" :"activate",
"deactivate":"deactivate",
"this-user":" this user",
"delete-user":"Delete User",
"delete":"delete",
"add-user":"Add User",
"password-generateed" :"Password will only be generated once; make sure to copy it.",
"Team status":"Team status",
"user-deactivated":"User deactivated.",
"user-activated":"User activated.",
"public":"Public",
"download":"Download",
"view":"View",
"make-template-public":"Make template public",
"make-template-private":"Make template private",
"make-template-public-alert" :"Are you sure you want to make this template public?",
"make-template-private-alert" :"Are you sure you want to make this template private? This will remove it from your public profile.",
"public-role":"Public role",
"public-url":"Public URL",
"public-url-copy-mssg" :" Heres your public URL: Copy it or share it with the signer, and you will be able to see all your publicly set templates.",
"add-public-url-alert" :"Please add your public URL, and you will be able to make a public template.",
"share-with-alert":"You cannot share a template if any roles already have contacts assigned. Please remove all contact assignments from the roles before sharing the template.",
"share-with":"Share with",
"team-not-found":"Team not found",
"roles":"Roles",
"delete-document":"Delete Document",
"delete-document-alert" :"Are you sure you want to delete this document?",
"quick-send":"Quick send",
"add-new":"Add new",
"send":"Send" ,
"quick-send-alert-1":"All roles in this document are currently linked to contacts. To quick send copies of this template to multiple signers, please ensure that at least one role is not linked to any contact." ,
"quick-send-alert-2" :"Please ensure there's at least one signature widget added for all recipients.",
"quick-send-alert-3":"Please add at least one role to this template in order to 'quick send' copies of it to multiple signers.",
"quick-send-alert-4":"Quick send reached limit.",
"copy-link":"Copy link",
"copy":"Copy",
"revoke-document":"Revoke document",
"revoke-document-alert":"Are you sure you want to revoke this document?",
"resend-mail":"Resend Mail",
"resend-mail-help":"You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.",
"subject":"Subject",
"body":"Body",
"add-contact":"Add Contact",
"add-signer-alert":"Contact already exist!",
"record-delete-alert": "Record deleted successfully!",
"record-revoke-alert" : "Record revoked successfully!",
"mail-sent-alert": "Mail sent successfully.",
"document-sent-alert" : "Document sent successfully!",
"template-share-alert" :"Template Shared successfully.",
"template-public-alert-1" :"You have successfully made the template public.",
"template-public-alert-2" :"You have successfully made the template private.",
"template-public-alert-3" :"You need to select a role for the public signers.",
"template-public-alert-4": "Please ensure there's at least one signature widget added for all signers.",
"template-public-alert-5" : "Since this template has send-in-order enabled, the public role must be positioned at the top.",
"template-public-alert-6" :"Please attach signers to all roles except for the public role user.",
"template-public-alert-7" : "Please assign at least one public role to make this template public.",
"loader":" This might take some time",
"pages":"Pages",
"document-signed":"Document signed",
@@ -180,18 +277,129 @@
"verify-email":"Please verify your email !",
"send-otp":" Send OTP",
"otp-placeholder":"Enter OTP received over email",
"loading-doc":"Loading Document.."
}
"loading-doc":"Loading Document..",
"widgets-name":{
"signature":"signature",
"stamp":"stamp",
"initials":"initials",
"name":"name",
"job title":"job title",
"company":"company",
"date":"date",
"text":"text",
"text input":"text input",
"checkbox":"checkbox",
"dropdown":"dropdown",
"radio button":"radio button",
"image": "image",
"email":"email"
},
"fields":"Fields",
"recipients":"Recipients",
"please-add":"Please add a",
"signed-by":"Signed By",
"more":"more",
"sent":"sent",
"print":"Print",
"certificate":"Certificate",
"decline":"Decline",
"finish":"Finish",
"mail":"Mail",
"sign-now":"Sign Now",
"successfully-signed":"Successfully signed!",
"email-mssg":" Recipients added here will get a copy of the signed document.",
"email-error-1":" please provide correct email address",
"email-error-2" :"You can only send to ten recipients at a time.",
"upload-stamp-image":"Upload stamp image",
"draw":"Draw",
"type":"Type",
"my-initials":"My Initials",
"upload":"Upload",
"initial-teb":"Initials",
"signature-tab":"Signature",
"your-signature":"Your signature",
"copy-to-all-pages":"Copy to all pages",
"apply":"Apply",
"copy-type":{
"All pages":"All pages",
"All pages but last":"All pages but last",
"All pages but first":"All pages but first"
},
"options":"options",
"minimun-check":"Minimun check",
"maximum-check":"Maximum check",
"default-value":"Default value",
"select":"Select",
"read-only":"Is read only",
"hide-labels":"Hide labels",
"checkbox":"Checkbox",
"alert":"Alert",
"zoom-in":"Zoom in",
"zoom-out":"Zoom out",
"document-signed-alert":"Congratulations! 🎉 This document has been successfully signed by you!",
"otp-sent-alert":"OTP sent on your email",
"fields-required":"Fields required",
"signature-widget-alert-1" :"Please ensure there's at least one signature widget added",
"signature-widget-alert-2" : "Please ensure all field is accurately filled and meets all requirements.",
"encrypted-pdf-alert" :"Currently encrypted pdf files are not supported.",
"user-not-exist":"User does not exist",
"template-signature-field":"Please add at least one signature field for all roles.",
"template-role-alert":"Please add roles first",
"create-document":"Create Document",
"template-created-alert":"Do you want to create a document using the template you just created ?",
"signers-alert":"signers alert",
"template-creation-alert-1":"Please select signer for add placeholder!",
"ok":"Ok",
"radio-group":"Radio group",
"dropdown-options":"Dropdown options",
"add-role":"Add Role",
"role-ex":" e.g: Customer, Hr, Director, Manager, Student, etc",
"add/choose-signer":"Add/Choose Signer",
"choose-from-contacts":"Choose from contacts",
"select-signer" :" Please select signer",
"edit-template":"Edit Template",
"widget-info":"Widget info",
"validation":"Validation",
"invalid-default-value":"invalid default value",
"hint":"Hint",
"color":"color",
"role-help":{
"p1":"What are template roles?",
"p2":"Begin by specifying each role needed for the completion of the document. Think about the parties involved in the signing process and what their responsibilities are. Common roles include HR for internal documents, Customer for agreements or Vendor for business agreements.",
"p3":"Why pre-attach users to some roles?",
"p4":"For roles that consistently involve the same individual (e.g., the CEO's signature on employee offer letters), you can pre-attach a user to a role within the template. This step is optional but recommended for efficiency and consistency across documents.",
"p5":"When do i specify the user attached to each role?",
"p6":"When you create a document from your template, you'll be prompted to attach users to each defined role. If a role already has a user attached, this will be pre-filled, but you can modify it as needed before sending out the document."
},
"add-recipients":"Add recipients",
"loading-mssg": "This might take some time",
"send-mail": "Send Mail",
"placeholder-alert-1":"Please ensure there's at least one signature widget added for all recipients.",
"placeholder-alert-2":"Please confirm that you have filled the text field.",
"placeholder-alert-3":" Are you sure you want to send out this document for signatures?",
"placeholder-alert-4":"You have successfully sent mails to all recipients!",
"placeholder-alert-5":"Do you want to sign documents right now ?",
"placeholder-alert-6" :"Please setup mail adapter to send mail!",
"placeholder-alert-7" :"Please select signer for add placeholder!",
"email-subject":"email subject",
"email-body":"email body",
"email-placeholder":"add body of email",
"reset-to-default" :"Reset to default",
"cutomize-email":"Cutomize Email",
"upgrade-to-customize-email":"Upgrade to customize Email",
"sign-url":"Sign url",
"Mails Sent":"Mails Sent",
"document-alert":"Document Alert",
"owner-subscription-expired":"Owner's subscription has expired.",
"subscription-expired":"Subscription Expired",
"alert-message":"Alert message",
"document-decline":"Document decline",
"decline-alert-1":"Are you sure want to decline this document ?",
"decline-alert-2":"You have declined this document!",
"decline-alert-3":"You can not sign this document as it has been declined/revoked.",
"sign here":"Sign here",
"guest-email-alert" :"verification code is sent to your email",
"get-otp-alert" :"you will get a OTP via Email"
}
}
+260 -41
View File
@@ -7,29 +7,35 @@
"email":"E-mail",
"company":"Entreprise",
"job-title":"Titre d'emploi",
"profile":"Profil",
"is-email-verified":"L'e-mail est-il vérifié",
"log-out" :"Déconnexion",
"public-profile":"Profil public",
"tagline":"Slogan",
"has-requested-you-to-sign":" vous a demandé de signer",
"has-requested-you-to-review-and-sign":"vous a demandé de consulter et de signer",
"Ascending":"Ascendant",
"Action":"Action",
"ascending":"Ascendant",
"action":"Action",
"add":"ajouter",
"add-new-folder":"add new folder",
"add-new-folder":"ajouter un nouveau dossier",
"disable-documentId":"Désactiver l'ID de document",
"edit":"Modifier",
"change-password":"Changer le mot de passe",
"save":"Sauvegarder",
"cancel":"Annuler",
"upgrade-now":"Mettre à jour maintenant",
"pro":"PRO",
"team":"ÉQUIPE",
"docs":"Documents",
"user":"Utilisateur",
"public-profile-help":"Il s'agit de votre URL publique. Copiez-le ou partagez-le avec le signataire et vous pourrez voir tous vos modèles définis publiquement.",
"tagline-help":"Ce slogan apparaîtra sur votre profil public OpenSign par exemple. https://opensign.me/alex",
"welcome":"Content de te revoir!",
"Login-to-your-account" :"Connectez-vous à votre compte",
"Login-to-your-account" :"Se connecter à son compte",
"password" :"Mot de passe",
"forgot-password":"Mot de passe oublié?",
"loading":"Chargement...",
"of":"de",
"sign-SSO":"Connectez-vous avec SSO",
"login-page":"Page de connexion",
"or":"OU",
@@ -42,7 +48,7 @@
"register" :"Registre",
"sidebar": {
"Dashboard": "Tableau de bord",
"Sign yourself": "Signez-vous",
"Sign yourself": "signez vous-même",
"Request signatures":"Demander des signatures",
"Templates":"Modèles",
"Templates-Children":{
@@ -51,20 +57,22 @@
},
"OpenSign™ Drive":"Lecteur OpenSign™",
"Reports":"Rapports",
"Reports-Children" :{
"Need your sign": "Besoin de votre signe",
"Reports-Children" :{
"Need your sign": "Besoin de signer",
"In Progress": "En cours",
"Completed":"Complété",
"Drafts": "Brouillons",
"Declined": "Diminué",
"Declined": "a refusé",
"Expired":"Expiré",
"Contactbook":"Carnet de contacts"
},
"Settings": "Paramètres",
"Settings-Children":{
"My Signature": "Ma signature",
"My Signature": "Ma signature",
"API Token":"Jeton API",
"Webhook":"Webhook"
"Webhook":"Webhook",
"Teams":"Équipes",
"Users":"Utilisateurs"
}
},
"dashboard-card":{
@@ -82,20 +90,40 @@
"Recent signature requests":"Demandes de signature récentes",
"Drafts":"Brouillons",
"Contactbook":"Carnet de contacts",
"Templates":"Modèles"
"Templates":"Modèles",
"Teams":"Teams",
"Users":"Utilisateurs"
},
"report-heading":{
"Sr.No":"Sr. Non",
"Title":"Titre",
"Email":"E-mail",
"Phone":"Téléphone",
"File":"Déposer",
"File":"Fichier",
"Owner":"Propriétaire",
"Signers":"Signataires",
"Note": "Note",
"Folder":"Dossier",
"Reason": "Raison"
"Reason": "Raison",
"Parent Team":"Équipe de parents",
"Active":"Actif",
"Role":"Rôle",
"Team":"Équipe",
"Name":"Nom"
},
"btnLabel":{
"sign":"signe",
"Resend":"Renvoyer",
"Revoke":"Révoquer",
"Delete":"Supprimer",
"Use":"Utiliser",
"Quick send":"Envoi rapide",
"Edit":"Modifier",
"Share with team":"Partager avec l'équipe",
"Share":"Partager",
"View":"Voir",
"option":"option"
},
"report-help":{
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
"Need your sign": "Voici une liste de documents qui attendent votre signature",
@@ -107,7 +135,7 @@
"Templates" : "Il s'agit d'une liste de modèles à votre disposition pour créer des documents. Vous pouvez cliquer sur le bouton 'Utiliser' pour créer un nouveau document à l'aide d'un modèle, modifier le document et ajouter des signataires à l'étape suivante."
},
"form-name":{
"Sign Yourself":"Signez-vous",
"Sign Yourself":"signez vous-même",
"Request Signatures":"Demander des signatures",
"New Template":"Nouveau modèle"
},
@@ -132,58 +160,249 @@
"select-folder" :"Sélectionner le dossier",
"OpenSign-drive":"Lecteur OpenSign™",
"select-folder-help" :"Si vous ne sélectionnez pas de dossier, votre document signé sera enregistré dans le dossier du lecteur principal OpenSign.",
"no-data" :"Aucune donnée disponible",
"no-data" :"Aucune donnée disponible",
"save-here":"Enregistrer ici",
"back" :"Dos",
"back" :"Retour",
"add-folder" :"Ajouter le dossier",
"create-folder":"Créer le dossier",
"parent-folder" :"Dossier parent",
"create":"Créer",
"Signers" :"Signataires",
"signers" :"Signataires",
"signers-help" :"Commencez à saisir le nom d'un contact pour voir les signataires suggérés par vos contacts enregistrés ou en ajouter de nouveaux. Organisez l'ordre de signature en ajoutant des signataires dans l'ordre souhaité. Utilisez le bouton « + » pour inclure les signataires et le « x » pour les supprimer. Chaque signataire recevra un e-mail invité à signer le document dans l'ordre indiqué.",
"add-signer":"Ajouter un signataire",
"contact-not-found" :"Contact introuvable",
"add-yourself" :"Ajoutez-vous",
"add-yourself":"Ajoutez-vous",
"submit" :"Soumettre",
"reset" :"Réinitialiser",
"my-signature" :"Ma signature",
"my-signature":"Ma signature",
"signature":"Signature",
"upload-image" :"Télécharger une image",
"clear" :"clair",
"upload-signature/Image" :"Veuillez télécharger la signature/l'image",
"clear" :"Vider",
"upload-signature/Image" :"télécharger-signature/Image",
"initials" :"Initiales",
"API" :"API",
"api-token":"Jeton API",
"regenerate-token":"Régénérer le jeton",
"generate-token" :"Générer un jeton",
"view-docs" :"Afficher les documents" ,
"generate-token-alert" :"Êtes-vous sûr de vouloir régénérer le jeton, il expirera à l'ancienne jeton?",
"generate-token-alert":"Êtes-vous sûr de vouloir régénérer le jeton, il expirera à l'ancienne jeton?",
"yes" :"Oui",
"copied" :"Copié",
"wrong-mssg" :"Quelque chose s'est mal passé.",
"token-generated" :"Jeton généré avec succès.",
"wrong-mssg":"Quelque chose c'est mal passé. Merci d'essayer plus tard.",
"token-generated":"Jeton généré avec succès.",
"webhook":"Webhook",
"update-webhook" :"Mettre à jour le webhook",
"add-webhook" :"Ajouter un webhook",
"webhook-added" :"Webhook ajouté avec succès.",
"team-disabled":"Équipe: Désactivée",
"team-enabled":"Équipe activée",
"are-you-sure":"Êtes-vous sûr de vouloir",
"disable":"désactiver",
"enable":"activer",
"this-team":"cette équipe?",
"edit-team" :"Modifier l'équipe",
"name-of-team":"Nom de l'équipe",
"prev" :"précédent",
"no-data-avaliable" :"pas de données disponibles",
"add-team":"Ajouter une équipe",
"page-not-found" :"Page non trouvée",
"users-from-teams" :"utilisateurs de Teams",
"user-status":"Statut de l'utilisateur",
"activate" :"Activer",
"deactivate":"désactiver",
"this-user":"cet utilisateur ",
"delete-user":"Supprimer l'utilisateur",
"delete" :"supprimer",
"add-user":"Ajouter un utilisateur",
"password-generateed" :"Le mot de passe ne sera généré qu'une seule fois ; assurez-vous de le copier.",
"Team status" :"Statut de l'équipe",
"user-deactivated":"Utilisateur désactivé.",
"user-activated":"Activé par l'utilisateur.",
"public" :"Public",
"download" :"Téléchargement",
"view":"voir",
"make-template-public" :"Rendre le modèle public",
"make-template-private" :"Rendre le modèle privé",
"make-template-public-alert" :"Êtes-vous sûr de vouloir rendre ce modèle public ?",
"make-template-private-alert":"Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil public.",
"public-role" :"Rôle public",
"public-url" :"URL publique",
"public-url-copy-mssg":"Voici votre URL publique : copiez-la ou partagez-le avec le signataire et vous pouvoir voir tous vos paramètres publics modèles.",
"add-public-url-alert":"Veuillez ajouter votre URL publique et vous pourra rendre public modèle.",
"share-with-alert":"Vous ne pouvez pas partager un modèle si des contacts sont déjà attribués à des rôles. Veuillez supprimer toutes les attributions de contacts des rôles avant de partager le modèle.",
"share-with":"Partager avec",
"team-not-found" :"Équipe introuvable",
"roles":"Les rôles",
"delete-document" :"Supprimer un document",
"delete-document-alert" :"Êtes-vous sûr de vouloir supprimer ce document ?",
"quick-send" :"Envoi rapide",
"add-new" :"Ajouter un nouveau",
"send" :"envoyer",
"quick-send-alert-1":"Tous les rôles dans ce document sont actuellement liés à des contacts. Pour envoyer rapidement des copies de ce modèle à plusieurs signataires, veuillez vous assurer qu'au moins un rôle n'est lié à aucun contact.",
"quick-send-alert-2":"Veuillez vous assurer qu'au moins un widget de signature est ajouté pour tous les destinataires.",
"quick-send-alert-3":"Veuillez ajouter au moins un rôle à ce modèle afin d'en « envoyer rapidement » des copies à plusieurs signataires.",
"quick-send-alert-4":"L'envoi rapide a atteint la limite.",
"copy-link" :"Copier le lien",
"copy":"Copier",
"revoke-document":"Révoquer le document",
"revoke-document-alert" :"Êtes-vous sûr de vouloir révoquer ce document ?",
"resend-mail":"Renvoyer le courrier",
"resend-mail-help" :"Vous pouvez utiliser les variables suivantes qui seront remplacées par leurs valeurs réelles : - {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email} }, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.",
"subject":"Sujet",
"body":"Corps",
"add-contact":"Ajouter le contact",
"add-signer-alert":"Le contact existe déjà !",
"record-delete-alert":"Enregistrement supprimé avec succès !",
"record-revoke-alert":" Enregistrement révoqué avec succès ! ",
"mail-sent-alert":"Courriel envoyé avec succès.",
"document-sent-alert":"Document envoyé avec succès !",
"template-share-alert":"Modèle partagé avec succès.",
"template-public-alert-1":"Vous avez rendu le modèle public avec succès.",
"template-public-alert-2":"Vous avez réussi à rendre le modèle privé.",
"template-public-alert-3":"Vous devez sélectionner un rôle pour les signataires publics.",
"template-public-alert-4" :"Veuillez vous assurer qu'au moins un widget de signature est ajouté pour tous les signataires.",
"template-public-alert-5" :"Étant donné que l'envoi dans l'ordre est activé sur ce modèle, le rôle public doit être positionné en haut.",
"template-public-alert-6" :"Veuillez associer des signataires à tous les rôles, à l'exception du rôle d'utilisateur public.",
"template-public-alert-7" :"Veuillez attribuer au moins un rôle public pour rendre ce modèle public.",
"loader":"Cela pourrait prendre un certain temps",
"pages":"Pages",
"document-signed":"Document signé",
"close":"Fermer",
"validation-alert":"Alerte de validation",
"validate-alert-mssg" :"L'entrée ne répond pas aux critères définis par l'expression régulière.",
"otp-verification":"Vérification OTP",
"enter-otp":"Entrez OTP",
"verify":"Vérifier",
"resend":"Renvoyer",
"verify-email":"Veuillez vérifier votre email!",
"send-otp":"envoyer un code à usage unique",
"otp-placeholder":"Saisissez l'OTP reçu par e-mail",
"loading-doc":"Chargement du document..",
"widgets-name":{
"signature":"signature",
"stamp":"estampiller",
"initials":"initiales",
"name":"nom",
"job title":"titre d'emploi",
"company":"entreprise",
"date":"date",
"text":"texte",
"text input":"saisie de texte",
"checkbox":"checkbocase à cocher",
"dropdown":"dérouler",
"radio button":"bouton radio",
"image": "image",
"email":"e-mail"
},
"fields" : "Des champs",
"recipients":"Destinataires",
"please-add" :"Veuillez ajouter un",
"signed-by" :"Signé par",
"more":"plus",
"sent":"Envoyé",
"print":"imprimer",
"certificate":"Certificat",
"decline":"refusé",
"finish":"terminé",
"mail":"Mail",
"sign-now":"Signez maintenant",
"successfully-signed" :"Signé avec succès !",
"email-mssg" :"Les destinataires ajoutés ici recevront une copie du document signé.",
"email-error-1" :"veuillez fournir une adresse e-mail correcte",
"email-error-2" :"Vous ne pouvez envoyer qu'à dix destinataires à la fois.",
"upload-stamp-image":"Télécharger l'image du tampon",
"draw":"Dessiner",
"type":"Type",
"my-initials" :"Mes initiales",
"upload" :"Télécharger",
"initial-teb":"Initiales",
"signature-tab":"Signature",
"your-signature" :"Votre signature",
"copy-to-all-pages" :"Copier sur toutes les pages",
"apply" :"Appliquer",
"copy-type":{
"All pages":"Toutes les pages",
"All pages but last": "Toutes les pages sauf la dernière",
"All pages but first":"Toutes les pages sauf la première"
},
"options": "Possibilités",
"minimun-check" :"Vérification minimale",
"maximum-check" :"Contrôle maximum",
"default-value" :"Valeur par défaut",
"select":"Sélectionner",
"read-only" :"Est en lecture seule",
"hide-labels":"Masquer les étiquettes",
"checkbox":"Case à cocher",
"alert":"Alerte",
"zoom-in":"Agrandir",
"zoom-out" :"Dézoomer",
"document-signed-alert" :"Félicitations ! 🎉 Ce document a été signé avec succès par vous !",
"otp-sent-alert" :"OTP envoyé sur votre email",
"fields-required" :"Champs obligatoires",
"signature-widget-alert-1" :"Veuillez vous assurer qu'au moins un widget de signature a été ajouté",
"signature-widget-alert-2" :"Veuillez vous assurer que tous les champs sont remplis avec précision et répondent à toutes les exigences.",
"encrypted-pdf-alert" :"Les fichiers PDF actuellement cryptés ne sont pas pris en charge.",
"user-not-exist" :"L'utilisateur n'existe pas",
"template-signature-field":"Veuillez ajouter au moins un champ de signature pour tous les rôles.",
"template-role-alert":"Veuillez d'abord ajouter des rôles",
"create-document" :"Créer un document",
"template-created-alert":"Voulez-vous créer un document en utilisant le modèle que vous vient de créer ?",
"signers-alert" :"alerte des signataires",
"template-creation-alert-1" :"Veuillez sélectionner le signataire pour ajouter un espace réservé !",
"ok":"D'accord",
"radio-group" :"Groupe de radio",
"dropdown-options":"Options déroulantes",
"add-role" :"Ajouter un rôle",
"role-ex" :"Ex : Client, RH, Directeur, Manager, Étudiant, etc.",
"add/choose-signer":"Ajouter/Choisir un signataire",
"choose-from-contacts":"Choisissez parmi les contacts",
"select-signer":"Veuillez sélectionner le signataire",
"edit-template" :"Modifier le modèle",
"widget-info" :"Informations sur les widgets",
"validation" : "Validation",
"invalid-default-value" :"valeur par défaut invalide",
"hint":"Indice",
"color":"couleur",
"role-help":{
"p1":"Que sont les rôles modèles ?",
"p2":"Commencez par spécifier chaque rôle nécessaire à la finalisation du document. Pensez aux parties impliquées dans le processus de signature et à leurs responsabilités. Les rôles courants incluent les RH pour les documents internes, le Client pour les accords ou le Fournisseur pour les accords commerciaux.",
"p3":"Pourquoi pré-attacher les utilisateurs à certains rôles ?",
"p4":"Pour les rôles qui impliquent systématiquement la même personne (par exemple, la signature du PDG sur les lettres d'offre des employés), vous pouvez pré-attacher un utilisateur à un rôle dans le modèle. Cette étape est facultative mais recommandée pour des raisons d'efficacité et de cohérence entre les documents.",
"p5":"Quand dois-je spécifier l'utilisateur attaché à chaque rôle ?",
"p6":"Lorsque vous créez un document à partir de votre modèle, vous serez invité à attacher des utilisateurs à chaque rôle défini. Si un rôle est déjà associé à un utilisateur, celui-ci sera pré-rempli, mais vous pourrez le modifier si nécessaire avant d'envoyer le document."
},
"add-recipients":"Ajouter des destinataires",
"loading-mssg" :"Cela pourrait prendre du temps",
"send-mail" :"Envoyer un mail",
"placeholder-alert-1" :"Veuillez vous assurer qu'au moins un widget de signature est ajouté pour tous les destinataires.",
"placeholder-alert-2" :"Veuillez confirmer que vous avez rempli le champ de texte.",
"placeholder-alert-3" :"Etes-vous sûr de vouloir envoyer ce document pour signature ? ",
"placeholder-alert-4" :"Vous avez envoyé avec succès des mails à tous les",
"placeholder-alert-5" :"Voulez-vous signer des documents maintenant ?",
"placeholder-alert-6" :"Veuillez configurer l'adaptateur de messagerie pour envoyer du courrier !",
"placeholder-alert-7" :"Veuillez sélectionner le signataire pour ajouter un espace réservé !",
"email-subject":"Sujet du courriel",
"email-body":"corps de l'e-mail",
"email-placeholder" :"ajouter le corps de l'e-mail",
"reset-to-default" :"Réinitialiser aux valeurs par défaut",
"cutomize-email":"Personnaliser l'e-mail",
"upgrade-to-customize-email":"Mise à niveau pour personnaliser l'e-mail",
"sign-url" :"Signer l'URL",
"Mails Sent" :"Mails envoyés",
"document-alert" :"Alerte document",
"owner-subscription-expired":"L'abonnement du propriétaire a expiré.",
"subscription-expired" :"Abonnement expiré",
"alert-message" :"Message d'alerte",
"document-decline" :"Document-refus",
"decline-alert-1":"Etes-vous sûr de vouloir refuser ce document ?",
"decline-alert-2": "Vous avez refusé ce document !",
"decline-alert-3": "Vous ne pouvez pas signer ce document car il a été refusé/révoqué.",
"sign here":"Signer ici",
"guest-email-alert" :"le code de vérification a été envoyé sur votre e-mail",
"get-otp-alert":"vous recevrez un mot de passe à usage unique par e-mail"
"document-signature":{
"loader":"Cela pourrait prendre un certain temps",
"pages":"Pages",
"document-signed":"Document signé",
"close":"Close",
"validation-alert":"Alerte de validation",
"validate-alert-mssg" :"L'entrée ne répond pas aux critères définis par l'expression régulière.",
"otp-verification":"Vérification OTP",
"enter-otp":"Entrez OTP",
"verify":"Vérifier",
"resend":"Renvoyer",
"verify-email":"Veuillez vérifier votre email!",
"send-otp":"Envoyer OTP",
"otp-placeholder":"Saisissez l'OTP reçu par e-mail",
"loading-doc":"Chargement du document.."
}
}
+3 -3
View File
@@ -169,17 +169,17 @@ const AddSigner = (props) => {
}
}
} else {
alert("Contact already exist!");
alert(t("add-signer-alert"));
setIsLoader(false);
}
} catch (err) {
console.log("err in fetch contact", err);
setIsLoader(false);
alert("something went wrong, please try again later");
alert(t("something-went-wrong-mssg"));
}
} else {
setIsLoader(false);
alert("something went wrong, please try again later");
alert(t("something-went-wrong-mssg"));
}
};
+6 -4
View File
@@ -2,8 +2,10 @@ import React, { useEffect, useState } from "react";
import Parse from "parse";
import Title from "./Title";
import Loader from "../primitives/Loader";
import { useTranslation } from "react-i18next";
const AddTeam = (props) => {
const { t } = useTranslation();
const [formdata, setFormdata] = useState({
name: "",
team: ""
@@ -140,7 +142,7 @@ const AddTeam = (props) => {
htmlFor="name"
className="block text-xs text-gray-700 font-semibold"
>
Name
{t("name")}
<span className="text-[red] text-[13px]"> *</span>
</label>
<input
@@ -157,7 +159,7 @@ const AddTeam = (props) => {
htmlFor="phone"
className="block text-xs text-gray-700 font-semibold"
>
Parent Team
{t("report-heading.Parent Team")}
</label>
<select
value={formdata.team}
@@ -175,14 +177,14 @@ const AddTeam = (props) => {
</div>
<div className="flex items-center mt-3 gap-2 text-white">
<button type="submit" className="op-btn op-btn-primary">
Submit
{t("submit")}
</button>
<div
type="button"
onClick={() => handleReset()}
className="op-btn op-btn-secondary"
>
Reset
{t("reset")}
</div>
</div>
</form>
+7 -5
View File
@@ -4,6 +4,7 @@ import Title from "./Title";
import Loader from "../primitives/Loader";
import { copytoData } from "../constant/Utils";
import { isEnableSubscription } from "../constant/const";
import { useTranslation } from "react-i18next";
function generatePassword(length) {
const characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
@@ -17,6 +18,7 @@ function generatePassword(length) {
}
const AddUser = (props) => {
const { t } = useTranslation();
const [formdata, setFormdata] = useState({
name: "",
phone: "",
@@ -260,7 +262,7 @@ const AddUser = (props) => {
htmlFor="name"
className="block text-xs text-gray-700 font-semibold"
>
Name
{t("name")}
<span className="text-[red] text-[13px]"> *</span>
</label>
<input
@@ -277,7 +279,7 @@ const AddUser = (props) => {
htmlFor="email"
className="block text-xs text-gray-700 font-semibold"
>
Email
{t("email")}
<span className="text-[red] text-[13px]"> *</span>
</label>
<input
@@ -294,7 +296,7 @@ const AddUser = (props) => {
htmlFor="email"
className="block text-xs text-gray-700 font-semibold"
>
Password
{t("password")}
</label>
<div className="flex justify-between items-center op-input op-input-bordered op-input-sm text-base-content w-full h-full text-[13px]">
<div className="break-all">{formdata?.password}</div>
@@ -304,7 +306,7 @@ const AddUser = (props) => {
></i>
</div>
<div className="text-[12px] ml-2 mb-0 text-[red] select-none">
Password will only be generated once; make sure to copy it.
{t("password-generateed")}
</div>
</div>
<div className="mb-3">
@@ -312,7 +314,7 @@ const AddUser = (props) => {
htmlFor="phone"
className="block text-xs text-gray-700 font-semibold"
>
Phone
{t("phone")}
{/* <span className="text-[red] text-[13px]"> *</span> */}
</label>
<input
+9 -11
View File
@@ -2,8 +2,10 @@ import React, { useState, useEffect, useRef } from "react";
import axios from "axios";
import SuggestionInput from "./shared/fields/SuggestionInput";
import Loader from "../primitives/Loader";
import { useTranslation } from "react-i18next";
const BulkSendUi = (props) => {
const { t } = useTranslation();
const [forms, setForms] = useState([]);
const [formId, setFormId] = useState(2);
const formRef = useRef(null);
@@ -96,7 +98,7 @@ const BulkSendUi = (props) => {
setScrollOnNextUpdate(true);
} else {
// If the limit has been reached, throw an error with the appropriate message
alert("Quick send reached limit.");
alert(t("quick-send-alert-4"));
}
};
@@ -244,36 +246,32 @@ const BulkSendUi = (props) => {
onClick={handleAddForm}
className="op-btn op-btn-primary focus:outline-none"
>
<i className="fa-light fa-plus"></i> <span>Add new</span>
<i className="fa-light fa-plus"></i>{" "}
<span>{t("add-new")}</span>
</button>
<button
type="submit"
className="op-btn op-btn-secondary focus:outline-none"
>
<i className="fa-light fa-paper-plane"></i>{" "}
<span>Send</span>
<span>{t("send")}</span>
</button>
</div>
</form>
) : (
<div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center">
All roles in this document are currently linked to contacts. To
&apos;quick send&apos; copies of this template to multiple
signers, please ensure that at least one role is not linked to
any contact.
{t("quick-send-alert-1")}
</div>
)}
</>
) : (
<div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center">
Please ensure there&#39;s at least one signature widget added for
all recipients.
{t("quick-send-alert-2")}
</div>
)
) : (
<div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center">
Please add at least one role to this template in order to &apos;quick
send&apos; copies of it to multiple signers.
{t("quick-send-alert-3")}
</div>
)}
</>
+10 -7
View File
@@ -11,8 +11,10 @@ import {
openInNewTab
} from "../constant/Utils";
import { isEnableSubscription, isStaging } from "../constant/const";
import { useTranslation } from "react-i18next";
const Header = ({ showSidebar }) => {
const { t } = useTranslation();
const navigate = useNavigate();
const { width } = useWindowSize();
let username = localStorage.getItem("username");
@@ -126,18 +128,18 @@ const Header = ({ showSidebar }) => {
className="text-xs md:text-sm shadow op-btn op-btn-outline op-btn-sm md:op-btn-md op-btn-accent"
onClick={() => navigate("/subscription")}
>
Upgrade Now
{t("upgrade-now")}
</button>
</div>
)}
{!isTeam && isPro && (
<div className="w-[35px] h-[35px] bg-white rounded-full ring-[1px] ring-offset-2 ring-[#002862] text-[#002862] overflow-hidden font-semibold flex items-center justify-center">
PRO
{t("pro")}
</div>
)}
{isTeam && (
<div className="w-[35px] h-[35px] bg-white rounded-full ring-[1px] text-[13px] ring-offset-2 ring-[#002862] text-[#002862] overflow-hidden font-semibold flex items-center justify-center">
TEAM
{t("team")}
</div>
)}
<div>
@@ -182,7 +184,7 @@ const Header = ({ showSidebar }) => {
>
<li onClick={() => openInNewTab("https://docs.opensignlabs.com")}>
<span>
<i className="fa-light fa-book"></i> Docs
<i className="fa-light fa-book"></i> {t("docs")}
</span>
</li>
<li
@@ -192,7 +194,7 @@ const Header = ({ showSidebar }) => {
}}
>
<span>
<i className="fa-light fa-user"></i> Profile
<i className="fa-light fa-user"></i> {t("profile")}
</span>
</li>
<li
@@ -202,7 +204,7 @@ const Header = ({ showSidebar }) => {
}}
>
<span>
<i className="fa-light fa-lock"></i> Change Password
<i className="fa-light fa-lock"></i> {t("change-password")}
</span>
</li>
<li
@@ -216,7 +218,8 @@ const Header = ({ showSidebar }) => {
</li>
<li onClick={closeDropdown}>
<span>
<i className="fa-light fa-arrow-right-from-bracket"></i> Log Out
<i className="fa-light fa-arrow-right-from-bracket"></i>{" "}
{t("log-out")}
</span>
</li>
</ul>
@@ -8,8 +8,10 @@ import Table from "react-bootstrap/Table";
import * as HoverCard from "@radix-ui/react-hover-card";
import ModalUi from "../../primitives/ModalUi";
import FolderModal from "../shared/fields/FolderModal";
import { useTranslation } from "react-i18next";
function DriveBody(props) {
const { t } = useTranslation();
const [rename, setRename] = useState("");
const [renameValue, setRenameValue] = useState("");
const inputRef = useRef(null);
@@ -42,7 +44,7 @@ function DriveBody(props) {
props.setFolderName((prev) => [...prev, folderData]);
props.setIsLoading({
isLoad: true,
message: "This might take some time"
message: t("loading-mssg")
});
props.setDocId(data.objectId);
props.setPdfData([]);
@@ -1,10 +1,12 @@
import React from "react";
import ModalUi from "../../primitives/ModalUi";
import { useTranslation } from "react-i18next";
const AddRoleModal = (props) => {
const { t } = useTranslation();
return (
<ModalUi
title={"Add Role"}
title={t("add-role")}
isOpen={props.isModalRole}
handleClose={props.handleCloseRoleModal}
>
@@ -21,19 +23,19 @@ const AddRoleModal = (props) => {
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs mt-1"
/>
<p className="text-[gray] text-[11px] mt-[5px] mb-[10px] ml-[10px]">
e.g: Customer, Hr, Director, Manager, Student, etc...
{t("role-ex")}..
</p>
<div>
<div className="h-[1px] w-full bg-[#9f9f9f] mb-[10px]"></div>
<button type="submit" className="op-btn op-btn-primary">
Add
{t("add")}
</button>
<button
onClick={props.handleCloseRoleModal}
type="button"
className="op-btn op-btn-ghost ml-2"
>
Close
{t("close")}
</button>
</div>
</form>
@@ -3,16 +3,18 @@ import LoaderWithMsg from "../../primitives/LoaderWithMsg";
import { contractDocument } from "../../constant/Utils";
import HandleError from "../../primitives/HandleError";
import { useLocation, useNavigate } from "react-router-dom";
import { useTranslation } from "react-i18next";
function useQuery() {
return new URLSearchParams(useLocation().search);
}
function DraftDocument() {
const { t } = useTranslation();
const navigate = useNavigate();
const query = useQuery();
const docId = query.get("docId");
const [isLoading, setIsLoading] = useState({
isLoader: true,
message: "This might take some time"
message: t("loading-mssg")
});
useEffect(() => {
getDocumentDetails();
@@ -3,7 +3,9 @@ import { isEnableSubscription } from "../../constant/const";
import ModalUi from "../../primitives/ModalUi";
import { radioButtonWidget } from "../../constant/Utils";
import Upgrade from "../../primitives/Upgrade";
import { useTranslation } from "react-i18next";
function DropdownWidgetOption(props) {
const { t } = useTranslation();
const [dropdownOptionList, setDropdownOptionList] = useState([
"option-1",
"option-2"
@@ -155,7 +157,8 @@ function DropdownWidgetOption(props) {
>
<div>
<label className="text-[13px] font-semibold">
Name<span className="text-[red] text-[13px]"> *</span>
{t("name")}
<span className="text-[red] text-[13px]"> *</span>
</label>
<input
required
@@ -166,7 +169,7 @@ function DropdownWidgetOption(props) {
/>
<label className="text-[13px] font-semibold mt-[5px]">
Options
{t("options")}
</label>
<div className="flex flex-col">
{dropdownOptionList.map((option, index) => (
@@ -222,7 +225,7 @@ function DropdownWidgetOption(props) {
!props.isSubscribe ? "text-[gray]" : ""
} text-[13px] font-semibold`}
>
Minimun check
{t("minimun-check")}
</label>
{!props.isSubscribe && isEnableSubscription && (
<Upgrade />
@@ -245,7 +248,7 @@ function DropdownWidgetOption(props) {
!props.isSubscribe ? "text-[gray]" : ""
} text-[13px] font-semibold`}
>
Maximum check
{t("maximum-check")}
</label>
<input
required
@@ -268,7 +271,7 @@ function DropdownWidgetOption(props) {
{["dropdown", radioButtonWidget].includes(props.type) && (
<>
<label className="text-[13px] font-semibold mt-[5px]">
Default value
{t("default-value")}
</label>
<select
onChange={(e) => setDefaultValue(e.target.value)}
@@ -278,7 +281,7 @@ function DropdownWidgetOption(props) {
placeholder="select default value"
>
<option value="" disabled hidden className="text-[13px]">
Select...
{t("select")}...
</option>
{dropdownOptionList.map((data, ind) => {
return (
@@ -325,7 +328,7 @@ function DropdownWidgetOption(props) {
onChange={(e) => setIsReadOnly(e.target.checked)}
/>
<label className="ml-1 mb-0" htmlFor="isreadonly">
Is read only
{t("read-only")}
</label>
</div>
)}
@@ -339,7 +342,7 @@ function DropdownWidgetOption(props) {
/>
<label className="ml-1 mb-0" htmlFor="ishidelabel">
Hide labels
{t("hide-labels")}
</label>
</div>
</div>
@@ -358,7 +361,7 @@ function DropdownWidgetOption(props) {
type="submit"
className="op-btn op-btn-primary"
>
Save
{t("save")}
</button>
{props.currWidgetsDetails?.options?.values?.length > 0 && (
<button
@@ -369,7 +372,7 @@ function DropdownWidgetOption(props) {
resetState();
}}
>
Cancel
{t("cancel")}
</button>
)}
</form>
@@ -2,9 +2,11 @@ import React, { useState, useEffect } from "react";
import { checkIsSubscribed, getFileName } from "../../constant/Utils";
import Upgrade from "../../primitives/Upgrade";
import { isEnableSubscription } from "../../constant/const";
import { useTranslation } from "react-i18next";
// import SelectFolder from "../../premitives/SelectFolder";
const EditTemplate = ({ template, onSuccess }) => {
const { t } = useTranslation();
// const [folder, setFolder] = useState({ ObjectId: "", Name: "" });
const [formData, setFormData] = useState({
Name: template?.Name || "",
@@ -62,7 +64,7 @@ const EditTemplate = ({ template, onSuccess }) => {
<form onSubmit={handleSubmit}>
<div className="mb-[0.35rem]">
<label htmlFor="name" className="text-[13px]">
File
{t("report-heading.File")}
</label>
<div className="op-input op-input-bordered op-input-sm focus:outline-none py-2 font-semibold w-full text-xs">
{getFileName(template.URL)}
@@ -70,7 +72,7 @@ const EditTemplate = ({ template, onSuccess }) => {
</div>
<div className="mb-[0.35rem]">
<label htmlFor="name" className="text-[13px]">
Name
{t("name")}
<span className="text-[13px] text-[red]"> *</span>
</label>
<input
@@ -84,7 +86,7 @@ const EditTemplate = ({ template, onSuccess }) => {
</div>
<div className="mb-[0.35rem]">
<label htmlFor="Note" className="text-[13px]">
Note
{t("report-heading.Note")}
</label>
<input
type="text"
@@ -97,7 +99,7 @@ const EditTemplate = ({ template, onSuccess }) => {
</div>
<div className="mb-[0.35rem]">
<label htmlFor="Description" className="text-[13px]">
Description
{t("description")}
</label>
<input
type="text"
@@ -109,7 +111,7 @@ const EditTemplate = ({ template, onSuccess }) => {
/>
</div>
<div className="mb-[0.35rem]">
<label className="text-[13px]">Send In Order</label>
<label className="text-[13px]">{t("send-in-order")}</label>
<div className="flex items-center gap-[8px] ml-[8px] mb-[5px]">
<input
type="radio"
@@ -119,7 +121,7 @@ const EditTemplate = ({ template, onSuccess }) => {
checked={formData.SendinOrder === "true"}
onChange={handleStrInput}
/>
<div className="text-[12px]">Yes</div>
<div className="text-[12px]">{t("yes")}</div>
</div>
<div className="flex items-center gap-[8px] ml-[8px] mb-[5px]">
<input
@@ -130,7 +132,7 @@ const EditTemplate = ({ template, onSuccess }) => {
checked={formData.SendinOrder === "false"}
onChange={handleStrInput}
/>
<div className="text-[12px]">No</div>
<div className="text-[12px]">{t("no")}</div>
</div>
</div>
{isEnableSubscription && (
@@ -140,7 +142,8 @@ const EditTemplate = ({ template, onSuccess }) => {
isSubscribe ? "font-semibold" : "font-semibold text-gray-300"
}
>
Auto reminder{" "}
{t("auto-reminder")}
{" "}
{!isSubscribe && isEnableSubscription && <Upgrade />}
</span>
<label
@@ -162,7 +165,7 @@ const EditTemplate = ({ template, onSuccess }) => {
{isSubscribe && formData?.AutomaticReminders === true && (
<div className="text-xs mt-2">
<label className="block">
Remind once in every (Days)
{t("remind-once")}
<span className="text-red-500 text-[13px]">*</span>
</label>
<input
@@ -177,7 +180,7 @@ const EditTemplate = ({ template, onSuccess }) => {
)}
<div className="mt-[1rem] flex justify-start">
<button type="submit" className="op-btn op-btn-primary">
Submit
{t("submit")}
</button>
</div>
</form>
@@ -3,13 +3,15 @@ import Tooltip from "../../primitives/Tooltip";
import ReactQuill from "react-quill";
import "react-quill/dist/quill.snow.css";
import EditorToolbar, { module1, formats } from "./EditorToolbar";
import { useTranslation } from "react-i18next";
export function EmailBody(props) {
const { t } = useTranslation();
return (
<form className="flex flex-col text-base-content text-lg font-normal">
<div className="m-2 md:m-10 p-3 md:p-10 shadow-md hover:shadow-lg border-[1px] border-indigo-800 rounded-md">
<label className="text-sm ml-2">
Subject <Tooltip message={"email subject"} />
{t("subject")} <Tooltip message={t("email-subject")} />
</label>
<input
required
@@ -19,7 +21,7 @@ export function EmailBody(props) {
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
/>
<label className="text-sm ml-2 mt-3">
Body <Tooltip message={"email body"} />
{t("body")} <Tooltip message={t("email-body")} />
</label>
<div className="px-3 py-2 w-full focus:outline-none text-xs">
<EditorToolbar containerId="toolbar1" />
@@ -27,7 +29,7 @@ export function EmailBody(props) {
theme="snow"
value={props.requestBody}
// value={typedText}
placeholder="add body of email "
placeholder={t("email-placeholder")}
// readOnly={loading}
// onChangeSelection={handleTextSelection} // Listen for text selection
ref={props.editorRef}
@@ -6,6 +6,7 @@ import { themeColor, emailRegex } from "../../constant/const";
import printModule from "print-js";
import Loader from "../../primitives/Loader";
import ModalUi from "../../primitives/ModalUi";
import { useTranslation } from "react-i18next";
function EmailComponent({
isEmail,
@@ -18,6 +19,7 @@ function EmailComponent({
extUserId,
activeMailAdapter
}) {
const { t } = useTranslation();
const [emailList, setEmailList] = useState([]);
const [emailValue, setEmailValue] = useState("");
const [isLoading, setIsLoading] = useState(false);
@@ -68,7 +70,7 @@ function EmailComponent({
setIsEmail(false);
setIsAlert({
isShow: true,
alertMessage: "something went wrong"
alertMessage: t("something-went-wrong-mssg")
});
}
}
@@ -88,7 +90,7 @@ function EmailComponent({
setIsEmail(false);
setIsAlert({
isShow: true,
alertMessage: "something went wrong"
alertMessage: t("something-went-wrong-mssg")
});
setEmailValue("");
setEmailList([]);
@@ -97,7 +99,7 @@ function EmailComponent({
setIsEmail(false);
setIsAlert({
isShow: true,
alertMessage: "something went wrong"
alertMessage: t("something-went-wrong-mssg")
});
setEmailValue("");
setEmailList([]);
@@ -184,13 +186,13 @@ function EmailComponent({
<div className="absolute w-full h-full flex flex-col justify-center items-center z-[20] bg-[#e6f2f2]/70">
<Loader />
<span className="text-[12px] text-base-content">
This might take some time
{t("loader")}
</span>
</div>
)}
<div className="flex justify-between items-center py-[10px] px-[20px] border-b-[1px] border-base-content">
<span className="text-base-content font-semibold">
Successfully signed!
{t("successfully-signed")}
</span>
<div className="flex flex-row">
{!isAndroid && (
@@ -199,7 +201,7 @@ function EmailComponent({
className="op-btn op-btn-neutral op-btn-sm text-[15px]"
>
<i className="fa-light fa-print" aria-hidden="true"></i>
Print
{t("print")}
</button>
)}
<button
@@ -207,13 +209,13 @@ function EmailComponent({
onClick={() => handleDownloadPdf()}
>
<i className="fa-light fa-download" aria-hidden="true"></i>
Download
{t("download")}
</button>
</div>
</div>
<div className="h-full p-[20px]">
<p className="font-medium text-[15px] mb-[5px] text-base-content align-baseline">
Recipients added here will get a copy of the signed document.
{t("email-mssg")}
</p>
{emailList.length > 0 ? (
<div className="p-0 border-[1.5px] op-border-primary rounded w-full text-[15px]">
@@ -265,7 +267,7 @@ function EmailComponent({
)}
{emailErr && (
<p className="text-xs text-[red] ml-1.5 mt-0.5">
please provide correct email address
{t("email-error-1")}
</p>
)}
<button
@@ -278,10 +280,8 @@ function EmailComponent({
</button>
<div className="bg-[#e3e2e1] mt-[10px] p-[5px] rounded">
<span className="font-bold">Note: </span>
<span className="text-[15px]">
You can only send to ten recipients at a time.
</span>
<span className="font-bold">{t("report-heading.Note")}: </span>
<span className="text-[15px]">{t("email-error-2")}</span>
</div>
<hr className="w-full my-[15px] bg-base-content" />
<button
@@ -289,7 +289,7 @@ function EmailComponent({
className="op-btn op-btn-secondary"
onClick={() => emailList.length > 0 && sendEmail()}
>
Send
{t("send")}
</button>
<button
type="button"
@@ -300,7 +300,7 @@ function EmailComponent({
setEmailList([]);
}}
>
Close
{t("close")}
</button>
</div>
</ModalUi>
+32 -27
View File
@@ -9,6 +9,7 @@ import "../../styles/signature.css";
import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
import ModalUi from "../../primitives/ModalUi";
import Loader from "../../primitives/Loader";
import { useTranslation } from "react-i18next";
function Header({
isPdfRequestFiles,
@@ -35,6 +36,7 @@ function Header({
setIsEditTemplate,
isPublicTemplate
}) {
const { t } = useTranslation();
const filterPrefill =
signerPos && signerPos?.filter((data) => data.Role !== "prefill");
const isMobile = window.innerWidth < 767;
@@ -97,7 +99,7 @@ function Header({
className="fa-light fa-arrow-down mr-[3px]"
aria-hidden="true"
></i>
Download
{t("download")}
</div>
</DropdownMenu.Item>
{isCompleted && (
@@ -115,7 +117,7 @@ function Header({
className="fa-light fa-award mr-[3px]"
aria-hidden="true"
></i>
Certificate
{t("certificate")}
</div>
</DropdownMenu.Item>
)}
@@ -129,7 +131,7 @@ function Header({
className="fa-light fa-envelope mr-[3px]"
aria-hidden="true"
></i>
Mail
{t("mail")}
</div>
</DropdownMenu.Item>
)}
@@ -144,7 +146,7 @@ function Header({
className="fa-light fa-print mr-[3px]"
aria-hidden="true"
></i>
Print
{t("print")}
</div>
</DropdownMenu.Item>
</DropdownMenu.Content>
@@ -191,7 +193,7 @@ function Header({
}}
className="border-none font-[650] text-[14px] op-link op-link-primary no-underline"
>
Finish
{t("finish")}
</div>
)}
<DropdownMenu.Root>
@@ -222,7 +224,7 @@ function Header({
className="fa-light fa-arrow-down mr-[3px]"
aria-hidden="true"
></i>
<span className="font-[500]">Download</span>
<span className="font-[500]">{t("download")}</span>
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Portal>
@@ -249,13 +251,14 @@ function Header({
<div>
{filterPrefill.length === 0 ? (
<span className="text-[13px] text-[#f5405e]">
Add {signersdata.length - filterPrefill.length}{" "}
recipients signature
{t("add")} {signersdata.length - filterPrefill.length}{" "}
{t("recipients")} {t("widgets-name.signature")}
</span>
) : (
<span className="text-[13px] text-[#f5405e]">
Add {signersdata.length - filterPrefill.length} more
recipients signature
{t("add")} {signersdata.length - filterPrefill.length}{" "}
{t("more")}
{t("recipients")} {t("widgets-name.signature")}
</span>
)}
</div>
@@ -275,7 +278,7 @@ function Header({
type="button"
className="op-btn op-btn-ghost op-btn-sm mr-[3px]"
>
Back
{t("back")}
</button>
<button
disabled={isMailSend && true}
@@ -286,8 +289,8 @@ function Header({
{completeBtnTitle
? completeBtnTitle
: isMailSend
? "Sent"
: "Send"}
? t("sent")
: t("send")}
</button>
</div>
</>
@@ -303,7 +306,7 @@ function Header({
className="fa-light fa-print py-[3px]"
aria-hidden="true"
></i>
<span className="hidden lg:block">Print</span>
<span className="hidden lg:block">{t("print")}</span>
</button>
{isCompleted && (
<button
@@ -317,7 +320,7 @@ function Header({
className="fa-light fa-award py-[3px]"
aria-hidden="true"
></i>
<span className="hidden lg:block">Certificate</span>
<span className="hidden lg:block">{t("certificate")}</span>
</button>
)}
<button
@@ -331,7 +334,7 @@ function Header({
className="fa-light fa-download py-[3px]"
aria-hidden="true"
></i>
<span className="hidden lg:block">Download</span>
<span className="hidden lg:block">{t("download")}</span>
</button>
</div>
) : (
@@ -341,7 +344,7 @@ function Header({
type="button"
className="op-btn op-btn-ghost op-btn-sm mr-[3px]"
>
Back
{t("back")}
</button>
{currentSigner && (
<>
@@ -349,14 +352,14 @@ function Header({
className="op-btn op-btn-secondary op-btn-sm mr-[3px] shadow"
onClick={() => handleDeclinePdfAlert()}
>
Decline
{t("decline")}
</button>
<button
type="button"
className="op-btn op-btn-primary op-btn-sm mr-[3px] shadow"
onClick={() => embedWidgetsData()}
>
Finish
{t("finish")}
</button>
<button
type="button"
@@ -366,7 +369,7 @@ function Header({
}
>
<i className="fa-light fa-arrow-down font-semibold lg:hidden"></i>
<span className="hidden lg:block">Download</span>
<span className="hidden lg:block">{t("download")}</span>
</button>
</>
)}
@@ -383,7 +386,9 @@ function Header({
className="op-btn op-btn-secondary op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow"
>
<i className="fa-light fa-award" aria-hidden="true"></i>
<span className="hidden lg:block ml-1">Certificate</span>
<span className="hidden lg:block ml-1">
{t("certificate")}
</span>
</button>
)}
<button
@@ -392,7 +397,7 @@ function Header({
className="op-btn op-btn-neutral op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow"
>
<i className="fa-light fa-print" aria-hidden="true"></i>
<span className="hidden lg:block ml-1">Print</span>
<span className="hidden lg:block ml-1">{t("print")}</span>
</button>
<button
type="button"
@@ -402,7 +407,7 @@ function Header({
}
>
<i className="fa-light fa-download" aria-hidden="true"></i>
<span className="hidden lg:block ml-1">Download</span>
<span className="hidden lg:block ml-1">{t("download")}</span>
</button>
<button
type="button"
@@ -410,7 +415,7 @@ function Header({
onClick={() => setIsEmail(true)}
>
<i className="fa-light fa-envelope" aria-hidden="true"></i>
<span className="hidden lg:block ml-1">Mail</span>
<span className="hidden lg:block ml-1">{t("mail")}</span>
</button>
</div>
) : isPublicTemplate ? (
@@ -423,7 +428,7 @@ function Header({
embedWidgetsData();
}}
>
Sign Now
{t("sign-now")}
</button>
</div>
</>
@@ -434,7 +439,7 @@ function Header({
type="button"
className="op-btn op-btn-ghost op-btn-sm mr-[3px]"
>
Back
{t("back")}
</button>
<button
type="button"
@@ -445,7 +450,7 @@ function Header({
}
}}
>
Finish
{t("finish")}
</button>
</div>
)}
+5 -3
View File
@@ -1,6 +1,8 @@
import React from "react";
import { useTranslation } from "react-i18next";
function PdfZoom(props) {
const { t } = useTranslation();
const onClickZoomIn = () => {
props.setScale(props.scale + 0.1 * props.scale);
props.setZoomPercent(props.zoomPercent + 10);
@@ -25,14 +27,14 @@ function PdfZoom(props) {
<span
className="bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer"
onClick={onClickZoomIn}
title="Zoom in"
title={t("zoom-in")}
>
<i className="fa-light fa-magnifying-glass-plus text-gray-500 2xl:text-[30px]"></i>
</span>
<span
className="bg-gray-50 px-[4px] 2xl:px-[15px] 2xl:py-[10px] cursor-pointer"
onClick={handleReset}
title="Reset"
title={t("reset")}
>
<i className="fa-light fa-magnifying-glass-arrows-rotate text-gray-500 2xl:text-[30px]"></i>
</span>
@@ -42,7 +44,7 @@ function PdfZoom(props) {
style={{
cursor: props.zoomPercent > 0 ? "pointer" : "default"
}}
title="Zoom out"
title={t("zoom-out")}
>
<i className="fa-light fa-magnifying-glass-minus text-gray-500 2xl:text-[30px]"></i>
</span>
@@ -1,8 +1,10 @@
import React, { useState } from "react";
import ModalUi from "../../primitives/ModalUi";
import { randomId, textWidget } from "../../constant/Utils";
import { useTranslation } from "react-i18next";
function PlaceholderCopy(props) {
const { t } = useTranslation();
const copyType = ["All pages", "All pages but last", "All pages but first"];
const [selectCopyType, setSelectCopyType] = useState("");
//function for get copy placeholder position
@@ -188,7 +190,7 @@ function PlaceholderCopy(props) {
return (
<ModalUi
isOpen={props.isPageCopy}
title={"Copy to all pages"}
title={t("copy-to-all-pages")}
handleClose={() => handleUniqueId()}
>
<div className="h-full p-[20px] text-base-content">
@@ -203,8 +205,7 @@ function PlaceholderCopy(props) {
onChange={() => setSelectCopyType(data)}
checked={selectCopyType === data}
/>
{data}
{t(`copy-type.${data}`)}
</label>
</div>
);
@@ -220,14 +221,14 @@ function PlaceholderCopy(props) {
disabled={!selectCopyType}
className="op-btn op-btn-primary"
>
Apply
{t("apply")}
</button>
<button
type="button"
className="op-btn op-btn-ghost"
onClick={() => handleUniqueId()}
>
Cancel
{t("cancel")}
</button>
</div>
</ModalUi>
@@ -14,12 +14,15 @@ import "react-datepicker/dist/react-datepicker.css";
import "../../styles/signature.css";
import RegexParser from "regex-parser";
import { emailRegex } from "../../constant/const";
import { useTranslation } from "react-i18next";
const textWidgetCls =
"w-full h-full md:min-w-full md:min-h-full z-[999] text-[12px] rounded-[2px] border-[1px] border-[#007bff] overflow-hidden resize-none outline-none text-base-content item-center whitespace-pre-wrap";
const selectWidgetCls =
"w-full h-full absolute left-0 top-0 border-[1px] border-[#007bff] rounded-[2px] focus:outline-none text-base-content";
function PlaceholderType(props) {
const { t } = useTranslation();
const type = props?.pos?.type;
const widgetTypeTraslation = t(`widgets-name.${props?.pos?.type}`);
const [selectOption, setSelectOption] = useState("");
const [validatePlaceholder, setValidatePlaceholder] = useState("");
const inputRef = useRef(null);
@@ -311,7 +314,7 @@ function PlaceholderType(props) {
props?.handleUserName(
props?.data?.Id,
props?.data?.Role,
props?.pos?.type
widgetTypeTraslation
)}
</div>
);
@@ -329,7 +332,7 @@ function PlaceholderType(props) {
props?.handleUserName(
props?.data?.Id,
props?.data?.Role,
props?.pos?.type
widgetTypeTraslation
)}
</div>
);
@@ -424,7 +427,7 @@ function PlaceholderType(props) {
overflow: "hidden"
}}
>
<span>{type}</span>
<span>{widgetTypeTraslation}</span>
</div>
);
case "dropdown":
@@ -461,7 +464,9 @@ function PlaceholderType(props) {
</select>
) : (
<div className="text-[12px] overflow-hidden">
{props.pos?.options?.name ? props.pos.options.name : type}
{props.pos?.options?.name
? props.pos.options.name
: widgetTypeTraslation}
</div>
);
case "initials":
@@ -478,7 +483,7 @@ function PlaceholderType(props) {
props?.handleUserName(
props?.data?.Id,
props?.data?.Role,
props?.pos?.type
widgetTypeTraslation
)}
</div>
);
@@ -524,7 +529,7 @@ function PlaceholderType(props) {
overflow: "hidden"
}}
>
<span>{type}</span>
<span>{widgetTypeTraslation}</span>
</div>
);
case "company":
@@ -568,7 +573,7 @@ function PlaceholderType(props) {
fontFamily: "Arial, sans-serif"
}}
>
<span>{type}</span>
<span>{widgetTypeTraslation}</span>
</div>
);
case "job title":
@@ -612,7 +617,7 @@ function PlaceholderType(props) {
overflow: "hidden"
}}
>
<span>{type}</span>
<span>{widgetTypeTraslation}</span>
</div>
);
case "date":
@@ -699,7 +704,7 @@ function PlaceholderType(props) {
props?.handleUserName(
props?.data?.Id,
props?.data?.Role,
props?.pos?.type
widgetTypeTraslation
)}
</div>
);
@@ -746,7 +751,7 @@ function PlaceholderType(props) {
overflow: "hidden"
}}
>
<span>{type}</span>
<span>{widgetTypeTraslation}</span>
</div>
);
case radioButtonWidget:
+5 -3
View File
@@ -1,6 +1,8 @@
import React from "react";
import { useTranslation } from "react-i18next";
function PrevNext({ pageNumber, allPages, changePage }) {
const { t } = useTranslation();
//for go to previous page
function previousPage() {
changePage(-1);
@@ -20,10 +22,10 @@ function PrevNext({ pageNumber, allPages, changePage }) {
<span className="block lg:hidden">
<i className="fa-light fa-backward" aria-hidden="true"></i>
</span>
<span className="lg:block hidden 2xl:text-[30px]">Prev</span>
<span className="lg:block hidden 2xl:text-[30px]">{t("prev")}</span>
</button>
<span className="text-xs text-base-content font-medium mx-2 2xl:text-[30px]">
{pageNumber || (allPages ? 1 : "--")} of {allPages || "--"}
{pageNumber || (allPages ? 1 : "--")} {t("of")} {allPages || "--"}
</span>
<button
className="op-btn op-btn-neutral op-btn-xs md:op-btn-sm font-semibold text-xs"
@@ -33,7 +35,7 @@ function PrevNext({ pageNumber, allPages, changePage }) {
<span className="block lg:hidden">
<i className="fa-light fa-forward" aria-hidden="true"></i>
</span>
<span className="lg:block hidden 2xl:text-[30px]">Next</span>
<span className="lg:block hidden 2xl:text-[30px]">{t("next")}</span>
</button>
</div>
);
@@ -69,14 +69,14 @@ function RenderAllPdfPage({
return (
<div ref={pageContainer} className="hidden w-[20%] bg-base-100 md:block">
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
{t("document-signature.pages")}
{t("pages")}
</div>
<div
className={`flex h-[90%] flex-col items-center m-2
autoSignScroll hide-scrollbar max-h-[100vh] `}
>
<Document
loading={t("document-signature.loading-doc")}
loading={t("loading-doc")}
onLoadSuccess={onDocumentLoad}
file={signPdfUrl}
>
+13 -11
View File
@@ -1,4 +1,5 @@
import React, { useRef, useState, useEffect } from "react";
import { useTranslation } from "react-i18next";
import SignatureCanvas from "react-signature-canvas";
function SignPad({
@@ -23,6 +24,7 @@ function SignPad({
currWidgetsDetails,
setCurrWidgetsDetails
}) {
const { t } = useTranslation();
const [penColor, setPenColor] = useState("blue");
const allColor = ["blue", "red", "black"];
const canvasRef = useRef(null);
@@ -82,7 +84,7 @@ function SignPad({
className="op-btn op-btn-ghost mr-1 mt-[2px]"
onClick={() => handleClear()}
>
Clear
{t("clear")}
</button>
)}
<button
@@ -138,7 +140,7 @@ function SignPad({
: true
}
>
Save
{t("save")}
</button>
</div>
);
@@ -301,8 +303,8 @@ function SignPad({
<span className="text-base-content font-bold text-lg">
{widgetType === "image" ||
currWidgetsDetails?.type === "image"
? "Upload image"
: "Upload stamp image"}
? t("upload-image")
: t("upload-stamp-image")}
</span>
) : (
<>
@@ -323,7 +325,7 @@ function SignPad({
: "no-underline"
} op-link underline-offset-8 ml-[2px]`}
>
Draw
{t("draw")}
</span>
</div>
<div>
@@ -340,7 +342,7 @@ function SignPad({
: "no-underline"
} op-link underline-offset-8 ml-[2px]`}
>
Upload Image
{t("upload-image")}
</span>
</div>
<div>
@@ -358,7 +360,7 @@ function SignPad({
: "no-underline"
} op-link underline-offset-8 ml-[2px]`}
>
Type
{t("type")}
</span>
</div>
{!isInitial && defaultSign ? (
@@ -377,7 +379,7 @@ function SignPad({
: "no-underline"
} op-link underline-offset-8 ml-[2px]`}
>
My Signature
{t("my-signature")}
</span>
</div>
) : (
@@ -398,7 +400,7 @@ function SignPad({
: "no-underline"
} op-link underline-offset-8 ml-[2px]`}
>
My Initials
{t("my-initials")}
</span>
</div>
)
@@ -485,7 +487,7 @@ function SignPad({
hidden
/>
<i className="fa-light fa-cloud-upload-alt uploadImgLogo"></i>
<div className="text-[10px]">Upload</div>
<div className="text-[10px]">{t("upload")}</div>
</div>
</div>
) : (
@@ -522,7 +524,7 @@ function SignPad({
<div>
<div className="flex justify-between items-center">
<span className="mr-[5px] text-[12px]">
{isInitial ? "Initials" : "Signature"}:
{isInitial ? t("initial-teb") : t("signature-tab")}:
</span>
<input
maxLength={isInitial ? 3 : 30}
+3 -1
View File
@@ -1,6 +1,8 @@
import React from "react";
import "../../styles/signature.css";
import { useTranslation } from "react-i18next";
function Signedby({ pdfDetails }) {
const { t } = useTranslation();
const getFirstLetter = (name) => {
const firstLetter = name.charAt(0);
return firstLetter;
@@ -9,7 +11,7 @@ function Signedby({ pdfDetails }) {
return (
<div className="hidden md:block w-full h-full bg-base-100">
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
Signed By
{t("signed-by")}
</div>
<div className="mt-[2px] bg-base-100">
<div className="bg-[#93a3db] rounded-xl mx-1 flex flex-row items-center py-[10px]">
@@ -1,8 +1,10 @@
import React from "react";
import RecipientList from "./RecipientList";
import { Tooltip } from "react-tooltip";
import { useTranslation } from "react-i18next";
function SignerListPlace(props) {
const { t } = useTranslation();
return (
<div>
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
@@ -18,36 +20,12 @@ function SignerListPlace(props) {
</a>
<Tooltip id="my-tooltip" className="z-[100]">
<div className="max-w-[450px] 2xl:max-w-[500px] 2xl:text-[20px] p-[1px]">
<p className="font-bold pb-[1px]">
What are template roles?
</p>
<p>
Begin by specifying each role needed for the completion of
the document. Think about the parties involved in the
signing process and what their responsibilities are.
Common roles include HR for internal documents, Customer
for agreements or Vendor for business agreements.{" "}
</p>
<p className="font-bold">
Why pre-attach users to some roles?
</p>
<p>
For roles that consistently involve the same individual
(e.g., the CEO&apos;s signature on employee offer
letters), you can pre-attach a user to a role within the
template. This step is optional but recommended for
efficiency and consistency across documents.
</p>
<p className="font-bold">
When do i specify the user attached to each role?
</p>
<p>
When you create a document from your template, you&apos;ll
be prompted to attach users to each defined role. If a
role already has a user attached, this will be pre-filled,
but you can modify it as needed before sending out the
document.
</p>
<p className="font-bold pb-[1px]">{t("role-help.p1")}</p>
<p>{t("role-help.p2")} </p>
<p className="font-bold">{t("role-help.p3")}</p>
<p>{t("role-help.p4")}</p>
<p className="font-bold">{t("role-help.p5")}</p>
<p>{t("role-help.p6")}</p>
</div>
</Tooltip>
</>
@@ -67,7 +45,7 @@ function SignerListPlace(props) {
className="op-btn op-btn-accent op-btn-outline w-full mt-[14px]"
onClick={() => props.handleAddSigner()}
>
<i className="fa-light fa-plus"></i> Add role
<i className="fa-light fa-plus"></i> {t("add-role")}
</div>
) : (
<div
@@ -77,7 +55,7 @@ function SignerListPlace(props) {
disabled={props?.isMailSend ? true : false}
onClick={() => props.setIsAddSigner(true)}
>
<i className="fa-light fa-plus"></i> Add recipients
<i className="fa-light fa-plus"></i> {t("add-recipients")}
</div>
)}
</div>
@@ -8,7 +8,7 @@ function VerifyEmail(props) {
<dialog className="op-modal op-modal-open absolute z-[1999]">
<div className="md:w-[40%] w-[80%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm">
<h3 className="font-bold text-lg pt-[15px] px-[20px] text-base-content">
{t("document-signature.otp-verification")}
{t("otp-verification")}
</h3>
{props.isVerifyModal ? (
<form
@@ -31,13 +31,13 @@ function VerifyEmail(props) {
</div>
<div className="px-6 my-3">
<button type="submit" className="op-btn op-btn-primary">
{t("document-signature.verify")}
{t("verify")}
</button>
<button
className="op-btn op-btn-secondary ml-2"
onClick={(e) => props.handleResend(e)}
>
{t("document-signature.resend")}
{t("resend")}
</button>
</div>
</form>
@@ -56,7 +56,7 @@ function VerifyEmail(props) {
props.handleVerifyBtn();
}}
>
{t("document-signature.send-otp")}
{t("send-otp")}
</button>
</div>
</div>
@@ -9,6 +9,7 @@ import {
textWidget,
widgets
} from "../../constant/Utils";
import { useTranslation } from "react-i18next";
function WidgetComponent({
dragSignature,
signRef,
@@ -40,6 +41,7 @@ function WidgetComponent({
setIsAddSigner,
uniqueId
}) {
const { t } = useTranslation();
const [isSignersModal, setIsSignersModal] = useState(false);
const [, dropdown] = useDrag({
type: "BOX",
@@ -330,7 +332,7 @@ function WidgetComponent({
} hidden md:block h-full bg-base-100`}
>
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
<span>Fields</span>
<span>{t("fields")}</span>
</div>
<div
@@ -348,7 +350,7 @@ function WidgetComponent({
)}
{isSignersModal && (
<ModalUi
title={title ? title : "Recipients"}
title={title ? title : t("recipients")}
isOpen={isSignersModal}
handleClose={handleModal}
>
@@ -375,7 +377,7 @@ function WidgetComponent({
</div>
) : (
<div className=" p-[20px] text-[15px] font-medium text-center">
Please add a {title ? title : "recipients"}
{t("please-add")} {title ? title : t("recipients")}
</div>
)}
</ModalUi>
@@ -1,7 +1,10 @@
import React from "react";
import { getWidgetType } from "../../constant/Utils";
import { useTranslation } from "react-i18next";
function WidgetList(props) {
const { t } = useTranslation();
return props.updateWidgets.map((item, ind) => {
return (
<div className="2xl:p-3 mb-[5px]" key={ind}>
@@ -25,7 +28,7 @@ function WidgetList(props) {
onMouseDown={() => props?.handleMouseLeave()}
onTouchStart={props?.handleDivClick}
>
{item.ref && getWidgetType(item)}
{item.ref && getWidgetType(item, t(`widgets-name.${item.type}`))}
</div>
</div>
);
@@ -7,8 +7,10 @@ import Upgrade from "../../primitives/Upgrade";
import { isEnableSubscription } from "../../constant/const";
import Tooltip from "../../primitives/Tooltip";
import { fontColorArr, fontsizeArr } from "../../constant/Utils";
import { useTranslation } from "react-i18next";
const WidgetNameModal = (props) => {
const { t } = useTranslation();
const [formdata, setFormdata] = useState({
name: "",
defaultValue: "",
@@ -104,7 +106,7 @@ const WidgetNameModal = (props) => {
<ModalUi
isOpen={props.isOpen}
handleClose={props.handleClose && props.handleClose}
title={"Widget info"}
title={t("widget-info")}
>
<form
onSubmit={handleSubmit}
@@ -114,7 +116,7 @@ const WidgetNameModal = (props) => {
>
<div className="mb-[0.75rem] text-[13px]">
<label htmlFor="name">
Name
{t("name")}
<span className="text-[red]"> *</span>
</label>
<input
@@ -138,7 +140,7 @@ const WidgetNameModal = (props) => {
: ""
} text-[13px]`}
>
Validation
{t("validation")}
</label>
<Tooltip
url={"https://www.w3schools.com/jsref/jsref_obj_regexp.asp"}
@@ -192,7 +194,7 @@ const WidgetNameModal = (props) => {
)}
<div className="mb-[0.75rem]">
<label htmlFor="name" className="text-[13px]">
Default value
{t("default-value")}
</label>
<input
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
@@ -216,7 +218,7 @@ const WidgetNameModal = (props) => {
className="fa-light fa-exclamation-circle text-[15px]"
style={{ color: "#fab005" }}
></i>
invalid default value
{t("invalid-default-value")}
</div>
)}
</div>
@@ -247,7 +249,7 @@ const WidgetNameModal = (props) => {
{props.defaultdata?.type === textInputWidget && (
<div className="mb-[0.75rem]">
<label htmlFor="hint" className="text-[13px]">
Hint
{t("hint")}
</label>
<input
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
@@ -283,7 +285,7 @@ const WidgetNameModal = (props) => {
})}
</select>
<div className="flex flex-row gap-1 items-center ml-4">
<span>color: </span>
<span>{t("color")}: </span>
<select
value={
props.fontColor ||
@@ -316,7 +318,7 @@ const WidgetNameModal = (props) => {
<div className="h-[1px] w-full mb-[16px] bg-[#b7b3b3]"></div>
<button type="submit" className="op-btn op-btn-primary">
Save
{t("save")}
</button>
</form>
</ModalUi>
@@ -1,8 +1,10 @@
import React, { useState } from "react";
import Parse from "parse";
import AsyncSelect from "react-select/async";
import { useTranslation } from "react-i18next";
const SelectSigners = (props) => {
const { t } = useTranslation();
const [userList, setUserList] = useState([]);
const [selected, setSelected] = useState();
const [userData, setUserData] = useState({});
@@ -71,13 +73,15 @@ const SelectSigners = (props) => {
<div className="h-full px-[20px] py-[10px] text-base-content">
<div className="w-full mx-auto p-[8px]">
<div className="mb-0">
<label className="text-[14px] font-bold">Choose from contacts</label>
<label className="text-[14px] font-bold">
{t("choose-from-contacts")}
</label>
<AsyncSelect
cacheOptions
defaultOptions
value={selected}
loadingMessage={() => "Loading..."}
noOptionsMessage={() => "Contact not found"}
loadingMessage={() => t("loading")}
noOptionsMessage={() => t("contact-not-found")}
loadOptions={loadOptions}
onChange={handleOptions}
unstyled
@@ -102,11 +106,11 @@ const SelectSigners = (props) => {
isError ? "text-[red]" : "text-transparent"
} text-[11px] ml-[6px] my-[2px]`}
>
Please select signer
{t("select-signer")}
</p>
<div>
<button className="op-btn op-btn-primary" onClick={() => handleAdd()}>
Submit
{t("submit")}
</button>
</div>
</div>
@@ -122,7 +122,7 @@ const SignersInput = (props) => {
return (
<div className="text-xs mt-2 ">
<label className="block relative">
{t("Signers")}
{t("signers")}
{props.required && <span className="text-red-500 text-[13px]">*</span>}
<span className="absolute ml-1 text-xs z-30">
<Tooltip id={"signer-tooltip"} message={t("signers-help")} />
+2 -3
View File
@@ -271,7 +271,6 @@ export const handleImageResize = (
}
}
};
export const widgets = [
{
type: "signature",
@@ -401,14 +400,14 @@ export const addWidgetOptions = (type) => {
return {};
}
};
export const getWidgetType = (item) => {
export const getWidgetType = (item, widgetName) => {
return (
<div className="op-btn w-fit md:w-[100%] op-btn-primary op-btn-outline op-btn-sm focus:outline-none outline outline-[1.5px] ml-[6px] md:ml-0 p-0 overflow-hidden">
<div className="w-full h-full flex md:justify-between items-center">
<div className="flex justify-start items-center text-[13px] ml-1">
{!isMobile && <i className="fa-light fa-grip-vertical ml-[3px]"></i>}
<span className="md:inline-block text-center text-[15px] ml-[5px] font-semibold pr-1 md:pr-0">
{item.type}
{widgetName}
</span>
</div>
<div className="text-[20px] op-btn op-btn-primary rounded-none w-[40px] h-full flex justify-center items-center">
+2 -2
View File
@@ -75,10 +75,10 @@ function GenerateToken() {
setIsAlert({ type: "success", msg: t("token-generated") });
} else {
console.error("Error while generating Token");
setIsAlert({ type: "danger", msg: t("wrong-mssg") });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
}
} catch (error) {
setIsAlert({ type: "danger", msg: t("wrong-mssg") });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
console.log("while generating Token", error);
} finally {
setIsLoader(false);
+3 -1
View File
@@ -7,8 +7,10 @@ import logo from "../assets/images/logo.png";
import { appInfo } from "../constant/appinfo";
import Parse from "parse";
import Loader from "../primitives/Loader";
import { useTranslation } from "react-i18next";
function GuestLogin() {
const { t } = useTranslation();
const { id, userMail, contactBookId, base64url } = useParams();
const navigate = useNavigate();
const [email, setEmail] = useState(userMail);
@@ -198,7 +200,7 @@ function GuestLogin() {
<div className="w-full md:w-[50%] text-base-content">
<h1 className="text-2xl md:text-[30px]">Welcome Back!</h1>
<legend className="text-[12px] text-[#878787] mt-2 mb-1">
Verification code is sent to your email
{t("guest-email-alert")}
</legend>
<div className="p-[20px] outline outline-1 outline-slate-300/50 my-2 op-card shadow-md">
<input
+4 -2
View File
@@ -10,6 +10,7 @@ import TourContentWithBtn from "../primitives/TourContentWithBtn";
import Tour from "reactour";
import axios from "axios";
import Loader from "../primitives/Loader";
import { useTranslation } from "react-i18next";
const DriveBody = React.lazy(
() => import("../components/opensigndrive/DriveBody")
@@ -22,6 +23,7 @@ const AppLoader = () => {
);
};
function Opensigndrive() {
const { t } = useTranslation();
const navigate = useNavigate();
const scrollRef = useRef(null);
const [isList, setIsList] = useState(false);
@@ -37,7 +39,7 @@ function Opensigndrive() {
const [tourStatusArr, setTourStatusArr] = useState([]);
const [isLoading, setIsLoading] = useState({
isLoad: true,
message: "This might take some time"
message: t("loading-mssg")
});
const [docId, setDocId] = useState();
const [handleError, setHandleError] = useState("");
@@ -126,7 +128,7 @@ function Opensigndrive() {
checkTourStatus();
}
if (!disbaleLoading) {
setIsLoading({ isLoad: true, message: "This might take some time" });
setIsLoading({ isLoad: true, message: t("loading-mssg") });
}
try {
const driveDetails = await getDrive(docId, skip, limit);
+13 -14
View File
@@ -46,8 +46,10 @@ import { useSelector } from "react-redux";
import SignerListComponent from "../components/pdf/SignerListComponent";
import VerifyEmail from "../components/pdf/VerifyEmail";
import PdfZoom from "../components/pdf/PdfZoom";
import { useTranslation } from "react-i18next";
function PdfRequestFiles(props) {
const { t } = useTranslation();
const [pdfDetails, setPdfDetails] = useState([]);
const [signedSigners, setSignedSigners] = useState([]);
const [unsignedSigners, setUnSignedSigners] = useState([]);
@@ -71,7 +73,7 @@ function PdfRequestFiles(props) {
const [tourStatus, setTourStatus] = useState([]);
const [isLoading, setIsLoading] = useState({
isLoad: true,
message: "This might take some time"
message: t("loading-mssg")
});
const [defaultSignImg, setDefaultSignImg] = useState();
const [isDocId, setIsDocId] = useState(false);
@@ -1608,13 +1610,13 @@ function PdfRequestFiles(props) {
<Title title={props.templateId ? "Public Sign" : "Request Sign"} />
{isSubscriptionExpired ? (
<ModalUi
title={"Subscription Expired"}
title={t("subscription-expired")}
isOpen={isSubscriptionExpired}
showClose={false}
>
<div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5">
<p className="text-sm md:text-lg font-normal">
Owner&apos;s subscription has expired.
{t("owner-subscription-expired")}
</p>
</div>
</ModalUi>
@@ -1630,7 +1632,7 @@ function PdfRequestFiles(props) {
<div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80">
<Loader />
<span className="text-[13px] text-base-content">
This might take some time
{t("loading-mssg")}
</span>
</div>
)}
@@ -1657,7 +1659,7 @@ function PdfRequestFiles(props) {
requestSignTourFunction()}
<ModalUi
isOpen={isAlert.isShow}
title={"Alert message"}
title={t("alert-message")}
handleClose={() => {
setIsAlert({
isShow: false,
@@ -1678,7 +1680,7 @@ function PdfRequestFiles(props) {
type="button"
className="op-btn op-btn-primary"
>
Ok
{t("ok")}
</button>
</div>
</ModalUi>
@@ -1697,14 +1699,13 @@ function PdfRequestFiles(props) {
{/* this modal is used to show decline alert */}
<PdfDeclineModal
show={isDecline.isDeclined}
headMsg="Document decline"
headMsg={t("document-decline")}
bodyMssg={
isDecline.currnt === "Sure"
? "Are you sure want to decline this document ?"
? t("decline-alert-2")
: isDecline.currnt === "YouDeclined"
? "You have declined this document!"
: isDecline.currnt === "another" &&
"You can not sign this document as it has been declined/revoked."
? t("decline-alert-1")
: isDecline.currnt === "another" && t("decline-alert-3")
}
footerMessage={isDecline.currnt === "Sure"}
declineDoc={declineDoc}
@@ -1740,9 +1741,7 @@ function PdfRequestFiles(props) {
{isOtp ? (
<form onSubmit={VerifyOTP}>
<div className="flex flex-col gap-2">
<span>
You will get a verification code via email
</span>
<span>{t("get-otp-alert")}</span>
<label className="op-input op-input-bordered flex items-center gap-2 ">
<input
type="number"
+37 -47
View File
@@ -53,8 +53,10 @@ import Loader from "../primitives/Loader";
import { useSelector } from "react-redux";
import PdfZoom from "../components/pdf/PdfZoom";
import LottieWithLoader from "../primitives/DotLottieReact";
import { useTranslation } from "react-i18next";
function PlaceHolderSign() {
const { t } = useTranslation();
const editorRef = useRef();
const navigate = useNavigate();
const { state } = useLocation();
@@ -78,7 +80,7 @@ function PlaceHolderSign() {
const [fontColor, setFontColor] = useState();
const [isLoading, setIsLoading] = useState({
isLoad: true,
message: "This might take some time"
message: t("loading-mssg")
});
const [handleError, setHandleError] = useState();
const [currentId, setCurrentId] = useState("");
@@ -268,7 +270,7 @@ function PlaceHolderSign() {
//convert document url in array buffer format to use embed widgets in pdf using pdf-lib
const arrayBuffer = await convertPdfArrayBuffer(url);
if (arrayBuffer === "Error") {
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
} else {
setPdfArrayBuffer(arrayBuffer);
}
@@ -395,10 +397,10 @@ function PlaceHolderSign() {
const loadObj = {
isLoad: false
};
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
setIsLoading(loadObj);
} else {
setHandleError("No Data Found!");
setHandleError(t("no-data-avaliable"));
const loadObj = {
isLoad: false
};
@@ -410,7 +412,7 @@ function PlaceHolderSign() {
const loadObj = {
isLoad: false
};
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
setIsLoading(loadObj);
} else if (res.length && res[0]?.objectId) {
setActiveMailAdapter(res[0]?.active_mail_adapter);
@@ -433,7 +435,7 @@ function PlaceHolderSign() {
};
setIsLoading(loadObj);
} else if (res.length === 0) {
setHandleError("No Data Found!");
setHandleError(t("no-data-avaliable"));
const loadObj = {
isLoad: false
};
@@ -1064,7 +1066,7 @@ function PlaceHolderSign() {
>
{copied && (
<Alert type="success">
<div className="ml-3">Copied</div>
<div className="ml-3">{t("copied")}</div>
</Alert>
)}
<span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis ">
@@ -1077,12 +1079,12 @@ function PlaceHolderSign() {
className="flex flex-row items-center op-link op-link-primary"
>
<i className="fa-light fa-link" aria-hidden="true"></i>
<span className=" hidden md:block ml-1 ">Copy link</span>
<span className=" hidden md:block ml-1 ">{t("copy-link")}</span>
</button>
<RWebShare
data={{
url: data.url,
title: "Sign url"
title: t("sign-url")
}}
>
<i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i>
@@ -1705,7 +1707,7 @@ function PlaceHolderSign() {
<div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80">
<Loader />
<span className="text-[13px] text-base-content">
This might take some time
{t("loading-mssg")}
</span>
</div>
)}
@@ -1757,29 +1759,21 @@ function PlaceHolderSign() {
title={
isSendAlert.mssg === "sure" ||
isSendAlert.mssg === textWidget
? "Fields required"
: isSendAlert.mssg === "confirm" && "Send Mail"
? t("fields-required")
: isSendAlert.mssg === "confirm" && t("send-mail")
}
handleClose={() => setIsSendAlert({})}
>
<div className="max-h-96 overflow-y-scroll scroll-hide p-[20px] text-base-content">
{isSendAlert.mssg === "sure" ? (
<span>
Please ensure there&apos;s at least one signature
widget added for all recipients.
</span>
<span>{t("placeholder-alert-1")}</span>
) : isSendAlert.mssg === textWidget ? (
<p>
Please confirm that you have filled the text field.
</p>
<p>{t("placeholder-alert-2")}</p>
) : (
isSendAlert.mssg === "confirm" && (
<>
{!isCustomize && (
<span>
Are you sure you want to send out this document
for signatures?
</span>
<span>{t("placeholder-alert-3")}</span>
)}
{isCustomize && isSubscribe && (
<>
@@ -1797,7 +1791,7 @@ function PlaceHolderSign() {
setRequestSubject(defaultSubject);
}}
>
<span>Reset to default</span>
<span>{t("reset-to-default")}</span>
</div>
</>
)}
@@ -1807,14 +1801,14 @@ function PlaceHolderSign() {
onClick={() => sendEmailToSigners()}
className="op-btn op-btn-primary font-[500] text-sm shadow"
>
Send
{t("send")}
</button>
{isCustomize && (
<button
onClick={() => setIsCustomize(false)}
className="op-btn op-btn-ghost font-[500] text-sm"
>
Close
{t("close")}
</button>
)}
</div>
@@ -1823,13 +1817,13 @@ function PlaceHolderSign() {
className="op-link op-link-accent text-sm"
onClick={() => setIsCustomize(!isCustomize)}
>
Cutomize Email
{t("cutomize-email")}
</span>
)}
{!isSubscribe && isEnableSubscription && (
<div className="mt-2">
<Upgrade
message="Upgrade to customize Email"
message={t("upgrade-to-customize-email")}
newWindow={true}
/>
</div>
@@ -1842,7 +1836,7 @@ function PlaceHolderSign() {
<>
<div className="flex justify-center items-center mt-3">
<span className="h-[1px] w-[20%] bg-[#ccc]"></span>
<span className="ml-[5px] mr-[5px]">or</span>
<span className="ml-[5px] mr-[5px]">{t("or")}</span>
<span className="h-[1px] w-[20%] bg-[#ccc]"></span>
</div>
<div className="mt-3 mb-3">{handleShareList()}</div>
@@ -1854,7 +1848,7 @@ function PlaceHolderSign() {
{/* this modal is used show send mail message and after send mail success message */}
<ModalUi
isOpen={isSend}
title={"Mails Sent"}
title={t("Mails Sent")}
handleClose={() => {
setIsSend(false);
setSignerPos([]);
@@ -1865,15 +1859,11 @@ function PlaceHolderSign() {
{mailStatus === "success" ? (
<div className="text-center mb-[10px]">
<LottieWithLoader />
<p>
You have successfully sent mails to all recipients!
</p>
{isCurrUser && (
<p>Do you want to sign documents right now ?</p>
)}
<p>{t("placeholder-alert-4")}</p>
{isCurrUser && <p>{t("placeholder-alert-5")}</p>}
</div>
) : (
<p>Please setup mail adapter to send mail!</p>
<p>{t("placeholder-alert-6")}</p>
)}
{!mailStatus && (
<div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div>
@@ -1893,7 +1883,7 @@ function PlaceHolderSign() {
type="button"
className="op-btn op-btn-primary mr-1"
>
Yes
{t("yes")}
</button>
)}
@@ -1906,20 +1896,20 @@ function PlaceHolderSign() {
type="button"
className="op-btn op-btn-ghost"
>
{isCurrUser ? "No" : "Close"}
{isCurrUser ? t("no") : t("close")}
</button>
</div>
</div>
</ModalUi>
<ModalUi
isOpen={isShowEmail}
title={"signers alert"}
title={t("signers-alert")}
handleClose={() => {
setIsShowEmail(false);
}}
>
<div className="h-[100%] p-[20px]">
<p>Please select signer for add placeholder!</p>
<p>{t("placeholder-alert-7")}</p>
<div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div>
<button
onClick={() => {
@@ -1928,7 +1918,7 @@ function PlaceHolderSign() {
type="button"
className="op-btn op-btn-primary"
>
Ok
{t("ok")}
</button>
</div>
</ModalUi>
@@ -1948,7 +1938,7 @@ function PlaceHolderSign() {
/>
<DropdownWidgetOption
type={radioButtonWidget}
title="Radio group"
title={t("radio-group")}
showDropdown={isRadio}
setShowDropdown={setIsRadio}
handleSaveWidgetsOptions={handleSaveWidgetsOptions}
@@ -1959,7 +1949,7 @@ function PlaceHolderSign() {
/>
<DropdownWidgetOption
type="checkbox"
title="Checkbox"
title={t("checkbox")}
showDropdown={isCheckbox}
setShowDropdown={setIsCheckbox}
handleSaveWidgetsOptions={handleSaveWidgetsOptions}
@@ -1970,7 +1960,7 @@ function PlaceHolderSign() {
/>
<DropdownWidgetOption
type="dropdown"
title="Dropdown options"
title={t("dropdown-options")}
showDropdown={showDropdown}
setShowDropdown={setShowDropdown}
handleSaveWidgetsOptions={handleSaveWidgetsOptions}
@@ -2137,7 +2127,7 @@ function PlaceHolderSign() {
<ModalUi
isOpen={isAlreadyPlace.status}
title={"Document Alert"}
title={t("document-alert")}
showClose={false}
>
<div className="h-[100%] p-[20px]">
@@ -2148,7 +2138,7 @@ function PlaceHolderSign() {
type="button"
className="op-btn op-btn-primary"
>
View
{t("view")}
</button>
</div>
</ModalUi>
+27 -26
View File
@@ -87,9 +87,9 @@ function SignYourSelf() {
const [validateAlert, setValidateAlert] = useState(false);
const [isLoading, setIsLoading] = useState({
isLoad: true,
message: "This might take some time"
message: t("loading-mssg")
});
const [handleError, setHandleError] = useState();
const [handleError, setHandleError] = useState("");
const [isDragging, setIsDragging] = useState(false);
const [signTour, setSignTour] = useState(true);
const { docId } = useParams();
@@ -219,12 +219,12 @@ function SignYourSelf() {
//convert document url in array buffer format to use embed widgets in pdf using pdf-lib
const arrayBuffer = await convertPdfArrayBuffer(url);
if (arrayBuffer === "Error") {
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
} else {
setPdfArrayBuffer(arrayBuffer);
}
} else {
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
}
isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted;
if (isCompleted) {
@@ -236,7 +236,7 @@ function SignYourSelf() {
setPdfUrl(documentData[0].SignedUrl);
const alreadySign = {
status: true,
mssg: "Congratulations! 🎉 This document has been successfully signed by you!"
mssg: t("document-signed-alert")
};
if (showComplete) {
setShowAlreadySignDoc(alreadySign);
@@ -255,10 +255,10 @@ function SignYourSelf() {
const loadObj = {
isLoad: false
};
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
setIsLoading(loadObj);
} else {
setHandleError("No Data Found!");
setHandleError(t("no-data-avaliable"));
const loadObj = {
isLoad: false
};
@@ -292,7 +292,7 @@ function SignYourSelf() {
const loadObj = {
isLoad: false
};
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
setIsLoading(loadObj);
});
const contractUsersRes = await contractUsers(jsonSender.email);
@@ -300,7 +300,7 @@ function SignYourSelf() {
const loadObj = {
isLoad: false
};
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
setIsLoading(loadObj);
} else if (contractUsersRes[0] && contractUsersRes.length > 0) {
setActiveMailAdapter(contractUsersRes[0]?.active_mail_adapter);
@@ -344,7 +344,7 @@ function SignYourSelf() {
setCheckTourStatus(true);
}
} else {
setHandleError("No Data Found!");
setHandleError(t("no-data-avaliable"));
}
const loadObj = {
isLoad: false
@@ -580,7 +580,7 @@ function SignYourSelf() {
setOtpLoader(true);
await handleSendOTP(Parse.User.current().getEmail());
setOtpLoader(false);
alert("OTP sent on you email");
alert(t("otp-sent-alert"));
};
//`handleVerifyEmail` function is used to verify email with otp
const handleVerifyEmail = async (e) => {
@@ -630,7 +630,7 @@ function SignYourSelf() {
setIsEmailVerified(isEmailVerified);
}
} catch (e) {
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
}
}
if (isEmailVerified) {
@@ -668,17 +668,15 @@ function SignYourSelf() {
}
if (xyPostion.length === 0 || !isSignatureExist) {
setIsAlert({
header: "Fields required",
header: t("fields-required"),
isShow: true,
alertMessage:
"Please ensure there's at least one signature widget added"
alertMessage: t("signature-widget-alert-1")
});
return;
} else if (showAlert) {
setIsAlert({
isShow: true,
alertMessage:
"Please ensure all field is accurately filled and meets all requirements."
alertMessage: t("signature-widget-alert-2")
});
return;
} else {
@@ -713,13 +711,13 @@ function SignYourSelf() {
if (err && err.message.includes("is encrypted.")) {
setIsAlert({
isShow: true,
alertMessage: `Currently encrypted pdf files are not supported.`
alertMessage: t("encrypted-pdf-alert")
});
} else {
console.log("err in signing", err);
setIsAlert({
isShow: true,
alertMessage: `Something went wrong.`
alertMessage: t("something-went-wrong-mssg")
});
}
}
@@ -729,7 +727,7 @@ function SignYourSelf() {
setIsUiLoading(false);
setIsAlert({
isShow: true,
alertMessage: "something went wrong, please try again later."
alertMessage: t("something-went-wrong-mssg")
});
}
}
@@ -740,7 +738,7 @@ function SignYourSelf() {
const getIsSubscribe = await checkIsSubscribed();
const tenantDetails = await getTenantDetails(jsonSender.objectId);
if (tenantDetails && tenantDetails === "user does not exist!") {
alert("User does not exist");
alert(t("user-not-exist"));
} else {
if (
tenantDetails?.CompletionBody &&
@@ -771,6 +769,7 @@ function SignYourSelf() {
base64Sign = await fetchImageBase64(base64Sign);
} catch (e) {
console.log("error", e);
alert(t("something-went-wrong-mssg"));
}
}
//change image width and height to 104/44 in png base64
@@ -805,6 +804,7 @@ function SignYourSelf() {
})
.catch((err) => {
console.log("axois err ", err);
alert(t("something-went-wrong-mssg"));
});
};
@@ -1056,6 +1056,7 @@ function SignYourSelf() {
})
.catch((err) => {
console.log("axois err ", err);
alert(t("something-went-wrong-mssg"));
});
}
};
@@ -1177,7 +1178,7 @@ function SignYourSelf() {
<div className="absolute h-[100vh] w-full z-[999] flex flex-col justify-center items-center bg-[#e6f2f2] bg-opacity-80">
<Loader />
<span style={{ fontSize: "13px", fontWeight: "bold" }}>
{t("document-signature.loader")}
{t("loader")}
</span>
</div>
)}
@@ -1235,7 +1236,7 @@ function SignYourSelf() {
<div className=" w-full md:w-[95%] ">
<ModalUi
isOpen={isAlert.isShow}
title={isAlert?.header || "Alert"}
title={isAlert?.header || t("alert")}
handleClose={() => {
setIsAlert({
isShow: false,
@@ -1251,7 +1252,7 @@ function SignYourSelf() {
{/* this modal is used show this document is already sign */}
<ModalUi
isOpen={showAlreadySignDoc.status}
title={t("document-signature.document-signed")}
title={t("document-signed")}
handleClose={() => {
setShowAlreadySignDoc({ status: false });
}}
@@ -1270,7 +1271,7 @@ function SignYourSelf() {
</ModalUi>
<DropdownWidgetOption
type="checkbox"
title="Checkbox"
title={t("checkbox")}
showDropdown={isCheckbox}
setShowDropdown={setIsCheckbox}
handleSaveWidgetsOptions={handleSaveWidgetsOptions}
@@ -1425,7 +1426,7 @@ function SignYourSelf() {
}}
>
<div className="p-[20px] h-full">
<p>{t("document-signature.validate-alert-mssg")}</p>
<p>{t("validate-alert-mssg")}</p>
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
<button
+31 -23
View File
@@ -11,6 +11,7 @@ import { isEnableSubscription } from "../constant/const";
import { checkIsSubscribedTeam } from "../constant/Utils";
import SubscribeCard from "../primitives/SubscribeCard";
import Title from "../components/Title";
import { useTranslation } from "react-i18next";
const heading = ["Sr.No", "Name", "Parent Team", "Active"];
const actions = [
@@ -25,6 +26,7 @@ const actions = [
];
const TeamList = () => {
const { t } = useTranslation();
const recordperPage = 10;
const [teamList, setTeamList] = useState([]);
const [isLoader, setIsLoader] = useState(false);
@@ -120,7 +122,7 @@ const TeamList = () => {
}
} catch (err) {
console.log("Err in fetch teamlist", err);
setIsAlert({ type: "danger", msg: "Something went wrong." });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
} finally {
setTimeout(() => {
setIsAlert({ type: "success", msg: "" });
@@ -169,10 +171,10 @@ const TeamList = () => {
// console.log("teamRes ", teamRes);
setIsAlert({
type: !IsActive === false ? "danger" : "success",
msg: !IsActive === false ? "Team disabled." : "Team enabled."
msg: !IsActive === false ? t("team-disabled") : t("team-enabled")
});
} catch (err) {
setIsAlert({ type: "danger", msg: "something went wrong." });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
console.log("err in disable team", err);
} finally {
setIsActLoader({});
@@ -200,10 +202,10 @@ const TeamList = () => {
const data = { Name: team.Name, TeamId: team.objectId };
await Parse.Cloud.run("updateteam", data);
// console.log("updateTeamRes ", updateTeamRes);
setIsAlert({ type: "success", msg: "Team Update successfully." });
setIsAlert({ type: "success", msg: t("something-went-wrong-mssg") });
} catch (Err) {
console.log("Err in update team name"), Err;
setIsAlert({ type: "danger", msg: "Something went wrong." });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
} finally {
setIsActLoader({});
setTimeout(() => setIsAlert({ type: "success", msg: "" }), 1500);
@@ -233,9 +235,9 @@ const TeamList = () => {
)}
<div className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]">
<div className="font-light">
Teams{" "}
{t("report-name.Teams")}
<span className="text-xs md:text-[13px] font-normal">
<Tooltip message={"Teams"} />
<Tooltip message={t("report-heading.Team")} />
</span>
</div>
<div
@@ -251,7 +253,9 @@ const TeamList = () => {
<tr className="border-y-[1px]">
{heading?.map((item, index) => (
<React.Fragment key={index}>
<th className="px-4 py-2">{item}</th>
<th className="px-4 py-2">
{t(`report-heading.${item}`)}
</th>
</React.Fragment>
))}
</tr>
@@ -286,16 +290,16 @@ const TeamList = () => {
{isActiveModal[item.objectId] && (
<ModalUi
isOpen
title={"Team status"}
title={t("Team status")}
handleClose={handleClose}
>
<div className="m-[20px]">
<div className="text-lg font-normal text-black">
Are you sure you want to{" "}
{t("are-you-sure")}{" "}
{item?.IsActive
? "disable"
: "enable"}{" "}
this team?
? t("disable")
: t("enable")}{" "}
{t("this-team")}
</div>
<hr className="bg-[#ccc] mt-4 " />
<div className="flex items-center mt-3 gap-2 text-white">
@@ -305,13 +309,13 @@ const TeamList = () => {
}
className="op-btn op-btn-primary"
>
Yes
{t("yes")}
</button>
<button
onClick={handleClose}
className="op-btn op-btn-secondary"
>
No
{t("no")}
</button>
</div>
</div>
@@ -341,7 +345,7 @@ const TeamList = () => {
{isEditModal[item.objectId] && (
<ModalUi
isOpen
title={"Edit Team"}
title={t("edit-team")}
handleClose={handleClose}
>
<form
@@ -351,7 +355,7 @@ const TeamList = () => {
}
>
<label className="text-xs font-semibold text-base-content ml-1">
Name of Team{" "}
{t("name-of-team")}{" "}
<span className="text-[red] text-[13px]">
*
</span>
@@ -368,7 +372,7 @@ const TeamList = () => {
type="submit"
className="op-btn op-btn-primary mt-3"
>
Save
{t("save")}
</button>
</form>
</ModalUi>
@@ -389,7 +393,7 @@ const TeamList = () => {
onClick={() => paginateBack()}
className="op-join-item op-btn op-btn-sm"
>
Prev
{t("prev")}
</button>
)}
{pageNumbers.map((x, i) => (
@@ -409,7 +413,7 @@ const TeamList = () => {
onClick={() => paginateFront()}
className="op-join-item op-btn op-btn-sm"
>
Next
{t("next")}
</button>
)}
</div>
@@ -426,11 +430,13 @@ const TeamList = () => {
alt="img"
/>
</div>
<div className="text-sm font-semibold">No Data Available</div>
<div className="text-sm font-semibold">
{t("no-data-avaliable")}
</div>
</div>
)}
<ModalUi
title={"Add Team"}
title={t("add-team")}
isOpen={isModal}
handleClose={handleFormModal}
>
@@ -447,7 +453,9 @@ const TeamList = () => {
<h1 className="text-[60px] lg:text-[120px] font-semibold">
404
</h1>
<p className="text-[30px] lg:text-[50px]">Page Not Found</p>
<p className="text-[30px] lg:text-[50px]">
{t("page-not-found")}
</p>
</div>
</div>
)}
+30 -34
View File
@@ -40,7 +40,9 @@ import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption";
import Parse from "parse";
import { useSelector } from "react-redux";
import PdfZoom from "../components/pdf/PdfZoom";
import { useTranslation } from "react-i18next";
const TemplatePlaceholder = () => {
const { t } = useTranslation();
const navigate = useNavigate();
const isHeader = useSelector((state) => state.showHeader);
const { templateId } = useParams();
@@ -61,7 +63,7 @@ const TemplatePlaceholder = () => {
const [isSubscribe, setIsSubscribe] = useState(false);
const [isLoading, setIsLoading] = useState({
isLoad: true,
message: "This might take some time"
message: t("loading-mssg")
});
const [handleError, setHandleError] = useState();
const [currentEmail, setCurrentEmail] = useState();
@@ -300,10 +302,10 @@ const TemplatePlaceholder = () => {
const loadObj = {
isLoad: false
};
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
setIsLoading(loadObj);
} else {
setHandleError("No Data Found!");
setHandleError(t("no-data-avaliable"));
const loadObj = {
isLoad: false
};
@@ -312,9 +314,9 @@ const TemplatePlaceholder = () => {
} catch (err) {
console.log("err ", err);
if (err?.response?.data?.code === 101) {
setHandleError("Error: Template not found!");
setHandleError(t("no-data-avaliable"));
} else {
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
}
}
const res = await contractUsers(jsonSender.email);
@@ -339,10 +341,10 @@ const TemplatePlaceholder = () => {
const loadObj = {
isLoad: false
};
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
setIsLoading(loadObj);
} else if (res.length === 0) {
setHandleError("No Data Found!");
setHandleError(t("no-data-avaliable"));
const loadObj = {
isLoad: false
};
@@ -730,7 +732,7 @@ const TemplatePlaceholder = () => {
if (signersdata?.length) {
const loadObj = {
isLoad: true,
message: "This might take some time"
message: t("loading-mssg")
};
setIsLoading(loadObj);
setIsSendAlert(false);
@@ -905,7 +907,7 @@ const TemplatePlaceholder = () => {
});
setIsCreateDoc(false);
} else {
setHandleError("Error: Something went wrong!");
setHandleError(t("something-went-wrong-mssg"));
setIsCreateDoc(false);
}
};
@@ -1321,35 +1323,30 @@ const TemplatePlaceholder = () => {
{/* this modal is used show alert set placeholder for all signers before send mail */}
<ModalUi
isOpen={isSendAlert}
title={"Fields required"}
title={t("fields-required")}
handleClose={() => setIsSendAlert(false)}
>
<div className="h-full p-[20px]">
<p>
Please add at least one signature field for all roles.
</p>
<p>{t("template-signature-field")}</p>
</div>
</ModalUi>
<ModalUi
isOpen={!IsReceipent}
title={"Roles"}
title={t("roles")}
handleClose={() => setIsReceipent(true)}
>
<div className="h-full p-[20px] text-center font-medium">
<p>Please add roles first</p>
<p>{t("template-role-alert")}</p>
</div>
</ModalUi>
{/* this modal is used show send mail message and after send mail success message */}
<ModalUi
isOpen={isCreateDocModal}
title={"Create Document"}
title={t("create-document")}
handleClose={() => setIsCreateDocModal(false)}
>
<div className="h-full p-[20px]">
<p>
Do you want to create a document using the template you
just created ?
</p>
<p>{t("template-created-alert")}</p>
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
{currentEmail.length > 0 && (
<>
@@ -1360,7 +1357,7 @@ const TemplatePlaceholder = () => {
type="button"
className="op-btn op-btn-primary"
>
Yes
{t("yes")}
</button>
<button
onClick={() => {
@@ -1370,7 +1367,7 @@ const TemplatePlaceholder = () => {
type="button"
className="op-btn op-btn-secondary ml-2"
>
No
{t("no")}
</button>
</>
)}
@@ -1379,13 +1376,13 @@ const TemplatePlaceholder = () => {
{isCreateDoc && <LoaderWithMsg isLoading={isLoading} />}
<ModalUi
isOpen={isShowEmail}
title={"signers alert"}
title={t("signers-alert")}
handleClose={() => {
setIsShowEmail(false);
}}
>
<div className="h-full p-[20px]">
<p>Please select signer for add placeholder!</p>
<p>{t("template-creation-alert-1")}</p>
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
<button
onClick={() => {
@@ -1394,13 +1391,13 @@ const TemplatePlaceholder = () => {
type="button"
className="op-btn op-btn-primary"
>
Ok
{t("ok")}
</button>
</div>
</ModalUi>
<DropdownWidgetOption
type={radioButtonWidget}
title="Radio group"
title={t("radio-group")}
showDropdown={isRadio}
setShowDropdown={setIsRadio}
handleSaveWidgetsOptions={handleSaveWidgetsOptions}
@@ -1411,7 +1408,7 @@ const TemplatePlaceholder = () => {
/>
<DropdownWidgetOption
type="checkbox"
title="Checkbox"
title={t("checkbox")}
showDropdown={isCheckbox}
setShowDropdown={setIsCheckbox}
handleSaveWidgetsOptions={handleSaveWidgetsOptions}
@@ -1422,7 +1419,7 @@ const TemplatePlaceholder = () => {
/>
<DropdownWidgetOption
type="dropdown"
title="Dropdown options"
title={t("dropdown-options")}
showDropdown={showDropdown}
setShowDropdown={setShowDropdown}
handleSaveWidgetsOptions={handleSaveWidgetsOptions}
@@ -1444,7 +1441,7 @@ const TemplatePlaceholder = () => {
/>
{/* pdf header which contain funish back button */}
<Header
completeBtnTitle={"Next"}
completeBtnTitle={t("next")}
isPlaceholder={true}
pageNumber={pageNumber}
allPages={allPages}
@@ -1541,7 +1538,7 @@ const TemplatePlaceholder = () => {
handleDeleteUser={handleDeleteUser}
handleRoleChange={handleRoleChange}
handleOnBlur={handleOnBlur}
title={"Roles"}
title={t("roles")}
initial={true}
isTemplateFlow={true}
sendInOrder={pdfDetails[0].SendinOrder}
@@ -1570,7 +1567,7 @@ const TemplatePlaceholder = () => {
handleDeleteUser={handleDeleteUser}
handleRoleChange={handleRoleChange}
handleOnBlur={handleOnBlur}
title={"Roles"}
title={t("roles")}
sendInOrder={pdfDetails[0]?.SendinOrder}
setSignersData={setSignersData}
blockColor={blockColor}
@@ -1590,7 +1587,7 @@ const TemplatePlaceholder = () => {
isDragStamp={isDragStamp}
isSignYourself={false}
addPositionOfSignature={addPositionOfSignature}
title={"Roles"}
title={t("roles")}
initial={true}
isTemplateFlow={true}
/>
@@ -1601,7 +1598,6 @@ const TemplatePlaceholder = () => {
</div>
</div>
)}
<div data-tut="reactourAddbtn--observe">
<AddRoleModal
isModalRole={isModalRole}
@@ -1622,7 +1618,7 @@ const TemplatePlaceholder = () => {
/>
</div>
<ModalUi
title={"Edit Template"}
title={t("edit-template")}
isOpen={isEditTemplate}
handleClose={handleEditTemplateModal}
>
+31 -22
View File
@@ -11,9 +11,11 @@ import SubscribeCard from "../primitives/SubscribeCard";
import { isEnableSubscription } from "../constant/const";
import { checkIsSubscribedTeam } from "../constant/Utils";
import Title from "../components/Title";
import { useTranslation } from "react-i18next";
const heading = ["Sr.No", "Name", "Email", "Phone", "Role", "Team", "Active"];
// const actions = [];
const UserList = () => {
const { t } = useTranslation();
const [userList, setUserList] = useState([]);
const [isLoader, setIsLoader] = useState(false);
const [isModal, setIsModal] = useState(false);
@@ -110,7 +112,7 @@ const UserList = () => {
setUserList(_userRes);
} catch (err) {
console.log("Err in fetch userlist", err);
setIsAlert({ type: "danger", msg: "Something went wrong." });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
} finally {
setTimeout(() => {
setIsAlert({ type: "success", msg: "" });
@@ -166,10 +168,11 @@ const UserList = () => {
await extUser.save();
setIsAlert({
type: !IsDisabled === true ? "danger" : "success",
msg: !IsDisabled === true ? "User deactivated." : "User activated."
msg:
!IsDisabled === true ? t("user-deactivated") : t("user-activated")
});
} catch (err) {
setIsAlert({ type: "danger", msg: "something went wrong." });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
console.log("err in disable team", err);
} finally {
setIsActLoader({});
@@ -204,9 +207,9 @@ const UserList = () => {
)}
<div className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]">
<div className="font-light">
Users{" "}
{t("report-name.Users")}
<span className="text-xs md:text-[13px] font-normal">
<Tooltip message={"users from Teams"} />
<Tooltip message={t("users-from-teams")} />
</span>
</div>
<div
@@ -222,7 +225,9 @@ const UserList = () => {
<tr className="border-y-[1px]">
{heading?.map((item, index) => (
<React.Fragment key={index}>
<th className="px-4 py-2">{item}</th>
<th className="px-4 py-2">
{t(`report-heading.${item}`)}
</th>
</React.Fragment>
))}
</tr>
@@ -261,16 +266,16 @@ const UserList = () => {
{isActiveModal[item.objectId] && (
<ModalUi
isOpen
title={"User status"}
title={t("user-status")}
handleClose={handleClose}
>
<div className="m-[20px]">
<div className="text-lg font-normal text-black">
Are you sure you want to{" "}
{t("are-you-sure")}{" "}
{item?.IsDisabled
? "activate"
: "deactivate"}{" "}
this user?
? t("activate")
: t("deactivate")}{" "}
{t("this-user")}?
</div>
<hr className="bg-[#ccc] mt-4 " />
<div className="flex items-center mt-3 gap-2 text-white">
@@ -280,13 +285,13 @@ const UserList = () => {
}
className="op-btn op-btn-primary"
>
Yes
{t("yes")}
</button>
<button
onClick={handleClose}
className="op-btn op-btn-secondary"
>
No
{t("no")}
</button>
</div>
</div>
@@ -311,12 +316,12 @@ const UserList = () => {
{isDeleteModal[item.objectId] && (
<ModalUi
isOpen
title={"Delete User"}
title={t("delete-user")}
handleClose={handleClose}
>
<div className="m-[20px]">
<div className="text-lg font-normal text-black">
Are you sure you want to delete this user?
{t( "are-you-sure")} {t("delete")} {t("this-user")}?
</div>
<hr className="bg-[#ccc] mt-4 " />
<div className="flex items-center mt-3 gap-2 text-white">
@@ -324,13 +329,13 @@ const UserList = () => {
onClick={() => handleDelete(item)}
className="op-btn op-btn-primary"
>
Yes
{t("yes")}
</button>
<button
onClick={handleClose}
className="op-btn op-btn-secondary"
>
No
{('no)}
</button>
</div>
</div>
@@ -350,7 +355,7 @@ const UserList = () => {
onClick={() => paginateBack()}
className="op-join-item op-btn op-btn-sm"
>
Prev
{t("prev")}
</button>
)}
{pageNumbers.map((x, i) => (
@@ -370,7 +375,7 @@ const UserList = () => {
onClick={() => paginateFront()}
className="op-join-item op-btn op-btn-sm"
>
Next
{t("next")}
</button>
)}
</div>
@@ -387,11 +392,13 @@ const UserList = () => {
alt="img"
/>
</div>
<div className="text-sm font-semibold">No Data Available</div>
<div className="text-sm font-semibold">
{t("no-data-avaliable")}
</div>
</div>
)}
<ModalUi
title={"Add User"}
title={t("add-user")}
isOpen={isModal}
handleClose={handleFormModal}
>
@@ -408,7 +415,9 @@ const UserList = () => {
<h1 className="text-[60px] lg:text-[120px] font-semibold">
404
</h1>
<p className="text-[30px] lg:text-[50px]">Page Not Found</p>
<p className="text-[30px] lg:text-[50px]">
{t("page-not-found")}
</p>
</div>
</div>
)}
+2 -2
View File
@@ -71,10 +71,10 @@ function Webhook() {
setIsAlert({ type: "success", msg: t("webhook-added") });
} else {
console.error("Error while generating webhook");
setIsAlert({ type: "danger", msg: t("wrong-mssg") });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
}
} catch (error) {
setIsAlert({ type: "danger", msg: t("wrong-mssg") });
setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") });
console.log("err while generating webhook", error);
} finally {
setIsLoader(false);
+10 -8
View File
@@ -1,7 +1,9 @@
import React, { useState, useEffect } from "react";
import Parse from "parse";
import Loader from "./Loader";
import { useTranslation } from "react-i18next";
const AddContact = (props) => {
const { t } = useTranslation();
const [name, setName] = useState("");
const [phone, setPhone] = useState("");
const [email, setEmail] = useState("");
@@ -148,7 +150,7 @@ const AddContact = (props) => {
} catch (err) {
// console.log("err", err);
setIsLoader(false);
alert("something went wrong!");
alert(t("something-went-wrong-mssg"));
}
};
@@ -175,7 +177,7 @@ const AddContact = (props) => {
</div>
)}
<div className="w-full mx-auto p-[8px]">
<div className="text-[14px] font-[700]">Add Contact</div>
<div className="text-[14px] font-[700]">{t("add-contact")}</div>
{isUserExist && (
<div className="mb-[0.75rem] flex items-center mt-1">
<input
@@ -189,14 +191,14 @@ const AddContact = (props) => {
htmlFor="addYourself"
className="ml-[0.5rem] text-base-content mb-0"
>
Add Yourself
{t("add-yourself")}
</label>
</div>
)}
<form className="text-base-content" onSubmit={handleSubmit}>
<div className="mb-[0.75rem]">
<label htmlFor="name" className="text-[13px]">
Name
{t("name")}
<span className="text-[13px] text-[red]"> *</span>
</label>
<input
@@ -211,7 +213,7 @@ const AddContact = (props) => {
</div>
<div className="mb-[0.75rem]">
<label htmlFor="email" className="text-[13px]">
Email
{t("email")}
<span className="text-[13px] text-[red]"> *</span>
</label>
<input
@@ -226,7 +228,7 @@ const AddContact = (props) => {
</div>
<div className="mb-[0.75rem]">
<label htmlFor="phone" className="text-[13px]">
Phone
{t("phone")}
</label>
<input
type="text"
@@ -240,14 +242,14 @@ const AddContact = (props) => {
<div className="mt-6 flex justify-start gap-2">
<button type="submit" className="op-btn op-btn-primary">
Submit
{t("submit")}
</button>
<button
type="button"
onClick={() => handleReset()}
className="op-btn op-btn-secondary"
>
Reset
{t("reset")}
</button>
</div>
</form>
+94 -103
View File
@@ -304,7 +304,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later!"
message: t("something-went-wrong-mssg")
});
setTimeout(() => setIsAlert(false), 1500);
setActLoader({});
@@ -316,7 +316,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later!"
message: t("something-went-wrong-mssg")
});
setTimeout(() => setIsAlert(false), 1500);
setActLoader({});
@@ -326,7 +326,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later!"
message: t("something-went-wrong-mssg")
});
setTimeout(() => setIsAlert(false), 1500);
setActLoader({});
@@ -416,7 +416,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "success",
message: "Record deleted successfully!"
message: t("record-delete-alert")
});
setTimeout(() => setIsAlert(false), 1500);
const upldatedList = props.List.filter(
@@ -429,7 +429,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later!"
message: t("something-went-wrong-mssg")
});
setTimeout(() => setIsAlert(false), 1500);
setActLoader({});
@@ -505,7 +505,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "success",
message: "Record revoked successfully!"
message: t("record-revoke-alert")
});
setTimeout(() => setIsAlert(false), 1500);
const upldatedList = props.List.filter(
@@ -520,7 +520,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later!"
message: t("something-went-wrong-mssg")
});
setTimeout(() => setIsAlert(false), 1500);
setActLoader({});
@@ -607,7 +607,7 @@ const ReportTable = (props) => {
setActLoader({});
} catch (err) {
console.log("err in getsignedurl", err);
alert("something went wrong, please try again later.");
alert(t("something-went-wrong-mssg"));
setActLoader({});
}
}
@@ -740,12 +740,12 @@ const ReportTable = (props) => {
const res = await axios.post(url, params, { headers: headers });
if (res?.data?.result?.status === "success") {
setIsAlert(true);
setAlertMsg({ type: "success", message: "Mail sent successfully." });
setAlertMsg({ type: "success", message: t("mail-sent-alert") });
} else {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, please try again later!"
message: t("something-went-wrong-mssg")
});
}
} catch (err) {
@@ -753,7 +753,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, please try again later!"
message: t("something-went-wrong-mssg")
});
} finally {
setTimeout(() => setIsAlert(false), 1500);
@@ -794,20 +794,20 @@ const ReportTable = (props) => {
if (count > 1) {
setAlertMsg({
type: "success",
message: count + " Document sent successfully!"
message: count + t("document-sent-alert")
});
setTimeout(() => setIsAlert(false), 1500);
} else {
setAlertMsg({
type: "success",
message: count + " Document sent successfully!"
message: count + t("document-sent-alert")
});
setTimeout(() => setIsAlert(false), 1500);
}
} else {
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later!"
message: t("something-went-wrong-mssg")
});
setTimeout(() => setIsAlert(false), 1500);
}
@@ -844,7 +844,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later!"
message: t("something-went-wrong-mssg")
});
setTimeout(() => setIsAlert(false), 1500);
}
@@ -868,7 +868,7 @@ const ReportTable = (props) => {
if (props.isPublic[item.objectId]) {
setAlertMsg({
type: "success",
message: "You have successfully made the template public."
message: t("template-public-alert-1")
});
setIsCelebration(true);
setTimeout(() => {
@@ -880,7 +880,7 @@ const ReportTable = (props) => {
} else {
setAlertMsg({
type: "success",
message: "You have successfully made the template private."
message: t("template-public-alert-2")
});
setSelectedPublicRole("");
}
@@ -897,7 +897,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later!"
message: t("something-went-wrong-mssg")
});
setTimeout(() => setIsAlert(false), 1500);
props.setIsPublic((prevStates) => ({
@@ -909,7 +909,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "You need to select a role for the public signers."
message: t("template-public-alert-3")
});
setTimeout(() => setIsAlert(false), 1500);
}
@@ -963,8 +963,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message:
" Please ensure there's at least one signature widget added for all signers."
message: t("template-public-alert-4")
});
setTimeout(() => setIsAlert(false), 5000);
}
@@ -972,8 +971,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message:
"Since this template has send-in-order enabled, the public role must be positioned at the top."
message: t("template-public-alert-5")
});
setTimeout(() => setIsAlert(false), 5000);
}
@@ -981,8 +979,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message:
"Please attach signers to all roles except for the public role user."
message: t("template-public-alert-6")
});
setTimeout(() => setIsAlert(false), 5000);
}
@@ -990,8 +987,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "danger",
message:
"Please assign at least one public role to make this template public."
message: t("template-public-alert-7")
});
setTimeout(() => setIsAlert(false), 5000);
}
@@ -1004,7 +1000,7 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "success",
message: "Copied."
message: t("copied")
});
setTimeout(() => setIsAlert(false), 1500);
};
@@ -1033,14 +1029,14 @@ const ReportTable = (props) => {
setIsAlert(true);
setAlertMsg({
type: "success",
message: "Template Shared successfully."
message: t("template-share-alert")
});
}
} catch (err) {
setIsAlert(true);
setAlertMsg({
type: "danger",
message: "Something went wrong, Please try again later."
message: t("something-went-wrong-mssg")
});
} finally {
setActLoader({});
@@ -1110,11 +1106,11 @@ const ReportTable = (props) => {
</React.Fragment>
))}
{props.ReportName === "Templates" && isEnableSubscription && (
<th className="px-4 py-2">Public</th>
<th className="px-4 py-2">{t("public")}</th>
)}
{props.actions?.length > 0 && (
<th className="px-4 py-2 text-transparent pointer-events-none">
Action
{t("action")}
</th>
)}
</tr>
@@ -1205,16 +1201,16 @@ const ReportTable = (props) => {
)}
{props.heading.includes("Folder") && (
<td className="px-4 py-2">
{item?.Folder?.Name || "OpenSign™ Drive"}
{item?.Folder?.Name || t("OpenSign™ Drive")}
</td>
)}
<td className="px-4 py-2">
<button
onClick={() => handleDownload(item)}
className="op-link op-link-primary"
title={"Download"}
title={t("download")}
>
{item?.URL ? "Download" : "-"}
{item?.URL ? t("download") : "-"}
</button>
</td>
<td className="px-4 py-2">
@@ -1226,7 +1222,7 @@ const ReportTable = (props) => {
onClick={() => handleViewSigners(item)}
className="op-link op-link-primary"
>
View
{t("view")}
</button>
) : (
"-"
@@ -1260,8 +1256,8 @@ const ReportTable = (props) => {
isOpen
title={
props.isPublic[item.objectId]
? "Make template public"
: "Make template private"
? t("make-template-public")
: t("make-template-private")
}
handleClose={() => {
setIsMakePublicModal({});
@@ -1277,13 +1273,13 @@ const ReportTable = (props) => {
<div className="font-normal text-black">
<p className="text-lg">
{props.isPublic[item.objectId]
? `Are you sure you want to make this template public?`
: `Are you sure you want to make this template private? This will remove it from your public profile.`}
? t("make-template-public-alert")
: t("make-template-private-alert")}
</p>
{props.isPublic[item.objectId] && (
<div className="flex mt-2 gap-2 md:items-center">
<p className="text-[15px]">
Public role :{" "}
{t("public-role")} :{" "}
</p>
<input
@@ -1301,13 +1297,13 @@ const ReportTable = (props) => {
}
className="op-btn op-btn-primary"
>
Submit
{t("submit")}
</button>
<button
onClick={() => handleClose(item)}
className="op-btn op-btn-secondary"
>
Cancel
{t("cancel")}
</button>
</div>
</div>
@@ -1316,7 +1312,7 @@ const ReportTable = (props) => {
{isPublicProfile[item.objectId] && (
<ModalUi
isOpen
title={"Public URL"}
title={t("public-url")}
handleClose={() => {
setIsPublicProfile({});
}}
@@ -1324,15 +1320,10 @@ const ReportTable = (props) => {
<div className="m-[20px]">
{publicUserName ? (
<div className="font-normal text-black">
<p>
Heres your public URL: Copy it or
share it with the signer, and you will
be able to see all your publicly set
templates.
</p>
<p>{t("public-url-copy-mssg")}</p>
<div className=" flex items-center gap-3 mt-2 p-[2px] ">
<span className="font-bold">
Public URL :
{t("public-url")}:
</span>
<span
onClick={() => copytoProfileLink()}
@@ -1342,16 +1333,12 @@ const ReportTable = (props) => {
</div>
) : (
<div className="font-normal text-black">
<p>
Please add your public URL, and you
will be able to make a public
template.
</p>
<p>{t("add-public-url-alert")}</p>
<button
className="mt-3 op-btn op-btn-primary"
onClick={() => navigate("/profile")}
>
Add
{t("add")}
</button>
</div>
)}
@@ -1376,7 +1363,7 @@ const ReportTable = (props) => {
onClick={() =>
handleActionBtn(act, item)
}
title={act.hoverLabel}
title={t(`btnLabel.${act.btnLabel}`)}
className={
act.action !== "option"
? `${
@@ -1390,7 +1377,7 @@ const ReportTable = (props) => {
<i className={act.btnIcon}></i>
{act.btnLabel && (
<span className="uppercase font-medium">
{act.btnLabel}
{t(`btnLabel.${act.btnLabel}`)}
</span>
)}
{isOption[item.objectId] &&
@@ -1405,7 +1392,9 @@ const ReportTable = (props) => {
item
)
}
title={subact.hoverLabel}
title={t(
`btnLabel.${subact.btnLabel}`
)}
>
<span>
<i
@@ -1413,7 +1402,9 @@ const ReportTable = (props) => {
></i>
{subact.btnLabel && (
<span className="text-[13px] capitalize font-medium">
{subact.btnLabel}
{t(
`btnLabel.${subact.btnLabel}`
)}
</span>
)}
</span>
@@ -1430,7 +1421,7 @@ const ReportTable = (props) => {
data-tut={act?.selector}
key={index}
onClick={() => handleActionBtn(act, item)}
title={act.hoverLabel}
title={t(`btnLabel.${act.hoverLabel}`)}
className={
act.action !== "option"
? `${
@@ -1442,7 +1433,7 @@ const ReportTable = (props) => {
<i className={act.btnIcon}></i>
{act.btnLabel && (
<span className="uppercase font-medium">
{act.btnLabel}
{t(`btnLabel.${act.btnLabel}`)}
</span>
)}
{isOption[item.objectId] &&
@@ -1454,7 +1445,9 @@ const ReportTable = (props) => {
onClick={() =>
handleActionBtn(subact, item)
}
title={subact.hoverLabel}
title={t(
`btnLabel.${subact.hoverLabel}`
)}
>
<span>
<i
@@ -1462,7 +1455,9 @@ const ReportTable = (props) => {
></i>
{subact.btnLabel && (
<span className="text-[13px] capitalize font-medium">
{subact.btnLabel}
{t(
`btnLabel.${subact.btnLabel}`
)}
</span>
)}
</span>
@@ -1488,17 +1483,13 @@ const ReportTable = (props) => {
</div>
<div className="text-base-content text-base text-center">
You cannot share a template if any
roles already have contacts assigned.
Please remove all contact assignments
from the roles before sharing the
template.
{t("share-with-alert")}
</div>
</div>
) : (
<>
<h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]">
Share with
{t("share-with")}
</h3>
<div
className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2 z-40"
@@ -1522,7 +1513,7 @@ const ReportTable = (props) => {
closeMenuOnSelect
required={true}
noOptionsMessage={() =>
"Team not found"
t("team-not-found")
}
unstyled
classNames={{
@@ -1544,7 +1535,7 @@ const ReportTable = (props) => {
}}
/>
<button className="op-btn op-btn-primary ml-[10px] my-3">
Submit
{t("submit")}
</button>
</form>
</>
@@ -1568,7 +1559,7 @@ const ReportTable = (props) => {
{isSubscribe && !isEnableSubscription && (
<>
<h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]">
Share with
{t("share-with")}
</h3>
<div
className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2 z-40"
@@ -1585,7 +1576,7 @@ const ReportTable = (props) => {
onClick={(e) => handleShareWith(e, item)}
className="op-btn op-btn-primary ml-[10px] my-3"
>
Submit
{t("submit")}
</button>
</>
)}
@@ -1598,7 +1589,7 @@ const ReportTable = (props) => {
showHeader={
props.ReportName === "Templates" && true
}
title={"Signers"}
title={t("signers")}
reduceWidth={"md:max-w-[450px]"}
handleClose={() => setIsViewShare({})}
>
@@ -1615,13 +1606,13 @@ const ReportTable = (props) => {
<tr>
{props.ReportName === "Templates" && (
<th className="p-2 pl-3 w-[30%]">
Roles
{t("roles")}
</th>
)}
<th className="pl-3 py-2">
{props.ReportName === "Templates"
? "Email"
: "Signers"}
? t("email")
: t("signers")}
</th>
</tr>
</thead>
@@ -1647,12 +1638,12 @@ const ReportTable = (props) => {
{isDeleteModal[item.objectId] && (
<ModalUi
isOpen
title={"Delete Document"}
title={t("delete-document")}
handleClose={handleClose}
>
<div className="m-[20px]">
<div className="text-lg font-normal text-black">
Are you sure you want to delete this document?
{t("delete-document-alert")}
</div>
<hr className="bg-[#ccc] mt-4" />
<div className="flex items-center mt-3 gap-2 text-white">
@@ -1660,13 +1651,13 @@ const ReportTable = (props) => {
onClick={() => handleDelete(item)}
className="op-btn op-btn-primary"
>
Yes
{t("yes")}
</button>
<button
onClick={handleClose}
className="op-btn op-btn-secondary"
>
No
{t("no")}
</button>
</div>
</div>
@@ -1675,7 +1666,7 @@ const ReportTable = (props) => {
{isBulkSend[item.objectId] && (
<ModalUi
isOpen
title={"Quick send"}
title={t("quick-send")}
handleClose={() => setIsBulkSend({})}
>
{isLoader[item.objectId] ? (
@@ -1694,7 +1685,7 @@ const ReportTable = (props) => {
{isShare[item.objectId] && (
<ModalUi
isOpen
title={"Copy link"}
title={t("copy-link")}
handleClose={() => {
setIsShare({});
setActLoader({});
@@ -1719,7 +1710,7 @@ const ReportTable = (props) => {
>
<button className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm ">
<i className="fa-light fa-share-from-square"></i>{" "}
Share
{t("btnLabel.Share")}
</button>
</RWebShare>
<button
@@ -1728,8 +1719,8 @@ const ReportTable = (props) => {
>
<i className="fa-light fa-link"></i>{" "}
{copied[share.email]
? "Copied"
: "Copy"}
? t("copied")
: t("copy")}
</button>
</div>
</div>
@@ -1740,12 +1731,12 @@ const ReportTable = (props) => {
{isRevoke[item.objectId] && (
<ModalUi
isOpen
title={"Revoke document"}
title={t("revoke-document")}
handleClose={handleClose}
>
<div className="m-[20px]">
<div className="text-sm md:text-lg font-normal text-black">
Are you sure you want to revoke this document?
{t("revoke-document-alert")}
</div>
<div className="mt-2">
<textarea
@@ -1761,13 +1752,13 @@ const ReportTable = (props) => {
onClick={() => handleRevoke(item)}
className="op-btn op-btn-primary px-6"
>
Yes
{t("yes")}
</button>
<button
onClick={handleClose}
className="op-btn op-btn-secondary px-6"
>
No
{t("no")}
</button>
</div>
</div>
@@ -1776,7 +1767,7 @@ const ReportTable = (props) => {
{isResendMail[item.objectId] && (
<ModalUi
isOpen
title={"Resend Mail"}
title={t("resend-mail")}
handleClose={() => {
setIsResendMail({});
setIsNextStep({});
@@ -1802,9 +1793,7 @@ const ReportTable = (props) => {
<div className="absolute right-5 text-xs z-40">
<Tooltip
id={`${user.Id}_help`}
message={
"You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}."
}
message={t("resend-mail-help")}
/>
</div>
<div>
@@ -1812,7 +1801,7 @@ const ReportTable = (props) => {
className="text-xs ml-1"
htmlFor="mailsubject"
>
Subject{" "}
{t("subject")}{" "}
</label>
<input
id="mailsubject"
@@ -1832,7 +1821,7 @@ const ReportTable = (props) => {
className="text-xs ml-1"
htmlFor="mailbody"
>
Body{" "}
{t("body")}{" "}
</label>
<EditorToolbar containerId="toolbar1" />
<ReactQuill
@@ -1851,7 +1840,7 @@ const ReportTable = (props) => {
type="submit"
className="op-btn op-btn-primary"
>
Resend
{t("resend")}
</button>
</form>
</div>
@@ -1889,7 +1878,7 @@ const ReportTable = (props) => {
onClick={() => paginateBack()}
className="op-join-item op-btn op-btn-sm"
>
Prev
{t("prev")}
</button>
)}
{pageNumbers.map((x, i) => (
@@ -1909,7 +1898,7 @@ const ReportTable = (props) => {
onClick={() => paginateFront()}
className="op-join-item op-btn op-btn-sm"
>
Next
{t("next")}
</button>
)}
</div>
@@ -1926,11 +1915,13 @@ const ReportTable = (props) => {
alt="img"
/>
</div>
<div className="text-sm font-semibold">No Data Available</div>
<div className="text-sm font-semibold">
{t("no-data-avaliable")}
</div>
</div>
)}
<ModalUi
title={"Add Contact"}
title={t("add-contact")}
isOpen={isContactform}
handleClose={handleContactFormModal}
>
@@ -2,11 +2,13 @@ import React from "react";
import SelectSigners from "../components/shared/fields/SelectSigners";
import AddContact from "./AddContact";
import ModalUi from "./ModalUi";
import { useTranslation } from "react-i18next";
const LinkUserModal = (props) => {
const { t } = useTranslation();
return (
<ModalUi
title={"Add/Choose Signer"}
title={t("add/choose-signer")}
isOpen={
props?.isAddSigner ||
(props?.isAddUser && props?.isAddUser[props?.uniqueId])
@@ -18,7 +20,9 @@ const LinkUserModal = (props) => {
closePopup={props.closePopup}
signersData={props?.signersData}
/>
<div className="op-divider text-base-content mx-[25%] my-1">or</div>
<div className="op-divider text-base-content mx-[25%] my-1">
{t("or")}
</div>
<AddContact details={props.handleAddUser} closePopup={props.closePopup} />
</ModalUi>
);