diff --git a/.env.local_dev b/.env.local_dev
index cf19e847c..807d61ec0 100644
--- a/.env.local_dev
+++ b/.env.local_dev
@@ -44,10 +44,16 @@ DO_REGION=us-west
# local storage
USE_LOCAL=FALSE
-# Email mailgun config (The app will not initialize if any of these 3 variables are not set) *********************************************************************************************************************
-MAILGUN_API_KEY=XXXXX
+# Email using Mailgun or SMTP if set enable config (The app will not initialize if any of these variables are not set) *********************************************************************************************************************
+MAILGUN_API_KEY=
MAILGUN_DOMAIN=mail.yourdomain.com
MAILGUN_SENDER=postmaster@mail.yourdomain.com
+SMTP_ENABLE=
+SMTP_HOST=
+SMTP_PORT=
+SMTP_USER_EMAIL=
+SMTP_PASS=
+
# Base64 encoded PFX or p12 document signing certificate file *********************************************************************************************************************
PFX_BASE64='MIIKLwIBAzCCCeUGCSqGSIb3DQEHAaCCCdYEggnSMIIJzjCCBEIGCSqGSIb3DQEH
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 1999e3518..21170d497 100755
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,5 +1,4 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
-npx eslint '**/*.{js,jsx}'
-npx pretty-quick --staged '**/*.{js,jsx}'
\ No newline at end of file
+npm run lint-staged-changes
diff --git a/.lintstagedrc.json b/.lintstagedrc.json
new file mode 100644
index 000000000..5478c3ce3
--- /dev/null
+++ b/.lintstagedrc.json
@@ -0,0 +1,3 @@
+{
+ "*.js": "prettier --write"
+}
diff --git a/README.md b/README.md
index fe1f2b8e6..7a4d986c7 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,7 @@
-
+
+
-The free and open source alternative to DocuSign
+[The free and open source alternative to DocuSign](https://www.opensignlabs.com)
[](http://isitmaintained.com/project/opensignlabs/opensign "Average time to resolve an issue")
[](#contributors)
@@ -23,7 +22,7 @@ The free and open source alternative to DocuSign
LinkedIn
-## An open-source document e-signing solution
+## The open-source document e-signing solution
---
diff --git a/apps/OpenSign/src/routes/PlanSubscriptions.js b/apps/OpenSign/src/routes/PlanSubscriptions.js
index 740277932..88d9d3ed2 100644
--- a/apps/OpenSign/src/routes/PlanSubscriptions.js
+++ b/apps/OpenSign/src/routes/PlanSubscriptions.js
@@ -28,7 +28,7 @@ const PlanSubscriptions = () => {
: "";
const phone =
userDetails && userDetails.phone ? "&mobile=" + userDetails.phone : "";
- const details = "?" + name + email + company + phone;
+ const details = "?shipping_country_code=US&" + name + email + company + phone;
useEffect(() => {
if (localStorage.getItem("accesstoken")) {
setIsLoader(false);
diff --git a/apps/OpenSignServer/cloud/parsefunction/SendMailv1.js b/apps/OpenSignServer/cloud/parsefunction/SendMailv1.js
index f7cb953ae..741ac4ec0 100644
--- a/apps/OpenSignServer/cloud/parsefunction/SendMailv1.js
+++ b/apps/OpenSignServer/cloud/parsefunction/SendMailv1.js
@@ -5,7 +5,7 @@ async function SendMailv1(request) {
const recipient = request.params.email;
const otp = request.params.otp;
const res = await Parse.Cloud.sendEmail({
- from: 'Test user' + ' <' + process.env.MAILGUN_SENDER + '>',
+ from: 'Test user' + ' <' + process.env.SMTP_ENABLE ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER + '>',
recipient: recipient,
subject: 'Your OpenSign™ OTP',
text: 'This email is a test.',
diff --git a/apps/OpenSignServer/cloud/parsefunction/sendMail.js b/apps/OpenSignServer/cloud/parsefunction/sendMail.js
index 702a3c93a..3465332c1 100644
--- a/apps/OpenSignServer/cloud/parsefunction/sendMail.js
+++ b/apps/OpenSignServer/cloud/parsefunction/sendMail.js
@@ -1,14 +1,29 @@
import fs from 'node:fs';
+import https from 'https';
import formData from 'form-data';
import Mailgun from 'mailgun.js';
-import https from 'https';
+import { createTransport } from 'nodemailer';
-const mailgun = new Mailgun(formData);
-const mailgunClient = mailgun.client({
- username: 'api',
- key: process.env.MAILGUN_API_KEY,
-});
-const mailgunDomain = process.env.MAILGUN_DOMAIN;
+let transporterSMTP;
+let mailgunClient;
+
+if (process.env.SMTP_ENABLE) {
+ transporterSMTP = createTransport({
+ host: process.env.SMTP_HOST,
+ port: process.env.SMTP_PORT || 465,
+ secure: process.env.SMTP_SECURE || true,
+ auth: {
+ user: process.env.SMTP_USER_EMAIL,
+ pass: process.env.SMTP_PASS,
+ },
+ });
+} else {
+ const mailgun = new Mailgun(formData);
+ mailgunClient = mailgun.client({
+ username: 'api',
+ key: process.env.MAILGUN_API_KEY,
+ });
+}
async function sendmail(req) {
try {
@@ -38,7 +53,8 @@ async function sendmail(req) {
const pdfName = req.params.pdfName && `${req.params.pdfName}.pdf`;
const file = {
filename: pdfName || 'exported.pdf',
- data: PdfBuffer, //fs.readFileSync('./exports/exported_file_1223.pdf'),
+ content: process.env.SMTP_ENABLE ? PdfBuffer : undefined, //fs.readFileSync('./exports/exported_file_1223.pdf'),
+ data: process.env.SMTP_ENABLE ? undefined : PdfBuffer,
};
// const html = "
Hello!
This is a html checking mail
Verify email
"
@@ -46,14 +62,60 @@ async function sendmail(req) {
const from = req.params.from || '';
const messageParams = {
- from: from + ' <' + process.env.MAILGUN_SENDER + '>',
+ from:
+ from + ' <' + process.env.SMTP_ENABLE
+ ? process.env.SMTP_USER_EMAIL
+ : process.env.MAILGUN_SENDER + '>',
to: req.params.recipient,
subject: req.params.subject,
text: req.params.text || 'mail',
html: req.params.html || '',
- attachment: file,
+ attachments: process.env.SMTP_ENABLE ? [file] : undefined,
+ attachment: process.env.SMTP_ENABLE ? undefined : file,
};
+ if (transporterSMTP) {
+ const res = await transporterSMTP.sendMail(messageParams);
+
+ console.log('Res ', res);
+ if (!res.err) {
+ return {
+ status: 'success',
+ };
+ }
+ } else {
+ const res = await mailgunClient.messages.create(mailgunDomain, messageParams);
+ console.log('Res ', res);
+ if (res.status === 200) {
+ return {
+ status: 'success',
+ };
+ }
+ }
+ }
+ } else {
+ const from = req.params.from || '';
+ const messageParams = {
+ from:
+ from + ' <' + process.env.SMTP_ENABLE
+ ? process.env.SMTP_USER_EMAIL
+ : process.env.MAILGUN_SENDER + '>',
+ to: req.params.recipient,
+ subject: req.params.subject,
+ text: req.params.text || 'mail',
+ html: req.params.html || '',
+ };
+
+ if (transporterSMTP) {
+ const res = await transporterSMTP.sendMail(messageParams);
+
+ console.log('Res ', res);
+ if (!res.err) {
+ return {
+ status: 'success',
+ };
+ }
+ } else {
const res = await mailgunClient.messages.create(mailgunDomain, messageParams);
console.log('Res ', res);
if (res.status === 200) {
@@ -62,23 +124,6 @@ async function sendmail(req) {
};
}
}
- } else {
- const from = req.params.from || '';
- const messageParams = {
- from: from + ' <' + process.env.MAILGUN_SENDER + '>',
- to: req.params.recipient,
- subject: req.params.subject,
- text: req.params.text || 'mail',
- html: req.params.html || '',
- };
-
- const res = await mailgunClient.messages.create(mailgunDomain, messageParams);
- console.log('Res ', res);
- if (res.status === 200) {
- return {
- status: 'success',
- };
- }
}
} catch (err) {
console.log('err ', err);
diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js
index 814d9cf58..13814d3cc 100644
--- a/apps/OpenSignServer/index.js
+++ b/apps/OpenSignServer/index.js
@@ -17,10 +17,11 @@ import S3Adapter from 'parse-server-s3-adapter';
import FSFilesAdapter from 'parse-server-fs-adapter';
import AWS from 'aws-sdk';
import { app as customRoute } from './cloud/customRoute/customApp.js';
+import { createTransport } from 'nodemailer';
const spacesEndpoint = new AWS.Endpoint(process.env.DO_ENDPOINT);
// console.log("configuration ", configuration);
-if (process.env.USE_LOCAL !== "TRUE") {
+if (process.env.USE_LOCAL !== 'TRUE') {
const s3Options = {
bucket: process.env.DO_SPACE, // globalConfig.S3FilesAdapter.bucket,
baseUrl: process.env.DO_BASEURL,
@@ -36,18 +37,31 @@ if (process.env.USE_LOCAL !== "TRUE") {
var fsAdapter = new S3Adapter(s3Options);
} else {
var fsAdapter = new FSFilesAdapter({
- "filesSubDirectory": "files" // optional, defaults to ./files
+ filesSubDirectory: 'files', // optional, defaults to ./files
});
}
+let transporterMail;
let mailgunClient;
let mailgunDomain;
-if (process.env.MAILGUN_API_KEY) {
+
+if (process.env.SMTP_ENABLE) {
+ transporterMail = createTransport({
+ host: process.env.SMTP_HOST,
+ port: process.env.SMTP_PORT || 465,
+ secure: process.env.SMTP_SECURE || true,
+ auth: {
+ user: process.env.SMTP_USER_EMAIL,
+ pass: process.env.SMTP_PASS,
+ },
+ });
+} else if (process.env.MAILGUN_API_KEY) {
const mailgun = new Mailgun(formData);
mailgunClient = mailgun.client({
username: 'api',
key: process.env.MAILGUN_API_KEY,
});
+
mailgunDomain = process.env.MAILGUN_DOMAIN;
}
@@ -64,36 +78,39 @@ export const config = {
// Your apps name. This will appear in the subject and body of the emails that are sent.
appName: 'Open Sign',
allowClientClassCreation: false,
- emailAdapter: process.env.MAILGUN_API_KEY
- ? {
- module: 'parse-server-api-mail-adapter',
- options: {
- // The email address from which emails are sent.
- sender: process.env.MAILGUN_SENDER,
- // The email templates.
- templates: {
- // The template used by Parse Server to send an email for password
- // reset; this is a reserved template name.
- passwordResetEmail: {
- subjectPath: './files/password_reset_email_subject.txt',
- textPath: './files/password_reset_email.txt',
- htmlPath: './files/password_reset_email.html',
+ emailAdapter:
+ process.env.SMTP_ENABLE || process.env.MAILGUN_API_KEY
+ ? {
+ module: 'parse-server-api-mail-adapter',
+ options: {
+ // The email address from which emails are sent.
+ sender: process.env.SMTP_ENABLE ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER,
+ // The email templates.
+ templates: {
+ // The template used by Parse Server to send an email for password
+ // reset; this is a reserved template name.
+ passwordResetEmail: {
+ subjectPath: './files/password_reset_email_subject.txt',
+ textPath: './files/password_reset_email.txt',
+ htmlPath: './files/password_reset_email.html',
+ },
+ // The template used by Parse Server to send an email for email
+ // address verification; this is a reserved template name.
+ verificationEmail: {
+ subjectPath: './files/verification_email_subject.txt',
+ textPath: './files/verification_email.txt',
+ htmlPath: './files/verification_email.html',
+ },
},
- // The template used by Parse Server to send an email for email
- // address verification; this is a reserved template name.
- verificationEmail: {
- subjectPath: './files/verification_email_subject.txt',
- textPath: './files/verification_email.txt',
- htmlPath: './files/verification_email.html',
+ apiCallback: async ({ payload, locale }) => {
+ if (mailgunClient) {
+ const mailgunPayload = ApiPayloadConverter.mailgun(payload);
+ await mailgunClient.messages.create(mailgunDomain, mailgunPayload);
+ } else if (transporterMail) await transporterMail.sendMail(payload);
},
},
- apiCallback: async ({ payload, locale }) => {
- const mailgunPayload = ApiPayloadConverter.mailgun(payload);
- await mailgunClient.messages.create(mailgunDomain, mailgunPayload);
- },
- },
- }
- : null,
+ }
+ : null,
filesAdapter: fsAdapter,
auth: {
google: {
diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json
index aadbb80b1..f7626012e 100644
--- a/apps/OpenSignServer/package-lock.json
+++ b/apps/OpenSignServer/package-lock.json
@@ -18,12 +18,13 @@
"express-sse": "^0.5.3",
"form-data": "^4.0.0",
"jsonschema": "^1.4.1",
- "mailgun.js": "^9.0.1",
+ "mailgun.js": "^9.3.0",
"mongoose": "^7.2.1",
"multer": "^1.4.5-lts.1",
"multer-s3": "^2.10.0",
"node-forge": "^1.3.1",
"node-signpdf": "^1.5.1",
+ "nodemailer": "^6.9.7",
"openai": "^4.8.0",
"parse": "4.1.0",
"parse-server": "6.3.1",
@@ -6017,9 +6018,9 @@
}
},
"node_modules/mailgun.js": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/mailgun.js/-/mailgun.js-9.0.1.tgz",
- "integrity": "sha512-bVZ1zGh5UfQcChqIwIAil99hzoTeB3aHqAUbqmIBLMLcKfx+FF2qvhbc00WtwrFhe5dBQqQw6zPj0QBlqV4nXg==",
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/mailgun.js/-/mailgun.js-9.3.0.tgz",
+ "integrity": "sha512-iRqCglCdi+Q5anFpeRKHiytT/i34E14p/WtTE57VSeq5bATK+zQ8UnpFgPRaqGGTJqyGjqcO9m5YDRRB4/qirw==",
"dependencies": {
"axios": "^1.3.3",
"base-64": "^1.0.0",
@@ -6800,6 +6801,14 @@
"node-forge": "^1.2.1"
}
},
+ "node_modules/nodemailer": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz",
+ "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/nodemon": {
"version": "2.0.22",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json
index 50292ad43..5049e7188 100644
--- a/apps/OpenSignServer/package.json
+++ b/apps/OpenSignServer/package.json
@@ -27,18 +27,19 @@
"express-sse": "^0.5.3",
"form-data": "^4.0.0",
"jsonschema": "^1.4.1",
- "mailgun.js": "^9.0.1",
+ "mailgun.js": "^9.3.0",
"mongoose": "^7.2.1",
"multer": "^1.4.5-lts.1",
"multer-s3": "^2.10.0",
"node-forge": "^1.3.1",
"node-signpdf": "^1.5.1",
+ "nodemailer": "^6.9.7",
"openai": "^4.8.0",
"parse": "4.1.0",
"parse-server": "6.3.1",
"parse-server-api-mail-adapter": "^3.0.0",
- "parse-server-s3-adapter": "^1.2.0",
"parse-server-fs-adapter": "1.0.1",
+ "parse-server-s3-adapter": "^1.2.0",
"pdf-lib": "^1.16.0",
"pdfkit": "^0.13.0",
"razorpay": "^2.8.6",
diff --git a/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js b/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js
index 5df07d5f5..37eee4fc3 100644
--- a/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js
+++ b/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js
@@ -1,7 +1,15 @@
import React, { useEffect, useState } from "react";
import "./certificate.css";
+import opensignLogo from "../../assests/open-sign-logo.png";
-import { Page, Text, View, Document, StyleSheet } from "@react-pdf/renderer";
+import {
+ Page,
+ Text,
+ View,
+ Document,
+ StyleSheet,
+ Image
+} from "@react-pdf/renderer";
function Certificate({ pdfData }) {
const [isMultiSigners, setIsMultiSigners] = useState();
@@ -49,70 +57,34 @@ function Certificate({ pdfData }) {
fontSize: "11px",
marginBottom: "10px",
color: "gray"
+ },
+ image: {
+ width: "71px",
+ height: "17px"
}
});
const generatedDate = () => {
const newDate = new Date();
- const localExpireDate = newDate.toLocaleDateString("en-US", {
- day: "numeric",
- month: "long",
- year: "numeric"
- });
-
- var currentOffset = newDate.getTimezoneOffset();
-
- var ISTOffset = 330; // IST offset UTC +5:30
-
- var ISTTime = new Date(
- newDate.getTime() + (ISTOffset + currentOffset) * 60000
- );
-
- // ISTTime now represents the time in IST coordinates
-
- var hoursIST = ISTTime.getHours();
- var minutesIST = ISTTime.getMinutes();
+ const utcTime = newDate.toUTCString();
return (
- Generated On {localExpireDate} {hoursIST}:{minutesIST} IST
+ Generated On {utcTime}
);
};
const changeCompletedDate = () => {
const completedOn = pdfData[0].updatedAt;
const newDate = new Date(completedOn);
- const localExpireDate = newDate.toLocaleDateString("en-US", {
- day: "numeric",
- month: "long",
- year: "numeric"
- });
+ const utcTime = newDate.toUTCString();
- var currentOffset = newDate.getTimezoneOffset();
-
- var ISTOffset = 330; // IST offset UTC +5:30
-
- var ISTTime = new Date(
- newDate.getTime() + (ISTOffset + currentOffset) * 60000
- );
-
- // ISTTime now represents the time in IST coordinates
-
- var hoursIST = ISTTime.getHours();
- var minutesIST = ISTTime.getMinutes();
-
- return (
-
- {localExpireDate} {hoursIST}:{minutesIST} IST
-
- );
+ return
{utcTime} ;
};
const signerName = (data) => {
@@ -143,7 +115,19 @@ function Certificate({ pdfData }) {
{/** Page defines a single page of content. */}
- {generatedDate()}
+
+
+ {generatedDate()}
+
+
Organization :
- __
+
+ {pdfData[0].ExtUserPtr.Company}
+
Completed on : {changeCompletedDate()}
diff --git a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js
index 6d2d33061..d741162d5 100644
--- a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js
+++ b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js
@@ -192,7 +192,6 @@ function PdfRequestFiles() {
//check document is signed or not
if (checkDocIdExist && checkDocIdExist.length > 0) {
- setAlreadySign(true);
setIsDocId(true);
const signerRes = res[0].Signers;
//comparison auditTrail user details with signers user details
diff --git a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js
index d4cb37df9..6591667bc 100644
--- a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js
+++ b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js
@@ -627,8 +627,8 @@ function SignYourSelf() {
const bottomY = xyPosData.isDrag
? xyPosData.yBottom * scale - height
: xyPosData.firstYPos
- ? xyPosData.yBottom * scale - height + xyPosData.firstYPos
- : xyPosData.yBottom * scale - height;
+ ? xyPosData.yBottom * scale - height + xyPosData.firstYPos
+ : xyPosData.yBottom * scale - height;
singleSign = {
pdfFile: pdfBase64Url,
@@ -664,15 +664,7 @@ function SignYourSelf() {
// console.log("json ", json);
setPdfUrl(json.result.data);
if (json.result.data) {
- const docStatus = {
- isCompleted: true
- };
-
- setDocumentStatus(docStatus);
- const loadObj = {
- isLoad: false
- };
- setIsLoading(loadObj);
+ getDocumentDetails();
}
})
.catch((err) => {
diff --git a/microfrontends/SignDocuments/src/Component/component/header.js b/microfrontends/SignDocuments/src/Component/component/header.js
index c68ad4ada..d7f4724ed 100644
--- a/microfrontends/SignDocuments/src/Component/component/header.js
+++ b/microfrontends/SignDocuments/src/Component/component/header.js
@@ -27,13 +27,13 @@ function Header({
signersdata,
isMailSend,
alertSendEmail,
- isSigned,
isCompleted,
isShowHeader,
decline,
currentSigner,
dataTut4,
- alreadySign
+ alreadySign,
+ isSignYourself
}) {
const isMobile = window.innerWidth < 767;
const navigate = useNavigate();
@@ -61,12 +61,19 @@ function Header({
const pdf = await getBase64FromUrl(pdfUrl);
const isAndroidDevice = navigator.userAgent.match(/Android/i);
- const isAppleDevice = (/iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) && !window.MSStream
+ const isAppleDevice =
+ (/iPad|iPhone|iPod/.test(navigator.platform) ||
+ (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1)) &&
+ !window.MSStream;
if (isAndroidDevice || isAppleDevice) {
- const byteArray = Uint8Array.from(atob(pdf).split('').map(char => char.charCodeAt(0)));
- const blob = new Blob([byteArray], { type: 'application/pdf' });
+ const byteArray = Uint8Array.from(
+ atob(pdf)
+ .split("")
+ .map((char) => char.charCodeAt(0))
+ );
+ const blob = new Blob([byteArray], { type: "application/pdf" });
const blobUrl = URL.createObjectURL(blob);
- window.open(blobUrl, '_blank');
+ window.open(blobUrl, "_blank");
} else {
printModule({ printable: pdf, type: "pdf", base64: true });
}
@@ -75,19 +82,148 @@ function Header({
//handle download signed pdf
const handleDownloadPdf = () => {
const pdfName = pdfDetails[0] && pdfDetails[0].Name;
-
saveAs(pdfUrl, `${sanitizeFileName(pdfName)}_signed_by_OpenSign™.pdf`);
};
const sanitizeFileName = (pdfName) => {
// Replace spaces with underscore
- return pdfName.replace(/ /g, '_');
- }
-
+ return pdfName.replace(/ /g, "_");
+ };
+ //certificate generate and download component in mobile view
+ const CertificateDropDown = () => {
+ //after generate download certifcate pdf
+ const handleDownload = (pdfBlob, fileName) => {
+ if (pdfBlob) {
+ const url = window.URL.createObjectURL(pdfBlob);
+ // Create a temporary anchor element
+ const link = document.createElement("a");
+ link.href = url;
+ link.download = fileName;
+ // Append the anchor to the body
+ document.body.appendChild(link);
+ // Programmatically click the anchor to trigger the download
+ link.click();
+ // Remove the anchor from the body
+ document.body.removeChild(link);
+ // Release the object URL to free up resources
+ window.URL.revokeObjectURL(url);
+ }
+ };
+ return (
+ e.preventDefault()}
+ style={{ textDecoration: "none", zIndex: "35" }}
+ document={ }
+ >
+ {({ blob, url, loading, error }) => (
+ <>
+ {loading ? (
+
+
+ Certificate
+
+ ) : (
+
+ handleDownload(
+ blob,
+ `completion certificate-${
+ pdfDetails[0] && pdfDetails[0].Name
+ }.pdf`
+ )
+ }
+ >
+
+ Certificate
+
+ )}
+ >
+ )}
+
+ );
+ };
+ const CertificateComponent = () => {
+ return (
+ }
+ fileName={`completion certificate-${
+ pdfDetails[0] && pdfDetails[0].Name
+ }.pdf`}
+ >
+ {({ blob, url, loading, error }) =>
+ loading ? (
+
+
+ Certificate
+
+ ) : (
+
+
+ Certificate
+
+ )
+ }
+
+ );
+ };
return (
{isMobile && isShowHeader ? (
@@ -95,7 +231,9 @@ function Header({
id="navbar"
className={isGuestSigner ? "stickySignerHead" : "stickyHead"}
style={{
- width: isGuestSigner ? window.innerWidth : window.innerWidth - 30 + "px"
+ width: isGuestSigner
+ ? window.innerWidth
+ : window.innerWidth - 30 + "px"
}}
>
@@ -140,16 +278,16 @@ function Header({
style={{ color: "gray", cursor: "pointer" }}
>
- {pdfUrl ? (
+ {pdfUrl && alreadySign ? (
handleDownloadPdf()}
style={{
color: themeColor(),
border: "none",
fontWeight: "650",
- fontSize: "16px"
+ fontSize: "16px",
+ padding: "0px 3px 0px 5px"
}}
>
@@ -179,51 +317,48 @@ function Header({
Download
-
- }
- fileName={`completion certificate-${
- pdfDetails[0] && pdfDetails[0].Name
- }.pdf`}
+ {recipient && pdfDetails[0] && pdfDetails.length > 0 ? (
+
+
+
+ ) : isPdfRequestFiles &&
+ alreadySign &&
+ isCompleted.isCertificate ? (
+
+
+
+ ) : (
+ isSignYourself && (
+
+
+
+ )
+ )}
+
+
- {({ blob, url, loading, error }) => (
- <>
- {console.log("error", error)}
- {loading ? (
- "Loading document..."
- ) : (
-
-
- Certificate
-
- )}
- >
- )}
-
+ {" "}
+
+ Print
+
) : (
- {/* current signer is checking user send request and check status of pdf sign than if current
+ {/* current signer is checking user send request and check status of pdf sign than if current
user exist than show finish button else no
*/}
{currentSigner && (
@@ -267,6 +402,8 @@ function Header({
onClick={() => {
if (!pdfUrl) {
embedImages();
+ } else if (isPdfRequestFiles) {
+ embedImages();
}
}}
style={{
@@ -297,40 +434,7 @@ function Header({
pdfUrl || isAlreadySign.mssg ? (
{pdfDetails[0] && pdfDetails.length > 0 && (
-
}
- fileName={`completion certificate-${
- pdfDetails[0] && pdfDetails[0].Name
- }.pdf`}
- >
- {({ blob, url, loading, error }) =>
- loading ? (
- "Loading document..."
- ) : (
-
-
- Certificate
-
- )
- }
-
+
)}
- {isCompleted.isCertificate && (
- }
- fileName={`completion certificate-${
- pdfDetails[0] && pdfDetails[0].Name
- }.pdf`}
- >
- {({ blob, url, loading, error }) =>
- loading ? (
- "Loading document..."
- ) : (
-
-
- Certificate
-
- )
- }
-
- )}
+ {isCompleted.isCertificate && }
- }
- fileName={`completion certificate-${
- pdfDetails[0] && pdfDetails[0].Name
- }.pdf`}
- >
- {({ blob, url, loading, error }) =>
- loading ? (
- "Loading document..."
- ) : (
-
-
- Certificate
-
- )
- }
-
+
{
let width;
@@ -74,8 +75,7 @@ function RenderPdf({
return width;
}
};
- //check isGuestSigner is present in local if yes than handle login flow header in mobile view
- const isGuestSigner = localStorage.getItem("isGuestSigner");
+
//function for render placeholder block over pdf document
const checkSignedSignes = (data) => {
@@ -777,7 +777,13 @@ function RenderPdf({
}}
onLoadSuccess={pageDetails}
ref={pdfRef}
- file={pdfUrl ? pdfUrl : pdfDetails[0] && pdfDetails[0].URL}
+ file={
+ pdfUrl
+ ? pdfUrl
+ : pdfDetails[0] && pdfDetails[0].SignedUrl
+ ? pdfDetails[0].SignedUrl
+ : pdfDetails[0].URL
+ }
>
{Array.from(new Array(numPages), (el, index) => (
{Array.from(new Array(numPages), (el, index) => (
=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+ "dev": true,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
+ "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+ "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true
+ },
+ "node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
+ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+ "dev": true,
+ "bin": {
+ "husky": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lint-staged": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz",
+ "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "5.3.0",
+ "commander": "11.1.0",
+ "debug": "4.3.4",
+ "execa": "8.0.1",
+ "lilconfig": "2.1.0",
+ "listr2": "7.0.2",
+ "micromatch": "4.0.5",
+ "pidtree": "0.6.0",
+ "string-argv": "0.3.2",
+ "yaml": "2.3.4"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz",
+ "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^3.1.0",
+ "colorette": "^2.0.20",
+ "eventemitter3": "^5.0.1",
+ "log-update": "^5.0.1",
+ "rfdc": "^1.3.0",
+ "wrap-ansi": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz",
+ "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^5.0.0",
+ "cli-cursor": "^4.0.0",
+ "slice-ansi": "^5.0.0",
+ "strip-ansi": "^7.0.1",
+ "wrap-ansi": "^8.0.1"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+ "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true,
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz",
+ "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
+ "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
+ "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..febdc4fb2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "opensign",
+ "version": "1.0.6",
+ "description": "Free and open source alternative to DocuSign",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "prepare": "husky install",
+ "lint-staged-changes": "lint-staged"
+ },
+ "repository": {
+ "type": "git",
+ "url": "github.com/opensignlabs/opensign"
+ },
+ "keywords": [
+ "digital",
+ "signature",
+ "e-signature",
+ "docusign",
+ "electronic",
+ "signature"
+ ],
+ "author": "OpenSignLabs",
+ "license": "AGPL-3.0",
+ "devDependencies": {
+ "husky": "^8.0.0",
+ "lint-staged": "^15.1.0",
+ "prettier": "3.1.0"
+ }
+}