Compare commits

...
3 Commits
Author SHA1 Message Date
prafull-opensignlabsandGitHub fca45ced38 Merge pull request #1663 from OpenSignLabs/updates-14122971328
v2.15.0
2025-03-28 11:37:55 +05:30
prafull-opensignlabs ac8ab70246 v2.15.0
v2.15.0
2025-03-28 06:02:14 +00:00
prafull-opensignlabsandGitHub 8373679f27 Merge pull request #1661 from OpenSignLabs/do_deploy
feat: update proxy file
2025-03-24 13:47:33 +05:30
29 changed files with 2648 additions and 2529 deletions
+78 -181
View File
@@ -14,12 +14,13 @@
"@radix-ui/themes": "^3.1.6", "@radix-ui/themes": "^3.1.6",
"@react-pdf/renderer": "^4.3.0", "@react-pdf/renderer": "^4.3.0",
"@reduxjs/toolkit": "^2.5.1", "@reduxjs/toolkit": "^2.5.1",
"axios": "^1.8.3", "axios": "^1.8.4",
"css-minimizer-webpack-plugin": "^7.0.2", "css-minimizer-webpack-plugin": "^7.0.2",
"date-fns-tz": "^3.2.0",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"i18next": "^23.16.8", "i18next": "^23.16.8",
"i18next-browser-languagedetector": "^8.0.2", "i18next-browser-languagedetector": "^8.0.4",
"i18next-http-backend": "^3.0.1", "i18next-http-backend": "^3.0.2",
"jszip": "^3.10.1", "jszip": "^3.10.1",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
"moment": "^2.30.1", "moment": "^2.30.1",
@@ -40,10 +41,10 @@
"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.4.0", "react-i18next": "^15.4.1",
"react-konva": "^18.2.10", "react-konva": "^18.2.10",
"react-pdf": "^9.2.1", "react-pdf": "^9.2.1",
"react-quill-new": "^3.4.1", "react-quill-new": "^3.4.6",
"react-redux": "^9.2.0", "react-redux": "^9.2.0",
"react-rnd": "^10.5.2", "react-rnd": "^10.5.2",
"react-router": "^7.1.5", "react-router": "^7.1.5",
@@ -69,17 +70,17 @@
"@babel/core": "^7.26.10", "@babel/core": "^7.26.10",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.26.9",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.26.3",
"@babel/runtime-corejs2": "^7.26.10", "@babel/runtime-corejs2": "^7.27.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"babel-loader": "^9.2.1", "babel-loader": "^10.0.0",
"commitizen": "^4.3.1", "commitizen": "^4.3.1",
"concurrently": "^9.1.2", "concurrently": "^9.1.2",
"css-loader": "^7.1.2", "css-loader": "^7.1.2",
"daisyui": "^4.12.23", "daisyui": "^4.12.23",
"dotenv": "^16.4.7", "dotenv": "^16.4.7",
"dotenv-webpack": "^8.1.0", "dotenv-webpack": "^8.1.0",
"eslint": "^9.22.0", "eslint": "^9.23.0",
"eslint-plugin-prettier": "^5.2.3", "eslint-plugin-prettier": "^5.2.5",
"eslint-plugin-react": "^7.37.4", "eslint-plugin-react": "^7.37.4",
"lint-staged": "^15.5.0", "lint-staged": "^15.5.0",
"mini-css-extract-plugin": "^2.9.2", "mini-css-extract-plugin": "^2.9.2",
@@ -1942,9 +1943,9 @@
} }
}, },
"node_modules/@babel/runtime-corejs2": { "node_modules/@babel/runtime-corejs2": {
"version": "7.26.10", "version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.26.10.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.27.0.tgz",
"integrity": "sha512-JfoPiD7f/vvd/PaOfu5cr9CyzwDMPg4T0nX3MQr6IgTq49DhjvUcmjmjA7j6+xih1Evq+QKZnge1SoIlYozv/Q==", "integrity": "sha512-89TgomkhiBKJ1QN/zPJbSW6M3T9caLoSDYsHFNlTI2Q+T12w8ehZeEnx54I79gB0kmM+etCC5Lfgv95rYUJPdQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -2588,9 +2589,9 @@
} }
}, },
"node_modules/@eslint/config-helpers": { "node_modules/@eslint/config-helpers": {
"version": "0.1.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz",
"integrity": "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==", "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2609,9 +2610,9 @@
} }
}, },
"node_modules/@eslint/eslintrc": { "node_modules/@eslint/eslintrc": {
"version": "3.3.0", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
"integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
@@ -2666,9 +2667,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "9.22.0", "version": "9.23.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz",
"integrity": "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==", "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3840,10 +3841,11 @@
} }
}, },
"node_modules/@pkgr/core": { "node_modules/@pkgr/core": {
"version": "0.1.1", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.0.tgz",
"integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "integrity": "sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==",
"dev": true, "dev": true,
"license": "MIT",
"engines": { "engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0" "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
}, },
@@ -8105,9 +8107,9 @@
} }
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.8.3", "version": "1.8.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
"integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.6",
@@ -8209,20 +8211,20 @@
} }
}, },
"node_modules/babel-loader": { "node_modules/babel-loader": {
"version": "9.2.1", "version": "10.0.0",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz",
"integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"find-cache-dir": "^4.0.0", "find-up": "^5.0.0"
"schema-utils": "^4.0.0"
}, },
"engines": { "engines": {
"node": ">= 14.15.0" "node": "^18.20.0 || ^20.10.0 || >=22.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@babel/core": "^7.12.0", "@babel/core": "^7.12.0",
"webpack": ">=5" "webpack": ">=5.61.0"
} }
}, },
"node_modules/babel-plugin-istanbul": { "node_modules/babel-plugin-istanbul": {
@@ -9623,12 +9625,6 @@
"node": ">= 12" "node": ">= 12"
} }
}, },
"node_modules/common-path-prefix": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
"integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
"dev": true
},
"node_modules/common-tags": { "node_modules/common-tags": {
"version": "1.8.2", "version": "1.8.2",
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
@@ -10677,6 +10673,15 @@
"url": "https://github.com/sponsors/kossnocorp" "url": "https://github.com/sponsors/kossnocorp"
} }
}, },
"node_modules/date-fns-tz": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz",
"integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==",
"license": "MIT",
"peerDependencies": {
"date-fns": "^3.0.0 || ^4.0.0"
}
},
"node_modules/debug": { "node_modules/debug": {
"version": "4.4.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
@@ -11692,18 +11697,18 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "9.22.0", "version": "9.23.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz",
"integrity": "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==", "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.12.1", "@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.19.2", "@eslint/config-array": "^0.19.2",
"@eslint/config-helpers": "^0.1.0", "@eslint/config-helpers": "^0.2.0",
"@eslint/core": "^0.12.0", "@eslint/core": "^0.12.0",
"@eslint/eslintrc": "^3.3.0", "@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.22.0", "@eslint/js": "9.23.0",
"@eslint/plugin-kit": "^0.2.7", "@eslint/plugin-kit": "^0.2.7",
"@humanfs/node": "^0.16.6", "@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
@@ -11828,13 +11833,14 @@
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
}, },
"node_modules/eslint-plugin-prettier": { "node_modules/eslint-plugin-prettier": {
"version": "5.2.3", "version": "5.2.5",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.5.tgz",
"integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", "integrity": "sha512-IKKP8R87pJyMl7WWamLgPkloB16dagPIdd2FjBDbyRYPKo93wS/NbCOPh6gH+ieNLC+XZrhJt/kWj0PS/DFdmg==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"prettier-linter-helpers": "^1.0.0", "prettier-linter-helpers": "^1.0.0",
"synckit": "^0.9.1" "synckit": "^0.10.2"
}, },
"engines": { "engines": {
"node": "^14.18.0 || >=16.0.0" "node": "^14.18.0 || >=16.0.0"
@@ -11845,7 +11851,7 @@
"peerDependencies": { "peerDependencies": {
"@types/eslint": ">=8.0.0", "@types/eslint": ">=8.0.0",
"eslint": ">=8.0.0", "eslint": ">=8.0.0",
"eslint-config-prettier": "*", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
"prettier": ">=3.0.0" "prettier": ">=3.0.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
@@ -12577,22 +12583,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}, },
"node_modules/find-cache-dir": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
"integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
"dev": true,
"dependencies": {
"common-path-prefix": "^3.0.0",
"pkg-dir": "^7.0.0"
},
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/find-node-modules": { "node_modules/find-node-modules": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz",
@@ -13824,23 +13814,25 @@
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
} }
], ],
"license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.23.2" "@babel/runtime": "^7.23.2"
} }
}, },
"node_modules/i18next-browser-languagedetector": { "node_modules/i18next-browser-languagedetector": {
"version": "8.0.2", "version": "8.0.4",
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.2.tgz", "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.4.tgz",
"integrity": "sha512-shBvPmnIyZeD2VU5jVGIOWP7u9qNG3Lj7mpaiPFpbJ3LVfHZJvVzKR4v1Cb91wAOFpNw442N+LGPzHOHsten2g==", "integrity": "sha512-f3frU3pIxD50/Tz20zx9TD9HobKYg47fmAETb117GKGPrhwcSSPJDoCposXlVycVebQ9GQohC3Efbpq7/nnJ5w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.23.2" "@babel/runtime": "^7.23.2"
} }
}, },
"node_modules/i18next-http-backend": { "node_modules/i18next-http-backend": {
"version": "3.0.1", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.1.tgz", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz",
"integrity": "sha512-XT2lYSkbAtDE55c6m7CtKxxrsfuRQO3rUfHzj8ZyRtY9CkIX3aRGwXGTkUhpGWce+J8n7sfu3J0f2wTzo7Lw0A==", "integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==",
"license": "MIT",
"dependencies": { "dependencies": {
"cross-fetch": "4.0.0" "cross-fetch": "4.0.0"
} }
@@ -19388,103 +19380,6 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/pkg-dir": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
"integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
"dev": true,
"dependencies": {
"find-up": "^6.3.0"
},
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-dir/node_modules/find-up": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
"dev": true,
"dependencies": {
"locate-path": "^7.1.0",
"path-exists": "^5.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-dir/node_modules/locate-path": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
"integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"dev": true,
"dependencies": {
"p-locate": "^6.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-dir/node_modules/p-limit": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"dev": true,
"dependencies": {
"yocto-queue": "^1.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-dir/node_modules/p-locate": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"dev": true,
"dependencies": {
"p-limit": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-dir/node_modules/path-exists": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
"dev": true,
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/pkg-dir/node_modules/yocto-queue": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
"integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
"dev": true,
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-up": { "node_modules/pkg-up": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
@@ -21924,9 +21819,10 @@
} }
}, },
"node_modules/react-i18next": { "node_modules/react-i18next": {
"version": "15.4.0", "version": "15.4.1",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.4.0.tgz", "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.4.1.tgz",
"integrity": "sha512-Py6UkX3zV08RTvL6ZANRoBh9sL/ne6rQq79XlkHEdd82cZr2H9usbWpUNVadJntIZP2pu3M2rL1CN+5rQYfYFw==", "integrity": "sha512-ahGab+IaSgZmNPYXdV1n+OYky95TGpFwnKRflX/16dY04DsYYKHtVLjeny7sBSCREEcoMbAgSkFiGLF5g5Oofw==",
"license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.25.0", "@babel/runtime": "^7.25.0",
"html-parse-stringify": "^3.0.1" "html-parse-stringify": "^3.0.1"
@@ -22026,9 +21922,9 @@
} }
}, },
"node_modules/react-quill-new": { "node_modules/react-quill-new": {
"version": "3.4.1", "version": "3.4.6",
"resolved": "https://registry.npmjs.org/react-quill-new/-/react-quill-new-3.4.1.tgz", "resolved": "https://registry.npmjs.org/react-quill-new/-/react-quill-new-3.4.6.tgz",
"integrity": "sha512-EM4EXlX3imgYH5H1Ml8OM0dXvb/hGtKXtzosrhF7MRiKqw5rDJSIDkty0x/L6yBiJzBycpLT24rCMtPELSQW9Q==", "integrity": "sha512-S2kEAwoKRo+xUIAEpb94fwiPe2QU3FmwIfQ+7Lkchf+izPa2nRu1mr4i4QxyVYg8TjHDryDUiOEYZuFEV45QFA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
@@ -26084,13 +25980,14 @@
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
}, },
"node_modules/synckit": { "node_modules/synckit": {
"version": "0.9.1", "version": "0.10.3",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.10.3.tgz",
"integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "integrity": "sha512-R1urvuyiTaWfeCggqEvpDJwAlDVdsT9NM+IP//Tk2x7qHCkSvBk/fwFgw/TLAHzZlrAnnazMcRw0ZD8HlYFTEQ==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@pkgr/core": "^0.1.0", "@pkgr/core": "^0.2.0",
"tslib": "^2.6.2" "tslib": "^2.8.1"
}, },
"engines": { "engines": {
"node": "^14.18.0 || >=16.0.0" "node": "^14.18.0 || >=16.0.0"
+10 -9
View File
@@ -9,12 +9,13 @@
"@radix-ui/themes": "^3.1.6", "@radix-ui/themes": "^3.1.6",
"@react-pdf/renderer": "^4.3.0", "@react-pdf/renderer": "^4.3.0",
"@reduxjs/toolkit": "^2.5.1", "@reduxjs/toolkit": "^2.5.1",
"axios": "^1.8.3", "axios": "^1.8.4",
"css-minimizer-webpack-plugin": "^7.0.2", "css-minimizer-webpack-plugin": "^7.0.2",
"date-fns-tz": "^3.2.0",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"i18next": "^23.16.8", "i18next": "^23.16.8",
"i18next-browser-languagedetector": "^8.0.2", "i18next-browser-languagedetector": "^8.0.4",
"i18next-http-backend": "^3.0.1", "i18next-http-backend": "^3.0.2",
"jszip": "^3.10.1", "jszip": "^3.10.1",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
"moment": "^2.30.1", "moment": "^2.30.1",
@@ -35,10 +36,10 @@
"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.4.0", "react-i18next": "^15.4.1",
"react-konva": "^18.2.10", "react-konva": "^18.2.10",
"react-pdf": "^9.2.1", "react-pdf": "^9.2.1",
"react-quill-new": "^3.4.1", "react-quill-new": "^3.4.6",
"react-redux": "^9.2.0", "react-redux": "^9.2.0",
"react-rnd": "^10.5.2", "react-rnd": "^10.5.2",
"react-router": "^7.1.5", "react-router": "^7.1.5",
@@ -99,17 +100,17 @@
"@babel/core": "^7.26.10", "@babel/core": "^7.26.10",
"@babel/preset-env": "^7.26.9", "@babel/preset-env": "^7.26.9",
"@babel/preset-react": "^7.26.3", "@babel/preset-react": "^7.26.3",
"@babel/runtime-corejs2": "^7.26.10", "@babel/runtime-corejs2": "^7.27.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"babel-loader": "^9.2.1", "babel-loader": "^10.0.0",
"commitizen": "^4.3.1", "commitizen": "^4.3.1",
"concurrently": "^9.1.2", "concurrently": "^9.1.2",
"css-loader": "^7.1.2", "css-loader": "^7.1.2",
"daisyui": "^4.12.23", "daisyui": "^4.12.23",
"dotenv": "^16.4.7", "dotenv": "^16.4.7",
"dotenv-webpack": "^8.1.0", "dotenv-webpack": "^8.1.0",
"eslint": "^9.22.0", "eslint": "^9.23.0",
"eslint-plugin-prettier": "^5.2.3", "eslint-plugin-prettier": "^5.2.5",
"eslint-plugin-react": "^7.37.4", "eslint-plugin-react": "^7.37.4",
"lint-staged": "^15.5.0", "lint-staged": "^15.5.0",
"mini-css-extract-plugin": "^2.9.2", "mini-css-extract-plugin": "^2.9.2",
@@ -458,6 +458,7 @@
"placeholder-alert-3": "Sind Sie sicher, dass Sie dieses Dokument zur Unterzeichnung senden möchten?", "placeholder-alert-3": "Sind Sie sicher, dass Sie dieses Dokument zur Unterzeichnung senden möchten?",
"placeholder-alert-4": "Sie haben erfolgreich E-Mails an alle Empfänger gesendet!", "placeholder-alert-4": "Sie haben erfolgreich E-Mails an alle Empfänger gesendet!",
"placeholder-mail-alert": "Sie haben erfolgreich eine E-Mail an {{name}} gesendet. Die nachfolgenden Unterzeichner erhalten eine E-Mail, sobald {{name}} das Dokument unterzeichnet.", "placeholder-mail-alert": "Sie haben erfolgreich eine E-Mail an {{name}} gesendet. Die nachfolgenden Unterzeichner erhalten eine E-Mail, sobald {{name}} das Dokument unterzeichnet.",
"placeholder-mail-alert-you": "Nachfolgende Unterzeichner erhalten E-Mails, sobald Sie das Dokument unterschreiben.",
"placeholder-alert-5": "Möchten Sie die Dokumente jetzt unterschreiben?", "placeholder-alert-5": "Möchten Sie die Dokumente jetzt unterschreiben?",
"placeholder-alert-6": "Bitte richten Sie den E-Mail-Adapter ein, um E-Mails zu senden!", "placeholder-alert-6": "Bitte richten Sie den E-Mail-Adapter ein, um E-Mails zu senden!",
"placeholder-alert-7": "Bitte wählen Sie einen Unterzeichner aus, um Platzhalter hinzuzufügen!", "placeholder-alert-7": "Bitte wählen Sie einen Unterzeichner aus, um Platzhalter hinzuzufügen!",
@@ -856,5 +857,11 @@
"enabled-signature-type-help": "Die Einstellung 'Aktivierte Signaturtypen' bestimmt, welche Signaturoptionen in Ihrer Organisation verfügbar sind. Wenn Sie beispielsweise die Option 'Zeichnen' deaktivieren, wird sie den Mitgliedern Ihrer Organisation im Signatur-Widget nicht angezeigt, während die anderen drei Optionen weiterhin zugänglich bleiben.", "enabled-signature-type-help": "Die Einstellung 'Aktivierte Signaturtypen' bestimmt, welche Signaturoptionen in Ihrer Organisation verfügbar sind. Wenn Sie beispielsweise die Option 'Zeichnen' deaktivieren, wird sie den Mitgliedern Ihrer Organisation im Signatur-Widget nicht angezeigt, während die anderen drei Optionen weiterhin zugänglich bleiben.",
"indexing-public-profile": "Erlaube die Indexierung des öffentlichen Profils durch Suchmaschinen", "indexing-public-profile": "Erlaube die Indexierung des öffentlichen Profils durch Suchmaschinen",
"user-created-successfully": "Benutzer erfolgreich erstellt.", "user-created-successfully": "Benutzer erfolgreich erstellt.",
"only-15-reminder-allowed": "Sie können bis zu 15 automatische Erinnerungen festlegen. Wenn zum Beispiel 'TimeToComplete' auf 15 Tage und 'RemindOnceInEvery' auf 1 Tag eingestellt ist, erreichen Sie das maximale Limit von 15 Erinnerungen. Passen Sie Ihre Einstellungen entsprechend an." "only-15-reminder-allowed": "Sie können bis zu 15 automatische Erinnerungen festlegen. Wenn zum Beispiel 'TimeToComplete' auf 15 Tage und 'RemindOnceInEvery' auf 1 Tag eingestellt ist, erreichen Sie das maximale Limit von 15 Erinnerungen. Passen Sie Ihre Einstellungen entsprechend an.",
"rate-your-experience": "👋 Bitte bewerten Sie Ihre Erfahrung mit Opensign",
"thanks-for-feedback": "Danke für Ihr Feedback 🙏",
"share-your-feedback": "Teilen Sie Ihr Feedback",
"share-your-review": "Teilen Sie Ihre Bewertung",
"date-format": "Datumsformat",
"document-deleted": "Das Dokument wurde gelöscht oder Sie haben keinen Zugriff. Bitte kontaktieren Sie den Absender."
} }
@@ -458,6 +458,7 @@
"placeholder-alert-3": " Are you sure you want to send out this document for signatures?", "placeholder-alert-3": " Are you sure you want to send out this document for signatures?",
"placeholder-alert-4": "You have successfully sent mails to all recipients!", "placeholder-alert-4": "You have successfully sent mails to all recipients!",
"placeholder-mail-alert": "You have successfully sent email to {{name}}. Subsequent signers will get email(s) once {{name}} signs the document", "placeholder-mail-alert": "You have successfully sent email to {{name}}. Subsequent signers will get email(s) once {{name}} signs the document",
"placeholder-mail-alert-you": "Subsequent signers will get email(s) once you signs the document.",
"placeholder-alert-5": "Do you want to sign the document right now?", "placeholder-alert-5": "Do you want to sign the document right now?",
"placeholder-alert-6": "Please setup mail adapter to send mail!", "placeholder-alert-6": "Please setup mail adapter to send mail!",
"placeholder-alert-7": "Please select signer for add placeholder!", "placeholder-alert-7": "Please select signer for add placeholder!",
@@ -856,5 +857,11 @@
"enabled-signature-type-help": "The 'Enabled Signature Types' setting determines which signature options are available across your organization. For example, if you disable the 'Draw' option, members of your organization will not see it in the signature widget, while the other three options will remain accessible.", "enabled-signature-type-help": "The 'Enabled Signature Types' setting determines which signature options are available across your organization. For example, if you disable the 'Draw' option, members of your organization will not see it in the signature widget, while the other three options will remain accessible.",
"indexing-public-profile": "Allow indexing of public profile by search engines", "indexing-public-profile": "Allow indexing of public profile by search engines",
"user-created-successfully": "user created successfully.", "user-created-successfully": "user created successfully.",
"only-15-reminder-allowed": "You can set up to 15 automatic reminders. For example, if 'TimeToComplete' is 15 days and 'RemindOnceInEvery' is 1 day, you'll reach the maximum limit of 15 reminders. Adjust your settings accordingly." "only-15-reminder-allowed": "You can set up to 15 automatic reminders. For example, if 'TimeToComplete' is 15 days and 'RemindOnceInEvery' is 1 day, you'll reach the maximum limit of 15 reminders. Adjust your settings accordingly.",
"rate-your-experience": "👋 Please rate your experience with Opensign",
"thanks-for-feedback": "Thanks for your feedback 🙏",
"share-your-feedback": "Share your feedback",
"share-your-review": "Share your review",
"date-format": "Date format",
"document-deleted": "The document has been deleted or you don't have access. Please contact the sender."
} }
@@ -458,6 +458,7 @@
"placeholder-alert-3": " ¿En definitiva quieres enviar este documento para ser firmado?", "placeholder-alert-3": " ¿En definitiva quieres enviar este documento para ser firmado?",
"placeholder-alert-4": "¡Has enviado exitosamente correos a todos los destinatarios!", "placeholder-alert-4": "¡Has enviado exitosamente correos a todos los destinatarios!",
"placeholder-mail-alert": "Has enviado un correo electrónico con éxito a {{name}}. Los siguientes firmantes recibirán un correo electrónico una vez que {{name}} firme el documento.", "placeholder-mail-alert": "Has enviado un correo electrónico con éxito a {{name}}. Los siguientes firmantes recibirán un correo electrónico una vez que {{name}} firme el documento.",
"placeholder-mail-alert-you": "Los firmantes posteriores recibirán correos electrónicos una vez que firme el documento.",
"placeholder-alert-5": "¿Quieres firmar documentos ahora mismo?", "placeholder-alert-5": "¿Quieres firmar documentos ahora mismo?",
"placeholder-alert-6": "¡Por favor, configura el adaptador de correo para enviar correos!", "placeholder-alert-6": "¡Por favor, configura el adaptador de correo para enviar correos!",
"placeholder-alert-7": "¡Por favor, selecciona un firmante para agregar un marcador de posición!", "placeholder-alert-7": "¡Por favor, selecciona un firmante para agregar un marcador de posición!",
@@ -856,5 +857,11 @@
"enabled-signature-type-help": "La configuración de 'Tipos de firma habilitados' determina qué opciones de firma están disponibles en su organización. Por ejemplo, si desactiva la opción 'Dibujar', los miembros de su organización no la verán en el widget de firma, mientras que las otras tres opciones seguirán siendo accesibles.", "enabled-signature-type-help": "La configuración de 'Tipos de firma habilitados' determina qué opciones de firma están disponibles en su organización. Por ejemplo, si desactiva la opción 'Dibujar', los miembros de su organización no la verán en el widget de firma, mientras que las otras tres opciones seguirán siendo accesibles.",
"indexing-public-profile": "Permitir la indexación del perfil público por los motores de búsqueda", "indexing-public-profile": "Permitir la indexación del perfil público por los motores de búsqueda",
"user-created-successfully": "Usuario creado con éxito.", "user-created-successfully": "Usuario creado con éxito.",
"only-15-reminder-allowed": "Puede configurar hasta 15 recordatorios automáticos. Por ejemplo, si 'TimeToComplete' es de 15 días y 'RemindOnceInEvery' es de 1 día, alcanzará el límite máximo de 15 recordatorios. Ajuste su configuración en consecuencia." "only-15-reminder-allowed": "Puede configurar hasta 15 recordatorios automáticos. Por ejemplo, si 'TimeToComplete' es de 15 días y 'RemindOnceInEvery' es de 1 día, alcanzará el límite máximo de 15 recordatorios. Ajuste su configuración en consecuencia.",
"rate-your-experience": "👋 Por favor, califique su experiencia con Opensign",
"thanks-for-feedback": "Gracias por su comentario 🙏",
"share-your-feedback": "Comparta sus comentarios",
"share-your-review": "Comparta su reseña",
"date-format": "Formato de fecha",
"document-deleted": "El documento ha sido eliminado o no tiene acceso. Por favor, contacte al remitente."
} }
@@ -458,6 +458,7 @@
"placeholder-alert-3": "Etes-vous sûr de vouloir envoyer ce document pour signature ? ", "placeholder-alert-3": "Etes-vous sûr de vouloir envoyer ce document pour signature ? ",
"placeholder-alert-4": "Vous avez envoyé avec succès des mails à tous les", "placeholder-alert-4": "Vous avez envoyé avec succès des mails à tous les",
"placeholder-mail-alert": "Vous avez envoyé un e-mail avec succès à {{name}}. Les signataires suivants recevront un e-mail une fois que {{name}} aura signé le document.", "placeholder-mail-alert": "Vous avez envoyé un e-mail avec succès à {{name}}. Les signataires suivants recevront un e-mail une fois que {{name}} aura signé le document.",
"placeholder-mail-alert-you": "Les signataires suivants recevront un e-mail dès que vous signez le document.",
"placeholder-alert-5": "Voulez-vous signer des documents maintenant ?", "placeholder-alert-5": "Voulez-vous signer des documents maintenant ?",
"placeholder-alert-6": "Veuillez configurer l'adaptateur de messagerie pour envoyer du courrier !", "placeholder-alert-6": "Veuillez configurer l'adaptateur de messagerie pour envoyer du courrier !",
"placeholder-alert-7": "Veuillez sélectionner le signataire pour ajouter un espace réservé !", "placeholder-alert-7": "Veuillez sélectionner le signataire pour ajouter un espace réservé !",
@@ -856,5 +857,11 @@
"enabled-signature-type-help": "Le paramètre 'Types de signature activés' détermine quelles options de signature sont disponibles dans votre organisation. Par exemple, si vous désactivez l'option 'Dessiner', les membres de votre organisation ne la verront pas dans le widget de signature, tandis que les trois autres options resteront accessibles.", "enabled-signature-type-help": "Le paramètre 'Types de signature activés' détermine quelles options de signature sont disponibles dans votre organisation. Par exemple, si vous désactivez l'option 'Dessiner', les membres de votre organisation ne la verront pas dans le widget de signature, tandis que les trois autres options resteront accessibles.",
"indexing-public-profile": "Autoriser l'indexation du profil public par les moteurs de recherche", "indexing-public-profile": "Autoriser l'indexation du profil public par les moteurs de recherche",
"user-created-successfully": "Utilisateur créé avec succès.", "user-created-successfully": "Utilisateur créé avec succès.",
"only-15-reminder-allowed": "Vous pouvez définir jusqu'à 15 rappels automatiques. Par exemple, si 'TimeToComplete' est de 15 jours et 'RemindOnceInEvery' est de 1 jour, vous atteindrez la limite maximale de 15 rappels. Ajustez vos paramètres en conséquence." "only-15-reminder-allowed": "Vous pouvez définir jusqu'à 15 rappels automatiques. Par exemple, si 'TimeToComplete' est de 15 jours et 'RemindOnceInEvery' est de 1 jour, vous atteindrez la limite maximale de 15 rappels. Ajustez vos paramètres en conséquence.",
"rate-your-experience": "👋 Veuillez évaluer votre expérience avec Opensign",
"thanks-for-feedback": "Merci pour votre retour 🙏",
"share-your-feedback": "Partagez votre avis",
"share-your-review": "Partagez votre avis",
"date-format": "Format de date",
"document-deleted": "Le document a été supprimé ou vous n'y avez pas accès. Veuillez contacter l'expéditeur."
} }
@@ -458,6 +458,7 @@
"placeholder-alert-3": "Sei sicuro di voler inviare questo documento per le firme?", "placeholder-alert-3": "Sei sicuro di voler inviare questo documento per le firme?",
"placeholder-alert-4": "Hai inviato con successo le mail a tutti i destinatari!", "placeholder-alert-4": "Hai inviato con successo le mail a tutti i destinatari!",
"placeholder-mail-alert": "Hai inviato con successo un'e-mail a {{name}}. I firmatari successivi riceveranno un'e-mail una volta che {{name}} avrà firmato il documento.", "placeholder-mail-alert": "Hai inviato con successo un'e-mail a {{name}}. I firmatari successivi riceveranno un'e-mail una volta che {{name}} avrà firmato il documento.",
"placeholder-mail-alert-you": "I firmatari successivi riceveranno un'email non appena firmi il documento.",
"placeholder-alert-5": "Vuoi firmare i documenti ora?", "placeholder-alert-5": "Vuoi firmare i documenti ora?",
"placeholder-alert-6": "Configura l'adattatore email per inviare mail!", "placeholder-alert-6": "Configura l'adattatore email per inviare mail!",
"placeholder-alert-7": "Seleziona il firmatario per aggiungere un segnaposto!", "placeholder-alert-7": "Seleziona il firmatario per aggiungere un segnaposto!",
@@ -856,5 +857,11 @@
"enabled-signature-type-help": "L'impostazione 'Tipi di firma abilitati' determina quali opzioni di firma sono disponibili nella tua organizzazione. Ad esempio, se disabiliti l'opzione 'Disegna', i membri della tua organizzazione non la vedranno nel widget della firma, mentre le altre tre opzioni resteranno accessibili.", "enabled-signature-type-help": "L'impostazione 'Tipi di firma abilitati' determina quali opzioni di firma sono disponibili nella tua organizzazione. Ad esempio, se disabiliti l'opzione 'Disegna', i membri della tua organizzazione non la vedranno nel widget della firma, mentre le altre tre opzioni resteranno accessibili.",
"indexing-public-profile": "Consenti l'indicizzazione del profilo pubblico dai motori di ricerca", "indexing-public-profile": "Consenti l'indicizzazione del profilo pubblico dai motori di ricerca",
"user-created-successfully": "Utente creato con successo.", "user-created-successfully": "Utente creato con successo.",
"only-15-reminder-allowed": "Puoi impostare fino a 15 promemoria automatici. Ad esempio, se 'TimeToComplete' è di 15 giorni e 'RemindOnceInEvery' è di 1 giorno, raggiungerai il limite massimo di 15 promemoria. Regola le tue impostazioni di conseguenza." "only-15-reminder-allowed": "Puoi impostare fino a 15 promemoria automatici. Ad esempio, se 'TimeToComplete' è di 15 giorni e 'RemindOnceInEvery' è di 1 giorno, raggiungerai il limite massimo di 15 promemoria. Regola le tue impostazioni di conseguenza.",
"rate-your-experience": "👋 Valuta la tua esperienza con Opensign",
"thanks-for-feedback": "Grazie per il tuo feedback 🙏",
"share-your-feedback": "Condividi il tuo feedback",
"share-your-review": "Condividi la tua recensione",
"date-format": "Formato data",
"document-deleted": "Il documento è stato eliminato o non hai accesso. Si prega di contattare il mittente."
} }
@@ -30,10 +30,17 @@ function DraftDocument() {
documentData === "Error: Something went wrong!" || documentData === "Error: Something went wrong!" ||
(documentData.result && documentData.result.error) (documentData.result && documentData.result.error)
) { ) {
if (documentData?.result?.error?.includes("deleted")) {
setIsLoading({
isLoader: false,
message: t("document-deleted")
});
} else {
setIsLoading({ setIsLoading({
isLoader: false, isLoader: false,
message: t("something-went-wrong-mssg") message: t("something-went-wrong-mssg")
}); });
}
} else { } else {
setIsLoading({ isLoader: false, message: t("no-data") }); setIsLoading({ isLoader: false, message: t("no-data") });
} }
@@ -5,6 +5,7 @@ import Loader from "../../primitives/Loader";
import ModalUi from "../../primitives/ModalUi"; import ModalUi from "../../primitives/ModalUi";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import Parse from "parse"; import Parse from "parse";
function EmailComponent({ function EmailComponent({
isEmail, isEmail,
setIsEmail, setIsEmail,
@@ -20,6 +21,7 @@ function EmailComponent({
const [emailErr, setEmailErr] = useState(false); const [emailErr, setEmailErr] = useState(false);
const [isDownloading, setIsDownloading] = useState(""); const [isDownloading, setIsDownloading] = useState("");
const isAndroid = /Android/i.test(navigator.userAgent); const isAndroid = /Android/i.test(navigator.userAgent);
//function for send email //function for send email
const sendEmail = async () => { const sendEmail = async () => {
setIsLoading(true); setIsLoading(true);
@@ -105,7 +107,7 @@ function EmailComponent({
</div> </div>
)} )}
<div className="flex justify-between items-center py-[10px] px-[20px] border-b-[1px] border-base-content"> <div className="flex justify-between items-center py-[10px] px-[20px] border-b-[1px] border-base-content">
<span className="text-base-content font-semibold"> <span className="text-base-content font-bold text-sm md:text-lg">
{t("successfully-signed")} {t("successfully-signed")}
</span> </span>
<div className="flex flex-row"> <div className="flex flex-row">
@@ -114,14 +116,14 @@ function EmailComponent({
onClick={(e) => onClick={(e) =>
handleToPrint(e, setIsDownloading, pdfDetails) handleToPrint(e, setIsDownloading, pdfDetails)
} }
className="op-btn op-btn-neutral op-btn-sm text-[15px]" className="op-btn op-btn-neutral op-btn-sm text-xs md:text-[15px]"
> >
<i className="fa-light fa-print" aria-hidden="true"></i> <i className="fa-light fa-print" aria-hidden="true"></i>
{t("print")} {t("print")}
</button> </button>
)} )}
<button <button
className="op-btn op-btn-primary op-btn-sm text-[15px] ml-2" className="op-btn op-btn-primary op-btn-sm text-xs md:text-[15px] ml-2"
onClick={() => { onClick={() => {
handleClose(); handleClose();
setIsDownloadModal(true); setIsDownloadModal(true);
@@ -137,12 +139,12 @@ function EmailComponent({
{t("email-mssg")} {t("email-mssg")}
</p> </p>
{emailList.length > 0 ? ( {emailList.length > 0 ? (
<div className="p-0 border-[1.5px] op-border-primary rounded w-full text-[15px]"> <div className="p-0 border-[1px] op-border-primary w-full rounded-md text-[15px] overflow-hidden">
<div className="flex flex-row flex-wrap"> <div className="flex flex-row flex-wrap">
{emailList.map((data, ind) => { {emailList.map((data, ind) => {
return ( return (
<div <div
className="flex flex-row items-center op-bg-primary m-[4px] rounded-md py-[5px] px-[10px]" className="flex flex-row items-center op-bg-primary mx-[2px] mt-[2px] rounded-md py-[5px] px-[10px]"
key={ind} key={ind}
> >
<span className="text-base-100 text-[13px]"> <span className="text-base-100 text-[13px]">
@@ -162,7 +164,7 @@ function EmailComponent({
<input <input
type="email" type="email"
value={emailValue} value={emailValue}
className="p-[10px] pb-[20px] rounded w-full text-[15px] bg-transparent outline-none" className="p-[10px] rounded-md w-full text-[15px] bg-transparent outline-none"
onChange={handleEmailValue} onChange={handleEmailValue}
onKeyDown={handleEnterPress} onKeyDown={handleEnterPress}
onBlur={() => emailValue && handleEnterPress("add")} onBlur={() => emailValue && handleEnterPress("add")}
@@ -179,7 +181,7 @@ function EmailComponent({
<input <input
type="email" type="email"
value={emailValue} value={emailValue}
className="p-[10px] pb-[20px] rounded w-full text-[15px] outline-none bg-transparent border-[1.5px] op-border-primary" className="p-[10px] pb-[20px] rounded-md w-full text-[15px] outline-none bg-transparent border-[1px] op-border-primary"
onChange={handleEmailValue} onChange={handleEmailValue}
onKeyDown={handleEnterPress} onKeyDown={handleEnterPress}
placeholder={t("enter-email-plaholder")} placeholder={t("enter-email-plaholder")}
@@ -197,7 +199,7 @@ function EmailComponent({
{t("email-error-1")} {t("email-error-1")}
</p> </p>
)} )}
<button {/* <button
className={`${ className={`${
emailValue ? "cursor-pointer" : "cursor-default" emailValue ? "cursor-pointer" : "cursor-default"
} op-btn op-btn-primary op-btn-sm m-2 shadow-md`} } op-btn op-btn-primary op-btn-sm m-2 shadow-md`}
@@ -205,12 +207,12 @@ function EmailComponent({
> >
<i className="fa-light fa-plus" aria-hidden="true"></i> <i className="fa-light fa-plus" aria-hidden="true"></i>
</button> </button>
<div className="bg-[#e3e2e1] mt-[10px] p-[5px] rounded"> <div className="bg-[#e3e2e1] mt-[10px] p-[5px] rounded">
<span className="font-bold">{t("report-heading.Note")}: </span> <span className="font-bold">{t("report-heading.Note")}: </span>
<span className="text-[15px]">{t("email-error-2")}</span> <span className="text-[15px]">{t("email-error-2")}</span>
</div> </div>
<hr className="w-full my-[15px] bg-base-content" /> <hr className="w-full my-[15px] bg-base-content" /> */}
<div className="mt-2">
<button <button
type="button" type="button"
className="op-btn op-btn-secondary" className="op-btn op-btn-secondary"
@@ -226,6 +228,7 @@ function EmailComponent({
{t("close")} {t("close")}
</button> </button>
</div> </div>
</div>
</ModalUi> </ModalUi>
)} )}
</div> </div>
@@ -1,64 +1,75 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { formatDateTime } from "../../../constant/Utils";
import { useTranslation } from "react-i18next";
const DateFormatSelector = (props) => { const DateFormatSelector = (props) => {
const { t } = useTranslation();
const date = new Date();
const [selectedFormat, setSelectedFormat] = useState(props.dateFormat); const [selectedFormat, setSelectedFormat] = useState(props.dateFormat);
const [is12Hour, setIs12Hour] = useState(props?.is12HourTime);
const defaultDate = new Date(); const dateFormats = [
const numDate = { year: "numeric", month: "2-digit", day: "2-digit" }; "MM/DD/YYYY",
const shortMonthDate = { year: "numeric", month: "short", day: "2-digit" }; "MMMM DD, YYYY",
const longMonthDate = { year: "numeric", month: "long", day: "2-digit" }; "DD MMMM, YYYY",
const dateFormats = { "DD-MM-YYYY",
"MM/DD/YYYY": (date) => "DD MMM, YYYY",
new Intl.DateTimeFormat("en-US", numDate).format(date), "YYYY-MM-DD",
"MMMM DD, YYYY": (date) => "MM-DD-YYYY",
new Intl.DateTimeFormat("en-US", longMonthDate).format(date), "MM.DD.YYYY",
"DD MMMM, YYYY": (date) => "MMM DD, YYYY"
new Intl.DateTimeFormat("en-GB", longMonthDate).format(date), ];
"DD-MM-YYYY": (date) =>
new Intl.DateTimeFormat("fr-FR", numDate)
.format(date)
.replace(/\//g, "-"),
"DD MMM, YYYY": (date) =>
new Intl.DateTimeFormat("en-GB", shortMonthDate).format(date),
"YYYY-MM-DD": (date) =>
new Intl.DateTimeFormat("sv-SE", numDate).format(date),
"MM-DD-YYYY": (date) =>
new Intl.DateTimeFormat("en-US", numDate)
.format(date)
.replace(/\//g, "-"),
"MM.DD.YYYY": (date) =>
new Intl.DateTimeFormat("de-DE", numDate)
.format(date)
.replace(/^(\d{2})\.(\d{2})\.(\d{4})$/, "$2.$1.$3"), // Swap day and month to MM.DD.YYYY
"MMM DD, YYYY": (date) =>
new Intl.DateTimeFormat("en-US", shortMonthDate).format(date)
};
// Handle format change // Handle format change
const handleFormatChange = (event) => { const handleFormatChange = (event) => {
setSelectedFormat(event.target.value); setSelectedFormat(event.target.value);
props.setDateFormat && props.setDateFormat(event.target.value); props.setDateFormat && props.setDateFormat(event.target.value);
}; };
const handleHrInput = () => {
setIs12Hour(!is12Hour);
props.setIs12HourTime && props.setIs12HourTime(!is12Hour);
};
return ( return (
<div className="max-w-[400px] pr-[20px]"> <div className="max-w-[400px] pr-[20px]">
<label className="text-[14px] mb-[0.7rem] font-medium"> <label className="text-[14px] mb-[0.7rem] font-medium">
Select default date format for date widget {t("date-format")}
</label> </label>
<select <select
className="op-select op-select-bordered op-select-sm focus:outline-none hover:border-base-content w-full h-full text-[11px]" className="op-select op-select-bordered op-select-sm focus:outline-none hover:border-base-content w-full h-full text-[11px]"
value={selectedFormat} value={selectedFormat}
onChange={handleFormatChange} onChange={handleFormatChange}
> >
{Object.keys(dateFormats).map((format) => ( {dateFormats.map((format) => (
<option key={format} value={format}> <option key={format} value={format}>
{format} {format}
</option> </option>
))} ))}
</select> </select>
<div className="flex flex-col md:flex-row md:gap-4 mt-[0.75rem] text-[12px]">
<div className="flex items-center gap-2 ml-2">
<input
type="radio"
value={true}
className="op-radio op-radio-xs"
checked={is12Hour}
onChange={handleHrInput}
/>
<div className="text-center">12 hr</div>
</div>
<div className="flex items-center gap-2 ml-2">
<input
type="radio"
value={false}
className="op-radio op-radio-xs"
checked={!is12Hour}
onChange={handleHrInput}
/>
<div className="text-center">24 hr</div>
</div>
</div>
<p className="mt-[12px] ml-[10px] text-[13px] font-medium"> <p className="mt-[12px] ml-[10px] text-[13px] font-medium">
<strong> <strong>
Formatted Date:{" "} {formatDateTime(date, selectedFormat, props?.timezone, is12Hour)}
{selectedFormat && dateFormats?.[selectedFormat]?.(defaultDate)}
</strong> </strong>
</p> </p>
</div> </div>
@@ -1,10 +1,10 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
import AsyncSelect from "react-select/async"; import AsyncSelect from "react-select/async";
import AddSigner from "../../AddSigner"; import AddContact from "../../../primitives/AddContact";
import Parse from "parse";
import Tooltip from "../../../primitives/Tooltip"; import Tooltip from "../../../primitives/Tooltip";
import { createPortal } from "react-dom"; import { createPortal } from "react-dom";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { findContact } from "../../../constant/Utils";
function arrayMove(array, from, to) { function arrayMove(array, from, to) {
array = array.slice(); array = array.slice();
array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]); array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
@@ -103,17 +103,21 @@ const SignersInput = (props) => {
// `handleNewDetails` is used to set just save from quick form to selected option in dropdown // `handleNewDetails` is used to set just save from quick form to selected option in dropdown
const handleNewDetails = (data) => { const handleNewDetails = (data) => {
setState([...state, data]); const user = {
value: data["objectId"],
label: data["Name"],
email: data?.Email
};
setState([...state, user]);
if (selected.length > 0) { if (selected.length > 0) {
setSelected([...selected, data]); setSelected([...selected, user]);
} else { } else {
setSelected([data]); setSelected([user]);
} }
}; };
const loadOptions = async (inputValue) => { const loadOptions = async (inputValue) => {
try { try {
const params = { search: inputValue }; const contactRes = await findContact(inputValue);
const contactRes = await Parse.Cloud.run("getsigners", params);
if (contactRes) { if (contactRes) {
const res = JSON.parse(JSON.stringify(contactRes)); const res = JSON.parse(JSON.stringify(contactRes));
//compareArrays is a function where compare between two array (total signersList and dcument signers list) //compareArrays is a function where compare between two array (total signersList and dcument signers list)
@@ -148,7 +152,9 @@ const SignersInput = (props) => {
{props.label ? props.label : t("signers")} {props.label ? props.label : t("signers")}
{props.required && <span className="text-red-500 text-[13px]">*</span>} {props.required && <span className="text-red-500 text-[13px]">*</span>}
<span <span
className={`z-[${props?.helptextZindex ? props.helptextZindex : 30}] absolute ml-1 text-xs`} className={`z-[${
props?.helptextZindex ? props.helptextZindex : 30
}] absolute ml-1 text-xs`}
> >
<Tooltip <Tooltip
id={`${props.label ? props.label : "signers"}-tooltip`} id={`${props.label ? props.label : "signers"}-tooltip`}
@@ -209,9 +215,8 @@ const SignersInput = (props) => {
</button> </button>
{isModal && ( {isModal && (
<AddSigner <AddContact
valueKey={"objectId"} isDisableTitle
displayKey={"Name"}
details={handleNewDetails} details={handleNewDetails}
closePopup={handleModalCloseClick} closePopup={handleModalCloseClick}
/> />
@@ -7,27 +7,10 @@ const TimezoneSelector = (props) => {
// Intl.DateTimeFormat().resolvedOptions().timeZone // Default to the user's local timezone // Intl.DateTimeFormat().resolvedOptions().timeZone // Default to the user's local timezone
const onChangeTimezone = (timezone) => { const onChangeTimezone = (timezone) => {
setSelectedTimezone(timezone); setSelectedTimezone(timezone?.value);
props.setTimezone && props.setTimezone(timezone?.value); props.setTimezone && props.setTimezone(timezone?.value);
}; };
// Format date and time for the selected timezone
const formatDate = (date, timezone) => {
return timezone
? new Intl.DateTimeFormat("en-US", {
weekday: "short",
year: "numeric",
month: "short",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
timeZone: timezone,
hour12: false
}).format(date)
: new Date(date).toUTCString();
};
return ( return (
<> <>
<div className="max-w-[400px] pr-[20px]"> <div className="max-w-[400px] pr-[20px]">
@@ -54,11 +37,6 @@ const TimezoneSelector = (props) => {
}} }}
/> />
</div> </div>
<div className="mt-[12px] ml-[10px] text-[13px]">
<strong>
{formatDate(new Date(), selectedTimezone?.value || selectedTimezone)}
</strong>{" "}
</div>
</> </>
); );
}; };
+4 -3
View File
@@ -3,8 +3,7 @@ import { useTranslation } from "react-i18next";
import { NavLink } from "react-router"; import { NavLink } from "react-router";
const Menu = ({ item, isOpen, closeSidebar }) => { const Menu = ({ item, isOpen, closeSidebar }) => {
const appName = const appName = "OpenSign™";
"OpenSign™";
const drivename = appName === "OpenSign™" ? "OpenSign™" : ""; const drivename = appName === "OpenSign™" ? "OpenSign™" : "";
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
@@ -18,13 +17,15 @@ const Menu = ({ item, isOpen, closeSidebar }) => {
className={({ isActive }) => className={({ isActive }) =>
`${ `${
isActive ? " bg-base-300 text-base-content" : "" isActive ? " bg-base-300 text-base-content" : ""
} flex items-center text-left p-3 lg:p-4 text-base-content hover:text-base-content focus:bg-base-300 hover:bg-base-300 hover:no-underline focus:outline-none` } flex items-center justify-start text-left p-3 lg:p-4 text-base-content hover:text-base-content focus:bg-base-300 hover:bg-base-300 hover:no-underline focus:outline-none`
} }
onClick={closeSidebar} onClick={closeSidebar}
tabIndex={isOpen ? 0 : -1} tabIndex={isOpen ? 0 : -1}
role="menuitem" role="menuitem"
> >
<span className="w-[20px] h-[20px] flex justify-center">
<i className={`${item.icon} text-[18px]`} aria-hidden="true"></i> <i className={`${item.icon} text-[18px]`} aria-hidden="true"></i>
</span>
<span className="ml-3 lg:ml-4"> <span className="ml-3 lg:ml-4">
{t(`sidebar.${item.title}`, { appName: drivename })} {t(`sidebar.${item.title}`, { appName: drivename })}
</span> </span>
@@ -3,8 +3,7 @@ import { useTranslation } from "react-i18next";
import { NavLink } from "react-router"; import { NavLink } from "react-router";
const Submenu = ({ item, closeSidebar, toggleSubmenu, submenuOpen }) => { const Submenu = ({ item, closeSidebar, toggleSubmenu, submenuOpen }) => {
const appName = const appName = "OpenSign™";
"OpenSign™";
const drivename = appName === "OpenSign™" ? "OpenSign™" : ""; const drivename = appName === "OpenSign™" ? "OpenSign™" : "";
const { t } = useTranslation(); const { t } = useTranslation();
const { title, icon, children } = item; const { title, icon, children } = item;
@@ -12,14 +11,16 @@ const Submenu = ({ item, closeSidebar, toggleSubmenu, submenuOpen }) => {
<li role="none" className="my-0.5"> <li role="none" className="my-0.5">
<button <button
onClick={() => toggleSubmenu(item.title)} onClick={() => toggleSubmenu(item.title)}
className="flex items-center text-left p-3 lg:p-4 text-base-content hover:text-base-content focus:bg-base-300 hover:bg-base-300 hover:no-underline focus:outline-none " className="flex items-center justify-start text-left p-3 lg:p-4 text-base-content hover:text-base-content focus:bg-base-300 hover:bg-base-300 hover:no-underline focus:outline-none "
aria-expanded={submenuOpen} aria-expanded={submenuOpen}
aria-haspopup="true" aria-haspopup="true"
aria-controls={`submenu-${title}`} aria-controls={`submenu-${title}`}
> >
<span className="w-[20px] h-[20px] flex justify-center">
<i className={`${icon} text-[18px]`}></i> <i className={`${icon} text-[18px]`}></i>
</span>
<div className="flex justify-between items-center w-full"> <div className="flex justify-between items-center w-full">
<span className="ml-3 lg:ml-4"> <span className="ml-3 lg:ml-4 text-start">
{t(`sidebar.${item.title}`, { appName })} {t(`sidebar.${item.title}`, { appName })}
</span> </span>
<i <i
@@ -45,16 +46,18 @@ const Submenu = ({ item, closeSidebar, toggleSubmenu, submenuOpen }) => {
className={({ isActive }) => className={({ isActive }) =>
`${ `${
isActive ? "bg-base-300 text-base-content" : "" isActive ? "bg-base-300 text-base-content" : ""
} flex items-center text-left pl-6 md:pl-8 py-2 text-sm cursor-pointer text-base-content hover:text-base-content focus:bg-base-300 hover:bg-base-300 hover:no-underline focus:outline-none` } flex items-center justify-start text-left pl-6 md:pl-8 py-2 text-sm cursor-pointer text-base-content hover:text-base-content focus:bg-base-300 hover:bg-base-300 hover:no-underline focus:outline-none`
} }
onClick={closeSidebar} onClick={closeSidebar}
role="menuitem" role="menuitem"
tabIndex={submenuOpen ? 0 : -1} tabIndex={submenuOpen ? 0 : -1}
> >
<span className="w-[15px] h-[15px] flex justify-center">
<i <i
className={`${childItem.icon} text-[18px]`} className={`${childItem.icon} text-[18px]`}
aria-hidden="true" aria-hidden="true"
></i> ></i>
</span>
<span className="ml-3 lg:ml-4"> <span className="ml-3 lg:ml-4">
{t(`sidebar.${item.title}-Children.${childItem.title}`, { {t(`sidebar.${item.title}-Children.${childItem.title}`, {
appName: drivename appName: drivename
+17 -13
View File
@@ -8,6 +8,7 @@ import { saveAs } from "file-saver";
import printModule from "print-js"; import printModule from "print-js";
import fontkit from "@pdf-lib/fontkit"; import fontkit from "@pdf-lib/fontkit";
import { themeColor } from "./const"; import { themeColor } from "./const";
import { format, toZonedTime } from "date-fns-tz";
export const fontsizeArr = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]; export const fontsizeArr = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28];
export const fontColorArr = ["red", "black", "blue", "yellow"]; export const fontColorArr = ["red", "black", "blue", "yellow"];
@@ -2870,20 +2871,11 @@ export function generatePdfName(length) {
// Format date and time for the selected timezone // Format date and time for the selected timezone
export const formatTimeInTimezone = (date, timezone) => { export const formatTimeInTimezone = (date, timezone) => {
return timezone const nyDate = timezone && toZonedTime(date, timezone);
? new Intl.DateTimeFormat("en-US", { const generatedDate = timezone
weekday: "short", ? format(nyDate, "EEE, dd MMM yyyy HH:mm:ss zzz", { timeZone: timezone })
year: "numeric",
month: "short",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
timeZone: timezone,
timeZoneName: "short",
hour12: false
}).format(date)
: new Date(date).toUTCString(); : new Date(date).toUTCString();
return generatedDate;
}; };
// `usertimezone` is used to get timezone of current user // `usertimezone` is used to get timezone of current user
@@ -2982,3 +2974,15 @@ export const mailTemplate = (param) => {
return { subject, body }; return { subject, body };
}; };
export function formatDateTime(date, dateFormat, timeZone, is12Hour) {
const zonedDate = toZonedTime(date, timeZone); // Convert date to the given timezone
const timeFormat = is12Hour ? "hh:mm:ss a" : "HH:mm:ss";
return dateFormat
? format(
zonedDate,
`${selectFormat(dateFormat)}, ${timeFormat} 'GMT' XXX`,
{ timeZone }
)
: formatTimeInTimezone(date, timeZone);
}
@@ -760,7 +760,11 @@ function PdfRequestFiles() {
documentData === "Error: Something went wrong!" || documentData === "Error: Something went wrong!" ||
(documentData.result && documentData.result.error) (documentData.result && documentData.result.error)
) { ) {
if (documentData?.result?.error?.includes("deleted")) {
setHandleError(t("document-deleted"));
} else {
setHandleError(t("something-went-wrong-mssg")); setHandleError(t("something-went-wrong-mssg"));
}
} else { } else {
setHandleError("Document not Found!"); setHandleError("Document not Found!");
} }
+7 -2
View File
@@ -170,7 +170,6 @@ function PlaceHolderSign() {
drop: (item, monitor) => addPositionOfSignature(item, monitor), drop: (item, monitor) => addPositionOfSignature(item, monitor),
collect: (monitor) => ({ isOver: !!monitor.isOver() }) collect: (monitor) => ({ isOver: !!monitor.isOver() })
}); });
const documentId = docId; const documentId = docId;
useEffect(() => { useEffect(() => {
if (documentId) { if (documentId) {
@@ -457,7 +456,11 @@ function PlaceHolderSign() {
documentData === "Error: Something went wrong!" || documentData === "Error: Something went wrong!" ||
(documentData.result && documentData.result.error) (documentData.result && documentData.result.error)
) { ) {
if (documentData?.result?.error?.includes("deleted")) {
setHandleError(t("document-deleted"));
} else {
setHandleError(t("something-went-wrong-mssg")); setHandleError(t("something-went-wrong-mssg"));
}
setIsLoading({ isLoad: false }); setIsLoading({ isLoad: false });
} else { } else {
setHandleError(t("no-data-avaliable")); setHandleError(t("no-data-avaliable"));
@@ -2093,7 +2096,9 @@ function PlaceHolderSign() {
<LottieWithLoader /> <LottieWithLoader />
{pdfDetails[0].SendinOrder ? ( {pdfDetails[0].SendinOrder ? (
<p> <p>
{t("placeholder-mail-alert", { {isCurrUser
? t("placeholder-mail-alert-you")
: t("placeholder-mail-alert", {
name: signersdata[0]?.Name name: signersdata[0]?.Name
})} })}
</p> </p>
+10 -1
View File
@@ -49,6 +49,7 @@ const Preferences = () => {
const [sendinOrder, setSendinOrder] = useState(true); const [sendinOrder, setSendinOrder] = useState(true);
const [isTourEnabled, setIsTourEnabled] = useState(false); const [isTourEnabled, setIsTourEnabled] = useState(false);
const [dateFormat, setDateFormat] = useState("MM/DD/YYYY"); const [dateFormat, setDateFormat] = useState("MM/DD/YYYY");
const [is12HourTime, setIs12HourTime] = useState(false);
useEffect(() => { useEffect(() => {
fetchSignType(); fetchSignType();
@@ -106,6 +107,9 @@ const Preferences = () => {
? _getUser?.DateFormat ? _getUser?.DateFormat
: "MM/DD/YYYY"; : "MM/DD/YYYY";
setDateFormat(DateFormat); setDateFormat(DateFormat);
const is12Hr =
_getUser?.Is12HourTime !== undefined ? _getUser?.Is12HourTime : false;
setIs12HourTime(is12Hr);
} }
} catch (err) { } catch (err) {
console.log("err while getting user details", err); console.log("err while getting user details", err);
@@ -162,7 +166,8 @@ const Preferences = () => {
...params, ...params,
SendinOrder: sendinOrder, SendinOrder: sendinOrder,
IsTourEnabled: isTourEnabled, IsTourEnabled: isTourEnabled,
DateFormat: dateFormat DateFormat: dateFormat,
Is12HourTime: is12HourTime
}; };
const updateRes = await Parse.Cloud.run("updatepreferences", params); const updateRes = await Parse.Cloud.run("updatepreferences", params);
if (updateRes) { if (updateRes) {
@@ -175,6 +180,7 @@ const Preferences = () => {
extUser.SendinOrder = sendinOrder; extUser.SendinOrder = sendinOrder;
extUser.IsTourEnabled = isTourEnabled; extUser.IsTourEnabled = isTourEnabled;
extUser.DateFormat = dateFormat; extUser.DateFormat = dateFormat;
extUser.Is12HourTime = is12HourTime;
const _extUser = JSON.parse(JSON.stringify(extUser)); const _extUser = JSON.parse(JSON.stringify(extUser));
localStorage.setItem("Extand_Class", JSON.stringify([_extUser])); localStorage.setItem("Extand_Class", JSON.stringify([_extUser]));
} }
@@ -492,7 +498,10 @@ const Preferences = () => {
</div> </div>
<div className="mb-[0.75rem]"> <div className="mb-[0.75rem]">
<DateFormatSelector <DateFormatSelector
timezone={timezone}
dateFormat={dateFormat} dateFormat={dateFormat}
is12HourTime={is12HourTime}
setIs12HourTime={setIs12HourTime}
setDateFormat={setDateFormat} setDateFormat={setDateFormat}
/> />
</div> </div>
@@ -252,7 +252,11 @@ function SignYourSelf() {
documentData === "Error: Something went wrong!" || documentData === "Error: Something went wrong!" ||
(documentData.result && documentData.result.error) (documentData.result && documentData.result.error)
) { ) {
if (documentData?.result?.error?.includes("deleted")) {
setHandleError(t("document-deleted"));
} else {
setHandleError(t("something-went-wrong-mssg")); setHandleError(t("something-went-wrong-mssg"));
}
setIsLoading({ isLoad: false }); setIsLoading({ isLoad: false });
} else { } else {
setHandleError(t("no-data-avaliable")); setHandleError(t("no-data-avaliable"));
+7 -7
View File
@@ -33,8 +33,9 @@ const AddContact = (props) => {
try { try {
const baseURL = localStorage.getItem("baseUrl"); const baseURL = localStorage.getItem("baseUrl");
const url = `${baseURL}functions/isuserincontactbook`; const url = `${baseURL}functions/isuserincontactbook`;
const token = const token = {
{ "X-Parse-Session-Token": localStorage.getItem("accesstoken") }; "X-Parse-Session-Token": localStorage.getItem("accesstoken")
};
const headers = { const headers = {
"Content-Type": "application/json", "Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"), "X-Parse-Application-Id": localStorage.getItem("parseAppId"),
@@ -63,16 +64,13 @@ const AddContact = (props) => {
) )
); );
const userId = user?.objectId || ""; const userId = user?.objectId || "";
const tenantDetails = await getTenantDetails( const tenantDetails = await getTenantDetails(userId);
userId,
);
const tenantId = tenantDetails?.objectId || ""; const tenantId = tenantDetails?.objectId || "";
if (tenantId) { if (tenantId) {
try { try {
const baseURL = localStorage.getItem("baseUrl"); const baseURL = localStorage.getItem("baseUrl");
const url = `${baseURL}functions/savecontact`; const url = `${baseURL}functions/savecontact`;
const token = const token = {
{
"X-Parse-Session-Token": localStorage.getItem("accesstoken") "X-Parse-Session-Token": localStorage.getItem("accesstoken")
}; };
const data = { name, email, phone, tenantId }; const data = { name, email, phone, tenantId };
@@ -137,7 +135,9 @@ const AddContact = (props) => {
</div> </div>
)} )}
<div className="w-full mx-auto p-[8px]"> <div className="w-full mx-auto p-[8px]">
{!props?.isDisableTitle && (
<div className="text-[14px] font-[700]">{t("add-contact")}</div> <div className="text-[14px] font-[700]">{t("add-contact")}</div>
)}
{isUserExist && ( {isUserExist && (
<div className="mb-[0.75rem] flex items-center mt-1"> <div className="mb-[0.75rem] flex items-center mt-1">
<input <input
@@ -14,7 +14,7 @@ import {
copytoData, copytoData,
fetchUrl, fetchUrl,
formatDate, formatDate,
formatTimeInTimezone, formatDateTime,
getSignedUrl, getSignedUrl,
getTenantDetails, getTenantDetails,
handleSignatureType, handleSignatureType,
@@ -1012,11 +1012,23 @@ const ReportTable = (props) => {
); );
if (matchSigner) { if (matchSigner) {
const timezone = extClass?.[0]?.Timezone || ""; const timezone = extClass?.[0]?.Timezone || "";
const DateFormat = extClass?.[0]?.DateFormat || "MM/DD/YYYY";
const Is12Hr = extClass?.[0]?.Is12HourTime || false;
const signedon = matchSigner?.SignedOn const signedon = matchSigner?.SignedOn
? formatTimeInTimezone(new Date(matchSigner?.SignedOn), timezone) ? formatDateTime(
new Date(matchSigner?.SignedOn),
DateFormat,
timezone,
Is12Hr
)
: "-"; : "-";
const viewedon = matchSigner?.ViewedOn const viewedon = matchSigner?.ViewedOn
? formatTimeInTimezone(new Date(matchSigner?.ViewedOn), timezone) ? formatDateTime(
new Date(matchSigner?.ViewedOn),
DateFormat,
timezone,
Is12Hr
)
: "-"; : "-";
return { return {
id: i, id: i,
+39
View File
@@ -252,3 +252,42 @@ export const mailTemplate = param => {
return { subject, body }; return { subject, body };
}; };
export const selectFormat = data => {
switch (data) {
case 'L':
return 'MM/dd/yyyy';
case 'MM/DD/YYYY':
return 'MM/dd/yyyy';
case 'DD-MM-YYYY':
return 'dd-MM-yyyy';
case 'DD/MM/YYYY':
return 'dd/MM/yyyy';
case 'LL':
return 'MMMM dd, yyyy';
case 'DD MMM, YYYY':
return 'dd MMM, yyyy';
case 'YYYY-MM-DD':
return 'yyyy-MM-dd';
case 'MM-DD-YYYY':
return 'MM-dd-yyyy';
case 'MM.DD.YYYY':
return 'MM.dd.yyyy';
case 'MMM DD, YYYY':
return 'MMM dd, yyyy';
case 'MMMM DD, YYYY':
return 'MMMM dd, yyyy';
case 'DD MMMM, YYYY':
return 'dd MMMM, yyyy';
default:
return 'MM/dd/yyyy';
}
};
export function formatDateTime(date, dateFormat, timeZone, is12Hour) {
const zonedDate = toZonedTime(date, timeZone); // Convert date to the given timezone
const timeFormat = is12Hour ? 'hh:mm:ss a' : 'HH:mm:ss';
return dateFormat
? format(zonedDate, `${selectFormat(dateFormat)}, ${timeFormat} 'GMT' XXX`, { timeZone })
: formatTimeInTimezone(date, timeZone);
}
@@ -1,7 +1,5 @@
import axios from 'axios'; import axios from 'axios';
import { import { cloudServerUrl } from '../../Utils.js';
cloudServerUrl,
} from '../../Utils.js';
export default async function getDocument(request) { export default async function getDocument(request) {
const serverUrl = cloudServerUrl; //process.env.SERVER_URL; const serverUrl = cloudServerUrl; //process.env.SERVER_URL;
const docId = request.params.docId; const docId = request.params.docId;
@@ -47,13 +45,12 @@ export default async function getDocument(request) {
console.log('err user in not authenticated', err); console.log('err user in not authenticated', err);
return { error: "You don't have access of this document!" }; return { error: "You don't have access of this document!" };
} }
} } else {
else {
return { error: "You don't have access of this document!" }; return { error: "You don't have access of this document!" };
} }
} }
} else { } else {
return { error: "You don't have access of this document!" }; return { error: "document deleted or you don't have access." };
} }
} catch (err) { } catch (err) {
console.log('err', err); console.log('err', err);
@@ -1,12 +1,12 @@
import { PDFDocument, rgb } from 'pdf-lib'; import { PDFDocument, rgb } from 'pdf-lib';
import fs from 'node:fs'; import fs from 'node:fs';
import fontkit from '@pdf-lib/fontkit'; import fontkit from '@pdf-lib/fontkit';
import { import { formatDateTime } from '../../../Utils.js';
formatTimeInTimezone,
} from '../../../Utils.js';
export default async function GenerateCertificate(docDetails) { export default async function GenerateCertificate(docDetails) {
const timezone = docDetails?.ExtUserPtr?.Timezone || ''; const timezone = docDetails?.ExtUserPtr?.Timezone || '';
const Is12Hr = docDetails?.ExtUserPtr?.Is12HourTime || false;
const DateFormat = docDetails?.ExtUserPtr?.DateFormat || 'MM/DD/YYYY';
const pdfDoc = await PDFDocument.create(); const pdfDoc = await PDFDocument.create();
// `fontBytes` is used to embed custom font in pdf // `fontBytes` is used to embed custom font in pdf
const fontBytes = fs.readFileSync('./font/times.ttf'); // const fontBytes = fs.readFileSync('./font/times.ttf'); //
@@ -22,23 +22,27 @@ export default async function GenerateCertificate(docDetails) {
const titleColor = rgb(0, 0.2, 0.4); //rgb(0, 0.53, 0.71); const titleColor = rgb(0, 0.2, 0.4); //rgb(0, 0.53, 0.71);
const titleUnderline = rgb(0, 0.2, 0.4); // rgb(0.12, 0.12, 0.12); const titleUnderline = rgb(0, 0.2, 0.4); // rgb(0.12, 0.12, 0.12);
const title = 25; const title = 25;
const subtitle = 20; const subtitle = 16;
const text = 14; const text = 13;
const signertext = 13;
const timeText = 11; const timeText = 11;
const textKeyColor = rgb(0.12, 0.12, 0.12); const textKeyColor = rgb(0.12, 0.12, 0.12);
const textValueColor = rgb(0.3, 0.3, 0.3); const textValueColor = rgb(0.3, 0.3, 0.3);
const completedAt = docDetails?.completedAt ? new Date(docDetails?.completedAt) : new Date(); const completedAt = docDetails?.completedAt ? new Date(docDetails?.completedAt) : new Date();
const completedAtperTimezone = formatTimeInTimezone(completedAt, timezone); const completedAtperTimezone = formatDateTime(completedAt, DateFormat, timezone, Is12Hr);
const completedUTCtime = completedAtperTimezone; const completedUTCtime = completedAtperTimezone;
const signersCount = docDetails?.Signers?.length || 1; const signersCount = docDetails?.Signers?.length || 1;
const generateAt = docDetails?.completedAt ? new Date(docDetails?.completedAt) : new Date(); const generateAt = docDetails?.completedAt ? new Date(docDetails?.completedAt) : new Date();
const generatedAtperTimezone = formatTimeInTimezone(generateAt, timezone); const generatedAtperTimezone = formatDateTime(generateAt, DateFormat, timezone, Is12Hr);
const generatedUTCTime = generatedAtperTimezone; const generatedUTCTime = generatedAtperTimezone;
const generatedOn = 'Generated On ' + generatedUTCTime; const generatedOn = 'Generated On ' + generatedUTCTime;
const textWidth = timesRomanFont.widthOfTextAtSize(generatedOn, 12);
const margin = 30;
const maxX = width - margin - textWidth; // Ensures text stays inside the border with 30px margin
const OriginIp = docDetails?.OriginIp || ''; const OriginIp = docDetails?.OriginIp || '';
const company = docDetails?.ExtUserPtr?.Company || ''; const company = docDetails?.ExtUserPtr?.Company || '';
const createdAt = docDetails?.DocSentAt?.iso || docDetails.createdAt; const createdAt = docDetails?.DocSentAt?.iso || docDetails.createdAt;
const createdAtperTimezone = formatTimeInTimezone(createdAt, timezone); const createdAtperTimezone = formatDateTime(createdAt, DateFormat, timezone, Is12Hr);
const IsEnableOTP = docDetails?.IsEnableOTP || false; const IsEnableOTP = docDetails?.IsEnableOTP || false;
const filteredaudit = docDetails?.AuditTrail?.filter(x => x?.UserPtr?.objectId); const filteredaudit = docDetails?.AuditTrail?.filter(x => x?.UserPtr?.objectId);
const auditTrail = const auditTrail =
@@ -83,7 +87,7 @@ export default async function GenerateCertificate(docDetails) {
}); });
page.drawText(generatedOn, { page.drawText(generatedOn, {
x: 320, x: Math.max(startX, maxX), // Adjusts dynamically 320
y: 810, y: 810,
size: 12, size: 12,
font: timesRomanFont, font: timesRomanFont,
@@ -92,13 +96,13 @@ export default async function GenerateCertificate(docDetails) {
page.drawText('Certificate of Completion', { page.drawText('Certificate of Completion', {
x: 160, x: 160,
y: 750, y: 755,
size: title, size: title,
font: timesRomanFont, font: timesRomanFont,
color: titleColor, color: titleColor,
}); });
const underlineY = 740; const underlineY = 745;
page.drawLine({ page.drawLine({
start: { x: 30, y: underlineY }, start: { x: 30, y: underlineY },
end: { x: width - 30, y: underlineY }, end: { x: width - 30, y: underlineY },
@@ -108,7 +112,7 @@ export default async function GenerateCertificate(docDetails) {
page.drawText('Summary', { page.drawText('Summary', {
x: 30, x: 30,
y: 710, y: 727,
size: subtitle, size: subtitle,
font: timesRomanFont, font: timesRomanFont,
color: titleColor, color: titleColor,
@@ -116,15 +120,15 @@ export default async function GenerateCertificate(docDetails) {
page.drawText('Document Id :', { page.drawText('Document Id :', {
x: 30, x: 30,
y: 685, y: 710,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(docDetails.objectId, { page.drawText(docDetails.objectId, {
x: 115, x: 110,
y: 685, y: 710,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
@@ -132,15 +136,15 @@ export default async function GenerateCertificate(docDetails) {
page.drawText('Document Name :', { page.drawText('Document Name :', {
x: 30, x: 30,
y: 665, y: 690,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(docDetails?.Name, { page.drawText(docDetails?.Name, {
x: 140, x: 130,
y: 665, y: 690,
size: docDetails?.Name?.length >= 78 ? 12 : text, size: docDetails?.Name?.length >= 78 ? 12 : text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
@@ -148,52 +152,52 @@ export default async function GenerateCertificate(docDetails) {
page.drawText('Organization :', { page.drawText('Organization :', {
x: 30, x: 30,
y: 645, y: 670,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(company, { page.drawText(company, {
x: 115, x: 110,
y: 645, y: 670,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('Created on :', { page.drawText('Created on :', {
x: 30, x: 30,
y: 625, y: 650,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(`${createdAtperTimezone}`, { page.drawText(`${createdAtperTimezone}`, {
x: 105, x: 97,
y: 625, y: 650,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('Completed on :', { page.drawText('Completed on :', {
x: 30, x: 30,
y: 605, y: 630,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(`${completedUTCtime}`, { page.drawText(`${completedUTCtime}`, {
x: 125, x: 115,
y: 605, y: 630,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('Signers :', { page.drawText('Signers :', {
x: 30, x: 30,
y: 585, y: 610,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
@@ -201,73 +205,76 @@ export default async function GenerateCertificate(docDetails) {
page.drawText(`${signersCount}`, { page.drawText(`${signersCount}`, {
x: 80, x: 80,
y: 585, y: 610,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('Document originator', { page.drawText('Document originator', {
x: 30, x: 30,
y: 565, y: 590,
size: 17, size: 17,
font: timesRomanFont, font: timesRomanFont,
color: titleColor, color: titleColor,
}); });
page.drawText('Name :', { page.drawText('Name :', {
x: 60, x: 60,
y: 545, y: 573,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(ownerName, { page.drawText(ownerName, {
x: 105, x: 105,
y: 545, y: 573,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('Email :', { page.drawText('Email :', {
x: 60, x: 60,
y: 525, y: 553,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(ownerEmail, { page.drawText(ownerEmail, {
x: 105, x: 105,
y: 525, y: 553,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('IP address :', { page.drawText('IP address :', {
x: 60, x: 60,
y: 505, y: 533,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(`${OriginIp}`, { page.drawText(`${OriginIp}`, {
x: 130, x: 125,
y: 505, y: 533,
size: text, size: text,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawLine({ page.drawLine({
start: { x: 30, y: 495 }, start: { x: 30, y: 527 },
end: { x: width - 30, y: 495 }, end: { x: width - 30, y: 527 },
color: rgb(0.12, 0.12, 0.12), color: rgb(0.12, 0.12, 0.12),
thickness: 0.5, thickness: 0.5,
}); });
let yPosition1 = 475; let yPosition1 = 512;
let yPosition2 = 455; let yPosition2 = 498;
let yPosition3 = 435; let yPosition3 = 478;
let yPosition4 = 415; let yPosition4 = 458;
let yPosition5 = 395; let yPosition5 = 438;
let yPosition6 = 360; let yPosition6 = 418;
let yPosition7 = 398;
let yPosition8 = 363;
auditTrail.slice(0, 3).forEach(async (x, i) => { auditTrail.slice(0, 3).forEach(async (x, i) => {
const embedPng = x.Signature ? await pdfDoc.embedPng(x.Signature) : ''; const embedPng = x.Signature ? await pdfDoc.embedPng(x.Signature) : '';
page.drawText(`Signer ${i + 1}`, { page.drawText(`Signer ${i + 1}`, {
@@ -280,7 +287,7 @@ export default async function GenerateCertificate(docDetails) {
page.drawText('Name :', { page.drawText('Name :', {
x: 30, x: 30,
y: yPosition2, y: yPosition2,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
@@ -288,32 +295,32 @@ export default async function GenerateCertificate(docDetails) {
page.drawText(x?.Name, { page.drawText(x?.Name, {
x: 75, x: 75,
y: yPosition2, y: yPosition2,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('Viewed on :', { if (IsEnableOTP) {
x: half + 45, page.drawText('Security level :', {
x: half + 120,
y: yPosition2, y: yPosition2,
size: timeText, size: timeText,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText('Email, OTP Auth', {
//new Date(x.ViewedOn).toUTCString() x: half + 190,
page.drawText(`${formatTimeInTimezone(x.ViewedOn, timezone)}`, {
x: half + 102,
y: yPosition2, y: yPosition2,
size: timeText, size: timeText,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
}
page.drawText('Email :', { page.drawText('Email :', {
x: 30, x: 30,
y: yPosition3, y: yPosition3,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
@@ -321,70 +328,70 @@ export default async function GenerateCertificate(docDetails) {
page.drawText(x?.Email, { page.drawText(x?.Email, {
x: 75, x: 75,
y: yPosition3, y: yPosition3,
size: text, size: signertext,
font: timesRomanFont,
color: textValueColor,
});
page.drawText('Viewed on :', {
x: 30,
y: yPosition4,
size: signertext,
font: timesRomanFont,
color: textKeyColor,
});
page.drawText(`${formatDateTime(x.ViewedOn, DateFormat, timezone, Is12Hr)}`, {
x: 97,
y: yPosition4,
size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('Signed on :', { page.drawText('Signed on :', {
x: half + 45, x: 30,
y: yPosition3 + 5, y: yPosition5,
size: timeText, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
// new Date(x.SignedOn).toUTCString() page.drawText(`${formatDateTime(x.SignedOn, DateFormat, timezone, Is12Hr)}`, {
page.drawText(`${formatTimeInTimezone(x.SignedOn, timezone)}`, { x: 95,
x: half + 98, y: yPosition5,
y: yPosition3 + 5, size: signertext,
size: timeText,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
page.drawText('IP address :', { page.drawText('IP address :', {
x: 30, x: 30,
y: yPosition4, y: yPosition6,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawText(x?.ipAddress, { page.drawText(x?.ipAddress, {
x: 100, x: 95,
y: yPosition4, y: yPosition6,
size: 13, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
if (IsEnableOTP) {
page.drawText('Security level :', {
x: half + 45,
y: yPosition4 + 10,
size: timeText,
font: timesRomanFont,
color: textKeyColor,
});
page.drawText('Email, OTP Auth', {
x: half + 115,
y: yPosition4 + 10,
size: timeText,
font: timesRomanFont,
color: textValueColor,
});
}
page.drawText('Signature :', { page.drawText('Signature :', {
x: 30, x: 30,
y: yPosition5, y: yPosition7,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
page.drawRectangle({ page.drawRectangle({
x: 98, x: 98,
y: yPosition5 - 30, y: yPosition7 - 30,
width: 104, width: 104,
height: 44, height: 44,
borderColor: rgb(0.22, 0.18, 0.47), borderColor: rgb(0.22, 0.18, 0.47),
@@ -393,24 +400,26 @@ export default async function GenerateCertificate(docDetails) {
if (embedPng) { if (embedPng) {
page.drawImage(embedPng, { page.drawImage(embedPng, {
x: 100, x: 100,
y: yPosition5 - 27, y: yPosition7 - 27,
width: 100, width: 100,
height: 40, height: 40,
}); });
} }
page.drawLine({ page.drawLine({
start: { x: 30, y: yPosition6 }, start: { x: 30, y: yPosition8 },
end: { x: width - 30, y: yPosition6 }, end: { x: width - 30, y: yPosition8 },
color: rgb(0.12, 0.12, 0.12), color: rgb(0.12, 0.12, 0.12),
thickness: 0.5, thickness: 0.5,
}); });
yPosition1 = yPosition6 - 20; yPosition1 = yPosition8 - 20;
yPosition2 = yPosition1 - 20; yPosition2 = yPosition1 - 20;
yPosition3 = yPosition2 - 20; yPosition3 = yPosition2 - 20;
yPosition4 = yPosition3 - 20; yPosition4 = yPosition3 - 20;
yPosition5 = yPosition4 - 20; yPosition5 = yPosition4 - 20;
yPosition6 = yPosition6 - 140; yPosition6 = yPosition5 - 20;
yPosition7 = yPosition6 - 20;
yPosition8 = yPosition8 - 174;
}); });
if (auditTrail.length > 3) { if (auditTrail.length > 3) {
@@ -420,7 +429,7 @@ export default async function GenerateCertificate(docDetails) {
const embedPng = x.Signature ? await pdfDoc.embedPng(x.Signature) : ''; const embedPng = x.Signature ? await pdfDoc.embedPng(x.Signature) : '';
// Calculate remaining space on current page // Calculate remaining space on current page
const remainingSpace = yPosition6; const remainingSpace = yPosition8;
// If there's not enough space for the next entry, create a new page // If there's not enough space for the next entry, create a new page
if (remainingSpace < 90) { if (remainingSpace < 90) {
@@ -440,7 +449,10 @@ export default async function GenerateCertificate(docDetails) {
yPosition3 = yPosition2 - 20; yPosition3 = yPosition2 - 20;
yPosition4 = yPosition3 - 20; yPosition4 = yPosition3 - 20;
yPosition5 = yPosition4 - 20; yPosition5 = yPosition4 - 20;
yPosition6 = currentPage.getHeight() - 160; yPosition5 = yPosition4 - 20;
yPosition6 = yPosition5 - 20;
yPosition7 = yPosition6 - 20;
yPosition8 = currentPage.getHeight() - 190;
} }
currentPage.drawText(`Signer ${4 + i}`, { currentPage.drawText(`Signer ${4 + i}`, {
@@ -453,7 +465,7 @@ export default async function GenerateCertificate(docDetails) {
currentPage.drawText('Name :', { currentPage.drawText('Name :', {
x: 30, x: 30,
y: yPosition2, y: yPosition2,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
@@ -461,32 +473,32 @@ export default async function GenerateCertificate(docDetails) {
currentPage.drawText(x?.Name, { currentPage.drawText(x?.Name, {
x: 75, x: 75,
y: yPosition2, y: yPosition2,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
currentPage.drawText('Viewed on :', { if (IsEnableOTP) {
x: half + 45, currentPage.drawText('Security level :', {
x: half + 120,
y: yPosition2, y: yPosition2,
size: timeText, size: timeText,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
currentPage.drawText(`Email, OTP Auth`, {
// new Date(x.ViewedOn).toUTCString() x: half + 190,
currentPage.drawText(`${formatTimeInTimezone(x.ViewedOn, timezone)}`, {
x: half + 102,
y: yPosition2, y: yPosition2,
size: timeText, size: timeText,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
}
currentPage.drawText('Email :', { currentPage.drawText('Email :', {
x: 30, x: 30,
y: yPosition3, y: yPosition3,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
@@ -494,70 +506,68 @@ export default async function GenerateCertificate(docDetails) {
currentPage.drawText(x?.Email, { currentPage.drawText(x?.Email, {
x: 75, x: 75,
y: yPosition3, y: yPosition3,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
currentPage.drawText('Signed on :', { currentPage.drawText('Viewed on :', {
x: half + 45, x: 30,
y: yPosition3 + 5, y: yPosition4,
size: timeText, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
// new Date(x.SignedOn).toUTCString() currentPage.drawText(`${formatDateTime(x.ViewedOn, DateFormat, timezone, Is12Hr)}`, {
currentPage.drawText(`${formatTimeInTimezone(x.SignedOn, timezone)}`, { x: 97,
x: half + 98, y: yPosition4,
y: yPosition3 + 5, size: signertext,
size: timeText, font: timesRomanFont,
color: textValueColor,
});
currentPage.drawText('Signed on :', {
x: 30,
y: yPosition5,
size: signertext,
font: timesRomanFont,
color: textKeyColor,
});
currentPage.drawText(`${formatDateTime(x.SignedOn, DateFormat, timezone, Is12Hr)}`, {
x: 95,
y: yPosition5,
size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
currentPage.drawText('IP address :', { currentPage.drawText('IP address :', {
x: 30, x: 30,
y: yPosition4, y: yPosition6,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
currentPage.drawText(x?.ipAddress, { currentPage.drawText(x?.ipAddress, {
x: 100, x: 100,
y: yPosition4, y: yPosition6,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textValueColor, color: textValueColor,
}); });
if (IsEnableOTP) {
currentPage.drawText('Security level :', {
x: half + 45,
y: yPosition4 + 10,
size: timeText,
font: timesRomanFont,
color: textKeyColor,
});
currentPage.drawText(`Email, OTP Auth`, {
x: half + 115,
y: yPosition4 + 10,
size: timeText,
font: timesRomanFont,
color: textValueColor,
});
}
currentPage.drawText('Signature :', { currentPage.drawText('Signature :', {
x: 30, x: 30,
y: yPosition5, y: yPosition7,
size: text, size: signertext,
font: timesRomanFont, font: timesRomanFont,
color: textKeyColor, color: textKeyColor,
}); });
currentPage.drawRectangle({ currentPage.drawRectangle({
x: 98, x: 98,
y: yPosition5 - 27, y: yPosition7 - 27,
width: 104, width: 104,
height: 44, height: 44,
borderColor: rgb(0.22, 0.18, 0.47), borderColor: rgb(0.22, 0.18, 0.47),
@@ -566,26 +576,28 @@ export default async function GenerateCertificate(docDetails) {
if (embedPng) { if (embedPng) {
currentPage.drawImage(embedPng, { currentPage.drawImage(embedPng, {
x: 100, x: 100,
y: yPosition5 - 25, y: yPosition7 - 25,
width: 100, width: 100,
height: 40, height: 40,
}); });
} }
currentPage.drawLine({ currentPage.drawLine({
start: { x: 30, y: yPosition6 }, start: { x: 30, y: yPosition8 },
end: { x: width - 30, y: yPosition6 }, end: { x: width - 30, y: yPosition8 },
color: rgb(0.12, 0.12, 0.12), color: rgb(0.12, 0.12, 0.12),
thickness: 0.5, thickness: 0.5,
}); });
// Update y positions for the next entry // Update y positions for the next entry
yPosition1 = yPosition6 - 20; yPosition1 = yPosition8 - 20;
yPosition2 = yPosition1 - 20; yPosition2 = yPosition1 - 20;
yPosition3 = yPosition2 - 20; yPosition3 = yPosition2 - 20;
yPosition4 = yPosition3 - 20; yPosition4 = yPosition3 - 20;
yPosition5 = yPosition4 - 20; yPosition5 = yPosition4 - 20;
yPosition6 = yPosition6 - 140; yPosition6 = yPosition5 - 20;
yPosition7 = yPosition6 - 20;
yPosition8 = yPosition8 - 174;
}); });
} }
@@ -209,7 +209,8 @@ async function sendCompletedMail(obj) {
subject = replaceVar.subject; subject = replaceVar.subject;
body = replaceVar.body; body = replaceVar.body;
} }
const Bcc = doc?.Bcc?.length > 0 ? doc.Bcc.map(x => x.Email) : ''; const Bcc = doc?.Bcc?.length > 0 ? doc.Bcc.map(x => x.Email) : [];
const updatedBcc = doc?.SenderMail ? [...Bcc, doc?.SenderMail] : Bcc;
const params = { const params = {
extUserId: sender.objectId, extUserId: sender.objectId,
url: url, url: url,
@@ -220,7 +221,7 @@ async function sendCompletedMail(obj) {
pdfName: pdfName, pdfName: pdfName,
html: body, html: body,
mailProvider: obj.mailProvider, mailProvider: obj.mailProvider,
bcc: Bcc, bcc: updatedBcc?.length > 0 ? updatedBcc : '',
certificatePath: `./exports/signed_certificate_${doc.objectId}.pdf`, certificatePath: `./exports/signed_certificate_${doc.objectId}.pdf`,
filename: obj?.filename, filename: obj?.filename,
}; };
@@ -31,6 +31,7 @@ async function sendMailProvider(req, plan, monthchange) {
if (req.params.url) { if (req.params.url) {
const randomNumber = Math.floor(Math.random() * 5000); const randomNumber = Math.floor(Math.random() * 5000);
const testPdf = `test_${randomNumber}.pdf`; const testPdf = `test_${randomNumber}.pdf`;
try {
let Pdf = fs.createWriteStream(testPdf); let Pdf = fs.createWriteStream(testPdf);
const writeToLocalDisk = () => { const writeToLocalDisk = () => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@@ -183,6 +184,19 @@ async function sendMailProvider(req, plan, monthchange) {
} }
} }
} }
} catch (err) {
console.log('err in sendmailv3', err);
if (fs.existsSync(testPdf)) {
try {
fs.unlinkSync(testPdf);
} catch (err) {
console.log('Err in unlink pdf sendmailv3');
}
}
if (err) {
return { status: 'error' };
}
}
} else { } else {
const from = req.params.from || ''; const from = req.params.from || '';
const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER; const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER;
@@ -51,6 +51,9 @@ export default async function updatePreferences(request) {
if (request.params.DateFormat) { if (request.params.DateFormat) {
newOrg.set('DateFormat', request.params.DateFormat); newOrg.set('DateFormat', request.params.DateFormat);
} }
if (request.params.Is12HourTime !== undefined) {
newOrg.set('Is12HourTime', request.params.Is12HourTime);
}
const updateUserRes = await newOrg.save(null, { useMasterKey: true }); const updateUserRes = await newOrg.save(null, { useMasterKey: true });
if (updateUserRes) { if (updateUserRes) {
const _updateUserRes = JSON.parse(JSON.stringify(updateUserRes)); const _updateUserRes = JSON.parse(JSON.stringify(updateUserRes));
+1959 -1885
View File
File diff suppressed because it is too large Load Diff
+8 -8
View File
@@ -18,8 +18,8 @@
"watch": "nodemon index.js" "watch": "nodemon index.js"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.758.0", "@aws-sdk/client-s3": "^3.775.0",
"@aws-sdk/s3-request-presigner": "^3.758.0", "@aws-sdk/s3-request-presigner": "^3.775.0",
"@parse/fs-files-adapter": "^3.0.0", "@parse/fs-files-adapter": "^3.0.0",
"@parse/s3-files-adapter": "^4.1.0", "@parse/s3-files-adapter": "^4.1.0",
"@pdf-lib/fontkit": "^1.1.1", "@pdf-lib/fontkit": "^1.1.1",
@@ -27,17 +27,17 @@
"@signpdf/signer-p12": "^3.2.4", "@signpdf/signer-p12": "^3.2.4",
"@signpdf/signpdf": "^3.2.5", "@signpdf/signpdf": "^3.2.5",
"aws-sdk": "^2.1692.0", "aws-sdk": "^2.1692.0",
"axios": "^1.8.3", "axios": "^1.8.4",
"cors": "^2.8.5", "cors": "^2.8.5",
"date-fns-tz": "^3.2.0", "date-fns-tz": "^3.2.0",
"dotenv": "^16.4.7", "dotenv": "^16.4.7",
"express": "^4.21.1", "express": "^4.21.1",
"form-data": "^4.0.2", "form-data": "^4.0.2",
"generate-api-key": "^1.0.2", "generate-api-key": "^1.0.2",
"googleapis": "^144.0.0", "googleapis": "^148.0.0",
"mailgun.js": "^11.1.0", "mailgun.js": "^11.1.0",
"mongodb": "^6.15.0", "mongodb": "^6.15.0",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.2",
"multer-s3": "^3.0.1", "multer-s3": "^3.0.1",
"node-forge": "^1.3.1", "node-forge": "^1.3.1",
"nodemailer": "^6.10.0", "nodemailer": "^6.10.0",
@@ -46,13 +46,13 @@
"parse-server": "^7.4.0", "parse-server": "^7.4.0",
"parse-server-api-mail-adapter": "^4.1.0", "parse-server-api-mail-adapter": "^4.1.0",
"pdf-lib": "^1.17.1", "pdf-lib": "^1.17.1",
"posthog-node": "^4.10.1", "posthog-node": "^4.10.2",
"ws": "^8.18.1" "ws": "^8.18.1"
}, },
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"@babel/eslint-parser": "^7.26.10", "@babel/eslint-parser": "^7.27.0",
"eslint": "^9.22.0", "eslint": "^9.23.0",
"jasmine": "^5.6.0", "jasmine": "^5.6.0",
"mongodb-runner": "^5.8.0", "mongodb-runner": "^5.8.0",
"nodemon": "^3.1.9", "nodemon": "^3.1.9",