This commit is contained in:
prafull-opensignlabs
2025-05-05 05:12:54 +00:00
parent 365c2a217e
commit b50c1e70ee
23 changed files with 1755 additions and 1171 deletions
+15 -13
View File
@@ -13,7 +13,7 @@
"@pdf-lib/fontkit": "^1.1.1",
"@radix-ui/themes": "^3.1.6",
"@reduxjs/toolkit": "^2.7.0",
"axios": "^1.8.4",
"axios": "^1.9.0",
"css-minimizer-webpack-plugin": "^7.0.2",
"date-fns-tz": "^3.2.0",
"file-saver": "^2.0.5",
@@ -24,7 +24,7 @@
"jwt-decode": "^4.0.0",
"moment": "^2.30.1",
"nth-check": "^2.1.1",
"parse": "^5.3.0",
"parse": "^6.1.1",
"pdf-lib": "^1.17.1",
"print-js": "^1.6.0",
"radix-ui": "^1.0.1",
@@ -1956,9 +1956,10 @@
}
},
"node_modules/@babel/runtime-corejs3": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.7.tgz",
"integrity": "sha512-eytSX6JLBY6PVAeQa2bFlDx/7Mmln/gaEpsit5a3WEvjGfiIytEsgAwuIXCPM0xvw0v0cJn3ilq0/TvXrW0kgA==",
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz",
"integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==",
"license": "MIT",
"dependencies": {
"core-js-pure": "^3.30.2",
"regenerator-runtime": "^0.14.0"
@@ -7810,9 +7811,9 @@
}
},
"node_modules/axios": {
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
"integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
"integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
@@ -18749,15 +18750,16 @@
}
},
"node_modules/parse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/parse/-/parse-5.3.0.tgz",
"integrity": "sha512-mWBnE6hHJhdvlx5KPQcYgCGRdgqKhPw+5fSC0j7vOfse3Lkh3xtDwOfmDpvv2LXZVBj72G/mgVKMRmbAICRzkQ==",
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/parse/-/parse-6.1.1.tgz",
"integrity": "sha512-zf70XcHKesDcqpO2RVKyIc1l7pngxBsYQVl0Yl/A38pftOSP8BQeampqqLEqMknzUetNZy8B+wrR3k5uTQDXOw==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime-corejs3": "7.24.7",
"@babel/runtime-corejs3": "7.27.0",
"idb-keyval": "6.2.1",
"react-native-crypto-js": "1.0.0",
"uuid": "10.0.0",
"ws": "8.17.1",
"ws": "8.18.1",
"xmlhttprequest": "1.8.0"
},
"engines": {
+2 -2
View File
@@ -8,7 +8,7 @@
"@pdf-lib/fontkit": "^1.1.1",
"@radix-ui/themes": "^3.1.6",
"@reduxjs/toolkit": "^2.7.0",
"axios": "^1.8.4",
"axios": "^1.9.0",
"css-minimizer-webpack-plugin": "^7.0.2",
"date-fns-tz": "^3.2.0",
"file-saver": "^2.0.5",
@@ -19,7 +19,7 @@
"jwt-decode": "^4.0.0",
"moment": "^2.30.1",
"nth-check": "^2.1.1",
"parse": "^5.3.0",
"parse": "^6.1.1",
"pdf-lib": "^1.17.1",
"print-js": "^1.6.0",
"radix-ui": "^1.0.1",
@@ -153,7 +153,8 @@
"Duplicate": "Duplikat",
"daily-mail-quota": "Tägliches E-Mail-Kontingent",
"Save as template": "Als Vorlage speichern",
"Fix & resend": "Korrigieren und erneut senden"
"Fix & resend": "Korrigieren und erneut senden",
"Kiosk Mode": "Kiosk Modus"
},
"report-heading": {
"Sr.No": "Nr.",
@@ -304,7 +305,7 @@
"send": "Senden",
"quick-send-alert-1": "Alle Rollen in diesem Dokument sind derzeit mit Kontakten verknüpft. Um Kopien dieser Vorlage schnell an mehrere Unterzeichner zu senden, stellen Sie sicher, dass mindestens eine Rolle keinem Kontakt zugeordnet ist.",
"quick-send-alert-2": "Bitte stellen Sie sicher, dass für alle Empfänger mindestens ein Signatur-Widget hinzugefügt wurde.",
"quick-send-alert-3": "Bitte fügen Sie mindestens eine Rolle zu dieser Vorlage hinzu, um Kopien davon schnell an mehrere Unterzeichner zu senden.",
"quick-send-alert-3": "Bitte fügen Sie diesem template mindestens eine Rolle hinzu.",
"quick-send-alert-4": "Das Limit für Schnellsendungen wurde erreicht.",
"copy-link": "Link kopieren",
"copy": "Kopieren",
@@ -965,5 +966,10 @@
"p1": "Administre la configuración de seguridad de su cuenta para mantener sus datos seguros. OpenSign admite métodos de autenticación avanzados para mejorar la protección de la cuenta.",
"2fa-auth-help": "Agregue una capa adicional de seguridad activando 2FA. Esto requiere ingresar un código de verificación desde una aplicación autenticadora después de su contraseña.",
"passkey-auth-help": "Use claves de acceso para iniciar sesión sin contraseña con verificación biométrica o basada en el dispositivo, proporcionando una seguridad sólida y comodidad."
}
},
"signer-already-present": "Unterzeichner bereits vorhanden",
"kiosk-sign": "Kiosk-Unterschrift",
"dont-have-access-to-template": "Das template wurde gelöscht oder Sie haben keinen Zugriff. Bitte kontaktieren Sie den Absender.",
"kiosk-info": "Kiosk Modus ermöglicht es Ihnen, persönliche Unterschriften schnell und effizient zu erfassen. Ideal für Messen, Veranstaltungen oder Laufkundschaft, bei denen alle Unterzeichner physisch anwesend sind. ",
"learn-more": "Mehr erfahren"
}
@@ -153,7 +153,8 @@
"Duplicate": "Duplicate",
"daily-mail-quota": "Daily Email Quota",
"Save as template": "Save as template",
"Fix & resend": "Fix & Resend"
"Fix & resend": "Fix & Resend",
"Kiosk Mode": "Kiosk Mode"
},
"report-heading": {
"Sr.No": "Sr.No",
@@ -304,7 +305,7 @@
"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-3": "Please add at least one role to this template.",
"quick-send-alert-4": "Quick send reached limit.",
"copy-link": "Copy link",
"copy": "Copy",
@@ -965,5 +966,10 @@
"p1":"Manage your account's security settings to keep your data safe. OpenSign supports advanced authentication methods to enhance account protection.",
"2fa-auth-help":" Add an extra layer of security by enabling 2FA. This requires you to enter a verification code from an authenticator app after your password.",
"passkey-auth-help":"Use passkeys for passwordless sign-in with biometric or device-based verification, providing both strong security and convenience."
}
},
"signer-already-present": "Signer already present",
"kiosk-sign": "Kiosk Sign",
"dont-have-access-to-template": "The template has been deleted or you don't have access. Please contact the sender.",
"kiosk-info": "Kiosk Mode lets you collect in-person signatures quickly and efficiently. Ideal for trade shows, events, or walk-in scenarios where all signers are physically present. ",
"learn-more": "Learn more"
}
@@ -153,7 +153,8 @@
"Duplicate": "Duplicada",
"daily-mail-quota": "Cuota diaria de correos electrónicos",
"Save as template": "Guardar como plantilla",
"Fix & resend": "Corregir y reenviar"
"Fix & resend": "Corregir y reenviar",
"Kiosk Mode": "Modo Kiosco"
},
"report-heading": {
"Sr.No": "Nº",
@@ -305,7 +306,7 @@
"send": "Enviar",
"quick-send-alert-1": "Todos los roles de este documento están actualmente vinculados a contactos. Para enviar rápidamente copias de esta plantilla a varios firmantes, por favor, asegúrate de que al menos un rol no esté vinculado a ningún contacto.",
"quick-send-alert-2": "Por favor, asegúrate de que hay al menos un widget de firma añadido para cada destinatario.",
"quick-send-alert-3": "Por favor, añade al menos un rol a esta plantilla para poder hacer un «envío rápido» de copias a varios firmantes.",
"quick-send-alert-3": "Veuillez ajouter au moins un rôle à ce template.",
"quick-send-alert-4": "El envío rápido ha alcanzado el límite.",
"copy-link": "Copiar enlace",
"copy": "Copiar",
@@ -965,5 +966,10 @@
"p1": "Administre la configuración de seguridad de su cuenta para mantener sus datos seguros. OpenSign admite métodos de autenticación avanzados para mejorar la protección de la cuenta.",
"2fa-auth-help": "Agregue una capa adicional de seguridad activando 2FA. Esto requiere ingresar un código de verificación desde una aplicación autenticadora después de su contraseña.",
"passkey-auth-help": "Use claves de acceso para iniciar sesión sin contraseña con verificación biométrica o basada en el dispositivo, proporcionando una seguridad sólida y comodidad."
}
},
"signer-already-present": "Firmante ya presente",
"kiosk-sign": "Firma en quiosco",
"dont-have-access-to-template": "El template ha sido eliminado o no tiene acceso. Por favor, contacte al remitente.",
"kiosk-info": "El Modo Kiosco le permite recopilar firmas en persona de forma rápida y eficiente. Ideal para ferias, eventos o situaciones con personas que firman en el lugar. ",
"learn-more": "Más información"
}
@@ -174,7 +174,8 @@
"Duplicate": "Double",
"daily-mail-quota": "Quota d'e-mails quotidien",
"Save as template": "Enregistrer comme modèle",
"Fix & resend": "Corriger et renvoyer"
"Fix & resend": "Corriger et renvoyer",
"Kiosk Mode": "Mode Kiosque"
},
"report-help": {
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
@@ -304,7 +305,7 @@
"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-3": "Veuillez ajouter au moins un rôle à ce template.",
"quick-send-alert-4": "L'envoi rapide a atteint la limite.",
"copy-link": "Copier le lien",
"copy": "Copier",
@@ -965,5 +966,10 @@
"p1": "Gérez les paramètres de sécurité de votre compte pour protéger vos données. OpenSign prend en charge des méthodes d'authentification avancées pour renforcer la protection de votre compte.",
"2fa-auth-help": "Ajoutez une couche de sécurité supplémentaire en activant 2FA. Cela vous demandera de saisir un code de vérification provenant dune application dauthentification après votre mot de passe.",
"passkey-auth-help": "Utilisez des passkeys pour une connexion sans mot de passe grâce à une vérification biométrique ou basée sur lappareil, offrant à la fois une sécurité renforcée et une grande commodité."
}
},
"signer-already-present": "Signataire déjà présent",
"kiosk-sign": "Signature sur kiosque",
"dont-have-access-to-template": "Le template a été supprimé ou vous n'y avez pas accès. Veuillez contacter l'expéditeur.",
"kiosk-info": "Le Mode Kiosque vous permet de recueillir des signatures en personne rapidement et efficacement. Idéal pour les salons, événements ou situations où tous les signataires sont physiquement présents. ",
"learn-more": "En savoir plus"
}
@@ -153,7 +153,8 @@
"Duplicate": "Duplica",
"daily-mail-quota": "Quota e-mail giornaliera",
"Save as template": "Salva come modello",
"Fix & resend": "Correggi e reinvia"
"Fix & resend": "Correggi e reinvia",
"Kiosk Mode": "Modalità Kiosk"
},
"report-heading": {
"Sr.No": "Nr.",
@@ -304,7 +305,7 @@
"send": "Invia",
"quick-send-alert-1": "Tutti i ruoli in questo documento sono attualmente collegati a contatti. Per inviare rapidamente copie di questo modello a più firmatari, assicurati che almeno un ruolo non sia collegato a nessun contatto.",
"quick-send-alert-2": "Assicurati che ci sia almeno un widget firma aggiunto per tutti i destinatari.",
"quick-send-alert-3": "Aggiungi almeno un ruolo a questo modello per 'invio rapido' a più firmatari.",
"quick-send-alert-3": "Si prega di aggiungere almeno un ruolo a questo template.",
"quick-send-alert-4": "Limite di invio rapido raggiunto.",
"copy-link": "Copia link",
"copy": "Copia",
@@ -965,5 +966,10 @@
"p1": "Gestisci le impostazioni di sicurezza del tuo account per proteggere i tuoi dati. OpenSign supporta metodi di autenticazione avanzati per migliorare la protezione dellaccount.",
"2fa-auth-help": "Aggiungi un ulteriore livello di sicurezza abilitando 2FA. Ti verrà richiesto di inserire un codice di verifica da un'app di autenticazione dopo la password.",
"passkey-auth-help": "Usa le passkey per accedere senza password con verifica biometrica o basata sul dispositivo, garantendo sicurezza elevata e praticità."
}
},
"signer-already-present": "Firmatario già presente",
"kiosk-sign": "Firma su chiosco",
"dont-have-access-to-template": "Il template è stato eliminato o non hai accesso. Si prega di contattare il mittente.",
"kiosk-info": "La Modalità Kiosk consente di raccogliere firme in presenza in modo rapido ed efficiente. Ideale per fiere, eventi o situazioni con firmatari fisicamente presenti. ",
"learn-more": "Scopri di più"
}
+6 -13
View File
@@ -28,8 +28,12 @@ function Header(props) {
const enabledBackBtn = props?.disabledBackBtn === true ? false : true;
//function for show decline alert
const handleDeclinePdfAlert = async () => {
const currentDecline = { currnt: "Sure", isDeclined: true };
props?.setIsDecline(currentDecline);
if (props?.handleDecline) {
props.handleDecline();
} else {
const currentDecline = { currnt: "Sure", isDeclined: true };
props?.setIsDecline(currentDecline);
}
};
const handleDetelePage = async () => {
props?.setIsUploadPdf && props?.setIsUploadPdf(true);
@@ -102,7 +106,6 @@ function Header(props) {
console.error("Error merging PDF:", error);
}
};
return (
<div className="flex py-[5px]">
{isMobile && props?.isShowHeader ? (
@@ -502,16 +505,6 @@ function Header(props) {
</div>
) : (
<div className="flex" data-tut="reactourFifth">
{(!props?.templateId && !props?.isSelfSign) ||
(!props.isGuestSignFlow && (
<button
onClick={() => window.history.go(-2)}
type="button"
className="op-btn op-btn-ghost op-btn-sm mr-[3px]"
>
{t("back")}
</button>
))}
{props?.currentSigner && (
<>
{props?.templateId && (
@@ -199,7 +199,7 @@ function Placeholder(props) {
}, [selectDate]);
//`handleWidgetIdandPopup` is used to set current widget id and open relative popup
const handleWidgetIdandPopup = () => {
const handleWidgetIdandPopup = async () => {
if (props.setSelectWidgetId) {
props.setSelectWidgetId(props.pos.key);
}
@@ -223,7 +223,7 @@ function Placeholder(props) {
props.handleUserDetails();
} else {
if (props?.isNeedSign) {
//funcion is used to height widgets on top if two widgets on overlap
//funcion is used to heightlight widgets on top if two widgets on overlap
const getCurrentSignerPos = props.xyPosition.find(
(x) => x.Id === props.uniqueId
);
@@ -367,6 +367,8 @@ function Placeholder(props) {
} else {
widgetClickHandler();
}
// }
// }
} else {
//The else condition is used to handle the case when the user clicks on a widget and open signature pad to draw sign
props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos);
@@ -176,7 +176,7 @@ function PlaceholderType(props) {
ref={ref}
>
{value}
<i className="fa-light fa-calendar ml-[5px]"></i>
<i className="fa-light fa-calendar ml-[5px]"></i>
</div>
));
ExampleCustomInput.displayName = "ExampleCustomInput";
@@ -188,7 +188,7 @@ function PlaceholderType(props) {
props.data?.signerObjId === props.signerObjId
) {
const isDefault = true;
const senderUser = localStorage.getItem(`Extand_Class`);
const senderUser = localStorage.getItem("Extand_Class");
const jsonSender = JSON.parse(senderUser);
onChangeInput(
jsonSender && jsonSender[0],
@@ -403,6 +403,7 @@ function RenderPdf(props) {
onGetAnnotationsError={(error) => {
console.log("annotation error", error);
}}
className="select-none touch-callout-none"
/>
</Document>
</div>
+94 -26
View File
@@ -71,8 +71,15 @@ function SignPad(props) {
} else if (tab === "typed") {
setIsTab("type");
} else if (tab === "default") {
setIsDefaultSign(true);
setIsTab("mysignature");
if (
(props?.isInitial && props?.myInitial) ||
(!props?.isInitial && props?.defaultSign)
) {
setIsDefaultSign(true);
setIsTab("mysignature");
} else {
setIsTab("draw");
}
} else {
setIsTab(true);
}
@@ -453,7 +460,15 @@ function SignPad(props) {
props?.convertToImg(fontSelect, typedSignature, data);
setPenColor(allColor[key]);
}}
className={`border-b-[2px] ${key === 0 && penColor === "blue" ? "border-blue-600" : key === 1 && penColor === "red" ? "border-red-500" : key === 2 && penColor === "black" ? "border-black" : "border-white"} text-[${data}] text-[16px] fa-light fa-pen-nib`}
className={`border-b-[2px] ${
key === 0 && penColor === "blue"
? "border-blue-600"
: key === 1 && penColor === "red"
? "border-red-500"
: key === 2 && penColor === "black"
? "border-black"
: "border-white"
} text-[${data}] text-[16px] fa-light fa-pen-nib`}
></i>
);
})}
@@ -630,32 +645,77 @@ function SignPad(props) {
<div className="p-[20px] h-full">
{isDefaultSign ? (
<>
<div className="flex justify-center">
<div
className={`${props?.isInitial ? "intialSignatureCanvas" : "signatureCanvas"} bg-white border-[1.3px] border-[#007bff] flex flex-col justify-center items-center mb-[6px] cursor-pointer`}
>
<img
alt="stamp img"
className="w-full h-full object-contain bg-white"
draggable="false"
src={
props?.isInitial
? props?.myInitial
: props?.defaultSign
}
/>
</div>
</div>
{props.setIsAutoSign && autoSignAll()}
<div className="flex justify-end">
<SaveBtn />
</div>
{!props?.isInitial &&
props?.defaultSign &&
isTabEnabled("default") && (
<>
<div className="flex justify-center">
<div
className={`${
props?.isInitial
? "intialSignatureCanvas"
: "signatureCanvas"
} bg-white border-[1.3px] border-[#007bff] flex flex-col justify-center items-center mb-[6px] cursor-pointer`}
>
<img
alt="stamp img"
className="w-full h-full object-contain bg-white"
draggable="false"
src={
props?.isInitial
? props?.myInitial
: props?.defaultSign
}
/>
</div>
</div>
{props.setIsAutoSign && autoSignAll()}
<div className="flex justify-end">
<SaveBtn />
</div>
</>
)}
{props?.isInitial &&
props?.myInitial &&
isTabEnabled("default") && (
<>
<div className="flex justify-center">
<div
className={`${
props?.isInitial
? "intialSignatureCanvas"
: "signatureCanvas"
} bg-white border-[1.3px] border-[#007bff] flex flex-col justify-center items-center mb-[6px] cursor-pointer`}
>
<img
alt="stamp img"
className="w-full h-full object-contain bg-white"
draggable="false"
src={
props?.isInitial
? props?.myInitial
: props?.defaultSign
}
/>
</div>
</div>
{props.setIsAutoSign && autoSignAll()}
<div className="flex justify-end">
<SaveBtn />
</div>
</>
)}
</>
) : props?.isImageSelect || props?.isStamp ? (
!props?.image ? (
<div className="flex justify-center">
<div
className={`${props?.isInitial ? "intialSignatureCanvas" : "signatureCanvas"} bg-white border-[1.3px] border-[#007bff] flex flex-col justify-center items-center mb-[6px] cursor-pointer`}
className={`${
props?.isInitial
? "intialSignatureCanvas"
: "signatureCanvas"
} bg-white border-[1.3px] border-[#007bff] flex flex-col justify-center items-center mb-[6px] cursor-pointer`}
onClick={() => props?.imageRef.current.click()}
>
<input
@@ -674,7 +734,11 @@ function SignPad(props) {
<>
<div className="flex justify-center">
<div
className={`${props?.isInitial ? "intialSignatureCanvas" : "signatureCanvas"} bg-white border-[1.3px] border-[#007bff] mb-[6px] overflow-hidden`}
className={`${
props?.isInitial
? "intialSignatureCanvas"
: "signatureCanvas"
} bg-white border-[1.3px] border-[#007bff] mb-[6px] overflow-hidden`}
>
<img
alt="print img"
@@ -762,7 +826,11 @@ function SignPad(props) {
ref={canvasRef}
penColor={penColor}
canvasProps={{
className: `${props?.isInitial ? "intialSignatureCanvas" : "signatureCanvas"} border-[1.3px] border-[#007bff]`
className: `${
props?.isInitial
? "intialSignatureCanvas"
: "signatureCanvas"
} border-[1.3px] border-[#007bff]`
}}
onEnd={() =>
handleSignatureChange(
+5 -9
View File
@@ -552,7 +552,11 @@ function PdfRequestFiles() {
documentData === "Error: Something went wrong!" ||
(documentData.result && documentData.result.error)
) {
setHandleError(t("something-went-wrong-mssg"));
if (documentData?.result?.error?.includes("deleted")) {
setHandleError(t("document-deleted"));
} else {
setHandleError(t("something-went-wrong-mssg"));
}
setIsLoading({ isLoad: false });
console.log("err in getDocument cloud function ");
} else {
@@ -1867,14 +1871,6 @@ function PdfRequestFiles() {
closeWithMask={false}
/>
{isUiLoading && (
<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">
{t("loading-mssg")}
</span>
</div>
)}
{isUiLoading && (
<div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80">
<Loader />
@@ -1578,6 +1578,7 @@ const TemplatePlaceholder = () => {
style: { fontSize: "13px" }
}
];
const textFieldTour = [
{
selector: '[data-tut="IsSigned"]',
@@ -416,7 +416,7 @@ const ReportTable = (props) => {
setIsModal({ [`saveastemplate_${item.objectId}`]: true });
} else if (act.action === "recreatedocument") {
setIsModal({ [`recreatedocument_${item.objectId}`]: true });
} else if (act.action) {
} else if (act.action === "extendexpiry") {
setIsModal({ [`extendexpiry_${item.objectId}`]: true });
}
};
@@ -1724,7 +1724,7 @@ const ReportTable = (props) => {
{/* template report */}
{isOption[item.objectId] &&
act.action === "option" && (
<ul className="absolute -right-1 top-auto z-[70] w-max op-dropdown-content op-menu shadow-black/20 shadow bg-base-100 text-base-content rounded-box">
<ul className="absolute -right-1 top-auto z-[70] w-52 op-dropdown-content op-menu shadow-black/20 shadow bg-base-100 text-base-content rounded-box">
{act.subaction?.map((subact) => (
<li
key={subact.btnId}
@@ -1738,16 +1738,20 @@ const ReportTable = (props) => {
`btnLabel.${subact.btnLabel}`
)}
>
<span>
<i
className={`${subact.btnIcon} mr-1.5`}
></i>
{subact.btnLabel && (
<span className="text-[13px] capitalize font-medium">
{t(
<span className="flex items-center justify-between">
<span className="text-[13px] capitalize font-medium">
<i
className={`${subact.btnIcon} mr-2`}
></i>
{subact.btnLabel &&
t(
`btnLabel.${subact.btnLabel}`
)}
</span>
</span>
{subact.secIcon && (
<i
className={`${subact.secIcon} ml-1.5`}
></i>
)}
</span>
</li>
+3 -1
View File
@@ -3,7 +3,9 @@ import React from "react";
function HandleError({ handleError }) {
return (
<div className="flex justify-center items-center h-[100vh]">
<span className="text-[20px] text-[gray]">{handleError}</span>
<span className="p-[15px] md:p-0 text-[20px] text-[gray]">
{handleError}
</span>
</div>
);
}
@@ -1,6 +1,7 @@
import React, { useState } from "react";
import "../styles/signature.css";
import { useTranslation } from "react-i18next";
import Loader from "./Loader";
function CustomModal(props) {
const { t } = useTranslation();
@@ -32,6 +33,11 @@ function CustomModal(props) {
props.show && (
<dialog className="op-modal op-modal-open absolute z-[448]">
<div className="w-[95%] md:w-[60%] lg:w-[40%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm">
{props?.isLoader && (
<div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80">
<Loader />
</div>
)}
<h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]">
{props?.headMsg && props?.headMsg}
</h3>
+12 -4
View File
@@ -1,12 +1,20 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./src/**/*.{js,jsx,ts,tsx}",
],
content: ["./src/**/*.{js,jsx,ts,tsx}"],
theme: {
extend: {}
},
plugins: [require("daisyui")],
plugins: [
require("daisyui"),
function ({ addUtilities }) {
addUtilities({
// Prevent iOS long-press popup
".touch-callout-none": {
"-webkit-touch-callout": "none"
}
});
}
],
daisyui: {
// themes: true,
themes: [
@@ -20,6 +20,7 @@ export default async function GetTemplate(request) {
try {
let template = new Parse.Query('contracts_Template');
template.equalTo('objectId', templateId);
template.notEqualTo('IsArchive', true);
template.include('ExtUserPtr');
template.include('Signers');
template.include('CreatedBy');
@@ -47,6 +48,7 @@ export default async function GetTemplate(request) {
});
template = Parse.Query.or(sharedWithQuery, createdByQuery);
template.equalTo('objectId', templateId);
template.notEqualTo('IsArchive', true);
template.include('ExtUserPtr');
template.include('Signers');
template.include('CreatedBy');
@@ -62,21 +64,21 @@ export default async function GetTemplate(request) {
delete templateRes?.ExtUserPtr?.TenantId?.PfxFile;
return templateRes;
} else {
return { error: "You don't have access of this template!" };
return { error: "template deleted or you don't have access." };
}
} catch (err) {
console.log('err', err);
return err;
}
} else {
return { error: "You don't have access of this template!" };
return { error: "template deleted or you don't have access." };
}
} catch (err) {
console.log('err', err);
if (err?.response?.data?.code === 209 || err.code == 209) {
return { error: 'Invalid session token' };
} else {
return { error: "You don't have access of this template!" };
return { error: "template deleted or you don't have access." };
}
}
}
@@ -7,6 +7,9 @@ export default async function declinedocument(request) {
objectId: request.params?.userId,
};
if (!docId) {
throw new Parse.Error(Parse.Error.SCRIPT_FAILED, 'missing parameter docId.');
}
try {
const docCls = new Parse.Query('contracts_Document');
docCls.include('ExtUserPtr.TenantId');
@@ -3,17 +3,17 @@
* @param {Parse} Parse
*/
exports.up = async Parse => {
const userschema = new Parse.Schema('_User');
userschema.addString('name');
return userschema.update(null, { useMasterKey: true });
};
/**
*
* @param {Parse} Parse
*/
exports.down = async Parse => {
const userschema = new Parse.Schema('_User');
userschema.deleteField('name');
return userschema.update(null, { useMasterKey: true });
};
const userschema = new Parse.Schema('_User');
userschema.addString('name');
return userschema.update(null, { useMasterKey: true });
};
/**
*
* @param {Parse} Parse
*/
exports.down = async Parse => {
const userschema = new Parse.Schema('_User');
userschema.deleteField('name');
return userschema.update(null, { useMasterKey: true });
};
+1512 -1046
View File
File diff suppressed because it is too large Load Diff
+11 -11
View File
@@ -18,8 +18,8 @@
"watch": "nodemon index.js"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.787.0",
"@aws-sdk/s3-request-presigner": "^3.787.0",
"@aws-sdk/client-s3": "^3.800.0",
"@aws-sdk/s3-request-presigner": "^3.800.0",
"@parse/fs-files-adapter": "^3.0.0",
"@parse/s3-files-adapter": "^4.1.0",
"@pdf-lib/fontkit": "^1.1.1",
@@ -27,11 +27,11 @@
"@signpdf/signer-p12": "^3.2.4",
"@signpdf/signpdf": "^3.2.5",
"aws-sdk": "^2.1692.0",
"axios": "^1.8.4",
"axios": "^1.9.0",
"cors": "^2.8.5",
"date-fns-tz": "^3.2.0",
"dotenv": "^16.5.0",
"express": "^4.21.2",
"express": "^5.1.0",
"form-data": "^4.0.2",
"generate-api-key": "^1.0.2",
"googleapis": "^148.0.0",
@@ -41,23 +41,23 @@
"multer-s3": "^3.0.1",
"node-forge": "^1.3.1",
"nodemailer": "^6.10.1",
"parse": "^5.3.0",
"parse": "^6.1.1",
"parse-dbtool": "^1.2.0",
"parse-server": "^7.4.0",
"parse-server": "^8.2.0",
"parse-server-api-mail-adapter": "^4.1.0",
"pdf-lib": "^1.17.1",
"posthog-node": "^4.13.0",
"posthog-node": "^4.16.0",
"qrcode": "^1.5.4",
"speakeasy": "^2.0.0",
"ws": "^8.18.1"
},
"type": "module",
"devDependencies": {
"@babel/eslint-parser": "^7.27.0",
"@babel/eslint-parser": "^7.27.1",
"eslint": "^9.25.1",
"jasmine": "^5.6.0",
"mongodb-runner": "^5.8.2",
"nodemon": "^3.1.9",
"jasmine": "^5.7.1",
"mongodb-runner": "^5.8.3",
"nodemon": "^3.1.10",
"nyc": "^17.1.0",
"prettier": "^3.5.3"
},