mirror of
https://github.com/OpenSignLabs/OpenSign.git
synced 2026-09-05 09:17:39 +02:00
Compare commits
50
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e71924a264 | ||
|
|
4ae9748004 | ||
|
|
eda6113792 | ||
|
|
4f1509c836 | ||
|
|
dfcf32ef3e | ||
|
|
4a95257ee2 | ||
|
|
ee1e13ef61 | ||
|
|
c9c099ffc5 | ||
|
|
a80f4fb3c9 | ||
|
|
941f3ac47f | ||
|
|
80d3200d57 | ||
|
|
55926e25d2 | ||
|
|
a31f3ebad7 | ||
|
|
dc9c32c6ee | ||
|
|
dac3aac2a1 | ||
|
|
40196e823c | ||
|
|
7708b7e938 | ||
|
|
8bbc5a9bc6 | ||
|
|
4dbdfb1b77 | ||
|
|
05c51edce3 | ||
|
|
379e8cd95e | ||
|
|
9fd00d4427 | ||
|
|
ca114cf124 | ||
|
|
75128784db | ||
|
|
722f0e277e | ||
|
|
7089998966 | ||
|
|
52211ddfa4 | ||
|
|
2b8b762d35 | ||
|
|
a9c08c8a9f | ||
|
|
9406c4f718 | ||
|
|
531ef4d0b2 | ||
|
|
4c6dbb6690 | ||
|
|
0beb60d1b5 | ||
|
|
893c9d7c42 | ||
|
|
c442689573 | ||
|
|
88919f2634 | ||
|
|
50557d8bc5 | ||
|
|
0f1ef0406e | ||
|
|
9852c87be7 | ||
|
|
1268f65516 | ||
|
|
6551b2537a | ||
|
|
b138ccf625 | ||
|
|
27ff7baa6d | ||
|
|
3fc41f4255 | ||
|
|
b20aa33a04 | ||
|
|
a64da4cd85 | ||
|
|
e80bcfc586 | ||
|
|
de5b8160a2 | ||
|
|
83df969751 | ||
|
|
f04fd16c9e |
Generated
+1241
-835
File diff suppressed because it is too large
Load Diff
+20
-19
@@ -4,14 +4,14 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@formkit/auto-animate": "^0.8.2",
|
"@formkit/auto-animate": "^0.8.2",
|
||||||
"@lottiefiles/dotlottie-react": "^0.8.9",
|
"@lottiefiles/dotlottie-react": "^0.9.0",
|
||||||
"@pdf-lib/fontkit": "^1.1.1",
|
"@pdf-lib/fontkit": "^1.1.1",
|
||||||
"@radix-ui/themes": "^3.1.3",
|
"@radix-ui/themes": "^3.1.3",
|
||||||
"@react-pdf/renderer": "^3.4.4",
|
"@react-pdf/renderer": "^4.0.0",
|
||||||
"@reduxjs/toolkit": "^2.2.7",
|
"@reduxjs/toolkit": "^2.2.7",
|
||||||
"axios": "^1.7.5",
|
"axios": "^1.7.7",
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
"i18next": "^23.14.0",
|
"i18next": "^23.15.1",
|
||||||
"i18next-browser-languagedetector": "^8.0.0",
|
"i18next-browser-languagedetector": "^8.0.0",
|
||||||
"i18next-http-backend": "^2.6.1",
|
"i18next-http-backend": "^2.6.1",
|
||||||
"jszip": "^3.10.1",
|
"jszip": "^3.10.1",
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
"react-bootstrap": "^2.10.4",
|
"react-bootstrap": "^2.10.4",
|
||||||
"react-confetti": "^6.1.0",
|
"react-confetti": "^6.1.0",
|
||||||
"react-cookie": "^7.2.0",
|
"react-cookie": "^7.2.0",
|
||||||
"react-datepicker": "^7.3.0",
|
"react-datepicker": "^7.4.0",
|
||||||
"react-dnd": "^16.0.1",
|
"react-dnd": "^16.0.1",
|
||||||
"react-dnd-html5-backend": "^16.0.1",
|
"react-dnd-html5-backend": "^16.0.1",
|
||||||
"react-dnd-multi-backend": "^8.0.3",
|
"react-dnd-multi-backend": "^8.0.3",
|
||||||
@@ -34,17 +34,18 @@
|
|||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-gtm-module": "^2.0.11",
|
"react-gtm-module": "^2.0.11",
|
||||||
"react-helmet": "^6.1.0",
|
"react-helmet": "^6.1.0",
|
||||||
"react-i18next": "^15.0.1",
|
"react-i18next": "^15.0.2",
|
||||||
"react-konva": "^18.2.10",
|
"react-konva": "^18.2.10",
|
||||||
"react-pdf": "^9.1.0",
|
"react-pdf": "^9.1.1",
|
||||||
"react-quill-new": "^3.3.0",
|
"react-quill-new": "^3.3.2",
|
||||||
"react-redux": "^9.1.2",
|
"react-redux": "^9.1.2",
|
||||||
"react-rnd": "^10.4.11",
|
"react-rnd": "^10.4.13",
|
||||||
"react-router-dom": "^6.26.1",
|
"react-router-dom": "^6.26.2",
|
||||||
"react-scripts": "5.0.1",
|
"react-scripts": "5.0.1",
|
||||||
"react-scrollbars-custom": "^4.1.1",
|
"react-scrollbars-custom": "^4.1.1",
|
||||||
"react-select": "^5.8.0",
|
"react-select": "^5.8.1",
|
||||||
"react-signature-canvas": "^1.0.6",
|
"react-signature-canvas": "^1.0.6",
|
||||||
|
"react-syntax-highlighter": "^15.5.0",
|
||||||
"react-tooltip": "^5.28.0",
|
"react-tooltip": "^5.28.0",
|
||||||
"react-web-share": "^2.0.2",
|
"react-web-share": "^2.0.2",
|
||||||
"reactour": "^1.19.4",
|
"reactour": "^1.19.4",
|
||||||
@@ -60,7 +61,7 @@
|
|||||||
"build-webpack": "webpack --config webpack.config.js",
|
"build-webpack": "webpack --config webpack.config.js",
|
||||||
"build": "npm run version && npm run build-webpack && react-scripts build",
|
"build": "npm run version && npm run build-webpack && react-scripts build",
|
||||||
"build-watch": "webpack --config webpack.config.js --watch",
|
"build-watch": "webpack --config webpack.config.js --watch",
|
||||||
"start-dev": "concurrently \"npm run build-watch\" \"react-scripts start\"",
|
"start-dev": "react-scripts start",
|
||||||
"start": "serve -s build",
|
"start": "serve -s build",
|
||||||
"version": "curl -s https://api.github.com/repos/opensignlabs/opensign/releases/latest | grep '\"tag_name\":' | awk -F '\"' '{print $4}' > ./public/version.txt",
|
"version": "curl -s https://api.github.com/repos/opensignlabs/opensign/releases/latest | grep '\"tag_name\":' | awk -F '\"' '{print $4}' > ./public/version.txt",
|
||||||
"version-win": "powershell -Command \"Invoke-RestMethod -Uri 'https://api.github.com/repos/opensignlabs/opensign/releases/latest' | Select-Object -ExpandProperty tag_name | Out-File -FilePath ./public/version.txt\"",
|
"version-win": "powershell -Command \"Invoke-RestMethod -Uri 'https://api.github.com/repos/opensignlabs/opensign/releases/latest' | Select-Object -ExpandProperty tag_name | Out-File -FilePath ./public/version.txt\"",
|
||||||
@@ -97,25 +98,25 @@
|
|||||||
"@babel/core": "^7.25.2",
|
"@babel/core": "^7.25.2",
|
||||||
"@babel/preset-env": "^7.25.4",
|
"@babel/preset-env": "^7.25.4",
|
||||||
"@babel/preset-react": "^7.24.7",
|
"@babel/preset-react": "^7.24.7",
|
||||||
"@babel/runtime-corejs2": "^7.25.4",
|
"@babel/runtime-corejs2": "^7.25.6",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"babel-loader": "^9.1.3",
|
"babel-loader": "^9.2.1",
|
||||||
"clean-webpack-plugin": "^4.0.0",
|
"clean-webpack-plugin": "^4.0.0",
|
||||||
"commitizen": "^4.3.0",
|
"commitizen": "^4.3.0",
|
||||||
"concurrently": "^8.2.2",
|
"concurrently": "^9.0.1",
|
||||||
"css-loader": "^7.1.2",
|
"css-loader": "^7.1.2",
|
||||||
"daisyui": "^4.12.10",
|
"daisyui": "^4.12.10",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"dotenv-webpack": "^8.1.0",
|
"dotenv-webpack": "^8.1.0",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^9.11.1",
|
||||||
"eslint-plugin-prettier": "^5.2.1",
|
"eslint-plugin-prettier": "^5.2.1",
|
||||||
"eslint-plugin-react": "^7.34.3",
|
"eslint-plugin-react": "^7.36.1",
|
||||||
"lint-staged": "^15.2.10",
|
"lint-staged": "^15.2.10",
|
||||||
"mini-css-extract-plugin": "^2.9.1",
|
"mini-css-extract-plugin": "^2.9.1",
|
||||||
"postcss": "^8.4.45",
|
"postcss": "^8.4.47",
|
||||||
"prettier": "^3.3.3",
|
"prettier": "^3.3.3",
|
||||||
"pretty-quick": "^4.0.0",
|
"pretty-quick": "^4.0.0",
|
||||||
"tailwindcss": "^3.4.10",
|
"tailwindcss": "^3.4.13",
|
||||||
"terser-webpack-plugin": "^5.3.10",
|
"terser-webpack-plugin": "^5.3.10",
|
||||||
"webpack-cli": "^5.1.4"
|
"webpack-cli": "^5.1.4"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -131,7 +131,8 @@
|
|||||||
"Share": "Share",
|
"Share": "Share",
|
||||||
"View": "View",
|
"View": "View",
|
||||||
"option": "Option",
|
"option": "Option",
|
||||||
"Embed": "Embed"
|
"Embed": "Embed",
|
||||||
|
"Copy TemplateId":"Copy TemplateId"
|
||||||
},
|
},
|
||||||
"report-heading": {
|
"report-heading": {
|
||||||
"Sr.No": "Sr.No",
|
"Sr.No": "Sr.No",
|
||||||
@@ -264,7 +265,8 @@
|
|||||||
"make-template-private-alert": "Are you sure you want to make this template private? This will remove it from your public profile.",
|
"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-role": "Public role",
|
||||||
"public-url": "Public URL",
|
"public-url": "Public URL",
|
||||||
"public-url-copy-mssg": " Here’s your public URL: Copy it or share it with the signer, and you will be able to see all your publicly set templates.",
|
"public-url-copy": "Here’s your public URL: ",
|
||||||
|
"public-url-copy-mssg":"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.",
|
"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-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",
|
"share-with": "Share with",
|
||||||
@@ -632,6 +634,19 @@
|
|||||||
"reason":"Reason",
|
"reason":"Reason",
|
||||||
"decline-by":"Declined/revoked by",
|
"decline-by":"Declined/revoked by",
|
||||||
"document-declined": "Document declined",
|
"document-declined": "Document declined",
|
||||||
|
"public-template-mssg-1":"To integrate OpenSign into your React or Next.js project, simply run the following command:",
|
||||||
|
"public-template-mssg-2" :"Ensure you have npm or yarn set up in your project. If you’re using Yarn, you can replace npm install with yarn add @opensign/react.",
|
||||||
|
"public-template-mssg-3" :"Need more details or examples?",
|
||||||
|
"public-template-mssg-4": "Visit the",
|
||||||
|
"public-template-mssg-5": " npm for the latest updates, detailed documentation, and version history.",
|
||||||
|
"public-template-mssg-6" :"You need to set this template as public before you can utilize this code snippet.",
|
||||||
|
"copy-code":"COPY",
|
||||||
|
"copied-code":"COPIED",
|
||||||
|
"Installation":"Installation",
|
||||||
|
"Usage" :"Usage",
|
||||||
|
"insufficient-credits":"Insufficient Signing Credits",
|
||||||
|
"insufficient-credits-mssg":"The owner of this document currently lacks the necessary OpenSign credits for you to sign. Please reach out to the owner if you require further details.",
|
||||||
|
"angular-npm-mssg-1": "To integrate OpenSign into your Angular project, simply run the following command:",
|
||||||
"quota-mail-info-head":"Monthly request signatures email limit",
|
"quota-mail-info-head":"Monthly request signatures email limit",
|
||||||
"quota-mail-info": "You can send upto 15 signature request emails every month. Upgrade now to send unlimited signing requests directly.",
|
"quota-mail-info": "You can send upto 15 signature request emails every month. Upgrade now to send unlimited signing requests directly.",
|
||||||
"quota-mail": "You've reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.",
|
"quota-mail": "You've reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.",
|
||||||
|
|||||||
@@ -151,7 +151,8 @@
|
|||||||
"Share": "Partager",
|
"Share": "Partager",
|
||||||
"View": "Voir",
|
"View": "Voir",
|
||||||
"option": "Option",
|
"option": "Option",
|
||||||
"Embed": "Intégrer"
|
"Embed": "Intégrer",
|
||||||
|
"Copy TemplateId": "Copier l'ID du modèle"
|
||||||
},
|
},
|
||||||
"report-help": {
|
"report-help": {
|
||||||
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
|
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
|
||||||
@@ -263,7 +264,8 @@
|
|||||||
"make-template-private-alert": "Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil 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-role": "Rôle public",
|
||||||
"public-url": "URL publique",
|
"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.",
|
"public-url-copy": "Voici votre URL publique : ",
|
||||||
|
"public-url-copy-mssg": "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.",
|
"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-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",
|
"share-with": "Partager avec",
|
||||||
@@ -631,6 +633,19 @@
|
|||||||
"reason" :"Raison",
|
"reason" :"Raison",
|
||||||
"decline-by" :"Refusé/révoqué par",
|
"decline-by" :"Refusé/révoqué par",
|
||||||
"document-declined":"document refusé",
|
"document-declined":"document refusé",
|
||||||
|
"public-template-mssg-1" :"Pour intégrer OpenSign dans votre projet React ou Next.js, exécutez simplement la commande suivante :",
|
||||||
|
"public-template-mssg-2" :"Assurez-vous que npm ou Yarn est configuré dans votre projet. Si vous utilisez Yarn, vous pouvez remplacer npm install par Yarn Add @opensign/react.",
|
||||||
|
"public-template-mssg-3" :"Besoin de plus de détails ou d'exemples ?",
|
||||||
|
"public-template-mssg-4": "Visitez le",
|
||||||
|
"public-template-mssg-5": "npm pour les dernières mises à jour, une documentation détaillée et l'historique des versions.",
|
||||||
|
"public-template-mssg-6":"Vous devez définir ce modèle comme public avant de pouvoir utiliser cet extrait de code.",
|
||||||
|
"copy-code":"COPIE",
|
||||||
|
"copied-code":"COPIÉ",
|
||||||
|
"Installation":"Installation",
|
||||||
|
"Usage" :"Usage",
|
||||||
|
"insufficient-credits":"Crédits de signature insuffisants",
|
||||||
|
"insufficient-credits-mssg" :"Le propriétaire de ce document ne dispose actuellement pas des crédits OpenSign nécessaires pour que vous puissiez le signer. Veuillez contacter le propriétaire si vous avez besoin de plus de détails.",
|
||||||
|
"angular-npm-mssg-1" :"Pour intégrer OpenSign dans votre projet Angular, exécutez simplement la commande suivante :",
|
||||||
"quota-mail-info-head":"Limite mensuelle d'e-mails de signatures de demandes",
|
"quota-mail-info-head":"Limite mensuelle d'e-mails de signatures de demandes",
|
||||||
"quota-mail-info": "Vous pouvez envoyer jusqu'à 15 e-mails de demande de signature chaque mois. Mettez à niveau maintenant pour envoyer directement des demandes de signature illimitées.",
|
"quota-mail-info": "Vous pouvez envoyer jusqu'à 15 e-mails de demande de signature chaque mois. Mettez à niveau maintenant pour envoyer directement des demandes de signature illimitées.",
|
||||||
"quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.",
|
"quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import * as HoverCard from "@radix-ui/react-hover-card";
|
|||||||
import ModalUi from "../../primitives/ModalUi";
|
import ModalUi from "../../primitives/ModalUi";
|
||||||
import FolderModal from "../shared/fields/FolderModal";
|
import FolderModal from "../shared/fields/FolderModal";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { handleDownloadPdf } from "../../constant/Utils";
|
||||||
|
|
||||||
function DriveBody(props) {
|
function DriveBody(props) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -100,16 +101,17 @@ function DriveBody(props) {
|
|||||||
|
|
||||||
//function for navigate user to microapp-signature component
|
//function for navigate user to microapp-signature component
|
||||||
const checkPdfStatus = async (data) => {
|
const checkPdfStatus = async (data) => {
|
||||||
const signerExist = data.Signers && data.Signers;
|
const signerExist = data?.Signers;
|
||||||
const isDecline = data.IsDeclined && data.IsDeclined;
|
const isDecline = data?.IsDeclined;
|
||||||
const isPlaceholder = data.Placeholders && data.Placeholders;
|
const isPlaceholder = data?.Placeholders;
|
||||||
const signedUrl = data.SignedUrl;
|
const signedUrl = data?.SignedUrl;
|
||||||
|
const isSignYourself = data?.IsSignyourself;
|
||||||
//checking if document has completed and request signature flow
|
//checking if document has completed and request signature flow
|
||||||
if (data?.IsCompleted && signerExist?.length > 0) {
|
if (data?.IsCompleted && signerExist?.length > 0) {
|
||||||
navigate(`/recipientSignPdf/${data.objectId}`);
|
navigate(`/recipientSignPdf/${data.objectId}`);
|
||||||
}
|
}
|
||||||
//checking if document has completed and signyour-self flow
|
//checking if document has completed and signyour-self flow
|
||||||
else if (!signerExist && !isPlaceholder) {
|
else if ((!signerExist && !isPlaceholder) || isSignYourself) {
|
||||||
navigate(`/signaturePdf/${data.objectId}`);
|
navigate(`/signaturePdf/${data.objectId}`);
|
||||||
}
|
}
|
||||||
//checking if document has declined by someone
|
//checking if document has declined by someone
|
||||||
@@ -136,12 +138,10 @@ function DriveBody(props) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleMenuItemClick = (selectType, data) => {
|
const handleMenuItemClick = async (selectType, data) => {
|
||||||
switch (selectType) {
|
switch (selectType) {
|
||||||
case "Download": {
|
case "Download": {
|
||||||
const pdfName = data && data.Name;
|
await handleDownloadPdf([data]);
|
||||||
const pdfUrl = data && data.SignedUrl ? data.SignedUrl : data.URL;
|
|
||||||
saveAs(pdfUrl, `${sanitizeFileName(pdfName)}_signed_by_OpenSign™.pdf`);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "Rename": {
|
case "Rename": {
|
||||||
|
|||||||
@@ -30,6 +30,28 @@ function EmailComponent({
|
|||||||
const pdfName = pdfDetails[0]?.Name;
|
const pdfName = pdfDetails[0]?.Name;
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
let sendMail;
|
let sendMail;
|
||||||
|
|
||||||
|
const docId = !pdfDetails?.[0]?.IsEnableOTP
|
||||||
|
? pdfDetails?.[0]?.objectId
|
||||||
|
: "";
|
||||||
|
let presignedUrl = pdfUrl;
|
||||||
|
try {
|
||||||
|
// const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl });
|
||||||
|
const axiosRes = await axios.post(
|
||||||
|
`${localStorage.getItem("baseUrl")}/functions/getsignedurl`,
|
||||||
|
{ url: pdfUrl, docId: docId },
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
"content-type": "Application/json",
|
||||||
|
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
|
||||||
|
"X-Parse-Session-Token": localStorage.getItem("accesstoken")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
presignedUrl = axiosRes.data.result;
|
||||||
|
} catch (err) {
|
||||||
|
console.log("err in getsignedurl", err);
|
||||||
|
}
|
||||||
for (let i = 0; i < emailList.length; i++) {
|
for (let i = 0; i < emailList.length; i++) {
|
||||||
try {
|
try {
|
||||||
const imgPng =
|
const imgPng =
|
||||||
@@ -47,7 +69,7 @@ function EmailComponent({
|
|||||||
mailProvider: activeMailAdapter,
|
mailProvider: activeMailAdapter,
|
||||||
extUserId: extUserId,
|
extUserId: extUserId,
|
||||||
pdfName: pdfName,
|
pdfName: pdfName,
|
||||||
url: pdfUrl,
|
url: presignedUrl,
|
||||||
recipient: emailList[i],
|
recipient: emailList[i],
|
||||||
subject: `${sender.name} has signed the doc - ${pdfName}`,
|
subject: `${sender.name} has signed the doc - ${pdfName}`,
|
||||||
from: sender.email,
|
from: sender.email,
|
||||||
|
|||||||
@@ -0,0 +1,267 @@
|
|||||||
|
import React, { useState } from "react";
|
||||||
|
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
|
||||||
|
import { tomorrow } from "react-syntax-highlighter/dist/esm/styles/prism";
|
||||||
|
import { copytoData } from "../../constant/Utils";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
|
function EmbedTab(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const tabName = [
|
||||||
|
{ title: "React/Next.js", icon: "fa-brands fa-react", color: "#61dafb" },
|
||||||
|
{ title: "JavaScript", icon: "fa-brands fa-js", color: "#ffd43b" },
|
||||||
|
{ title: "Angular", icon: "fa-brands fa-angular", color: "#ff5733" }
|
||||||
|
];
|
||||||
|
const [activeTab, setActiveTab] = useState(0);
|
||||||
|
// State to track if the code has been copied
|
||||||
|
const [isCopied, setIsCopied] = useState(false);
|
||||||
|
const reactCode = [
|
||||||
|
{
|
||||||
|
id: 0,
|
||||||
|
title: "Installation",
|
||||||
|
codeString: `
|
||||||
|
npm install @opensign/react`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
title: "Usage",
|
||||||
|
codeString: `
|
||||||
|
import React from "react";
|
||||||
|
import Opensign from "@opensign/react";
|
||||||
|
|
||||||
|
export function App() {
|
||||||
|
return (
|
||||||
|
<div className="app">
|
||||||
|
<Opensign
|
||||||
|
onLoad={() => console.log("success")}
|
||||||
|
onLoadError={(error) => console.log(error)}
|
||||||
|
templateId= {"${props.templateId}"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const angularCode = [
|
||||||
|
{
|
||||||
|
id: 0,
|
||||||
|
title: "Installation",
|
||||||
|
codeString: `
|
||||||
|
npm install @opensign/angular`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
title: "Usage",
|
||||||
|
codeString: `
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
import {OpensignComponent} from "@opensign/angular"
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector:'app-root',
|
||||||
|
standalone: true,
|
||||||
|
imports: [OpensignComponent],
|
||||||
|
template: '<opensign templateId={"${props.templateId}"}
|
||||||
|
(onLoad)="handleLoad()"
|
||||||
|
(onLoadError)="handleError($event)"
|
||||||
|
></opensign>',
|
||||||
|
})
|
||||||
|
export class AppComponent{
|
||||||
|
handleLoad() {
|
||||||
|
console.log("success");
|
||||||
|
}
|
||||||
|
handleError(error: string) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
];
|
||||||
|
const jsCodeString = `
|
||||||
|
<script
|
||||||
|
src= "https://app.opensignlabs.com/static/js/public-template.bundle.js"
|
||||||
|
id="opensign-script"
|
||||||
|
templateId=${props.templateId}
|
||||||
|
></script>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const handleCopy = (code, ind) => {
|
||||||
|
copytoData(code);
|
||||||
|
setIsCopied({ ...isCopied, [ind]: true });
|
||||||
|
setTimeout(() => setIsCopied(false), 3000);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="mt-4 border-t-[1px]">
|
||||||
|
<div className="flex justify-center items-center mt-2">
|
||||||
|
<div role="tablist" className="op-tabs op-tabs-bordered">
|
||||||
|
{tabName.map((tabData, ind) => (
|
||||||
|
<div
|
||||||
|
onClick={() => setActiveTab(ind)}
|
||||||
|
key={ind}
|
||||||
|
role="tab"
|
||||||
|
className={`${
|
||||||
|
activeTab === ind ? "op-tab-active" : ""
|
||||||
|
} op-tab flex items-center`}
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
className={`${tabData.icon}`}
|
||||||
|
style={{ color: tabData.color }}
|
||||||
|
></i>
|
||||||
|
<span className="ml-1 text-[10px] font-medium md:font-normal md:text-[15px]">
|
||||||
|
{tabData.title}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{activeTab === 0 ? (
|
||||||
|
<div className="mt-4">
|
||||||
|
{reactCode.map((data, ind) => {
|
||||||
|
return (
|
||||||
|
<div key={ind}>
|
||||||
|
<p className="font-medium text-[18px]">
|
||||||
|
{t(`${data.title}`)}
|
||||||
|
</p>
|
||||||
|
<p className="text-[13px] mt-2">
|
||||||
|
{t("public-template-mssg-1")}
|
||||||
|
</p>
|
||||||
|
<div className="relative p-1">
|
||||||
|
<div
|
||||||
|
onClick={() => handleCopy(data.codeString, ind)}
|
||||||
|
className="absolute top-[20px] right-[20px] cursor-pointer"
|
||||||
|
>
|
||||||
|
<i className="fa-light fa-copy text-white mr-[2px]" />
|
||||||
|
<span className=" text-white">
|
||||||
|
{isCopied[ind] ? t("copied-code") : t("copy-code")}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<SyntaxHighlighter
|
||||||
|
customStyle={{
|
||||||
|
borderRadius: "15px"
|
||||||
|
}}
|
||||||
|
language="javascript"
|
||||||
|
style={tomorrow}
|
||||||
|
>
|
||||||
|
{data.codeString}
|
||||||
|
</SyntaxHighlighter>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
|
||||||
|
<p className="font-medium text-[15px]">
|
||||||
|
{t("public-template-mssg-3")}
|
||||||
|
</p>
|
||||||
|
<p className="my-[6px]">
|
||||||
|
{" "}
|
||||||
|
{t("public-template-mssg-4")}
|
||||||
|
<a
|
||||||
|
href="https://www.npmjs.com/package/@opensign/react"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
className="cursor-pointer text-blue-700 "
|
||||||
|
>
|
||||||
|
{" "}
|
||||||
|
OpenSign React package{" "}
|
||||||
|
</a>
|
||||||
|
{t("public-template-mssg-5")}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
) : activeTab === 1 ? (
|
||||||
|
<div className="mt-4">
|
||||||
|
<div>
|
||||||
|
{/* <p className="font-medium text-[18px]">{t(`${data.title}`)}</p> */}
|
||||||
|
|
||||||
|
<div className="relative p-1">
|
||||||
|
<div
|
||||||
|
onClick={() => handleCopy(jsCodeString, 0)}
|
||||||
|
className="absolute top-[20px] right-[20px] cursor-pointer"
|
||||||
|
>
|
||||||
|
<i className="fa-light fa-copy text-white mr-[2px]" />
|
||||||
|
<span className=" text-white">
|
||||||
|
{isCopied[0] ? t("copied-code") : t("copy-code")}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<SyntaxHighlighter
|
||||||
|
customStyle={{
|
||||||
|
borderRadius: "15px"
|
||||||
|
}}
|
||||||
|
language="javascript"
|
||||||
|
style={tomorrow}
|
||||||
|
>
|
||||||
|
{jsCodeString}
|
||||||
|
</SyntaxHighlighter>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
activeTab === 2 && (
|
||||||
|
<div className="mt-4">
|
||||||
|
{angularCode.map((data, ind) => {
|
||||||
|
return (
|
||||||
|
<div key={ind}>
|
||||||
|
<p className="font-medium text-[18px]">
|
||||||
|
{t(`${data.title}`)}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p className="text-[13px] mt-2">
|
||||||
|
{t("angular-npm-mssg-1")}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="relative p-1">
|
||||||
|
<div
|
||||||
|
onClick={() => handleCopy(data.codeString, ind)}
|
||||||
|
className="absolute top-[20px] right-[20px] cursor-pointer"
|
||||||
|
>
|
||||||
|
<i className="fa-light fa-copy text-white mr-[2px]" />
|
||||||
|
<span className=" text-white">
|
||||||
|
{isCopied[ind] ? t("copied-code") : t("copy-code")}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<SyntaxHighlighter
|
||||||
|
customStyle={{
|
||||||
|
borderRadius: "15px"
|
||||||
|
}}
|
||||||
|
language="javascript"
|
||||||
|
style={tomorrow}
|
||||||
|
>
|
||||||
|
{data.codeString}
|
||||||
|
</SyntaxHighlighter>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
|
||||||
|
<p className="font-medium text-[15px]">
|
||||||
|
{t("public-template-mssg-3")}
|
||||||
|
</p>
|
||||||
|
<p className="my-[6px]">
|
||||||
|
{" "}
|
||||||
|
{t("public-template-mssg-4")}
|
||||||
|
<a
|
||||||
|
href="https://www.npmjs.com/package/@opensign/angular"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
className="cursor-pointer text-blue-700 "
|
||||||
|
>
|
||||||
|
{" "}
|
||||||
|
OpenSign Angular package{" "}
|
||||||
|
</a>
|
||||||
|
{t("public-template-mssg-5")}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default EmbedTab;
|
||||||
@@ -33,14 +33,15 @@ export const openInNewTab = (url, target) => {
|
|||||||
export async function fetchSubscription(
|
export async function fetchSubscription(
|
||||||
extUserId,
|
extUserId,
|
||||||
contactObjId,
|
contactObjId,
|
||||||
isGuestSign = false
|
isGuestSign = false,
|
||||||
|
isPublic = false
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
const Extand_Class = localStorage.getItem("Extand_Class");
|
const Extand_Class = localStorage.getItem("Extand_Class");
|
||||||
const extClass = Extand_Class && JSON.parse(Extand_Class);
|
const extClass = Extand_Class && JSON.parse(Extand_Class);
|
||||||
// console.log("extClass ", extClass);
|
// console.log("extClass ", extClass);
|
||||||
let extUser;
|
let extUser;
|
||||||
if (extClass && extClass.length > 0) {
|
if (extClass && extClass.length > 0 && !isPublic) {
|
||||||
extUser = extClass[0].objectId;
|
extUser = extClass[0].objectId;
|
||||||
} else {
|
} else {
|
||||||
extUser = extUserId;
|
extUser = extUserId;
|
||||||
@@ -54,7 +55,7 @@ export async function fetchSubscription(
|
|||||||
};
|
};
|
||||||
const params = isGuestSign
|
const params = isGuestSign
|
||||||
? { contactId: contactObjId }
|
? { contactId: contactObjId }
|
||||||
: { extUserId: extUser };
|
: { extUserId: extUser, ispublic: isPublic };
|
||||||
const tenatRes = await axios.post(url, params, { headers: headers });
|
const tenatRes = await axios.post(url, params, { headers: headers });
|
||||||
let plan, status, billingDate, adminId;
|
let plan, status, billingDate, adminId;
|
||||||
if (isGuestSign) {
|
if (isGuestSign) {
|
||||||
@@ -2058,12 +2059,12 @@ export const getSignedUrl = async (pdfUrl, docId) => {
|
|||||||
export const handleDownloadPdf = async (pdfDetails, setIsDownloading) => {
|
export const handleDownloadPdf = async (pdfDetails, setIsDownloading) => {
|
||||||
const pdfName = pdfDetails[0] && pdfDetails[0]?.Name;
|
const pdfName = pdfDetails[0] && pdfDetails[0]?.Name;
|
||||||
const pdfUrl = pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL;
|
const pdfUrl = pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL;
|
||||||
setIsDownloading("pdf");
|
setIsDownloading && setIsDownloading("pdf");
|
||||||
const docId = !pdfDetails?.[0]?.IsEnableOTP ? pdfDetails?.[0]?.objectId : "";
|
const docId = !pdfDetails?.[0]?.IsEnableOTP ? pdfDetails?.[0]?.objectId : "";
|
||||||
try {
|
try {
|
||||||
const url = await getSignedUrl(pdfUrl, docId);
|
const url = await getSignedUrl(pdfUrl, docId);
|
||||||
await fetchUrl(url, pdfName);
|
await fetchUrl(url, pdfName);
|
||||||
setIsDownloading("");
|
setIsDownloading && setIsDownloading("");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log("err in getsignedurl", err);
|
console.log("err in getsignedurl", err);
|
||||||
setIsDownloading("");
|
setIsDownloading("");
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { isEnableSubscription } from "../constant/const";
|
||||||
|
|
||||||
export default function reportJson(id) {
|
export default function reportJson(id) {
|
||||||
// console.log("json ", json);
|
// console.log("json ", json);
|
||||||
const head = ["Sr.No", "Title", "Note", "Folder", "File", "Owner", "Signers"];
|
const head = ["Sr.No", "Title", "Note", "Folder", "File", "Owner", "Signers"];
|
||||||
@@ -22,6 +24,24 @@ export default function reportJson(id) {
|
|||||||
const contactbook = ["Sr.No", "Name", "Email", "Phone"];
|
const contactbook = ["Sr.No", "Name", "Email", "Phone"];
|
||||||
const dashboardReportHead = ["Title", "File", "Owner", "Signers"];
|
const dashboardReportHead = ["Title", "File", "Owner", "Signers"];
|
||||||
const templateReport = ["Sr.No", "Title", "File", "Owner", "Signers"];
|
const templateReport = ["Sr.No", "Title", "File", "Owner", "Signers"];
|
||||||
|
const templateSubAction = isEnableSubscription
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
btnId: "2434",
|
||||||
|
btnLabel: "Embed",
|
||||||
|
hoverLabel: "Embed",
|
||||||
|
btnIcon: "fa-light fa-code",
|
||||||
|
action: "Embed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
btnId: "2434",
|
||||||
|
btnLabel: "Copy TemplateId",
|
||||||
|
hoverLabel: "Copy TemplateId",
|
||||||
|
btnIcon: "fa-light fa-copy",
|
||||||
|
action: "CopyTemplateId"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
: [];
|
||||||
switch (id) {
|
switch (id) {
|
||||||
// draft documents report
|
// draft documents report
|
||||||
case "ByHuevtCFY":
|
case "ByHuevtCFY":
|
||||||
@@ -363,13 +383,7 @@ export default function reportJson(id) {
|
|||||||
redirectUrl: "template",
|
redirectUrl: "template",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
},
|
},
|
||||||
{
|
...templateSubAction,
|
||||||
btnId: "2434",
|
|
||||||
btnLabel: "Embed",
|
|
||||||
hoverLabel: "Embed",
|
|
||||||
btnIcon: "fa-light fa-code",
|
|
||||||
action: "Embed"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
btnId: "1834",
|
btnId: "1834",
|
||||||
btnLabel: "Delete",
|
btnLabel: "Delete",
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ import LoaderWithMsg from "../primitives/LoaderWithMsg";
|
|||||||
import DownloadPdfZip from "../primitives/DownloadPdfZip";
|
import DownloadPdfZip from "../primitives/DownloadPdfZip";
|
||||||
import Loader from "../primitives/Loader";
|
import Loader from "../primitives/Loader";
|
||||||
import PdfDeclineModal from "../primitives/PdfDeclineModal";
|
import PdfDeclineModal from "../primitives/PdfDeclineModal";
|
||||||
|
import Agreement from "../primitives/Agreement";
|
||||||
|
|
||||||
function PdfRequestFiles(props) {
|
function PdfRequestFiles(props) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -137,6 +138,8 @@ function PdfRequestFiles(props) {
|
|||||||
const isHeader = useSelector((state) => state.showHeader);
|
const isHeader = useSelector((state) => state.showHeader);
|
||||||
const divRef = useRef(null);
|
const divRef = useRef(null);
|
||||||
const [isDownloadModal, setIsDownloadModal] = useState(false);
|
const [isDownloadModal, setIsDownloadModal] = useState(false);
|
||||||
|
const [isAgree, setIsAgree] = useState(false);
|
||||||
|
const [isAgreeTour, setIsAgreeTour] = useState(false);
|
||||||
|
|
||||||
const isMobile = window.innerWidth < 767;
|
const isMobile = window.innerWidth < 767;
|
||||||
|
|
||||||
@@ -244,7 +247,13 @@ function PdfRequestFiles(props) {
|
|||||||
};
|
};
|
||||||
async function checkIsSubscribed(extUserId, contactId) {
|
async function checkIsSubscribed(extUserId, contactId) {
|
||||||
const isGuestSign = isGuestSignFlow || false;
|
const isGuestSign = isGuestSignFlow || false;
|
||||||
const res = await fetchSubscription(extUserId, contactId, isGuestSign);
|
const isPublic = props.templateId ? true : false;
|
||||||
|
const res = await fetchSubscription(
|
||||||
|
extUserId,
|
||||||
|
contactId,
|
||||||
|
isGuestSign,
|
||||||
|
isPublic
|
||||||
|
);
|
||||||
const plan = res.plan;
|
const plan = res.plan;
|
||||||
const billingDate = res?.billingDate;
|
const billingDate = res?.billingDate;
|
||||||
const status = res?.status;
|
const status = res?.status;
|
||||||
@@ -292,16 +301,18 @@ function PdfRequestFiles(props) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
const documentData =
|
const documentData = templateDeatils?.data?.result
|
||||||
templateDeatils.data && templateDeatils.data.result
|
? [templateDeatils?.data?.result]
|
||||||
? [templateDeatils.data.result]
|
|
||||||
: [];
|
: [];
|
||||||
if (documentData && documentData[0]?.error) {
|
if (documentData && documentData[0]?.error) {
|
||||||
|
props?.setTemplateStatus &&
|
||||||
props?.setTemplateStatus({
|
props?.setTemplateStatus({
|
||||||
status: "Invalid"
|
status: "Invalid"
|
||||||
});
|
});
|
||||||
|
throw new Error("error: Invalid TemplateId");
|
||||||
} else if (documentData && documentData.length > 0) {
|
} else if (documentData && documentData.length > 0) {
|
||||||
if (documentData[0]?.IsPublic) {
|
if (documentData[0]?.IsPublic) {
|
||||||
|
props?.setTemplateStatus &&
|
||||||
props?.setTemplateStatus({
|
props?.setTemplateStatus({
|
||||||
status: "Success"
|
status: "Success"
|
||||||
});
|
});
|
||||||
@@ -348,22 +359,34 @@ function PdfRequestFiles(props) {
|
|||||||
isLoad: false
|
isLoad: false
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
props?.setTemplateStatus &&
|
||||||
props?.setTemplateStatus({
|
props?.setTemplateStatus({
|
||||||
status: "Private"
|
status: "Private"
|
||||||
});
|
});
|
||||||
|
setIsLoading(false);
|
||||||
|
setHandleError(t("something-went-wrong-mssg"));
|
||||||
|
console.error("error: TemplateId is not public");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
props?.setTemplateStatus &&
|
||||||
props?.setTemplateStatus({
|
props?.setTemplateStatus({
|
||||||
status: "Invalid"
|
status: "Invalid"
|
||||||
});
|
});
|
||||||
|
setIsLoading(false);
|
||||||
|
setHandleError(t("something-went-wrong-mssg"));
|
||||||
|
console.error("error: Invalid TemplateId");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log("err in get template details ", err);
|
setIsLoading(false);
|
||||||
if (err?.response?.data?.code === 101) {
|
if (err?.response?.data?.code === 101) {
|
||||||
setHandleError(t("error-template"));
|
setHandleError(t("error-template"));
|
||||||
} else {
|
} else {
|
||||||
setHandleError(t("something-went-wrong-mssg"));
|
setHandleError(t("something-went-wrong-mssg"));
|
||||||
}
|
}
|
||||||
|
console.error("error: Invalid TemplateId");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
//function for get document details for perticular signer with signer'object id
|
//function for get document details for perticular signer with signer'object id
|
||||||
@@ -1287,7 +1310,11 @@ function PdfRequestFiles(props) {
|
|||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.log("error updating field is decline ", err);
|
console.log("error updating field is decline ", err);
|
||||||
setIsUiLoading(false);
|
setIsUiLoading(false);
|
||||||
alert(t("something-went-wrong-mssg"));
|
setIsAlert({
|
||||||
|
title: "Error",
|
||||||
|
isShow: true,
|
||||||
|
alertMessage: t("something-went-wrong-mssg")
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
//function to add default signature for all requested placeholder of sign
|
//function to add default signature for all requested placeholder of sign
|
||||||
@@ -1488,11 +1515,32 @@ function PdfRequestFiles(props) {
|
|||||||
await SendOtp();
|
await SendOtp();
|
||||||
} else {
|
} else {
|
||||||
console.log("error in public-sign to create user details");
|
console.log("error in public-sign to create user details");
|
||||||
alert(t("something-went-wrong-mssg"));
|
setIsAlert({
|
||||||
|
title: "Error",
|
||||||
|
isShow: true,
|
||||||
|
alertMessage: t("something-went-wrong-mssg")
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("e", e);
|
console.log("e", e);
|
||||||
// setIsLoader(false);
|
if (
|
||||||
|
e?.response?.data?.error === "Insufficient Credit" ||
|
||||||
|
e?.response?.data?.error === "Plan expired"
|
||||||
|
) {
|
||||||
|
handleCloseOtp();
|
||||||
|
setIsAlert({
|
||||||
|
title: t("insufficient-credits"),
|
||||||
|
isShow: true,
|
||||||
|
alertMessage: t("insufficient-credits-mssg")
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
handleCloseOtp();
|
||||||
|
setIsAlert({
|
||||||
|
title: "Error",
|
||||||
|
isShow: true,
|
||||||
|
alertMessage: t("something-went-wrong-mssg")
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1524,7 +1572,11 @@ function PdfRequestFiles(props) {
|
|||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log("error in verify otp in public-sign", error);
|
console.log("error in verify otp in public-sign", error);
|
||||||
alert(t("something-went-wrong-mssg"));
|
setIsAlert({
|
||||||
|
title: "Error",
|
||||||
|
isShow: true,
|
||||||
|
alertMessage: t("something-went-wrong-mssg")
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1623,6 +1675,17 @@ function PdfRequestFiles(props) {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
const AgreementTour = [
|
||||||
|
{
|
||||||
|
selector: '[data-tut="IsAgree"]',
|
||||||
|
content: "Please agree & continue to start signing",
|
||||||
|
position: "top",
|
||||||
|
style: { fontSize: "13px" }
|
||||||
|
}
|
||||||
|
];
|
||||||
|
const handleCloseAgreeTour = () => {
|
||||||
|
setIsAgreeTour(false);
|
||||||
|
};
|
||||||
return (
|
return (
|
||||||
<DndProvider backend={HTML5Backend}>
|
<DndProvider backend={HTML5Backend}>
|
||||||
<Title title={props.templateId ? "Public Sign" : "Request Sign"} />
|
<Title title={props.templateId ? "Public Sign" : "Request Sign"} />
|
||||||
@@ -1645,7 +1708,23 @@ function PdfRequestFiles(props) {
|
|||||||
) : handleError ? (
|
) : handleError ? (
|
||||||
<HandleError handleError={handleError} />
|
<HandleError handleError={handleError} />
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div onClick={() => !isAgree && setIsAgreeTour(true)}>
|
||||||
|
{!isAgree && (
|
||||||
|
<Agreement
|
||||||
|
setIsAgree={setIsAgree}
|
||||||
|
setIsAgreeTour={setIsAgreeTour}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<Tour
|
||||||
|
showNumber={false}
|
||||||
|
showNavigation={false}
|
||||||
|
showNavigationNumber={false}
|
||||||
|
onRequestClose={handleCloseAgreeTour}
|
||||||
|
steps={AgreementTour}
|
||||||
|
isOpen={isAgreeTour}
|
||||||
|
rounded={5}
|
||||||
|
closeWithMask={false}
|
||||||
|
/>
|
||||||
{isUiLoading && (
|
{isUiLoading && (
|
||||||
<div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80">
|
<div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80">
|
||||||
<Loader />
|
<Loader />
|
||||||
@@ -1664,6 +1743,7 @@ function PdfRequestFiles(props) {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
pointerEvents:
|
pointerEvents:
|
||||||
@@ -1680,27 +1760,6 @@ function PdfRequestFiles(props) {
|
|||||||
{!requestSignTour &&
|
{!requestSignTour &&
|
||||||
signerObjectId &&
|
signerObjectId &&
|
||||||
requestSignTourFunction()}
|
requestSignTourFunction()}
|
||||||
<ModalUi
|
|
||||||
isOpen={isAlert.isShow}
|
|
||||||
title={t("alert-message")}
|
|
||||||
handleClose={() =>
|
|
||||||
setIsAlert({ isShow: false, alertMessage: "" })
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<div className="h-full p-[20px]">
|
|
||||||
<p>{isAlert.alertMessage}</p>
|
|
||||||
<button
|
|
||||||
onClick={() =>
|
|
||||||
setIsAlert({ isShow: false, alertMessage: "" })
|
|
||||||
}
|
|
||||||
type="button"
|
|
||||||
className="op-btn op-btn-primary mt-3 px-4"
|
|
||||||
>
|
|
||||||
{t("ok")}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</ModalUi>
|
|
||||||
|
|
||||||
<Tour
|
<Tour
|
||||||
showNumber={false}
|
showNumber={false}
|
||||||
showNavigation={false}
|
showNavigation={false}
|
||||||
@@ -2216,6 +2275,22 @@ function PdfRequestFiles(props) {
|
|||||||
pdfDetails={pdfDetails}
|
pdfDetails={pdfDetails}
|
||||||
isDocId={true}
|
isDocId={true}
|
||||||
/>
|
/>
|
||||||
|
<ModalUi
|
||||||
|
isOpen={isAlert.isShow}
|
||||||
|
title={isAlert?.title || t("alert-message")}
|
||||||
|
handleClose={() => setIsAlert({ isShow: false, alertMessage: "" })}
|
||||||
|
>
|
||||||
|
<div className="h-full p-[20px]">
|
||||||
|
<p>{isAlert.alertMessage}</p>
|
||||||
|
<button
|
||||||
|
onClick={() => setIsAlert({ isShow: false, alertMessage: "" })}
|
||||||
|
type="button"
|
||||||
|
className="op-btn op-btn-primary mt-3 px-4"
|
||||||
|
>
|
||||||
|
{t("close")}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ModalUi>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</DndProvider>
|
</DndProvider>
|
||||||
|
|||||||
@@ -1047,7 +1047,7 @@ function PlaceHolderSign() {
|
|||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center op-link op-link-primary"
|
className="flex flex-row items-center op-link op-link-primary"
|
||||||
>
|
>
|
||||||
<i className="fa-light fa-link" aria-hidden="true"></i>
|
<i className="fa-light fa-copy" />
|
||||||
<span className=" hidden md:block ml-1 ">{t("copy-link")}</span>
|
<span className=" hidden md:block ml-1 ">{t("copy-link")}</span>
|
||||||
</button>
|
</button>
|
||||||
<RWebShare data={{ url: data.url, title: t("sign-url") }}>
|
<RWebShare data={{ url: data.url, title: t("sign-url") }}>
|
||||||
|
|||||||
@@ -596,7 +596,7 @@ function UserProfile() {
|
|||||||
className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm"
|
className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm"
|
||||||
onClick={() => copytoclipboard()}
|
onClick={() => copytoclipboard()}
|
||||||
>
|
>
|
||||||
<i className="fa-light fa-link"></i>{" "}
|
<i className="fa-light fa-copy" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import React, { useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
|
function Agreement(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [isChecked, setIsChecked] = useState(false);
|
||||||
|
return (
|
||||||
|
<div className="flex justify-between mx-2 mb-2 pt-1" data-tut="IsAgree">
|
||||||
|
<div className="flex items-center">
|
||||||
|
<input
|
||||||
|
className="mr-3 op-checkbox op-checkbox-m"
|
||||||
|
type="checkbox"
|
||||||
|
value={isChecked}
|
||||||
|
onChange={(e) => {
|
||||||
|
setIsChecked(e.target.checked);
|
||||||
|
if (e.target.checked) {
|
||||||
|
props.setIsAgreeTour(false);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
I confirm that I have read and understood the 'Electronic Record
|
||||||
|
and Signature Disclosure' and consent to use electronic records and
|
||||||
|
signatures.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex">
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
if (isChecked) {
|
||||||
|
props.setIsAgreeTour(false);
|
||||||
|
props.setIsAgree(true);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
className="op-btn op-btn-primary op-btn-sm"
|
||||||
|
>
|
||||||
|
Agree & Continue
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Agreement;
|
||||||
@@ -25,8 +25,8 @@ const Alert = ({ children, type, className }) => {
|
|||||||
: "z-[1000] fixed top-20 left-1/2 transform -translate-x-1/2 text-sm"
|
: "z-[1000] fixed top-20 left-1/2 transform -translate-x-1/2 text-sm"
|
||||||
} `}
|
} `}
|
||||||
>
|
>
|
||||||
<div className={`op-alert ${textcolor}`}>
|
<div className={`op-alert ${textcolor} flex justify-center`}>
|
||||||
<span className="ml-3">{children}</span>
|
<span className="px-1">{children}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import { validplan } from "../json/plansArr";
|
|||||||
import { serverUrl_fn } from "../constant/appinfo";
|
import { serverUrl_fn } from "../constant/appinfo";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import DownloadPdfZip from "./DownloadPdfZip";
|
import DownloadPdfZip from "./DownloadPdfZip";
|
||||||
|
import EmbedTab from "../components/pdf/EmbedTab";
|
||||||
|
|
||||||
const ReportTable = (props) => {
|
const ReportTable = (props) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -74,6 +75,7 @@ const ReportTable = (props) => {
|
|||||||
const [isModal, setIsModal] = useState({});
|
const [isModal, setIsModal] = useState({});
|
||||||
const [reason, setReason] = useState("");
|
const [reason, setReason] = useState("");
|
||||||
const [isDownloadModal, setIsDownloadModal] = useState(false);
|
const [isDownloadModal, setIsDownloadModal] = useState(false);
|
||||||
|
const [isEmbed, setIsEmbed] = useState(false);
|
||||||
const Extand_Class = localStorage.getItem("Extand_Class");
|
const Extand_Class = localStorage.getItem("Extand_Class");
|
||||||
const extClass = Extand_Class && JSON.parse(Extand_Class);
|
const extClass = Extand_Class && JSON.parse(Extand_Class);
|
||||||
const startIndex = (currentPage - 1) * props.docPerPage;
|
const startIndex = (currentPage - 1) * props.docPerPage;
|
||||||
@@ -369,6 +371,8 @@ const ReportTable = (props) => {
|
|||||||
setIsShareWith({ [item.objectId]: true });
|
setIsShareWith({ [item.objectId]: true });
|
||||||
} else if (act.action === "Embed") {
|
} else if (act.action === "Embed") {
|
||||||
handleEmbedFunction(item);
|
handleEmbedFunction(item);
|
||||||
|
} else if (act.action === "CopyTemplateId") {
|
||||||
|
copyTemplateId(item.objectId);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Get current list
|
// Get current list
|
||||||
@@ -1121,12 +1125,14 @@ const ReportTable = (props) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
const handleEmbedFunction = async (item) => {
|
const handleEmbedFunction = async (item) => {
|
||||||
|
setIsEmbed(true);
|
||||||
setIsPublicProfile({
|
setIsPublicProfile({
|
||||||
[item.objectId]: props.isPublic[item.objectId]
|
[item.objectId]: true
|
||||||
});
|
});
|
||||||
let extendUser = JSON.parse(localStorage.getItem("Extand_Class"));
|
let extendUser = JSON.parse(localStorage.getItem("Extand_Class"));
|
||||||
setIsPublicUserName(extendUser[0]?.UserName || "");
|
setIsPublicUserName(extendUser[0]?.UserName || "");
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
{Object.keys(actLoader)?.length > 0 && (
|
{Object.keys(actLoader)?.length > 0 && (
|
||||||
@@ -1446,22 +1452,27 @@ const ReportTable = (props) => {
|
|||||||
<ModalUi
|
<ModalUi
|
||||||
isOpen
|
isOpen
|
||||||
title={t("public-url")}
|
title={t("public-url")}
|
||||||
handleClose={() => setIsPublicProfile({})}
|
handleClose={() => {
|
||||||
|
setIsPublicProfile({});
|
||||||
|
setIsEmbed(false);
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<div className="m-[20px]">
|
<div className="m-[20px]">
|
||||||
{publicUserName ? (
|
{isEmbed && !item?.IsPublic ? (
|
||||||
|
<>
|
||||||
|
<p>{t("public-template-mssg-6")}</p>
|
||||||
|
<EmbedTab templateId={item.objectId} />
|
||||||
|
</>
|
||||||
|
) : publicUserName ? (
|
||||||
<div className="font-normal text-black">
|
<div className="font-normal text-black">
|
||||||
<p>{t("public-url-copy-mssg")}</p>
|
<span>{t("public-url-copy")}</span>
|
||||||
<div className=" flex items-center justify-between gap-3 mt-2 p-[2px] ">
|
<div className=" flex items-center justify-between gap-3 p-[2px] ">
|
||||||
<div className="w-[280px] whitespace-nowrap overflow-hidden text-ellipsis">
|
<div className="w-[280px] whitespace-nowrap overflow-hidden text-ellipsis">
|
||||||
<span className="font-bold">
|
|
||||||
{t("public-url")} :
|
|
||||||
</span>
|
|
||||||
<span
|
<span
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
copytoProfileLink()
|
copytoProfileLink()
|
||||||
}
|
}
|
||||||
className="ml-[2px] underline underline-offset-2 cursor-pointer"
|
className="ml-[2px] underline underline-offset-2 cursor-pointer text-blue-800"
|
||||||
>
|
>
|
||||||
{publicUrl()}
|
{publicUrl()}
|
||||||
</span>
|
</span>
|
||||||
@@ -1486,7 +1497,7 @@ const ReportTable = (props) => {
|
|||||||
copytoProfileLink()
|
copytoProfileLink()
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<i className="fa-light fa-link"></i>{" "}
|
<i className="fa-light fa-copy" />
|
||||||
<span className="hidden md:inline-block">
|
<span className="hidden md:inline-block">
|
||||||
{copied["publicprofile"]
|
{copied["publicprofile"]
|
||||||
? t("copied")
|
? t("copied")
|
||||||
@@ -1495,36 +1506,10 @@ const ReportTable = (props) => {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className=" flex items-center justify-between gap-3 mt-2 p-[2px] ">
|
<p className="text-[13px] mt-[5px]">
|
||||||
<div>
|
{t("public-url-copy-mssg")}
|
||||||
<span className="font-bold">
|
</p>
|
||||||
{t("templateid")} :
|
<EmbedTab templateId={item.objectId} />
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
onClick={() =>
|
|
||||||
copyTemplateId(item.objectId)
|
|
||||||
}
|
|
||||||
className="underline ml-[2px] underline-offset-2 w-[150px] md:w-[350px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer"
|
|
||||||
>
|
|
||||||
{item.objectId}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<button
|
|
||||||
className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm"
|
|
||||||
onClick={() =>
|
|
||||||
copyTemplateId(item.objectId)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<i className="fa-light fa-link"></i>{" "}
|
|
||||||
<span className="hidden md:inline-block">
|
|
||||||
{copied["templateid"]
|
|
||||||
? t("copied")
|
|
||||||
: t("copy")}
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="font-normal text-black">
|
<div className="font-normal text-black">
|
||||||
@@ -1584,10 +1569,7 @@ const ReportTable = (props) => {
|
|||||||
{isOption[item.objectId] &&
|
{isOption[item.objectId] &&
|
||||||
act.action === "option" && (
|
act.action === "option" && (
|
||||||
<ul className="absolute -right-1 top-auto z-[70] w-max op-dropdown-content op-menu shadow bg-base-100 text-base-content rounded-box">
|
<ul className="absolute -right-1 top-auto z-[70] w-max op-dropdown-content op-menu shadow bg-base-100 text-base-content rounded-box">
|
||||||
{act.subaction?.map((subact) =>
|
{act.subaction?.map((subact) => (
|
||||||
props.isPublic[
|
|
||||||
item.objectId
|
|
||||||
] ? (
|
|
||||||
<li
|
<li
|
||||||
key={subact.btnId}
|
key={subact.btnId}
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
@@ -1613,36 +1595,7 @@ const ReportTable = (props) => {
|
|||||||
)}
|
)}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
) : (
|
))}
|
||||||
subact.action !== "Embed" && (
|
|
||||||
<li
|
|
||||||
key={subact.btnId}
|
|
||||||
onClick={() =>
|
|
||||||
handleActionBtn(
|
|
||||||
subact,
|
|
||||||
item
|
|
||||||
)
|
|
||||||
}
|
|
||||||
title={t(
|
|
||||||
`btnLabel.${subact.btnLabel}`
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<span>
|
|
||||||
<i
|
|
||||||
className={`${subact.btnIcon} mr-1.5`}
|
|
||||||
></i>
|
|
||||||
{subact.btnLabel && (
|
|
||||||
<span className="text-[13px] capitalize font-medium">
|
|
||||||
{t(
|
|
||||||
`btnLabel.${subact.btnLabel}`
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
</ul>
|
</ul>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -1963,7 +1916,7 @@ const ReportTable = (props) => {
|
|||||||
className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm"
|
className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm"
|
||||||
onClick={() => copytoclipboard(share)}
|
onClick={() => copytoclipboard(share)}
|
||||||
>
|
>
|
||||||
<i className="fa-light fa-link"></i>{" "}
|
<i className="fa-light fa-copy" />
|
||||||
{copied[share.email]
|
{copied[share.email]
|
||||||
? t("copied")
|
? t("copied")
|
||||||
: t("copy")}
|
: t("copy")}
|
||||||
|
|||||||
@@ -11,28 +11,37 @@ import { isPublicStaging } from "../constant/const";
|
|||||||
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.mjs`;
|
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.mjs`;
|
||||||
|
|
||||||
// Wrapper component to manage props
|
// Wrapper component to manage props
|
||||||
const PublicScriptFileWrapper = ({ initialProps }) => {
|
const PublicScriptFileWrapper = () => {
|
||||||
const [props, setProps] = useState(initialProps);
|
const [props, setProps] = useState("");
|
||||||
|
|
||||||
// Make the setProps function globally accessible
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
// Assigns the function 'setProps' to the global 'window' object as 'updatePublicTemplateProps'.
|
||||||
|
// This allows 'setProps' to be accessed and called globally across different scripts or components,
|
||||||
|
// enabling dynamic updates to the public template's properties.
|
||||||
window.updatePublicTemplateProps = setProps;
|
window.updatePublicTemplateProps = setProps;
|
||||||
|
const publicScript = document.getElementById("opensign-script");
|
||||||
|
// condition for using plan js load opensign-script then get templateId
|
||||||
|
if (publicScript) {
|
||||||
|
// Get the custom templateId attribute
|
||||||
|
const templateId = publicScript.getAttribute("templateId");
|
||||||
|
if (templateId) {
|
||||||
|
setProps({ templateId: templateId });
|
||||||
|
} else {
|
||||||
|
const error = "error: TemplateId is missing";
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
return () => {
|
return () => {
|
||||||
window.updatePublicTemplateProps = undefined;
|
window.updatePublicTemplateProps = undefined;
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return <PdfRequestFiles {...props} />;
|
return <PdfRequestFiles {...props} />;
|
||||||
};
|
};
|
||||||
|
|
||||||
const appId = isPublicStaging ? "opensign" : "legadranaxn";
|
const appId = isPublicStaging ? "opensign" : "legadranaxn";
|
||||||
//"opensign"
|
|
||||||
|
|
||||||
const serverUrl = isPublicStaging
|
const serverUrl = isPublicStaging
|
||||||
? "https://staging-app.opensignlabs.com/api/app"
|
? "https://staging-app.opensignlabs.com/api/app"
|
||||||
: "https://app.opensignlabs.com/api/app";
|
: "https://app.opensignlabs.com/api/app";
|
||||||
// "https://staging-app.opensignlabs.com/api/app"
|
|
||||||
|
|
||||||
localStorage.setItem("baseUrl", `${serverUrl}/`);
|
localStorage.setItem("baseUrl", `${serverUrl}/`);
|
||||||
localStorage.setItem("parseAppId", appId);
|
localStorage.setItem("parseAppId", appId);
|
||||||
@@ -58,7 +67,7 @@ const root = ReactDOM.createRoot(document.getElementById("script-component"));
|
|||||||
root.render(
|
root.render(
|
||||||
<div data-theme="opensigncss">
|
<div data-theme="opensigncss">
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<PublicScriptFileWrapper initialProps={{ text: "templateId" }} />
|
<PublicScriptFileWrapper />
|
||||||
</Provider>
|
</Provider>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -131,7 +131,8 @@
|
|||||||
"Share": "Share",
|
"Share": "Share",
|
||||||
"View": "View",
|
"View": "View",
|
||||||
"option": "Option",
|
"option": "Option",
|
||||||
"Embed": "Embed"
|
"Embed": "Embed",
|
||||||
|
"Copy TemplateId":"Copy TemplateId"
|
||||||
},
|
},
|
||||||
"report-heading": {
|
"report-heading": {
|
||||||
"Sr.No": "Sr.No",
|
"Sr.No": "Sr.No",
|
||||||
@@ -264,7 +265,8 @@
|
|||||||
"make-template-private-alert": "Are you sure you want to make this template private? This will remove it from your public profile.",
|
"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-role": "Public role",
|
||||||
"public-url": "Public URL",
|
"public-url": "Public URL",
|
||||||
"public-url-copy-mssg": " Here’s your public URL: Copy it or share it with the signer, and you will be able to see all your publicly set templates.",
|
"public-url-copy": "Here’s your public URL: ",
|
||||||
|
"public-url-copy-mssg":"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.",
|
"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-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",
|
"share-with": "Share with",
|
||||||
@@ -632,6 +634,19 @@
|
|||||||
"reason":"Reason",
|
"reason":"Reason",
|
||||||
"decline-by":"Declined/revoked by",
|
"decline-by":"Declined/revoked by",
|
||||||
"document-declined": "Document declined",
|
"document-declined": "Document declined",
|
||||||
|
"public-template-mssg-1":"To integrate OpenSign into your React or Next.js project, simply run the following command:",
|
||||||
|
"public-template-mssg-2" :"Ensure you have npm or yarn set up in your project. If you’re using Yarn, you can replace npm install with yarn add @opensign/react.",
|
||||||
|
"public-template-mssg-3" :"Need more details or examples?",
|
||||||
|
"public-template-mssg-4": "Visit the",
|
||||||
|
"public-template-mssg-5": " npm for the latest updates, detailed documentation, and version history.",
|
||||||
|
"public-template-mssg-6" :"You need to set this template as public before you can utilize this code snippet.",
|
||||||
|
"copy-code":"COPY",
|
||||||
|
"copied-code":"COPIED",
|
||||||
|
"Installation":"Installation",
|
||||||
|
"Usage" :"Usage",
|
||||||
|
"insufficient-credits":"Insufficient Signing Credits",
|
||||||
|
"insufficient-credits-mssg":"The owner of this document currently lacks the necessary OpenSign credits for you to sign. Please reach out to the owner if you require further details.",
|
||||||
|
"angular-npm-mssg-1": "To integrate OpenSign into your Angular project, simply run the following command:",
|
||||||
"quota-mail-info-head":"Monthly request signatures email limit",
|
"quota-mail-info-head":"Monthly request signatures email limit",
|
||||||
"quota-mail-info": "You can send upto 15 signature request emails every month. Upgrade now to send unlimited signing requests directly.",
|
"quota-mail-info": "You can send upto 15 signature request emails every month. Upgrade now to send unlimited signing requests directly.",
|
||||||
"quota-mail": "You've reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.",
|
"quota-mail": "You've reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.",
|
||||||
|
|||||||
@@ -151,7 +151,8 @@
|
|||||||
"Share": "Partager",
|
"Share": "Partager",
|
||||||
"View": "Voir",
|
"View": "Voir",
|
||||||
"option": "Option",
|
"option": "Option",
|
||||||
"Embed": "Intégrer"
|
"Embed": "Intégrer",
|
||||||
|
"Copy TemplateId": "Copier l'ID du modèle"
|
||||||
},
|
},
|
||||||
"report-help": {
|
"report-help": {
|
||||||
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
|
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
|
||||||
@@ -263,7 +264,8 @@
|
|||||||
"make-template-private-alert": "Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil 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-role": "Rôle public",
|
||||||
"public-url": "URL publique",
|
"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.",
|
"public-url-copy": "Voici votre URL publique : ",
|
||||||
|
"public-url-copy-mssg": "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.",
|
"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-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",
|
"share-with": "Partager avec",
|
||||||
@@ -631,6 +633,19 @@
|
|||||||
"reason" :"Raison",
|
"reason" :"Raison",
|
||||||
"decline-by" :"Refusé/révoqué par",
|
"decline-by" :"Refusé/révoqué par",
|
||||||
"document-declined":"document refusé",
|
"document-declined":"document refusé",
|
||||||
|
"public-template-mssg-1" :"Pour intégrer OpenSign dans votre projet React ou Next.js, exécutez simplement la commande suivante :",
|
||||||
|
"public-template-mssg-2" :"Assurez-vous que npm ou Yarn est configuré dans votre projet. Si vous utilisez Yarn, vous pouvez remplacer npm install par Yarn Add @opensign/react.",
|
||||||
|
"public-template-mssg-3" :"Besoin de plus de détails ou d'exemples ?",
|
||||||
|
"public-template-mssg-4": "Visitez le",
|
||||||
|
"public-template-mssg-5": "npm pour les dernières mises à jour, une documentation détaillée et l'historique des versions.",
|
||||||
|
"public-template-mssg-6":"Vous devez définir ce modèle comme public avant de pouvoir utiliser cet extrait de code.",
|
||||||
|
"copy-code":"COPIE",
|
||||||
|
"copied-code":"COPIÉ",
|
||||||
|
"Installation":"Installation",
|
||||||
|
"Usage" :"Usage",
|
||||||
|
"insufficient-credits":"Crédits de signature insuffisants",
|
||||||
|
"insufficient-credits-mssg" :"Le propriétaire de ce document ne dispose actuellement pas des crédits OpenSign nécessaires pour que vous puissiez le signer. Veuillez contacter le propriétaire si vous avez besoin de plus de détails.",
|
||||||
|
"angular-npm-mssg-1" :"Pour intégrer OpenSign dans votre projet Angular, exécutez simplement la commande suivante :",
|
||||||
"quota-mail-info-head":"Limite mensuelle d'e-mails de signatures de demandes",
|
"quota-mail-info-head":"Limite mensuelle d'e-mails de signatures de demandes",
|
||||||
"quota-mail-info": "Vous pouvez envoyer jusqu'à 15 e-mails de demande de signature chaque mois. Mettez à niveau maintenant pour envoyer directement des demandes de signature illimitées.",
|
"quota-mail-info": "Vous pouvez envoyer jusqu'à 15 e-mails de demande de signature chaque mois. Mettez à niveau maintenant pour envoyer directement des demandes de signature illimitées.",
|
||||||
"quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.",
|
"quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.",
|
||||||
@@ -653,4 +668,5 @@
|
|||||||
"download-pdf" :"Télécharger le PDF",
|
"download-pdf" :"Télécharger le PDF",
|
||||||
"pdf-certificate" :"Télécharger Pdf + Certificat",
|
"pdf-certificate" :"Télécharger Pdf + Certificat",
|
||||||
"document-logs":"Journaux de documents"
|
"document-logs":"Journaux de documents"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,6 +222,25 @@ const sendMailToAllSigners = async docId => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const deductcount = async _resSub => {
|
||||||
|
try {
|
||||||
|
const subscriptionCls = new Parse.Object('contracts_Subscriptions');
|
||||||
|
subscriptionCls.id = _resSub.objectId;
|
||||||
|
const allowedCredits = _resSub?.AllowedCredits || 0;
|
||||||
|
const addonCredits = _resSub?.AddonCredits || 0;
|
||||||
|
if (allowedCredits > 0) {
|
||||||
|
const updateAllowedcredits = allowedCredits - 1 || 0;
|
||||||
|
subscriptionCls.set('AllowedCredits', updateAllowedcredits);
|
||||||
|
} else {
|
||||||
|
const updateAddonCredits = addonCredits > 0 ? addonCredits - 1 : 0;
|
||||||
|
subscriptionCls.set('AddonCredits', updateAddonCredits);
|
||||||
|
}
|
||||||
|
await subscriptionCls.save(null, { useMasterKey: true });
|
||||||
|
} catch (err) {
|
||||||
|
console.log('Err in deductcount in PublicUserLinkContacttoDoc cloud function', err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// `PublicUserLinkContactToDoc` cloud function is used to create contact, add this contact in contracts_Guest role and
|
// `PublicUserLinkContactToDoc` cloud function is used to create contact, add this contact in contracts_Guest role and
|
||||||
// create new document from template and save contact pointer in placeholder, signers and ACL of Document
|
// create new document from template and save contact pointer in placeholder, signers and ACL of Document
|
||||||
export default async function PublicUserLinkContactToDoc(req) {
|
export default async function PublicUserLinkContactToDoc(req) {
|
||||||
@@ -241,6 +260,22 @@ export default async function PublicUserLinkContactToDoc(req) {
|
|||||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Template not found.');
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Template not found.');
|
||||||
}
|
}
|
||||||
const _tempRes = JSON.parse(JSON.stringify(tempRes));
|
const _tempRes = JSON.parse(JSON.stringify(tempRes));
|
||||||
|
const subscription = new Parse.Query('contracts_Subscriptions');
|
||||||
|
subscription.equalTo('TenantId', {
|
||||||
|
__type: 'Pointer',
|
||||||
|
className: 'partners_Tenant',
|
||||||
|
objectId: _tempRes?.ExtUserPtr?.TenantId?.objectId,
|
||||||
|
});
|
||||||
|
subscription.include('ExtUserPtr');
|
||||||
|
const date = new Date();
|
||||||
|
subscription.greaterThanOrEqualTo('Next_billing_date', date);
|
||||||
|
const resSub = await subscription.first({ useMasterKey: true });
|
||||||
|
if (resSub) {
|
||||||
|
const _resSub = JSON.parse(JSON.stringify(resSub));
|
||||||
|
const allowedCredits = _resSub?.AllowedCredits || 0;
|
||||||
|
const addonCredits = _resSub?.AddonCredits || 0;
|
||||||
|
const totalcredits = allowedCredits + addonCredits;
|
||||||
|
if (totalcredits > 0) {
|
||||||
const Placeholders = _tempRes?.Placeholders || [];
|
const Placeholders = _tempRes?.Placeholders || [];
|
||||||
let index;
|
let index;
|
||||||
if (role) {
|
if (role) {
|
||||||
@@ -260,6 +295,7 @@ export default async function PublicUserLinkContactToDoc(req) {
|
|||||||
//update contact in placeholder, signers and update ACl in provide document
|
//update contact in placeholder, signers and update ACl in provide document
|
||||||
const docRes = await createDocumentFromTemplate(template_json, existContact, index);
|
const docRes = await createDocumentFromTemplate(template_json, existContact, index);
|
||||||
if (docRes) {
|
if (docRes) {
|
||||||
|
await deductcount(_resSub);
|
||||||
//condition will execute only if sendInOrder will be false for send email to all signers at a time.
|
//condition will execute only if sendInOrder will be false for send email to all signers at a time.
|
||||||
if (!template_json?.SendinOrder) {
|
if (!template_json?.SendinOrder) {
|
||||||
await sendMailToAllSigners(docRes.id);
|
await sendMailToAllSigners(docRes.id);
|
||||||
@@ -286,6 +322,7 @@ export default async function PublicUserLinkContactToDoc(req) {
|
|||||||
const contactRes = await saveRoleContact(contact);
|
const contactRes = await saveRoleContact(contact);
|
||||||
const docRes = await createDocumentFromTemplate(template_json, contactRes, index);
|
const docRes = await createDocumentFromTemplate(template_json, contactRes, index);
|
||||||
if (docRes) {
|
if (docRes) {
|
||||||
|
await deductcount(_resSub);
|
||||||
//condition will execute only if sendInOrder will be false for send email to all signers at a time.
|
//condition will execute only if sendInOrder will be false for send email to all signers at a time.
|
||||||
if (!template_json?.SendinOrder) {
|
if (!template_json?.SendinOrder) {
|
||||||
await sendMailToAllSigners(docRes.id);
|
await sendMailToAllSigners(docRes.id);
|
||||||
@@ -311,8 +348,13 @@ export default async function PublicUserLinkContactToDoc(req) {
|
|||||||
// Create new contract on the basis provided contact details by user and userId from _User class
|
// Create new contract on the basis provided contact details by user and userId from _User class
|
||||||
const contactRes = await saveRoleContact(contact);
|
const contactRes = await saveRoleContact(contact);
|
||||||
//update contact in placeholder, signers and update ACl in provide document
|
//update contact in placeholder, signers and update ACl in provide document
|
||||||
const docRes = await createDocumentFromTemplate(template_json, contactRes, index);
|
const docRes = await createDocumentFromTemplate(
|
||||||
|
template_json,
|
||||||
|
contactRes,
|
||||||
|
index
|
||||||
|
);
|
||||||
if (docRes) {
|
if (docRes) {
|
||||||
|
await deductcount(_resSub);
|
||||||
//condition will execute only if sendInOrder will be false for send email to all signers at a time.
|
//condition will execute only if sendInOrder will be false for send email to all signers at a time.
|
||||||
if (!template_json?.SendinOrder) {
|
if (!template_json?.SendinOrder) {
|
||||||
await sendMailToAllSigners(docRes.id);
|
await sendMailToAllSigners(docRes.id);
|
||||||
@@ -343,8 +385,13 @@ export default async function PublicUserLinkContactToDoc(req) {
|
|||||||
// Create new contract on the basis provided contact details by user and userId from _User class
|
// Create new contract on the basis provided contact details by user and userId from _User class
|
||||||
const contactRes = await saveRoleContact(contact);
|
const contactRes = await saveRoleContact(contact);
|
||||||
//update contact in placeholder, signers and update ACl in provide document
|
//update contact in placeholder, signers and update ACl in provide document
|
||||||
const docRes = await createDocumentFromTemplate(template_json, contactRes, index);
|
const docRes = await createDocumentFromTemplate(
|
||||||
|
template_json,
|
||||||
|
contactRes,
|
||||||
|
index
|
||||||
|
);
|
||||||
if (docRes) {
|
if (docRes) {
|
||||||
|
await deductcount(_resSub);
|
||||||
//condition will execute only if sendInOrder will be false for send email to all signers at a time.
|
//condition will execute only if sendInOrder will be false for send email to all signers at a time.
|
||||||
if (!template_json?.SendinOrder) {
|
if (!template_json?.SendinOrder) {
|
||||||
await sendMailToAllSigners(docRes.id);
|
await sendMailToAllSigners(docRes.id);
|
||||||
@@ -360,7 +407,16 @@ export default async function PublicUserLinkContactToDoc(req) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Please provide required parameters!');
|
throw new Parse.Error(
|
||||||
|
Parse.Error.OBJECT_NOT_FOUND,
|
||||||
|
'Please provide required parameters!'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Parse.Error(Parse.Error.REQUEST_LIMIT_EXCEEDED, 'Insufficient Credit');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Plan expired');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Template not found.');
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Template not found.');
|
||||||
|
|||||||
@@ -68,15 +68,17 @@ const makeEmail = async (to, from, subject, html, url, pdfName) => {
|
|||||||
type: 'application/pdf',
|
type: 'application/pdf',
|
||||||
path: './exports/certificate.pdf',
|
path: './exports/certificate.pdf',
|
||||||
};
|
};
|
||||||
|
if (fs.existsSync(certificate.path)) {
|
||||||
attachments = [file, certificate];
|
attachments = [file, certificate];
|
||||||
|
} else {
|
||||||
|
attachments = [file];
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
attachments = [file];
|
attachments = [file];
|
||||||
console.log('Err in read certificate sendmailv3', err);
|
console.log('Err in read certificate sendmailv3', err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const attachmentParts = attachments.map(attachment => {
|
const attachmentParts = attachments.map(attachment => {
|
||||||
if (fs.existsSync(attachment.path)) {
|
|
||||||
try {
|
|
||||||
const content = fs.readFileSync(attachment.path);
|
const content = fs.readFileSync(attachment.path);
|
||||||
const encodedContent = content.toString('base64');
|
const encodedContent = content.toString('base64');
|
||||||
return [
|
return [
|
||||||
@@ -86,10 +88,6 @@ const makeEmail = async (to, from, subject, html, url, pdfName) => {
|
|||||||
`Content-Transfer-Encoding: base64\n\n`,
|
`Content-Transfer-Encoding: base64\n\n`,
|
||||||
`${encodedContent}\n`,
|
`${encodedContent}\n`,
|
||||||
].join('');
|
].join('');
|
||||||
} catch (err) {
|
|
||||||
console.log('Err in read attachments sendmailv3', attachment.path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const attachmentBody = attachmentParts.join(`\n--${boundary}\n`);
|
const attachmentBody = attachmentParts.join(`\n--${boundary}\n`);
|
||||||
@@ -149,6 +147,14 @@ export default async function sendMailGmailProvider(_extRes, template) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
console.log('gmail provider res: ', response?.status);
|
console.log('gmail provider res: ', response?.status);
|
||||||
|
const certificatePath = './exports/certificate.pdf';
|
||||||
|
if (fs.existsSync(certificatePath)) {
|
||||||
|
try {
|
||||||
|
fs.unlinkSync(certificatePath);
|
||||||
|
} catch (err) {
|
||||||
|
console.log('Err in unlink certificate sendmailgmail provider');
|
||||||
|
}
|
||||||
|
}
|
||||||
return { code: 200, message: 'Email sent successfully' };
|
return { code: 200, message: 'Email sent successfully' };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error sending email:', error);
|
console.error('Error sending email:', error);
|
||||||
|
|||||||
Generated
+184
-696
File diff suppressed because it is too large
Load Diff
@@ -24,24 +24,24 @@
|
|||||||
"@signpdf/placeholder-pdf-lib": "^3.2.4",
|
"@signpdf/placeholder-pdf-lib": "^3.2.4",
|
||||||
"@signpdf/signer-p12": "^3.2.4",
|
"@signpdf/signer-p12": "^3.2.4",
|
||||||
"@signpdf/signpdf": "^3.2.4",
|
"@signpdf/signpdf": "^3.2.4",
|
||||||
"aws-sdk": "^2.1687.0",
|
"aws-sdk": "^2.1691.0",
|
||||||
"axios": "^1.7.7",
|
"axios": "^1.7.7",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"express": "^4.21.0",
|
"express": "^4.21.0",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
"generate-api-key": "^1.0.2",
|
"generate-api-key": "^1.0.2",
|
||||||
"googleapis": "^140.0.1",
|
"googleapis": "^144.0.0",
|
||||||
"jsonschema": "^1.4.1",
|
"jsonschema": "^1.4.1",
|
||||||
"mailgun.js": "^10.2.3",
|
"mailgun.js": "^10.2.3",
|
||||||
"mongoose": "^8.6.1",
|
"mongoose": "^8.6.3",
|
||||||
"multer": "^1.4.5-lts.1",
|
"multer": "^1.4.5-lts.1",
|
||||||
"multer-s3": "^3.0.1",
|
"multer-s3": "^3.0.1",
|
||||||
"node-forge": "^1.3.1",
|
"node-forge": "^1.3.1",
|
||||||
"nodemailer": "^6.9.15",
|
"nodemailer": "^6.9.15",
|
||||||
"parse": "^5.3.0",
|
"parse": "^5.3.0",
|
||||||
"parse-dbtool": "^1.2.0",
|
"parse-dbtool": "^1.2.0",
|
||||||
"parse-server": "^7.2.0",
|
"parse-server": "^7.3.0-alpha.8",
|
||||||
"parse-server-api-mail-adapter": "^4.0.0",
|
"parse-server-api-mail-adapter": "^4.0.0",
|
||||||
"pdf-lib": "^1.17.1",
|
"pdf-lib": "^1.17.1",
|
||||||
"posthog-node": "^4.2.0",
|
"posthog-node": "^4.2.0",
|
||||||
@@ -50,11 +50,11 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/eslint-parser": "^7.25.1",
|
"@babel/eslint-parser": "^7.25.1",
|
||||||
"eslint": "^9.9.1",
|
"eslint": "^9.11.1",
|
||||||
"jasmine": "^5.3.0",
|
"jasmine": "^5.3.0",
|
||||||
"mongodb-runner": "^5.6.6",
|
"mongodb-runner": "^5.6.6",
|
||||||
"nodemon": "^3.1.4",
|
"nodemon": "^3.1.7",
|
||||||
"nyc": "^17.0.0",
|
"nyc": "^17.1.0",
|
||||||
"prettier": "^3.3.3"
|
"prettier": "^3.3.3"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
|
|||||||
Reference in New Issue
Block a user