mirror of
https://github.com/OpenSignLabs/OpenSign.git
synced 2026-09-04 16:58:05 +02:00
Compare commits
79
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acd1c589d7 | ||
|
|
de62052453 | ||
|
|
de120dae39 | ||
|
|
08d1e9a360 | ||
|
|
74a9d08550 | ||
|
|
6fc86e026b | ||
|
|
72da56a916 | ||
|
|
4ba7ffbb1a | ||
|
|
0d9a0b8bb1 | ||
|
|
084aa69702 | ||
|
|
597635800f | ||
|
|
8da2c7fad4 | ||
|
|
2b0276ead9 | ||
|
|
45a96ece54 | ||
|
|
729d19dfd3 | ||
|
|
29aa123669 | ||
|
|
f69caf016a | ||
|
|
48e0e0ee15 | ||
|
|
a71278f95c | ||
|
|
f7bb11ede1 | ||
|
|
6a365f7734 | ||
|
|
e4d946e519 | ||
|
|
149a16f150 | ||
|
|
d8ff3d9faa | ||
|
|
fe34001e42 | ||
|
|
fcdd7e2758 | ||
|
|
025c30b685 | ||
|
|
e742e85f0e | ||
|
|
476a99feae | ||
|
|
29464585b8 | ||
|
|
cdd078699b | ||
|
|
9ef1e22fda | ||
|
|
655401e04b | ||
|
|
b550c07ca8 | ||
|
|
fd72094b8a | ||
|
|
4d7348abc2 | ||
|
|
ec68479e98 | ||
|
|
ac05942e58 | ||
|
|
b387b6b402 | ||
|
|
e13baeb2fc | ||
|
|
52eb8e4a68 | ||
|
|
71189783a8 | ||
|
|
aec9396524 | ||
|
|
d74390b974 | ||
|
|
998fe013c8 | ||
|
|
06d4c9aeaf | ||
|
|
bc77a9b0a1 | ||
|
|
07c0390401 | ||
|
|
c50d753d74 | ||
|
|
65eef5739d | ||
|
|
01eed3664b | ||
|
|
685e09d406 | ||
|
|
7bacca1f78 | ||
|
|
3764ab5c30 | ||
|
|
2f7a1d67b6 | ||
|
|
8726efb0aa | ||
|
|
aeed48c0ef | ||
|
|
1f9504b9cc | ||
|
|
2862a97c4e | ||
|
|
6fde71e947 | ||
|
|
10bac3c11f | ||
|
|
8ecdbc43a3 | ||
|
|
6721b334cf | ||
|
|
454f557d14 | ||
|
|
635693b394 | ||
|
|
c8801846fa | ||
|
|
5536c99052 | ||
|
|
0fbe6aeb6c | ||
|
|
b218e96107 | ||
|
|
64a0be8776 | ||
|
|
3ede441f54 | ||
|
|
51edc339cd | ||
|
|
741efff1fa | ||
|
|
38b7311e66 | ||
|
|
e0ccf049a6 | ||
|
|
498bd18630 | ||
|
|
b530ef882a | ||
|
|
850d14064a | ||
|
|
273ada837b |
@@ -2,7 +2,7 @@ name: ci
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- 'staging'
|
- 'main'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker:
|
docker:
|
||||||
|
|||||||
Generated
+53
-32
@@ -34,7 +34,6 @@
|
|||||||
"react-gtm-module": "^2.0.11",
|
"react-gtm-module": "^2.0.11",
|
||||||
"react-helmet": "^6.1.0",
|
"react-helmet": "^6.1.0",
|
||||||
"react-konva": "^18.2.10",
|
"react-konva": "^18.2.10",
|
||||||
"react-modal": "^3.16.1",
|
|
||||||
"react-pdf": "^9.0.0",
|
"react-pdf": "^9.0.0",
|
||||||
"react-quill": "^2.0.0",
|
"react-quill": "^2.0.0",
|
||||||
"react-redux": "^9.1.2",
|
"react-redux": "^9.1.2",
|
||||||
@@ -55,9 +54,10 @@
|
|||||||
"web-vitals": "^4.0.1"
|
"web-vitals": "^4.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/runtime-corejs2": "^7.24.6",
|
"@babel/runtime-corejs2": "^7.24.7",
|
||||||
"autoprefixer": "^10.4.19",
|
"autoprefixer": "^10.4.19",
|
||||||
"commitizen": "^4.3.0",
|
"commitizen": "^4.3.0",
|
||||||
|
"daisyui": "^4.12.2",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
"eslint-plugin-react": "^7.34.1",
|
"eslint-plugin-react": "^7.34.1",
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.38",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"pretty-quick": "^3.3.1",
|
"pretty-quick": "^3.3.1",
|
||||||
"tailwindcss": "^3.4.3"
|
"tailwindcss": "^3.4.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@alloc/quick-lru": {
|
"node_modules/@alloc/quick-lru": {
|
||||||
@@ -2000,9 +2000,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/runtime-corejs2": {
|
"node_modules/@babel/runtime-corejs2": {
|
||||||
"version": "7.24.6",
|
"version": "7.24.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.24.6.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.24.7.tgz",
|
||||||
"integrity": "sha512-5UK2PnfpmiCftYGBeJ+SpFIMNaoMPU/eQt1P5ISx0TB7nGGzEMLT4/3PapNZEfGZh+nGxGOGj2t59prGFBhunQ==",
|
"integrity": "sha512-+Lf6xofiPZLtFwNkpjGHPgJck4b22Yo8h9+WHf3bEbS4ikOyOMNtJk6HSTolEQ2irH1XSoeguaCkrkcgyThrMA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"core-js": "^2.6.12",
|
"core-js": "^2.6.12",
|
||||||
@@ -9041,6 +9041,16 @@
|
|||||||
"resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
|
||||||
"integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
|
"integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
|
||||||
},
|
},
|
||||||
|
"node_modules/css-selector-tokenizer": {
|
||||||
|
"version": "0.8.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
|
||||||
|
"integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"cssesc": "^3.0.0",
|
||||||
|
"fastparse": "^1.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/css-to-react-native": {
|
"node_modules/css-to-react-native": {
|
||||||
"version": "2.3.2",
|
"version": "2.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz",
|
||||||
@@ -9264,6 +9274,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
||||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
|
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
|
||||||
},
|
},
|
||||||
|
"node_modules/culori": {
|
||||||
|
"version": "3.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
|
||||||
|
"integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cz-conventional-changelog": {
|
"node_modules/cz-conventional-changelog": {
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz",
|
||||||
@@ -9284,6 +9303,25 @@
|
|||||||
"@commitlint/load": ">6.1.1"
|
"@commitlint/load": ">6.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/daisyui": {
|
||||||
|
"version": "4.12.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.2.tgz",
|
||||||
|
"integrity": "sha512-ed3EFwPRLN+9+/MYPRB1pYjk6plRCBMobfBdSeB3voAS81KdL2pCKtbwJfUUpDdOnJ0F8T6oRdVX02P6UCD0Hg==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"css-selector-tokenizer": "^0.8",
|
||||||
|
"culori": "^3",
|
||||||
|
"picocolors": "^1",
|
||||||
|
"postcss-js": "^4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/daisyui"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/damerau-levenshtein": {
|
"node_modules/damerau-levenshtein": {
|
||||||
"version": "1.0.8",
|
"version": "1.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
|
||||||
@@ -10928,11 +10966,6 @@
|
|||||||
"url": "https://github.com/sindresorhus/execa?sponsor=1"
|
"url": "https://github.com/sindresorhus/execa?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/exenv": {
|
|
||||||
"version": "1.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz",
|
|
||||||
"integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw=="
|
|
||||||
},
|
|
||||||
"node_modules/exit": {
|
"node_modules/exit": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
|
||||||
@@ -11119,6 +11152,12 @@
|
|||||||
"punycode": "^1.3.2"
|
"punycode": "^1.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/fastparse": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/fastq": {
|
"node_modules/fastq": {
|
||||||
"version": "1.17.1",
|
"version": "1.17.1",
|
||||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
|
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
|
||||||
@@ -20126,24 +20165,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
|
||||||
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
|
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
|
||||||
},
|
},
|
||||||
"node_modules/react-modal": {
|
|
||||||
"version": "3.16.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz",
|
|
||||||
"integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==",
|
|
||||||
"dependencies": {
|
|
||||||
"exenv": "^1.2.0",
|
|
||||||
"prop-types": "^15.7.2",
|
|
||||||
"react-lifecycles-compat": "^3.0.0",
|
|
||||||
"warning": "^4.0.3"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18",
|
|
||||||
"react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/react-native-crypto-js": {
|
"node_modules/react-native-crypto-js": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
|
||||||
@@ -22700,9 +22721,9 @@
|
|||||||
"integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
|
"integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
|
||||||
},
|
},
|
||||||
"node_modules/tailwindcss": {
|
"node_modules/tailwindcss": {
|
||||||
"version": "3.4.3",
|
"version": "3.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz",
|
||||||
"integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
|
"integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@alloc/quick-lru": "^5.2.0",
|
"@alloc/quick-lru": "^5.2.0",
|
||||||
"arg": "^5.0.2",
|
"arg": "^5.0.2",
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
"react-gtm-module": "^2.0.11",
|
"react-gtm-module": "^2.0.11",
|
||||||
"react-helmet": "^6.1.0",
|
"react-helmet": "^6.1.0",
|
||||||
"react-konva": "^18.2.10",
|
"react-konva": "^18.2.10",
|
||||||
"react-modal": "^3.16.1",
|
|
||||||
"react-pdf": "^9.0.0",
|
"react-pdf": "^9.0.0",
|
||||||
"react-quill": "^2.0.0",
|
"react-quill": "^2.0.0",
|
||||||
"react-redux": "^9.1.2",
|
"react-redux": "^9.1.2",
|
||||||
@@ -85,9 +84,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/runtime-corejs2": "^7.24.6",
|
"@babel/runtime-corejs2": "^7.24.7",
|
||||||
"autoprefixer": "^10.4.19",
|
"autoprefixer": "^10.4.19",
|
||||||
"commitizen": "^4.3.0",
|
"commitizen": "^4.3.0",
|
||||||
|
"daisyui": "^4.12.2",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
"eslint-plugin-react": "^7.34.1",
|
"eslint-plugin-react": "^7.34.1",
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.38",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"pretty-quick": "^3.3.1",
|
"pretty-quick": "^3.3.1",
|
||||||
"tailwindcss": "^3.4.3"
|
"tailwindcss": "^3.4.4"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"nth-check": "$nth-check"
|
"nth-check": "$nth-check"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en" data-theme="opensigncss">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
@@ -50,4 +50,4 @@
|
|||||||
-->
|
-->
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
Binary file not shown.
@@ -17,6 +17,7 @@ import PdfRequestFiles from "./pages/PdfRequestFiles";
|
|||||||
import LazyPage from "./primitives/LazyPage";
|
import LazyPage from "./primitives/LazyPage";
|
||||||
import { isEnableSubscription } from "./constant/const";
|
import { isEnableSubscription } from "./constant/const";
|
||||||
import SSOVerify from "./pages/SSOVerify";
|
import SSOVerify from "./pages/SSOVerify";
|
||||||
|
import Loader from "./primitives/Loader";
|
||||||
const DebugPdf = lazy(() => import("./pages/DebugPdf"));
|
const DebugPdf = lazy(() => import("./pages/DebugPdf"));
|
||||||
const ForgetPassword = lazy(() => import("./pages/ForgetPassword"));
|
const ForgetPassword = lazy(() => import("./pages/ForgetPassword"));
|
||||||
const GuestLogin = lazy(() => import("./pages/GuestLogin"));
|
const GuestLogin = lazy(() => import("./pages/GuestLogin"));
|
||||||
@@ -29,24 +30,13 @@ const Opensigndrive = lazy(() => import("./pages/Opensigndrive"));
|
|||||||
const ManageSign = lazy(() => import("./pages/Managesign"));
|
const ManageSign = lazy(() => import("./pages/Managesign"));
|
||||||
const GenerateToken = lazy(() => import("./pages/GenerateToken"));
|
const GenerateToken = lazy(() => import("./pages/GenerateToken"));
|
||||||
const Webhook = lazy(() => import("./pages/Webhook"));
|
const Webhook = lazy(() => import("./pages/Webhook"));
|
||||||
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.mjs`;
|
|
||||||
const Loader = () => {
|
pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.mjs`;
|
||||||
|
|
||||||
|
const AppLoader = () => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div className="flex justify-center items-center h-[100vh]">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -75,9 +65,9 @@ function App() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-[#eef1f5]">
|
<div className="bg-base-200">
|
||||||
{isloading ? (
|
{isloading ? (
|
||||||
<Loader />
|
<AppLoader />
|
||||||
) : (
|
) : (
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<Routes>
|
<Routes>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 316 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 61 KiB |
@@ -1,7 +1,7 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { modalCancelBtnColor, modalSubmitBtnColor } from "../constant/const";
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const AddSigner = (props) => {
|
const AddSigner = (props) => {
|
||||||
const [name, setName] = useState("");
|
const [name, setName] = useState("");
|
||||||
@@ -227,38 +227,29 @@ const AddSigner = (props) => {
|
|||||||
<div className="h-full p-[20px]">
|
<div className="h-full p-[20px]">
|
||||||
{isLoader && (
|
{isLoader && (
|
||||||
<div className="fixed inset-0 flex justify-center items-center bg-black bg-opacity-30">
|
<div className="fixed inset-0 flex justify-center items-center bg-black bg-opacity-30">
|
||||||
<div
|
<Loader />
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="w-full mx-auto p-2">
|
<div className="w-full mx-auto p-2 text-base-content">
|
||||||
{isUserExist && (
|
{isUserExist && (
|
||||||
<div className="mb-3">
|
<div className="mb-3 flex items-center">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
id="addYourself"
|
id="addYourself"
|
||||||
checked={addYourself}
|
checked={addYourself}
|
||||||
onChange={handleAddYourselfChange}
|
onChange={handleAddYourselfChange}
|
||||||
className="form-checkbox"
|
className="op-checkbox op-checkbox-sm"
|
||||||
/>
|
/>
|
||||||
<label htmlFor="addYourself" className="ml-2 text-gray-700">
|
<label htmlFor="addYourself" className="ml-2 mb-0">
|
||||||
Add Yourself
|
Add Yourself
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="name" className="block text-xs font-semibold">
|
||||||
htmlFor="name"
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Name
|
Name
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[red] text-[13px]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
@@ -267,16 +258,13 @@ const AddSigner = (props) => {
|
|||||||
onChange={(e) => setName(e.target.value)}
|
onChange={(e) => setName(e.target.value)}
|
||||||
required
|
required
|
||||||
disabled={addYourself}
|
disabled={addYourself}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="email" className="block text-xs font-semibold">
|
||||||
htmlFor="email"
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Email
|
Email
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[red] text-[13px]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
@@ -285,14 +273,11 @@ const AddSigner = (props) => {
|
|||||||
onChange={(e) => setEmail(e.target.value?.toLowerCase())}
|
onChange={(e) => setEmail(e.target.value?.toLowerCase())}
|
||||||
required
|
required
|
||||||
disabled={addYourself}
|
disabled={addYourself}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs lowercase"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="phone" className="block text-xs font-semibold">
|
||||||
htmlFor="phone"
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Phone
|
Phone
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
@@ -301,23 +286,17 @@ const AddSigner = (props) => {
|
|||||||
value={phone}
|
value={phone}
|
||||||
onChange={(e) => setPhone(e.target.value)}
|
onChange={(e) => setPhone(e.target.value)}
|
||||||
disabled={addYourself}
|
disabled={addYourself}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="mt-4 flex gap-x-2 justify-start">
|
||||||
<div className="mt-4 flex justify-start">
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
style={{ backgroundColor: modalSubmitBtnColor }}
|
|
||||||
className="mr-2 px-[20px] py-1.5 text-white rounded shadow-md text-center focus:outline-none "
|
|
||||||
>
|
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => handleReset()}
|
onClick={() => handleReset()}
|
||||||
style={{ backgroundColor: modalCancelBtnColor }}
|
className="op-btn op-btn-secondary"
|
||||||
className="px-4 py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none"
|
|
||||||
>
|
>
|
||||||
Reset
|
Reset
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import Parse from "parse";
|
|||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import Title from "./Title";
|
import Title from "./Title";
|
||||||
import Alert from "../primitives/Alert";
|
import Alert from "../primitives/Alert";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const AddUser = (props) => {
|
const AddUser = (props) => {
|
||||||
const [name, setName] = useState("");
|
const [name, setName] = useState("");
|
||||||
@@ -195,13 +196,7 @@ const AddUser = (props) => {
|
|||||||
{isUserExist && <Alert type="danger">User already exists!</Alert>}
|
{isUserExist && <Alert type="danger">User already exists!</Alert>}
|
||||||
{isLoader && (
|
{isLoader && (
|
||||||
<div className="fixed inset-0 flex justify-center items-center bg-black bg-opacity-30 z-50">
|
<div className="fixed inset-0 flex justify-center items-center bg-black bg-opacity-30 z-50">
|
||||||
<div
|
<Loader />
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="w-full mx-auto">
|
<div className="w-full mx-auto">
|
||||||
@@ -213,7 +208,7 @@ const AddUser = (props) => {
|
|||||||
className="block text-xs text-gray-700 font-semibold"
|
className="block text-xs text-gray-700 font-semibold"
|
||||||
>
|
>
|
||||||
Name
|
Name
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[red] text-[13px]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
@@ -221,7 +216,7 @@ const AddUser = (props) => {
|
|||||||
value={name}
|
value={name}
|
||||||
onChange={(e) => setName(e.target.value)}
|
onChange={(e) => setName(e.target.value)}
|
||||||
required
|
required
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
@@ -230,7 +225,7 @@ const AddUser = (props) => {
|
|||||||
className="block text-xs text-gray-700 font-semibold"
|
className="block text-xs text-gray-700 font-semibold"
|
||||||
>
|
>
|
||||||
Email
|
Email
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[red] text-[13px]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
@@ -238,7 +233,7 @@ const AddUser = (props) => {
|
|||||||
value={email}
|
value={email}
|
||||||
onChange={(e) => setEmail(e.target.value)}
|
onChange={(e) => setEmail(e.target.value)}
|
||||||
required
|
required
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
@@ -247,7 +242,7 @@ const AddUser = (props) => {
|
|||||||
className="block text-xs text-gray-700 font-semibold"
|
className="block text-xs text-gray-700 font-semibold"
|
||||||
>
|
>
|
||||||
Phone
|
Phone
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[red] text-[13px]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
@@ -255,7 +250,7 @@ const AddUser = (props) => {
|
|||||||
value={phone}
|
value={phone}
|
||||||
onChange={(e) => setPhone(e.target.value)}
|
onChange={(e) => setPhone(e.target.value)}
|
||||||
required
|
required
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import React, { useState, useEffect, useRef } from "react";
|
import React, { useState, useEffect, useRef } from "react";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import SuggestionInput from "./shared/fields/SuggestionInput";
|
import SuggestionInput from "./shared/fields/SuggestionInput";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const BulkSendUi = (props) => {
|
const BulkSendUi = (props) => {
|
||||||
const [forms, setForms] = useState([]);
|
const [forms, setForms] = useState([]);
|
||||||
@@ -170,14 +171,8 @@ const BulkSendUi = (props) => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{isSubmit && (
|
{isSubmit && (
|
||||||
<div className="absolute z-[999] h-full w-full flex justify-center items-center bg-black bg-opacity-40">
|
<div className="absolute z-[999] h-full w-full flex justify-center items-center bg-black bg-opacity-30">
|
||||||
<div
|
<Loader />
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37 "
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{props.Placeholders?.length > 0 ? (
|
{props.Placeholders?.length > 0 ? (
|
||||||
@@ -185,14 +180,14 @@ const BulkSendUi = (props) => {
|
|||||||
<>
|
<>
|
||||||
{props.Placeholders?.some((x) => !x.signerObjId) ? (
|
{props.Placeholders?.some((x) => !x.signerObjId) ? (
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<div className=" min-h-max max-h-[250px] overflow-y-auto">
|
<div className="min-h-max max-h-[250px] overflow-y-auto">
|
||||||
{forms?.map((form, index) => (
|
{forms?.map((form, index) => (
|
||||||
<div
|
<div
|
||||||
key={form.Id}
|
key={form.Id}
|
||||||
className="p-3 rounded-xl border-[1px] border-gray-400 m-4 bg-white text-black grid grid-cols-1 md:grid-cols-2 gap-2 relative"
|
className="p-3 op-card border-[1px] border-gray-400 mt-3 mx-4 mb-4 bg-base-200 text-base-content grid grid-cols-1 md:grid-cols-2 gap-2 relative"
|
||||||
>
|
>
|
||||||
{form?.fields?.map((field, fieldIndex) => (
|
{form?.fields?.map((field, fieldIndex) => (
|
||||||
<div className="flex flex-col " key={field.fieldId}>
|
<div className="flex flex-col" key={field.fieldId}>
|
||||||
<label>{field.label}</label>
|
<label>{field.label}</label>
|
||||||
<SuggestionInput
|
<SuggestionInput
|
||||||
required
|
required
|
||||||
@@ -208,7 +203,7 @@ const BulkSendUi = (props) => {
|
|||||||
{forms?.length > 1 && (
|
{forms?.length > 1 && (
|
||||||
<button
|
<button
|
||||||
onClick={() => handleRemoveForm(index)}
|
onClick={() => handleRemoveForm(index)}
|
||||||
className="absolute right-3 top-1 border border-gray-300 rounded-lg px-2 py-1"
|
className="absolute right-3 top-1 text-[red] border-[1px] border-[red] rounded-lg w-[1.7rem] h-[1.7rem]"
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-trash"></i>
|
<i className="fa-solid fa-trash"></i>
|
||||||
</button>
|
</button>
|
||||||
@@ -220,13 +215,13 @@ const BulkSendUi = (props) => {
|
|||||||
<div className="flex flex-col mx-4 mb-4 gap-3">
|
<div className="flex flex-col mx-4 mb-4 gap-3">
|
||||||
<button
|
<button
|
||||||
onClick={handleAddForm}
|
onClick={handleAddForm}
|
||||||
className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none"
|
className="op-btn op-btn-primary focus:outline-none"
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-plus"></i> <span>Add new</span>
|
<i className="fa-solid fa-plus"></i> <span>Add new</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="bg-[#32a3ac] p-2 text-white w-full rounded-full focus:outline-none"
|
className="op-btn op-btn-secondary focus:outline-none"
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-paper-plane"></i>{" "}
|
<i className="fa-solid fa-paper-plane"></i>{" "}
|
||||||
<span>Send</span>
|
<span>Send</span>
|
||||||
|
|||||||
@@ -45,12 +45,16 @@ const Footer = () => {
|
|||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="bg-[#222c3c] text-[#98a6ba] text-center text-[13px] py-3">
|
<footer className="op-footer op-footer-center py-3 bg-base-300 text-base-content text-center text-[13px]">
|
||||||
All Rights Reserved © {new Date().getFullYear()}
|
<aside>
|
||||||
<span onClick={openUrl} className="hover:underline cursor-pointer">
|
<p>
|
||||||
{appName} ( version: {version ? version : `${Package.version} `})
|
All Rights Reserved © {new Date().getFullYear()}
|
||||||
</span>
|
<span onClick={openUrl} className="hover:underline cursor-pointer">
|
||||||
</div>
|
{appName} ( version: {version ? version : `${Package.version} `})
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
</aside>
|
||||||
|
</footer>
|
||||||
<button
|
<button
|
||||||
className={`${
|
className={`${
|
||||||
showButton ? "block" : "hidden"
|
showButton ? "block" : "hidden"
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ const FullScreenButton = () => {
|
|||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<button
|
<button
|
||||||
onClick={toggleFullScreen}
|
onClick={toggleFullScreen}
|
||||||
className="text-black p-2 text-sm focus:outline-none"
|
className="text-base-content p-2 text-sm focus:outline-none"
|
||||||
>
|
>
|
||||||
{isFullScreen ? (
|
{isFullScreen ? (
|
||||||
<i className="fa-solid fa-compress"></i>
|
<i className="fa-solid fa-compress"></i>
|
||||||
|
|||||||
@@ -45,7 +45,11 @@ const Header = ({ showSidebar }) => {
|
|||||||
const closeDropdown = () => {
|
const closeDropdown = () => {
|
||||||
setIsOpen(false);
|
setIsOpen(false);
|
||||||
if (Parse?.User?.current()) {
|
if (Parse?.User?.current()) {
|
||||||
Parse.User.logOut();
|
try {
|
||||||
|
Parse.User.logOut();
|
||||||
|
} catch (err) {
|
||||||
|
console.log("Err", err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let appdata = localStorage.getItem("userSettings");
|
let appdata = localStorage.getItem("userSettings");
|
||||||
let applogo = localStorage.getItem("appLogo");
|
let applogo = localStorage.getItem("appLogo");
|
||||||
@@ -89,14 +93,16 @@ const Header = ({ showSidebar }) => {
|
|||||||
}, [isOpen]);
|
}, [isOpen]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-row justify-between items-center gap-x-3 md:gap-x-4 bg-white md:px-4 px-2 shadow h-[50px] md:w-full ">
|
<div className="op-navbar bg-base-100 shadow">
|
||||||
<button
|
<div className="flex-none">
|
||||||
className="cursor-pointer focus:outline-none"
|
<button
|
||||||
onClick={showSidebar}
|
className="op-btn op-btn-square op-btn-ghost focus:outline-none"
|
||||||
>
|
onClick={showSidebar}
|
||||||
<i className={`fa-solid fa-bars text-xl `}></i>
|
>
|
||||||
</button>
|
<i className="fa-solid fa-bars text-xl text-base-content"></i>
|
||||||
<div className="flex-1">
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1 ml-2">
|
||||||
<div className="h-[25px] md:h-[40px] w-auto overflow-hidden">
|
<div className="h-[25px] md:h-[40px] w-auto overflow-hidden">
|
||||||
<img
|
<img
|
||||||
className="object-contain h-full w-auto"
|
className="object-contain h-full w-auto"
|
||||||
@@ -105,10 +111,7 @@ const Header = ({ showSidebar }) => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div id="profile-menu" className="flex-none gap-2">
|
||||||
id="profile-menu"
|
|
||||||
className="flex justify-between items-center gap-x-3"
|
|
||||||
>
|
|
||||||
{!isSubscribe && (
|
{!isSubscribe && (
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
@@ -120,7 +123,7 @@ const Header = ({ showSidebar }) => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{isPro && (
|
{isPro && (
|
||||||
<div className="w-[35px] h-[35px] rounded-full ring-[1px] ring-offset-2 ring-[#002862] text-[#002862] overflow-hidden font-semibold flex items-center justify-center">
|
<div className="w-[35px] h-[35px] bg-white rounded-full ring-[1px] ring-offset-2 ring-[#002862] text-[#002862] overflow-hidden font-semibold flex items-center justify-center">
|
||||||
PRO
|
PRO
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -140,60 +143,66 @@ const Header = ({ showSidebar }) => {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{width >= 768 && (
|
{width >= 768 && (
|
||||||
<div onClick={toggleDropdown} className="cursor-pointer text-sm">
|
<div
|
||||||
|
onClick={toggleDropdown}
|
||||||
|
className="cursor-pointer text-base-content text-sm"
|
||||||
|
>
|
||||||
{username && username}
|
{username && username}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="relative">
|
<div className="op-dropdown op-dropdown-end" id="profile-menu">
|
||||||
<div className="cursor-pointer">
|
<div tabIndex={0} role="button" className="op-btn op-btn-ghost">
|
||||||
<i onClick={toggleDropdown} className="fa-solid fa-angle-down"></i>
|
<i
|
||||||
|
tabIndex={0}
|
||||||
|
role="button"
|
||||||
|
onClick={toggleDropdown}
|
||||||
|
className="fa-solid fa-angle-down text-base-content"
|
||||||
|
></i>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<ul
|
||||||
className={`dropdown absolute text-sm text-gray-700 font-light right-0 mt-4 p-1 w-48 bg-white border rounded-lg shadow-lg z-10 ${
|
tabIndex={0}
|
||||||
isOpen ? "block" : "hidden"
|
className="mt-3 z-[1] p-2 shadow op-menu op-menu-sm op-dropdown-content text-base-content bg-base-100 rounded-box w-52"
|
||||||
}`}
|
|
||||||
>
|
>
|
||||||
<ul>
|
<li onClick={() => openInNewTab("https://docs.opensignlabs.com")}>
|
||||||
<li
|
<span>
|
||||||
className="hover:bg-gray-100 rounded-t-lg py-1 px-2 cursor-pointer font-normal"
|
|
||||||
onClick={() => openInNewTab("https://docs.opensignlabs.com")}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-book"></i> Docs
|
<i className="fa-solid fa-book"></i> Docs
|
||||||
</li>
|
</span>
|
||||||
<li
|
</li>
|
||||||
className="hover:bg-gray-100 py-1 px-2 cursor-pointer font-normal"
|
<li
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setIsOpen(false);
|
setIsOpen(false);
|
||||||
navigate("/profile");
|
navigate("/profile");
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
<span>
|
||||||
<i className="fa-regular fa-user"></i> Profile
|
<i className="fa-regular fa-user"></i> Profile
|
||||||
</li>
|
</span>
|
||||||
<li
|
</li>
|
||||||
className="hover:bg-gray-100 py-1 px-2 cursor-pointer font-normal"
|
<li
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setIsOpen(false);
|
setIsOpen(false);
|
||||||
navigate("/changepassword");
|
navigate("/changepassword");
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
<span>
|
||||||
<i className="fa-solid fa-lock"></i> Change Password
|
<i className="fa-solid fa-lock"></i> Change Password
|
||||||
</li>
|
</span>
|
||||||
<li
|
</li>
|
||||||
className="hover:bg-gray-100 py-1 px-2 cursor-pointer font-normal"
|
<li
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
window.open("https://console.opensignlabs.com/");
|
window.open("https://console.opensignlabs.com/");
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
<span>
|
||||||
<i className="fa-regular fa-id-card"></i> Console
|
<i className="fa-regular fa-id-card"></i> Console
|
||||||
</li>
|
</span>
|
||||||
<li
|
</li>
|
||||||
className="hover:bg-gray-100 rounded-b-lg py-1 px-2 cursor-pointer font-normal"
|
<li onClick={closeDropdown}>
|
||||||
onClick={closeDropdown}
|
<span>
|
||||||
>
|
|
||||||
<i className="fa-solid fa-arrow-right-from-bracket"></i> Log Out
|
<i className="fa-solid fa-arrow-right-from-bracket"></i> Log Out
|
||||||
</li>
|
</span>
|
||||||
</ul>
|
</li>
|
||||||
</div>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
// import FacebookLogin from "react-facebook-login";
|
// import FacebookLogin from "react-facebook-login";
|
||||||
|
|
||||||
const LoginFacebook = ({
|
const LoginFacebook = ({
|
||||||
@@ -112,29 +113,10 @@ const LoginFacebook = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div style={{ position: "relative" }}>
|
<div className="relative">
|
||||||
{thirdpartyLoader && (
|
{thirdpartyLoader && (
|
||||||
<div
|
<div className="fixed flex justify-center items-center inset-0 bg-black bg-opacity-25 z-20 ">
|
||||||
style={{
|
<Loader />
|
||||||
position: "fixed",
|
|
||||||
width: "100vw",
|
|
||||||
height: "100vh",
|
|
||||||
backgroundColor: "rgba(0,0,0,0.2)",
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
zIndex: 2
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
position: "fixed",
|
|
||||||
fontSize: "50px",
|
|
||||||
color: "#3ac9d6",
|
|
||||||
top: "50%",
|
|
||||||
left: "45%"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{/* <FacebookLogin
|
{/* <FacebookLogin
|
||||||
@@ -146,11 +128,10 @@ const LoginFacebook = ({
|
|||||||
/> */}
|
/> */}
|
||||||
{isModal && (
|
{isModal && (
|
||||||
<div
|
<div
|
||||||
className="modal fade show"
|
className="modal fade show block z-[1]"
|
||||||
id="exampleModal"
|
id="exampleModal"
|
||||||
tabIndex="-1"
|
tabIndex="-1"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
style={{ display: "block", zIndex: 1 }}
|
|
||||||
>
|
>
|
||||||
<div className="modal-dialog" role="document">
|
<div className="modal-dialog" role="document">
|
||||||
<div className="modal-content">
|
<div className="modal-content">
|
||||||
@@ -163,13 +144,8 @@ const LoginFacebook = ({
|
|||||||
<div className="modal-body">
|
<div className="modal-body">
|
||||||
<form>
|
<form>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label
|
<label htmlFor="Phone" className="col-form-label">
|
||||||
htmlFor="Phone"
|
Phone <span className="text-[red] text-[13px]">*</span>
|
||||||
style={{ display: "flex" }}
|
|
||||||
className="col-form-label"
|
|
||||||
>
|
|
||||||
Phone{" "}
|
|
||||||
<span style={{ fontSize: 13, color: "red" }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="tel"
|
type="tel"
|
||||||
@@ -186,13 +162,8 @@ const LoginFacebook = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label
|
<label htmlFor="Company" className="col-form-label">
|
||||||
htmlFor="Company"
|
Company <span className="text-[red] text-[13px]">*</span>
|
||||||
style={{ display: "flex" }}
|
|
||||||
className="col-form-label"
|
|
||||||
>
|
|
||||||
Company{" "}
|
|
||||||
<span style={{ fontSize: 13, color: "red" }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
@@ -212,16 +183,14 @@ const LoginFacebook = ({
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => handleSubmitbtn()}
|
onClick={() => handleSubmitbtn()}
|
||||||
className="btn btn-info"
|
className="btn btn-info mr-[10px]"
|
||||||
style={{ marginRight: 10 }}
|
|
||||||
>
|
>
|
||||||
Sign up
|
Sign up
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="btn btn-secondary"
|
className="btn btn-secondary w-[90px]"
|
||||||
onClick={() => setIsModal(false)}
|
onClick={() => setIsModal(false)}
|
||||||
style={{ width: 90 }}
|
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import Parse from "parse";
|
|||||||
import { jwtDecode } from "jwt-decode";
|
import { jwtDecode } from "jwt-decode";
|
||||||
import { useScript } from "../hook/useScript";
|
import { useScript } from "../hook/useScript";
|
||||||
import ModalUi from "../primitives/ModalUi";
|
import ModalUi from "../primitives/ModalUi";
|
||||||
import { modalCancelBtnColor, modalSubmitBtnColor } from "../constant/const";
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* `GoogleSignInBtn`as it's name indicates it render google sign in button
|
* `GoogleSignInBtn`as it's name indicates it render google sign in button
|
||||||
@@ -207,45 +207,22 @@ const GoogleSignInBtn = ({
|
|||||||
localStorage.setItem("parseAppId", appid);
|
localStorage.setItem("parseAppId", appid);
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div style={{ position: "relative" }}>
|
<div className="relative">
|
||||||
{thirdpartyLoader && (
|
{thirdpartyLoader && (
|
||||||
<div
|
<div className="fixed flex justify-center items-center inset-0 bg-black bg-opacity-25 z-20 ">
|
||||||
style={{
|
<Loader />
|
||||||
position: "fixed",
|
|
||||||
width: "100vw",
|
|
||||||
height: "100vh",
|
|
||||||
backgroundColor: "rgba(0,0,0,0.2)",
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
zIndex: 2
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
position: "fixed",
|
|
||||||
fontSize: "50px",
|
|
||||||
color: "#3ac9d6",
|
|
||||||
top: "50%",
|
|
||||||
left: "45%"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div ref={googleBtn} className="text-sm"></div>
|
<div ref={googleBtn} className="text-sm"></div>
|
||||||
<ModalUi showClose={false} isOpen={isModal} title="Sign up form">
|
<ModalUi showClose={false} isOpen={isModal} title="Sign up form">
|
||||||
<form className="px-4 py-3">
|
<form className="px-4 py-3 text-base-content">
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="Phone" className="block text-xs font-semibold">
|
||||||
htmlFor="Phone"
|
Phone <span className="text-[13px] text-[red]">*</span>
|
||||||
style={{ display: "flex" }}
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Phone <span style={{ fontSize: 13, color: "red" }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="tel"
|
type="tel"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
id="Phone"
|
id="Phone"
|
||||||
value={userDetails.Phone}
|
value={userDetails.Phone}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
@@ -258,16 +235,12 @@ const GoogleSignInBtn = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="Company" className="block text-xs font-semibold">
|
||||||
htmlFor="Company"
|
Company <span className="text-[13px] text-[red]">*</span>
|
||||||
style={{ display: "flex" }}
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Company <span style={{ fontSize: 13, color: "red" }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
id="Company"
|
id="Company"
|
||||||
value={userDetails.Company}
|
value={userDetails.Company}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
@@ -280,16 +253,12 @@ const GoogleSignInBtn = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="JobTitle" className="block text-xs font-semibold">
|
||||||
htmlFor="JobTitle"
|
Job Title <span className="text-[13px] text-[red]">*</span>
|
||||||
style={{ display: "flex" }}
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Job Title <span style={{ fontSize: 13, color: "red" }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
id="JobTitle"
|
id="JobTitle"
|
||||||
value={userDetails.Destination}
|
value={userDetails.Destination}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
@@ -301,20 +270,18 @@ const GoogleSignInBtn = ({
|
|||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div className="flex flex-row gap-2">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="px-3 py-1.5 text-white rounded shadow-md text-center focus:outline-none "
|
className="op-btn op-btn-primary"
|
||||||
onClick={() => handleSubmitbtn()}
|
onClick={() => handleSubmitbtn()}
|
||||||
style={{ marginRight: 10, backgroundColor: modalSubmitBtnColor }}
|
|
||||||
>
|
>
|
||||||
Sign up
|
Sign up
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="p-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none"
|
className="op-btn op-btn-ghost"
|
||||||
onClick={handleCloseModal}
|
onClick={handleCloseModal}
|
||||||
style={{ width: 90, backgroundColor: modalCancelBtnColor }}
|
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -4,27 +4,11 @@ import { Stage, Layer, Rect } from "react-konva";
|
|||||||
const RenderDebugPdf = (props) => {
|
const RenderDebugPdf = (props) => {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div
|
<div className="sticky top-0 p-[10px] z-10 bg-white border-[1px] border-[gray] my-[5px]">
|
||||||
style={{
|
|
||||||
position: "sticky",
|
|
||||||
top: 0,
|
|
||||||
padding: 10,
|
|
||||||
zIndex: 1,
|
|
||||||
backgroundColor: "white",
|
|
||||||
border: "1px solid grey",
|
|
||||||
margin: "5px 0"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{`Co-ordinates: X - ${props.hoverCoordinates.x}, Y - ${props.hoverCoordinates.y}`}
|
{`Co-ordinates: X - ${props.hoverCoordinates.x}, Y - ${props.hoverCoordinates.y}`}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
style={{
|
className="relative flex-1 cursor-crosshair border-[1px] border-[gray] overflow-auto"
|
||||||
flex: 1,
|
|
||||||
position: "relative",
|
|
||||||
border: "1px solid grey",
|
|
||||||
overflow: "auto",
|
|
||||||
cursor: "crosshair"
|
|
||||||
}}
|
|
||||||
onMouseMove={props.handleMouseMoveDiv}
|
onMouseMove={props.handleMouseMoveDiv}
|
||||||
>
|
>
|
||||||
<Document
|
<Document
|
||||||
@@ -57,7 +41,7 @@ const RenderDebugPdf = (props) => {
|
|||||||
onMouseUp={props.handleMouseUp}
|
onMouseUp={props.handleMouseUp}
|
||||||
width={props.pdfDimension.width}
|
width={props.pdfDimension.width}
|
||||||
height={props.pdfDimension.height}
|
height={props.pdfDimension.height}
|
||||||
style={{ position: "absolute", top: 0, left: 0 }}
|
className="absolute top-0 right-0"
|
||||||
>
|
>
|
||||||
<Layer>
|
<Layer>
|
||||||
{props.annotations
|
{props.annotations
|
||||||
|
|||||||
@@ -26,18 +26,18 @@ const DashboardButton = (props) => {
|
|||||||
props.Data && props.Data.Redirect_type
|
props.Data && props.Data.Redirect_type
|
||||||
? "cursor-pointer"
|
? "cursor-pointer"
|
||||||
: "cursor-default"
|
: "cursor-default"
|
||||||
} w-full px-3 py-2 flex text-white rounded-md shadow overflow-hidden`}
|
} w-full shadow-md px-3 py-2 op-card bg-base-100`}
|
||||||
>
|
>
|
||||||
<div className="flex items-center justify-start gap-5">
|
<div className="flex flex-row items-center">
|
||||||
<span className="rounded-full bg-black bg-opacity-20 w-[60px] h-[60px] self-start flex justify-center items-center">
|
<span className="rounded-full bg-base-content bg-opacity-20 w-[60px] h-[60px] self-start flex justify-center items-center">
|
||||||
<i
|
<i
|
||||||
className={`${
|
className={`${
|
||||||
props.Icon ? props.Icon : "fa fa-solid fa-info"
|
props.Icon ? props.Icon : "fa fa-solid fa-info"
|
||||||
} text-[25px] lg:text-[30px]`}
|
} text-[25px] lg:text-[30px]`}
|
||||||
></i>
|
></i>
|
||||||
</span>
|
</span>
|
||||||
<div className="">
|
<div className="op-card-title text-lg ml-3 text-base-content">
|
||||||
<div className="text-base lg:text-lg text-black"> {props.Label}</div>
|
{props.Label}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -336,25 +336,29 @@ const DashboardCard = (props) => {
|
|||||||
props.Data && props.Data.Redirect_type
|
props.Data && props.Data.Redirect_type
|
||||||
? "cursor-pointer"
|
? "cursor-pointer"
|
||||||
: "cursor-default"
|
: "cursor-default"
|
||||||
} w-full h-[140px] px-3 pt-4 pb-10 text-white rounded-md shadow overflow-hidden relative`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className="flex items-center justify-start gap-5">
|
<div className="flex items-center justify-start gap-5 text-white">
|
||||||
<span className="rounded-full bg-black bg-opacity-20 w-[60px] h-[60px] self-start flex justify-center items-center">
|
<span className="rounded-full bg-black bg-opacity-20 w-[60px] h-[60px] self-start flex justify-center items-center">
|
||||||
<i
|
<i
|
||||||
className={`${
|
className={`${
|
||||||
props.Icon ? props.Icon : "fa fa-solid fa-info"
|
props.Icon ? props.Icon : "fa fa-solid fa-info"
|
||||||
} text-[25px] lg:text-[30px]`}
|
} text-[25px] lg:text-[30px]`}
|
||||||
></i>
|
></i>
|
||||||
</span>
|
</span>
|
||||||
<div className="">
|
<div className="font-medium">
|
||||||
<div className="text-base lg:text-lg"> {props.Label}</div>
|
<div className="text-base lg:text-lg"> {props.Label}</div>
|
||||||
<div className="text-2xl font-light">
|
<div className="text-2xl font-light">
|
||||||
{loading ? <div className="loader-01"></div> : setFormat(response)}
|
{loading ? <div className="loader-01"></div> : setFormat(response)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs absolute top-2 right-1">
|
<div className="text-xs absolute top-3 right-2">
|
||||||
<Tooltip id={props.Label} iconColor={"white"} message={props?.Data?.tourMessage} />
|
<Tooltip
|
||||||
|
id={props.Label}
|
||||||
|
iconColor={"white"}
|
||||||
|
message={props?.Data?.tourMessage}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import Parse from "parse";
|
|||||||
import ReportTable from "../../primitives/GetReportDisplay";
|
import ReportTable from "../../primitives/GetReportDisplay";
|
||||||
import reportJson from "../../json/ReportJson";
|
import reportJson from "../../json/ReportJson";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
import Loader from "../../primitives/Loader";
|
||||||
function DashboardReport(props) {
|
function DashboardReport(props) {
|
||||||
// console.log("props ", props)
|
// console.log("props ", props)
|
||||||
const [List, setList] = useState([]);
|
const [List, setList] = useState([]);
|
||||||
@@ -121,21 +122,8 @@ function DashboardReport(props) {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{isLoader ? (
|
{isLoader ? (
|
||||||
<div
|
<div className="h-[250px] flex justify-center items-center">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -18,51 +18,26 @@ const buttonList = [
|
|||||||
];
|
];
|
||||||
const GetDashboard = (props) => {
|
const GetDashboard = (props) => {
|
||||||
const Button = ({ label, redirectId, redirectType, icon }) => (
|
const Button = ({ label, redirectId, redirectType, icon }) => (
|
||||||
<div className={"bg-white rounded-md shadow w-full"}>
|
<DashboardButton
|
||||||
<Suspense
|
Icon={icon}
|
||||||
fallback={
|
Label={label}
|
||||||
<div style={{ height: "300px" }}>
|
Data={{ Redirect_type: redirectType, Redirect_id: redirectId }}
|
||||||
<div
|
/>
|
||||||
style={{
|
|
||||||
marginLeft: "45%",
|
|
||||||
marginTop: "150px",
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<DashboardButton
|
|
||||||
Icon={icon}
|
|
||||||
Label={label}
|
|
||||||
Data={{ Redirect_type: redirectType, Redirect_id: redirectId }}
|
|
||||||
/>
|
|
||||||
</Suspense>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
const renderSwitchWithTour = (col) => {
|
const renderSwitchWithTour = (col) => {
|
||||||
switch (col.widget.type) {
|
switch (col.widget.type) {
|
||||||
case "Card":
|
case "Card":
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={"bg-[#2ed8b6] rounded-md shadow mb-3 md:mb-0"}
|
className={`${
|
||||||
|
col?.widget?.bgColor ? col.widget.bgColor : "bg-[#2ed8b6]"
|
||||||
|
} op-card w-full h-[140px] px-3 pt-4 mb-3 shadow-md"`}
|
||||||
data-tut={col.widget.data.tourSection}
|
data-tut={col.widget.data.tourSection}
|
||||||
style={{ background: col.widget.bgColor }}
|
|
||||||
>
|
>
|
||||||
<Suspense
|
<Suspense
|
||||||
fallback={
|
fallback={
|
||||||
<div style={{ height: "300px" }}>
|
<div className="h-[150px] w-full flex justify-center items-center">
|
||||||
<div
|
loading...
|
||||||
style={{
|
|
||||||
marginLeft: "45%",
|
|
||||||
marginTop: "150px",
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
@@ -72,7 +47,6 @@ const GetDashboard = (props) => {
|
|||||||
Format={col.widget.format && col.widget.format}
|
Format={col.widget.format && col.widget.format}
|
||||||
Data={col.widget.data}
|
Data={col.widget.data}
|
||||||
FilterData={col.widget.filter}
|
FilterData={col.widget.filter}
|
||||||
DefaultQuery={props.DefaultQuery}
|
|
||||||
/>
|
/>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</div>
|
</div>
|
||||||
@@ -89,7 +63,7 @@ const GetDashboard = (props) => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return null;
|
return <></>;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const renderSwitch = (col) => {
|
const renderSwitch = (col) => {
|
||||||
@@ -97,8 +71,9 @@ const GetDashboard = (props) => {
|
|||||||
case "Card":
|
case "Card":
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={"bg-[#2ed8b6] rounded-md shadow mb-3 md:mb-0"}
|
className={`${
|
||||||
style={{ background: col.widget.bgColor }}
|
col?.widget?.bgColor ? col.widget.bgColor : "bg-[#2ed8b6]"
|
||||||
|
} op-card w-full h-[140px] px-3 pt-4 mb-3 shadow-md"`}
|
||||||
>
|
>
|
||||||
<Suspense fallback={<div>please wait</div>}>
|
<Suspense fallback={<div>please wait</div>}>
|
||||||
<DashboardCard
|
<DashboardCard
|
||||||
@@ -107,7 +82,6 @@ const GetDashboard = (props) => {
|
|||||||
Format={col.widget.format && col.widget.format}
|
Format={col.widget.format && col.widget.format}
|
||||||
Data={col.widget.data}
|
Data={col.widget.data}
|
||||||
FilterData={col.widget.filter}
|
FilterData={col.widget.filter}
|
||||||
DefaultQuery={props.DefaultQuery}
|
|
||||||
/>
|
/>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</div>
|
</div>
|
||||||
@@ -122,7 +96,7 @@ const GetDashboard = (props) => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return null;
|
return <></>;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
@@ -130,7 +104,7 @@ const GetDashboard = (props) => {
|
|||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<div
|
<div
|
||||||
data-tut={"tourbutton"}
|
data-tut={"tourbutton"}
|
||||||
className="flex flex-col md:flex-row gap-6 md:gap-8"
|
className="flex flex-col md:flex-row gap-4"
|
||||||
>
|
>
|
||||||
{buttonList.map((btn) => (
|
{buttonList.map((btn) => (
|
||||||
<Button
|
<Button
|
||||||
@@ -143,21 +117,19 @@ const GetDashboard = (props) => {
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{props.dashboard.map((val, key) => (
|
<div className="grid grid-cols-12 w-full gap-x-4">
|
||||||
<div key={"a" + key} className="row">
|
{props?.dashboard?.columns?.map((col, i) =>
|
||||||
{val.columns.map((col, i) =>
|
col.widget.data && col.widget.data.tourSection ? (
|
||||||
col.widget.data && col.widget.data.tourSection ? (
|
<div key={i} className={col?.colsize}>
|
||||||
<div key={i} className={props.classnameArray[key][i]}>
|
{renderSwitchWithTour(col)}
|
||||||
{renderSwitchWithTour(col)}
|
</div>
|
||||||
</div>
|
) : (
|
||||||
) : (
|
<div key={i} className={col?.colsize}>
|
||||||
<div key={i} className={props.classnameArray[key][i]}>
|
{renderSwitch(col)}
|
||||||
{renderSwitch(col)}
|
</div>
|
||||||
</div>
|
)
|
||||||
)
|
)}
|
||||||
)}
|
</div>
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import { useNavigate } from "react-router-dom";
|
|||||||
import Table from "react-bootstrap/Table";
|
import Table from "react-bootstrap/Table";
|
||||||
import * as HoverCard from "@radix-ui/react-hover-card";
|
import * as HoverCard from "@radix-ui/react-hover-card";
|
||||||
import ModalUi from "../../primitives/ModalUi";
|
import ModalUi from "../../primitives/ModalUi";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
import FolderModal from "../shared/fields/FolderModal";
|
import FolderModal from "../shared/fields/FolderModal";
|
||||||
|
|
||||||
function DriveBody(props) {
|
function DriveBody(props) {
|
||||||
@@ -313,32 +312,21 @@ function DriveBody(props) {
|
|||||||
|
|
||||||
const signersName = () => {
|
const signersName = () => {
|
||||||
const getSignersName = signerExist.map((data) => data.Name);
|
const getSignersName = signerExist.map((data) => data.Name);
|
||||||
const signerName = getSignersName.join(",");
|
const signerName = getSignersName.join(", ");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<span
|
<span className="statusSpan w-[90%] break-words">{signerName}</span>
|
||||||
className="statusSpan"
|
|
||||||
style={{ width: "90%", wordWrap: "break-word" }}
|
|
||||||
>
|
|
||||||
{signerName}{" "}
|
|
||||||
</span>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
return listType === "table" ? (
|
return listType === "table" ? (
|
||||||
data.Type === "Folder" ? (
|
data.Type === "Folder" ? (
|
||||||
<tr onClick={() => handleOnclikFolder(data)}>
|
<tr onClick={() => handleOnclikFolder(data)}>
|
||||||
<td
|
<td className="cursor-pointer flex items-center">
|
||||||
style={{ cursor: "pointer", display: "flex", alignItems: "center" }}
|
|
||||||
>
|
|
||||||
<i
|
<i
|
||||||
className="fa fa-folder"
|
className="fa fa-folder mr-[8px] text-[26px] text-[#f0ad26]"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
style={{ color: "#f0ad26", marginRight: "8px", fontSize: "26px" }}
|
|
||||||
></i>
|
></i>
|
||||||
|
<span className="text-[12px] font-medium">{data.Name}</span>
|
||||||
<span style={{ fontSize: "12px", fontWeight: "500" }}>
|
|
||||||
{data.Name}
|
|
||||||
</span>
|
|
||||||
</td>
|
</td>
|
||||||
<td>_</td>
|
<td>_</td>
|
||||||
<td>Folder</td>
|
<td>Folder</td>
|
||||||
@@ -347,17 +335,9 @@ function DriveBody(props) {
|
|||||||
</tr>
|
</tr>
|
||||||
) : (
|
) : (
|
||||||
<tr onClick={() => checkPdfStatus(data)}>
|
<tr onClick={() => checkPdfStatus(data)}>
|
||||||
<td
|
<td className="cursor-pointer flex items-center">
|
||||||
style={{ cursor: "pointer", display: "flex", alignItems: "center" }}
|
<i className="fa fa-file-pdf mr-[8px] text-[26px] text-[#ed4d0e]"></i>
|
||||||
>
|
<span className="text-[12px] font-medium">{data.Name}</span>
|
||||||
<i
|
|
||||||
className="fa fa-file-pdf"
|
|
||||||
style={{ color: "#ed4d0e", marginRight: "8px", fontSize: "26px" }}
|
|
||||||
></i>
|
|
||||||
|
|
||||||
<span style={{ fontSize: "12px", fontWeight: "500" }}>
|
|
||||||
{data.Name}
|
|
||||||
</span>
|
|
||||||
</td>
|
</td>
|
||||||
<td>{createddate}</td>
|
<td>{createddate}</td>
|
||||||
<td>Pdf</td>
|
<td>Pdf</td>
|
||||||
@@ -368,31 +348,22 @@ function DriveBody(props) {
|
|||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
handleMenuItemClick("Download", data);
|
handleMenuItemClick("Download", data);
|
||||||
}}
|
}}
|
||||||
className="fa fa-download"
|
className="fa fa-download mr-[8px] text-[#ed280e]"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
style={{ color: "#ed280e", marginRight: "8px" }}
|
|
||||||
></i>
|
></i>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
)
|
)
|
||||||
) : listType === "list" && data.Type === "Folder" ? (
|
) : listType === "list" && data.Type === "Folder" ? (
|
||||||
<div key={ind} className="folderBox">
|
<div key={ind} className="icon-container">
|
||||||
<ContextMenu.Root>
|
<ContextMenu.Root>
|
||||||
<ContextMenu.Trigger className="ContextMenuTrigger">
|
<ContextMenu.Trigger className="ContextMenuTrigger">
|
||||||
<div
|
<div data-tut={props.dataTutSeventh}>
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "column",
|
|
||||||
cursor: "pointer"
|
|
||||||
}}
|
|
||||||
data-tut={props.dataTutSeventh}
|
|
||||||
>
|
|
||||||
<img
|
<img
|
||||||
alt="no img"
|
alt="folder"
|
||||||
onClick={() => handleOnclikFolder(data)}
|
onClick={() => handleOnclikFolder(data)}
|
||||||
src={folder}
|
src={folder}
|
||||||
width={100}
|
className="w-full h-full"
|
||||||
height={103}
|
|
||||||
/>
|
/>
|
||||||
{rename === data.objectId ? (
|
{rename === data.objectId ? (
|
||||||
<input
|
<input
|
||||||
@@ -411,12 +382,7 @@ function DriveBody(props) {
|
|||||||
defaultValue={renameValue}
|
defaultValue={renameValue}
|
||||||
// value={renameValue}
|
// value={renameValue}
|
||||||
onChange={(e) => setRenameValue(e.target.value)}
|
onChange={(e) => setRenameValue(e.target.value)}
|
||||||
style={{
|
className="w-[100px] border-[1.5px] border-black rounded-sm text-[10px]"
|
||||||
width: "100px",
|
|
||||||
border: "1.5px solid black",
|
|
||||||
borderRadius: "2px",
|
|
||||||
fontSize: "10px"
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<span className="foldName">{data.Name}</span>
|
<span className="foldName">{data.Name}</span>
|
||||||
@@ -434,8 +400,8 @@ function DriveBody(props) {
|
|||||||
onClick={() => handleMenuItemClick("Rename", data)}
|
onClick={() => handleMenuItemClick("Rename", data)}
|
||||||
className="ContextMenuItem"
|
className="ContextMenuItem"
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-font"></i>
|
<i className="fa-solid fa-font mr-[8px]"></i>
|
||||||
<span style={{ marginLeft: "8px" }}>Rename</span>
|
<span>Rename</span>
|
||||||
</ContextMenu.Item>
|
</ContextMenu.Item>
|
||||||
</ContextMenu.Content>
|
</ContextMenu.Content>
|
||||||
</ContextMenu.Portal>
|
</ContextMenu.Portal>
|
||||||
@@ -450,7 +416,7 @@ function DriveBody(props) {
|
|||||||
<ContextMenu.Trigger className="ContextMenuTrigger">
|
<ContextMenu.Trigger className="ContextMenuTrigger">
|
||||||
<img
|
<img
|
||||||
alt="PDF"
|
alt="PDF"
|
||||||
className="pdf-icon"
|
className="w-full h-full"
|
||||||
src={pdfLogo}
|
src={pdfLogo}
|
||||||
onClick={() => checkPdfStatus(data)}
|
onClick={() => checkPdfStatus(data)}
|
||||||
data-tut={props.dataTutSixth}
|
data-tut={props.dataTutSixth}
|
||||||
@@ -472,12 +438,7 @@ function DriveBody(props) {
|
|||||||
defaultValue={renameValue}
|
defaultValue={renameValue}
|
||||||
// value={renameValue}
|
// value={renameValue}
|
||||||
onChange={(e) => setRenameValue(e.target.value)}
|
onChange={(e) => setRenameValue(e.target.value)}
|
||||||
style={{
|
className="w-[100px] border-[1.5px] border-black rounded-sm text-[10px]"
|
||||||
width: "100px",
|
|
||||||
border: "1.5px solid black",
|
|
||||||
borderRadius: "2px",
|
|
||||||
fontSize: "10px"
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<span className="fileName">{data.Name}</span>
|
<span className="fileName">{data.Name}</span>
|
||||||
@@ -522,7 +483,7 @@ function DriveBody(props) {
|
|||||||
className="ContextMenuItem"
|
className="ContextMenuItem"
|
||||||
>
|
>
|
||||||
<i className={menu.icon}></i>
|
<i className={menu.icon}></i>
|
||||||
<span style={{ marginLeft: "8px" }}>{menu.type}</span>
|
<span className="ml-[8px]">{menu.type}</span>
|
||||||
</ContextMenu.Item>
|
</ContextMenu.Item>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
@@ -533,21 +494,21 @@ function DriveBody(props) {
|
|||||||
</HoverCard.Trigger>
|
</HoverCard.Trigger>
|
||||||
<HoverCard.Portal>
|
<HoverCard.Portal>
|
||||||
<HoverCard.Content className="HoverCardContent" sideOffset={5}>
|
<HoverCard.Content className="HoverCardContent" sideOffset={5}>
|
||||||
<strong style={{ fontSize: "13px" }}>Title: </strong>
|
<strong className="text-[13px]">Title: </strong>
|
||||||
<span className="statusSpan" style={{ marginBottom: "0px" }}>
|
<span className="statusSpan" style={{ marginBottom: "0px" }}>
|
||||||
{" "}
|
{" "}
|
||||||
{data.Name}
|
{data.Name}
|
||||||
</span>
|
</span>
|
||||||
<br />
|
<br />
|
||||||
<strong style={{ fontSize: "13px" }}>Status: </strong>
|
<strong className="text-[13px]">Status: </strong>
|
||||||
<span className="statusSpan"> {status}</span>
|
<span className="statusSpan"> {status}</span>
|
||||||
<br />
|
<br />
|
||||||
<strong style={{ fontSize: "13px" }}>Created Date: </strong>
|
<strong className="text-[13px]">Created Date: </strong>
|
||||||
<span className="statusSpan">{createddate}</span>
|
<span className="statusSpan">{createddate}</span>
|
||||||
<br />
|
<br />
|
||||||
{signerExist && (
|
{signerExist && (
|
||||||
<>
|
<>
|
||||||
<strong style={{ fontSize: "13px" }}>Signers: </strong>
|
<strong className="text-[13px]">Signers: </strong>
|
||||||
{/* <span className="statusSpan">kjefjjnejkfnkbjs bbfjkdsbjbfjkbjk kscbjkbjkb</span> */}
|
{/* <span className="statusSpan">kjefjjnejkfnkbjs bbfjkdsbjbfjkbjk kscbjkbjkb</span> */}
|
||||||
{signersName()}
|
{signersName()}
|
||||||
</>
|
</>
|
||||||
@@ -587,13 +548,9 @@ function DriveBody(props) {
|
|||||||
</Table>
|
</Table>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="pdfContainer">
|
<div className="flex flex-row flex-wrap items-center mt-1 pb-[20px] mx-[5px]">
|
||||||
{props.pdfData.map((data, ind) => {
|
{props.pdfData.map((data, ind) => {
|
||||||
return (
|
return <div key={ind}>{handleFolderData(data, ind, "list")}</div>;
|
||||||
<div className="box" key={ind}>
|
|
||||||
{handleFolderData(data, ind, "list")}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -609,44 +566,23 @@ function DriveBody(props) {
|
|||||||
)}
|
)}
|
||||||
<ModalUi
|
<ModalUi
|
||||||
isOpen={isDeleteDoc}
|
isOpen={isDeleteDoc}
|
||||||
headerColor={themeColor}
|
|
||||||
title={"Delete Document"}
|
title={"Delete Document"}
|
||||||
handleClose={() => {
|
handleClose={() => setIsDeleteDoc(false)}
|
||||||
setIsDeleteDoc(false);
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px] text-base-content">
|
||||||
<p>Are you sure you want to delete this document?</p>
|
<p>Are you sure you want to delete this document?</p>
|
||||||
|
<div className="h-[1px] w-full bg-[#9f9f9f] my-[15px]"></div>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => handleDeleteDocument(selectDoc)}
|
||||||
handleDeleteDocument(selectDoc);
|
|
||||||
}}
|
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn"
|
className="op-btn op-btn-primary mr-2"
|
||||||
>
|
>
|
||||||
Yes
|
Yes
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => setIsDeleteDoc(false)}
|
||||||
setIsDeleteDoc(false);
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-neutral"
|
||||||
>
|
>
|
||||||
No
|
No
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -8,11 +8,8 @@ const AddRoleModal = (props) => {
|
|||||||
isOpen={props.isModalRole}
|
isOpen={props.isModalRole}
|
||||||
handleClose={props.handleCloseRoleModal}
|
handleClose={props.handleCloseRoleModal}
|
||||||
>
|
>
|
||||||
<div className="addusercontainer">
|
<div className="h-full py-[10px] px-[20px]">
|
||||||
<form
|
<form className="flex flex-col" onSubmit={props.handleAddRole}>
|
||||||
style={{ display: "flex", flexDirection: "column" }}
|
|
||||||
onSubmit={props.handleAddRole}
|
|
||||||
>
|
|
||||||
<input
|
<input
|
||||||
value={props.roleName}
|
value={props.roleName}
|
||||||
onChange={(e) => props.setRoleName(e.target.value)}
|
onChange={(e) => props.setRoleName(e.target.value)}
|
||||||
@@ -21,39 +18,20 @@ const AddRoleModal = (props) => {
|
|||||||
? "User " + (props.signersdata.length + 1)
|
? "User " + (props.signersdata.length + 1)
|
||||||
: "User 1"
|
: "User 1"
|
||||||
}
|
}
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs mt-1"
|
||||||
/>
|
/>
|
||||||
<p
|
<p className="text-[gray] text-[11px] mt-[5px] mb-[10px] ml-[10px]">
|
||||||
style={{
|
|
||||||
color: "grey",
|
|
||||||
fontSize: 11,
|
|
||||||
margin: "10px 0 10px 5px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
e.g: Customer, Hr, Director, Manager, Student, etc...
|
e.g: Customer, Hr, Director, Manager, Student, etc...
|
||||||
</p>
|
</p>
|
||||||
<div>
|
<div>
|
||||||
<div
|
<div className="h-[1px] w-full bg-[#9f9f9f] mb-[10px]"></div>
|
||||||
style={{
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
style={{
|
|
||||||
background: "#00a2b7"
|
|
||||||
}}
|
|
||||||
className="finishBtn"
|
|
||||||
>
|
|
||||||
Add
|
Add
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={props.handleCloseRoleModal}
|
onClick={props.handleCloseRoleModal}
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-ghost ml-2"
|
||||||
>
|
>
|
||||||
Close
|
Close
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
function DefaultSignature({ defaultSignImg, xyPostion, setDefaultSignAlert }) {
|
function DefaultSignature({ defaultSignImg, xyPostion, setDefaultSignAlert }) {
|
||||||
const confirmToaddDefaultSign = () => {
|
const confirmToaddDefaultSign = () => {
|
||||||
if (xyPostion.length > 0) {
|
if (xyPostion.length > 0) {
|
||||||
@@ -18,54 +17,25 @@ function DefaultSignature({ defaultSignImg, xyPostion, setDefaultSignAlert }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div data-tut="reactourThird">
|
<div data-tut="reactourThird">
|
||||||
<div
|
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white",
|
|
||||||
padding: "5px",
|
|
||||||
fontFamily: "sans-serif",
|
|
||||||
marginTop: "5px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Signature
|
Signature
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="flex flex-col items-center mt-[10px] font-semibold">
|
||||||
style={{
|
<p className="text-base-content">Your Signature</p>
|
||||||
display: "flex",
|
<div className="op-card shadow-md h-[111px] w-[90%] p-2">
|
||||||
flexDirection: "column",
|
<img
|
||||||
alignItems: "center",
|
alt="signature"
|
||||||
marginTop: "10px",
|
className="w-full h-full object-contain"
|
||||||
fontWeight: "600"
|
src={defaultSignImg}
|
||||||
}}
|
/>
|
||||||
>
|
</div>
|
||||||
<>
|
<button
|
||||||
<p>Your Signature</p>
|
type="button"
|
||||||
<div className="defaultSignBox">
|
className="op-btn op-btn-primary op-btn-sm mt-[10px]"
|
||||||
<img
|
onClick={() => confirmToaddDefaultSign()}
|
||||||
alt="default img"
|
>
|
||||||
style={{
|
Auto Sign All
|
||||||
width: "100%",
|
</button>
|
||||||
height: "100%",
|
|
||||||
objectFit: "contain"
|
|
||||||
}}
|
|
||||||
src={defaultSignImg}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white",
|
|
||||||
marginTop: "20px",
|
|
||||||
cursor: "pointer",
|
|
||||||
marginBottom: "10px"
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
className="finishBtn finishnHover"
|
|
||||||
onClick={() => confirmToaddDefaultSign()}
|
|
||||||
>
|
|
||||||
Auto Sign All
|
|
||||||
</button>
|
|
||||||
</>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import Loader from "../../primitives/LoaderWithMsg";
|
import LoaderWithMsg from "../../primitives/LoaderWithMsg";
|
||||||
import { contractDocument } from "../../constant/Utils";
|
import { contractDocument } from "../../constant/Utils";
|
||||||
import HandleError from "../../primitives/HandleError";
|
import HandleError from "../../primitives/HandleError";
|
||||||
function DraftDocument() {
|
function DraftDocument() {
|
||||||
@@ -86,7 +86,7 @@ function DraftDocument() {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{isLoading.isLoader ? (
|
{isLoading.isLoader ? (
|
||||||
<Loader isLoading={isLoading} />
|
<LoaderWithMsg isLoading={isLoading} />
|
||||||
) : (
|
) : (
|
||||||
<HandleError handleError={isLoading.message} />
|
<HandleError handleError={isLoading.message} />
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { isEnableSubscription, themeColor } from "../../constant/const";
|
import { isEnableSubscription } from "../../constant/const";
|
||||||
import ModalUi from "../../primitives/ModalUi";
|
import ModalUi from "../../primitives/ModalUi";
|
||||||
import { radioButtonWidget } from "../../constant/Utils";
|
import { radioButtonWidget } from "../../constant/Utils";
|
||||||
import PremiumAlertHeader from "../../primitives/PremiumAlertHeader";
|
import PremiumAlertHeader from "../../primitives/PremiumAlertHeader";
|
||||||
@@ -147,7 +147,7 @@ function DropdownWidgetOption(props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ModalUi isOpen={props.showDropdown} title={props.title} showClose={false}>
|
<ModalUi isOpen={props.showDropdown} title={props.title} showClose={false}>
|
||||||
<div className="h-full p-[15px]">
|
<div className="h-full p-[15px] text-base-content">
|
||||||
<form
|
<form
|
||||||
onSubmit={(e) => {
|
onSubmit={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -155,38 +155,25 @@ function DropdownWidgetOption(props) {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<label style={{ fontSize: "13px", fontWeight: "600" }}>
|
<label className="text-[13px] font-semibold">
|
||||||
Name<span style={{ color: "red", fontSize: 13 }}> *</span>
|
Name<span className="text-[red] text-[13px]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
required
|
required
|
||||||
defaultValue={dropdownName}
|
defaultValue={dropdownName}
|
||||||
value={dropdownName}
|
value={dropdownName}
|
||||||
onChange={(e) => setDropdownName(e.target.value)}
|
onChange={(e) => setDropdownName(e.target.value)}
|
||||||
className="drodown-input"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<label
|
<label className="text-[13px] font-semibold mt-[5px]">
|
||||||
style={{ fontSize: "13px", fontWeight: "600", marginTop: "5px" }}
|
|
||||||
>
|
|
||||||
Options
|
Options
|
||||||
</label>
|
</label>
|
||||||
|
<div className="flex flex-col">
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "column"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{dropdownOptionList.map((option, index) => (
|
{dropdownOptionList.map((option, index) => (
|
||||||
<div
|
<div
|
||||||
key={index}
|
key={index}
|
||||||
style={{
|
className="flex flex-row mb-[5px] items-center"
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
marginBottom: "5px",
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{props.type === "checkbox" && !props.isSignYourself && (
|
{props.type === "checkbox" && !props.isSignYourself && (
|
||||||
<input
|
<input
|
||||||
@@ -206,51 +193,34 @@ function DropdownWidgetOption(props) {
|
|||||||
setDefaultCheckbox(removeOption);
|
setDefaultCheckbox(removeOption);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
style={{
|
className="op-checkbox focus:outline-none hover:border-base-content mr-[5px]"
|
||||||
width: "23px",
|
|
||||||
height: "19px",
|
|
||||||
marginRight: "5px"
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<input
|
<input
|
||||||
required
|
required
|
||||||
className="drodown-input"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
type="text"
|
type="text"
|
||||||
value={option}
|
value={option}
|
||||||
onChange={(e) => handleInputChange(index, e.target.value)}
|
onChange={(e) => handleInputChange(index, e.target.value)}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<i
|
<i
|
||||||
className="fa-solid fa-rectangle-xmark"
|
className="fa-solid fa-rectangle-xmark text-[25px] ml-[10px] text-error"
|
||||||
onClick={() => handleDeleteInput(index)}
|
onClick={() => handleDeleteInput(index)}
|
||||||
style={{
|
|
||||||
color: "red",
|
|
||||||
fontSize: "25px",
|
|
||||||
marginLeft: "10px"
|
|
||||||
}}
|
|
||||||
></i>
|
></i>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
<i
|
<i
|
||||||
onClick={handleAddInput}
|
onClick={handleAddInput}
|
||||||
style={{
|
className="fa-solid fa-square-plus text-[25px] ml-[10px] text-primary"
|
||||||
cursor: "pointer",
|
|
||||||
color: themeColor,
|
|
||||||
fontSize: "25px",
|
|
||||||
marginLeft: "10px"
|
|
||||||
}}
|
|
||||||
className="fa-solid fa-square-plus"
|
|
||||||
></i>
|
></i>
|
||||||
<div>
|
<div>
|
||||||
{props.type === "checkbox" && !props.isSignYourself && (
|
{props.type === "checkbox" && !props.isSignYourself && (
|
||||||
<>
|
<>
|
||||||
<label
|
<label
|
||||||
style={{
|
className={`${
|
||||||
fontSize: "13px",
|
!props.isSubscribe ? "text-[gray]" : ""
|
||||||
fontWeight: "600",
|
} text-[13px] font-semibold`}
|
||||||
color: !props.isSubscribe && "gray"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
Minimun check
|
Minimun check
|
||||||
</label>
|
</label>
|
||||||
@@ -263,18 +233,16 @@ function DropdownWidgetOption(props) {
|
|||||||
const count = handleSetMinMax(e);
|
const count = handleSetMinMax(e);
|
||||||
setMinCount(count);
|
setMinCount(count);
|
||||||
}}
|
}}
|
||||||
className={
|
className={`${
|
||||||
props.isSubscribe || !isEnableSubscription
|
props.isSubscribe || !isEnableSubscription
|
||||||
? "drodown-input"
|
? ""
|
||||||
: "disabled drodown-input"
|
: "pointer-events-none bg-opacity-50"
|
||||||
}
|
} op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs`}
|
||||||
/>
|
/>
|
||||||
<label
|
<label
|
||||||
style={{
|
className={`${
|
||||||
fontSize: "13px",
|
!props.isSubscribe ? "text-[gray]" : ""
|
||||||
fontWeight: "600",
|
} text-[13px] font-semibold`}
|
||||||
color: !props.isSubscribe && "gray"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
Maximum check
|
Maximum check
|
||||||
</label>
|
</label>
|
||||||
@@ -286,11 +254,11 @@ function DropdownWidgetOption(props) {
|
|||||||
const count = handleSetMinMax(e);
|
const count = handleSetMinMax(e);
|
||||||
setMaxCount(count);
|
setMaxCount(count);
|
||||||
}}
|
}}
|
||||||
className={
|
className={`${
|
||||||
props.isSubscribe || !isEnableSubscription
|
props.isSubscribe || !isEnableSubscription
|
||||||
? "drodown-input"
|
? ""
|
||||||
: "disabled drodown-input"
|
: "pointer-events-none bg-opacity-50"
|
||||||
}
|
} op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs`}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
@@ -298,32 +266,22 @@ function DropdownWidgetOption(props) {
|
|||||||
</div>
|
</div>
|
||||||
{["dropdown", radioButtonWidget].includes(props.type) && (
|
{["dropdown", radioButtonWidget].includes(props.type) && (
|
||||||
<>
|
<>
|
||||||
<label
|
<label className="text-[13px] font-semibold mt-[5px]">
|
||||||
style={{
|
|
||||||
fontSize: "13px",
|
|
||||||
fontWeight: "600",
|
|
||||||
marginTop: "5px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Default value
|
Default value
|
||||||
</label>
|
</label>
|
||||||
<select
|
<select
|
||||||
onChange={(e) => setDefaultValue(e.target.value)}
|
onChange={(e) => setDefaultValue(e.target.value)}
|
||||||
className="drodown-input"
|
className="op-select op-select-bordered op-select-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
name="defaultvalue"
|
name="defaultvalue"
|
||||||
value={defaultValue}
|
value={defaultValue}
|
||||||
placeholder="select default value"
|
placeholder="select default value"
|
||||||
>
|
>
|
||||||
<option value="" disabled hidden style={{ fontSize: "13px" }}>
|
<option value="" disabled hidden className="text-[13px]">
|
||||||
Select...
|
Select...
|
||||||
</option>
|
</option>
|
||||||
{dropdownOptionList.map((data, ind) => {
|
{dropdownOptionList.map((data, ind) => {
|
||||||
return (
|
return (
|
||||||
<option
|
<option className="text-[13px]" key={ind} value={data}>
|
||||||
style={{ fontSize: "13px" }}
|
|
||||||
key={ind}
|
|
||||||
value={data}
|
|
||||||
>
|
|
||||||
{data}
|
{data}
|
||||||
</option>
|
</option>
|
||||||
);
|
);
|
||||||
@@ -333,35 +291,21 @@ function DropdownWidgetOption(props) {
|
|||||||
)}
|
)}
|
||||||
{props.type !== "checkbox" && props.type !== radioButtonWidget && (
|
{props.type !== "checkbox" && props.type !== radioButtonWidget && (
|
||||||
<>
|
<>
|
||||||
<div
|
<div className="flex flex-row gap-[10px] mt-[0.5rem]">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
gap: 10,
|
|
||||||
marginTop: "0.5rem"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{statusArr.map((data, ind) => {
|
{statusArr.map((data, ind) => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
key={ind}
|
key={ind}
|
||||||
style={{
|
className="flex flex-row gap-[5px] items-center"
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
gap: 5,
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
style={{ accentColor: "red" }}
|
className="op-radio op-radio-xs my-1"
|
||||||
type="radio"
|
type="radio"
|
||||||
name="status"
|
name="status"
|
||||||
onChange={() => setStatus(data.toLowerCase())}
|
onChange={() => setStatus(data.toLowerCase())}
|
||||||
checked={status.toLowerCase() === data.toLowerCase()}
|
checked={status.toLowerCase() === data.toLowerCase()}
|
||||||
/>
|
/>
|
||||||
<div style={{ fontSize: "13px", fontWeight: "500" }}>
|
<div className="text-[13px] font-500">{data}</div>
|
||||||
{data}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
@@ -369,33 +313,31 @@ function DropdownWidgetOption(props) {
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{["checkbox", radioButtonWidget].includes(props.type) && (
|
{["checkbox", radioButtonWidget].includes(props.type) && (
|
||||||
<div className="flex flex-row gap-5 mt-2 items-center text-center">
|
<div className="flex flex-row gap-5 my-2 items-center text-center">
|
||||||
{!props.isSignYourself && (
|
{!props.isSignYourself && (
|
||||||
<div>
|
<div className="flex items-center">
|
||||||
<input
|
<input
|
||||||
id="isreadonly"
|
id="isreadonly"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={isReadOnly}
|
checked={isReadOnly}
|
||||||
onChange={(e) => {
|
className="op-checkbox op-checkbox-sm"
|
||||||
setIsReadOnly(e.target.checked);
|
onChange={(e) => setIsReadOnly(e.target.checked)}
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
<label className="ml-1" htmlFor="isreadonly">
|
<label className="ml-1 mb-0" htmlFor="isreadonly">
|
||||||
Is read only
|
Is read only
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div>
|
<div className="flex items-center">
|
||||||
<input
|
<input
|
||||||
id="ishidelabel"
|
id="ishidelabel"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={isHideLabel}
|
checked={isHideLabel}
|
||||||
onChange={(e) => {
|
className="op-checkbox op-checkbox-sm"
|
||||||
setIsHideLabel(e.target.checked);
|
onChange={(e) => setIsHideLabel(e.target.checked)}
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<label className="ml-1" htmlFor="ishidelabel">
|
<label className="ml-1 mb-0" htmlFor="ishidelabel">
|
||||||
Hide labels
|
Hide labels
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -421,19 +363,15 @@ function DropdownWidgetOption(props) {
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
disabled={dropdownOptionList.length === 0 && true}
|
disabled={dropdownOptionList.length === 0 && true}
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
type="submit"
|
type="submit"
|
||||||
className={"finishBtn"}
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
</button>
|
</button>
|
||||||
{props.currWidgetsDetails?.options?.values?.length > 0 && (
|
{props.currWidgetsDetails?.options?.values?.length > 0 && (
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-ghost ml-1"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
props.handleClose && props.handleClose();
|
props.handleClose && props.handleClose();
|
||||||
resetState();
|
resetState();
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import "../../styles/AddUser.css";
|
|
||||||
import { checkIsSubscribed, getFileName } from "../../constant/Utils";
|
import { checkIsSubscribed, getFileName } from "../../constant/Utils";
|
||||||
import PremiumAlertHeader from "../../primitives/PremiumAlertHeader";
|
import PremiumAlertHeader from "../../primitives/PremiumAlertHeader";
|
||||||
import Upgrade from "../../primitives/Upgrade";
|
import Upgrade from "../../primitives/Upgrade";
|
||||||
@@ -60,28 +59,20 @@ const EditTemplate = ({ template, onSuccess }) => {
|
|||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div className="max-h-[300px] md:max-h-[400px] overflow-y-scroll p-[10px]">
|
<div className="max-h-[300px] md:max-h-[400px] overflow-y-scroll p-[10px]">
|
||||||
<div className="form-wrapper">
|
<div className="text-base-content">
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="name" style={{ fontSize: 13 }}>
|
<label htmlFor="name" className="text-[13px]">
|
||||||
File
|
File
|
||||||
</label>
|
</label>
|
||||||
<div
|
<div className="op-input op-input-bordered op-input-sm focus:outline-none py-2 font-semibold w-full text-xs">
|
||||||
style={{
|
|
||||||
padding: "0.5rem 0.75rem",
|
|
||||||
border: "1px solid #d1d5db",
|
|
||||||
borderRadius: "0.375rem",
|
|
||||||
fontSize: "0.75rem",
|
|
||||||
fontWeight: "700"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{getFileName(template.URL)}
|
{getFileName(template.URL)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-section">
|
<div className="form-section">
|
||||||
<label htmlFor="name" style={{ fontSize: 13 }}>
|
<label htmlFor="name" className="text-[13px]">
|
||||||
Name
|
Name
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[13px] text-[red]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
@@ -89,11 +80,11 @@ const EditTemplate = ({ template, onSuccess }) => {
|
|||||||
value={formData.Name}
|
value={formData.Name}
|
||||||
onChange={(e) => handleStrInput(e)}
|
onChange={(e) => handleStrInput(e)}
|
||||||
required
|
required
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-section">
|
<div className="form-section">
|
||||||
<label htmlFor="Note" style={{ fontSize: 13 }}>
|
<label htmlFor="Note" className="text-[13px]">
|
||||||
Note
|
Note
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
@@ -102,11 +93,11 @@ const EditTemplate = ({ template, onSuccess }) => {
|
|||||||
id="Note"
|
id="Note"
|
||||||
value={formData.Note}
|
value={formData.Note}
|
||||||
onChange={(e) => handleStrInput(e)}
|
onChange={(e) => handleStrInput(e)}
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-section">
|
<div className="form-section">
|
||||||
<label htmlFor="Description" style={{ fontSize: 13 }}>
|
<label htmlFor="Description" className="text-[13px]">
|
||||||
Description
|
Description
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
@@ -115,46 +106,32 @@ const EditTemplate = ({ template, onSuccess }) => {
|
|||||||
id="Description"
|
id="Description"
|
||||||
value={formData.Description}
|
value={formData.Description}
|
||||||
onChange={(e) => handleStrInput(e)}
|
onChange={(e) => handleStrInput(e)}
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-section">
|
<div className="form-section">
|
||||||
<label style={{ fontSize: 13 }}>Send In Order</label>
|
<label className="text-[13px]">Send In Order</label>
|
||||||
<div
|
<div className="flex items-center gap-[8px] ml-[8px] mb-[5px]">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
gap: 8,
|
|
||||||
marginLeft: 8,
|
|
||||||
marginBottom: 5
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<input
|
<input
|
||||||
type="radio"
|
type="radio"
|
||||||
value={"true"}
|
value={"true"}
|
||||||
|
className="op-radio op-radio-xs"
|
||||||
name="SendinOrder"
|
name="SendinOrder"
|
||||||
checked={formData.SendinOrder === "true"}
|
checked={formData.SendinOrder === "true"}
|
||||||
onChange={handleStrInput}
|
onChange={handleStrInput}
|
||||||
/>
|
/>
|
||||||
<div style={{ fontSize: 12 }}>Yes</div>
|
<div className="text-[12px]">Yes</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="flex items-center gap-[8px] ml-[8px] mb-[5px]">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
gap: 8,
|
|
||||||
marginLeft: 8,
|
|
||||||
marginBottom: 5
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<input
|
<input
|
||||||
type="radio"
|
type="radio"
|
||||||
value={"false"}
|
value={"false"}
|
||||||
name="SendinOrder"
|
name="SendinOrder"
|
||||||
|
className="op-radio op-radio-xs"
|
||||||
checked={formData.SendinOrder === "false"}
|
checked={formData.SendinOrder === "false"}
|
||||||
onChange={handleStrInput}
|
onChange={handleStrInput}
|
||||||
/>
|
/>
|
||||||
<div style={{ fontSize: 12 }}>No</div>
|
<div className="text-[12px]">No</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs mt-2">
|
<div className="text-xs mt-2">
|
||||||
@@ -186,10 +163,8 @@ const EditTemplate = ({ template, onSuccess }) => {
|
|||||||
checked={formData.AutomaticReminders}
|
checked={formData.AutomaticReminders}
|
||||||
onChange={handleAutoReminder}
|
onChange={handleAutoReminder}
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
value=""
|
className="op-toggle transition-all checked:[--tglbg:#3368ff] checked:bg-white mt-2"
|
||||||
className="sr-only peer"
|
|
||||||
/>
|
/>
|
||||||
<div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600 mt-2"></div>
|
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
{isSubscribe && formData?.AutomaticReminders === true && (
|
{isSubscribe && formData?.AutomaticReminders === true && (
|
||||||
@@ -202,15 +177,14 @@ const EditTemplate = ({ template, onSuccess }) => {
|
|||||||
type="number"
|
type="number"
|
||||||
value={formData.RemindOnceInEvery}
|
value={formData.RemindOnceInEvery}
|
||||||
name="RemindOnceInEvery"
|
name="RemindOnceInEvery"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
onChange={handleStrInput}
|
onChange={handleStrInput}
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{/* <SelectFolder onSuccess={handleFolder} folderCls={"contracts_Template"} /> */}
|
<div className="mt-[1rem] flex justify-start">
|
||||||
<div className="buttoncontainer">
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
<button type="submit" className="submitbutton">
|
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,52 +1,42 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import Tooltip from "../../primitives/Tooltip";
|
import Tooltip from "../../primitives/Tooltip";
|
||||||
|
|
||||||
import ReactQuill from "react-quill";
|
import ReactQuill from "react-quill";
|
||||||
import "react-quill/dist/quill.snow.css";
|
import "react-quill/dist/quill.snow.css";
|
||||||
import EditorToolbar, { module1, formats } from "./EditorToolbar";
|
import EditorToolbar, { module1, formats } from "./EditorToolbar";
|
||||||
|
|
||||||
export function EmailBody(props) {
|
export function EmailBody(props) {
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<form className="flex flex-col text-base-content text-lg font-normal">
|
||||||
<div className={`flex justify-center py-1 p-2`}>
|
<div className="m-2 md:m-10 p-3 md:p-10 shadow-md hover:shadow-lg border-[1px] border-indigo-800 rounded-md">
|
||||||
<div className=" flex flex-col">
|
<label className="text-sm ml-2">
|
||||||
<form>
|
Subject <Tooltip message={"email subject"} />
|
||||||
<div className="text-lg font-normal text-black">
|
</label>
|
||||||
<div className=" m-2 md:m-10 p-3 md:p-10 shadow-md hover:shadow-lg border-[1px] border-indigo-800 rounded-md">
|
<input
|
||||||
<label className="text-sm ml-2">
|
required
|
||||||
Subject <Tooltip message={"email subject"} />
|
value={props.requestSubject}
|
||||||
</label>
|
onChange={(e) => props.setRequestSubject(e.target.value)}
|
||||||
<input
|
placeholder='${senderName} has requested you to sign "${documentName}"'
|
||||||
required
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={props.requestSubject}
|
/>
|
||||||
onChange={(e) => props.setRequestSubject(e.target.value)}
|
<label className="text-sm ml-2 mt-3">
|
||||||
placeholder='${senderName} has requested you to sign "${documentName}"'
|
Body <Tooltip message={"email body"} />
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
</label>
|
||||||
/>
|
<div className="px-3 py-2 w-full focus:outline-none text-xs">
|
||||||
<label className="text-sm ml-2 mt-3">
|
<EditorToolbar containerId="toolbar1" />
|
||||||
Body <Tooltip message={"email body"} />
|
<ReactQuill
|
||||||
</label>
|
theme="snow"
|
||||||
|
value={props.requestBody}
|
||||||
<div className="px-3 py-2 w-full focus:outline-none text-xs">
|
// value={typedText}
|
||||||
<EditorToolbar containerId="toolbar1" />
|
placeholder="add body of email "
|
||||||
<ReactQuill
|
// readOnly={loading}
|
||||||
theme="snow"
|
// onChangeSelection={handleTextSelection} // Listen for text selection
|
||||||
value={props.requestBody}
|
ref={props.editorRef}
|
||||||
// value={typedText}
|
modules={module1}
|
||||||
placeholder="add body of email "
|
formats={formats}
|
||||||
// readOnly={loading}
|
onChange={props.handleOnchangeRequest}
|
||||||
// onChangeSelection={handleTextSelection} // Listen for text selection
|
/>
|
||||||
ref={props.editorRef}
|
|
||||||
modules={module1}
|
|
||||||
formats={formats}
|
|
||||||
onChange={props.handleOnchangeRequest}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</React.Fragment>
|
</form>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import axios from "axios";
|
|||||||
import { getBase64FromUrl } from "../../constant/Utils";
|
import { getBase64FromUrl } from "../../constant/Utils";
|
||||||
import { themeColor } from "../../constant/const";
|
import { themeColor } from "../../constant/const";
|
||||||
import printModule from "print-js";
|
import printModule from "print-js";
|
||||||
import loader from "../../assets/images/loader2.gif";
|
import Loader from "../../primitives/Loader";
|
||||||
|
|
||||||
function EmailComponent({
|
function EmailComponent({
|
||||||
isEmail,
|
isEmail,
|
||||||
@@ -173,143 +173,59 @@ function EmailComponent({
|
|||||||
<div className="modaloverlay">
|
<div className="modaloverlay">
|
||||||
<div className="modalcontainer">
|
<div className="modalcontainer">
|
||||||
{isLoading && (
|
{isLoading && (
|
||||||
<div
|
<div className="absolute w-full h-full flex flex-col justify-center items-center z-[20] bg-[#e6f2f2] bg-opacity-80">
|
||||||
style={{
|
<Loader />
|
||||||
position: "absolute",
|
<span className="text-[12px] font-bold">
|
||||||
height: "100%",
|
|
||||||
width: "100%",
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
flexDirection: "column",
|
|
||||||
alignItems: "center",
|
|
||||||
zIndex: "20",
|
|
||||||
backgroundColor: "#e6f2f2",
|
|
||||||
opacity: 0.8
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
alt="no img"
|
|
||||||
src={loader}
|
|
||||||
style={{ width: "70px", height: "70px" }}
|
|
||||||
/>
|
|
||||||
<span style={{ fontSize: "12px", fontWeight: "bold" }}>
|
|
||||||
This might take some time
|
This might take some time
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div style={{ background: "#32a3ac" }} className="modalheader">
|
<div style={{ background: "#32a3ac" }} className="modalheader">
|
||||||
<span style={{ color: "white" }}>Successfully signed!</span>
|
<span className="text-white">Successfully signed!</span>
|
||||||
|
<div className="flex flex-row">
|
||||||
<div style={{ display: "flex", flexDirection: "row" }}>
|
|
||||||
<div></div>
|
<div></div>
|
||||||
{!isAndroid && (
|
{!isAndroid && (
|
||||||
<button
|
<button
|
||||||
onClick={handleToPrint}
|
onClick={handleToPrint}
|
||||||
style={{
|
className="op-btn op-btn-neutral op-btn-sm text-[15px]"
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
className="btn btn-primary btn-sm"
|
|
||||||
>
|
>
|
||||||
<i
|
<i className="fa fa-print" aria-hidden="true"></i>
|
||||||
className="fa fa-print"
|
|
||||||
style={{
|
|
||||||
fontSize: "15px",
|
|
||||||
marginRight: "3px",
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
aria-hidden="true"
|
|
||||||
></i>
|
|
||||||
Print
|
Print
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
className="btn btn-danger btn-sm"
|
className="op-btn op-btn-primary op-btn-sm text-[15px] ml-2"
|
||||||
onClick={() => handleDownloadPdf()}
|
onClick={() => handleDownloadPdf()}
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center",
|
|
||||||
marginLeft: "10px"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<i
|
<i className="fa fa-download" aria-hidden="true"></i>
|
||||||
className="fa fa-download"
|
|
||||||
style={{
|
|
||||||
color: "white",
|
|
||||||
fontSize: "15px",
|
|
||||||
marginRight: "3px"
|
|
||||||
}}
|
|
||||||
aria-hidden="true"
|
|
||||||
></i>
|
|
||||||
Download
|
Download
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px]">
|
||||||
{isEmailCelebration && (
|
{isEmailCelebration && (
|
||||||
<div className="absolute w-[100%] flex justify-center items-center">
|
<div className="absolute w-[100%] flex justify-center items-center">
|
||||||
<img
|
<img alt="celeb" width={300} height={250} src={celebration} />
|
||||||
alt="print img"
|
|
||||||
width={300}
|
|
||||||
height={250}
|
|
||||||
src={celebration}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
<p className="font-medium text-[15px] mb-[5px] text-base-content align-baseline">
|
||||||
<p
|
|
||||||
style={{
|
|
||||||
fontFamily: "system-ui",
|
|
||||||
verticalAlign: "baseline",
|
|
||||||
fontWeight: "500",
|
|
||||||
color: "#403f3e",
|
|
||||||
fontSize: "15px",
|
|
||||||
marginBottom: "5px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Recipients added here will get a copy of the signed document.
|
Recipients added here will get a copy of the signed document.
|
||||||
</p>
|
</p>
|
||||||
{emailList.length > 0 ? (
|
{emailList.length > 0 ? (
|
||||||
<>
|
<>
|
||||||
<div className="addEmail">
|
<div className="addEmail">
|
||||||
<div
|
<div className="flex flex-row flex-wrap">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
|
|
||||||
flexWrap: "wrap"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{emailList.map((data, ind) => {
|
{emailList.map((data, ind) => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="emailChip"
|
className="flex flex-row items-center bg-[#47a3ad] m-[4px] rounded-md py-[5px] px-[10px]"
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
key={ind}
|
key={ind}
|
||||||
>
|
>
|
||||||
<span
|
<span className="text-white text-[13px]">
|
||||||
style={{
|
|
||||||
color: "white",
|
|
||||||
fontSize: "13px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{data}
|
{data}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
style={{
|
className="text-white text-[13px] font-semibold ml-[7px] cursor-pointer"
|
||||||
color: "white",
|
|
||||||
fontSize: 13,
|
|
||||||
fontWeight: 600,
|
|
||||||
marginLeft: 7,
|
|
||||||
cursor: "pointer"
|
|
||||||
}}
|
|
||||||
onClick={() => removeChip(ind)}
|
onClick={() => removeChip(ind)}
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-xmark"></i>
|
<i className="fa-solid fa-xmark"></i>
|
||||||
@@ -322,7 +238,7 @@ function EmailComponent({
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
value={emailValue}
|
value={emailValue}
|
||||||
className="addEmailInput"
|
className="p-[10px] pb-[20px] rounded w-full text-[15px] bg-white outline-none"
|
||||||
onChange={handleEmailValue}
|
onChange={handleEmailValue}
|
||||||
onKeyDown={handleEnterPress}
|
onKeyDown={handleEnterPress}
|
||||||
onBlur={() => {
|
onBlur={() => {
|
||||||
@@ -340,7 +256,7 @@ function EmailComponent({
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
value={emailValue}
|
value={emailValue}
|
||||||
className="emailInput"
|
className="p-[10px] pb-[20px] rounded w-full text-[15px] outline-none bg-white border-2 border-[#47a3ad]"
|
||||||
onChange={handleEmailValue}
|
onChange={handleEmailValue}
|
||||||
onKeyDown={handleEnterPress}
|
onKeyDown={handleEnterPress}
|
||||||
placeholder="Add the email addresses"
|
placeholder="Add the email addresses"
|
||||||
@@ -353,67 +269,36 @@ function EmailComponent({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<span
|
<button
|
||||||
style={{
|
className={`${
|
||||||
cursor: emailValue && "pointer"
|
emailValue ? "cursor-pointer" : "cursor-default"
|
||||||
}}
|
} op-btn op-btn-primary op-btn-sm m-2 shadow-md`}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (emailValue) {
|
if (emailValue) {
|
||||||
handleEnterPress("add");
|
handleEnterPress("add");
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<i
|
<i className="fa fa-plus" aria-hidden="true"></i>
|
||||||
style={{
|
</button>
|
||||||
backgroundColor: themeColor,
|
|
||||||
padding: "5px 7px",
|
|
||||||
marginTop: "10px",
|
|
||||||
color: "white",
|
|
||||||
borderRadius: "2px"
|
|
||||||
}}
|
|
||||||
className="fa fa-plus"
|
|
||||||
aria-hidden="true"
|
|
||||||
></i>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<div
|
<div className="bg-[#e3e2e1] mt-[10px] p-[5px] rounded">
|
||||||
style={{
|
<span className="font-bold">Note: </span>
|
||||||
background: "#e3e2e1",
|
<span className="text-[15px]">
|
||||||
marginTop: "10px",
|
|
||||||
padding: "5px",
|
|
||||||
borderRadius: "3px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span style={{ fontWeight: "700" }}>Note:</span>
|
|
||||||
<span style={{ fontSize: "15px" }}>
|
|
||||||
{" "}
|
|
||||||
You can only send to ten recipients at a time.
|
You can only send to ten recipients at a time.
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
<button
|
||||||
disabled={emailList.length === 0 && true}
|
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className={emailList.length === 0 ? "defaultBtn" : "finishBtn"}
|
className="op-btn op-btn-primary"
|
||||||
onClick={() => sendEmail()}
|
onClick={() => emailList.length > 0 && sendEmail()}
|
||||||
>
|
>
|
||||||
Send
|
Send
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-ghost ml-2"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setIsEmail(false);
|
setIsEmail(false);
|
||||||
setEmailValue("");
|
setEmailValue("");
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import {
|
|||||||
import "../../styles/signature.css";
|
import "../../styles/signature.css";
|
||||||
import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
|
import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
import ModalUi from "../../primitives/ModalUi";
|
import ModalUi from "../../primitives/ModalUi";
|
||||||
|
import Loader from "../../primitives/Loader";
|
||||||
|
|
||||||
function Header({
|
function Header({
|
||||||
isPdfRequestFiles,
|
isPdfRequestFiles,
|
||||||
@@ -42,14 +42,7 @@ function Header({
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [isDownloading, setIsDownloading] = useState("");
|
const [isDownloading, setIsDownloading] = useState("");
|
||||||
const isGuestSigner = localStorage.getItem("isGuestSigner");
|
const isGuestSigner = localStorage.getItem("isGuestSigner");
|
||||||
//for go to previous page
|
|
||||||
function previousPage() {
|
|
||||||
changePage(-1);
|
|
||||||
}
|
|
||||||
//for go to next page
|
|
||||||
function nextPage() {
|
|
||||||
changePage(1);
|
|
||||||
}
|
|
||||||
//function for show decline alert
|
//function for show decline alert
|
||||||
const handleDeclinePdfAlert = async () => {
|
const handleDeclinePdfAlert = async () => {
|
||||||
const currentDecline = {
|
const currentDecline = {
|
||||||
@@ -71,56 +64,22 @@ function Header({
|
|||||||
: window.innerWidth - 30 + "px"
|
: window.innerWidth - 30 + "px"
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div className="preBtn2">
|
<div className="flex justify-between items-center py-[5px] px-[10px] ">
|
||||||
<div onClick={() => navigate(-1)}>
|
<div onClick={() => navigate(-1)}>
|
||||||
<i
|
<i
|
||||||
className="fa fa-arrow-left"
|
className="fa fa-arrow-left text-base-content"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
style={{ color: themeColor, cursor: "pointer" }}
|
|
||||||
></i>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<i
|
|
||||||
onClick={() => {
|
|
||||||
if (pageNumber > 1) {
|
|
||||||
previousPage();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
className="fa fa-backward"
|
|
||||||
style={{ color: "gray", cursor: "pointer" }}
|
|
||||||
></i>
|
|
||||||
<span
|
|
||||||
style={{
|
|
||||||
fontSize: "13px",
|
|
||||||
fontWeight: "600",
|
|
||||||
marginLeft: "10px",
|
|
||||||
marginRight: "10px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{pageNumber || (allPages ? 1 : "--")} of {allPages || "--"}
|
|
||||||
</span>
|
|
||||||
<i
|
|
||||||
onClick={() => {
|
|
||||||
if (pageNumber < allPages) {
|
|
||||||
nextPage();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
className="fa fa-forward"
|
|
||||||
style={{ color: "gray", cursor: "pointer" }}
|
|
||||||
></i>
|
></i>
|
||||||
</div>
|
</div>
|
||||||
|
<PrevNext
|
||||||
|
pageNumber={pageNumber}
|
||||||
|
allPages={allPages}
|
||||||
|
changePage={changePage}
|
||||||
|
/>
|
||||||
{pdfUrl && alreadySign ? (
|
{pdfUrl && alreadySign ? (
|
||||||
<DropdownMenu.Root>
|
<DropdownMenu.Root>
|
||||||
<DropdownMenu.Trigger asChild>
|
<DropdownMenu.Trigger asChild>
|
||||||
<div
|
<div className="op-link op-link-primary no-underline text-[16px] font-semibold pr-[3px] pl-[5px]">
|
||||||
style={{
|
|
||||||
color: themeColor,
|
|
||||||
border: "none",
|
|
||||||
fontWeight: "650",
|
|
||||||
fontSize: "16px",
|
|
||||||
padding: "0px 3px 0px 5px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i className="fa fa-ellipsis-v" aria-hidden="true"></i>
|
<i className="fa fa-ellipsis-v" aria-hidden="true"></i>
|
||||||
</div>
|
</div>
|
||||||
</DropdownMenu.Trigger>
|
</DropdownMenu.Trigger>
|
||||||
@@ -135,16 +94,10 @@ function Header({
|
|||||||
handleDownloadPdf(pdfDetails, pdfUrl, setIsDownloading)
|
handleDownloadPdf(pdfDetails, pdfUrl, setIsDownloading)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div
|
<div className="flex flex-row">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i
|
<i
|
||||||
className="fa fa-arrow-down"
|
className="fa fa-arrow-down mr-[2px]"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
style={{ marginRight: "2px" }}
|
|
||||||
></i>
|
></i>
|
||||||
Download
|
Download
|
||||||
</div>
|
</div>
|
||||||
@@ -159,15 +112,9 @@ function Header({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div
|
<div className="border-none bg-[#fff]">
|
||||||
style={{
|
|
||||||
border: "none",
|
|
||||||
backgroundColor: "#fff"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i
|
<i
|
||||||
className="fa-solid fa-award"
|
className="fa-solid fa-award mr-[2px]"
|
||||||
style={{ marginRight: "2px" }}
|
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
></i>
|
></i>
|
||||||
Certificate
|
Certificate
|
||||||
@@ -179,15 +126,9 @@ function Header({
|
|||||||
className="DropdownMenuItem"
|
className="DropdownMenuItem"
|
||||||
onClick={() => setIsEmail(true)}
|
onClick={() => setIsEmail(true)}
|
||||||
>
|
>
|
||||||
<div
|
<div className="flex flex-row">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i
|
<i
|
||||||
className="fa fa-envelope"
|
className="fa fa-envelope mr-[2px]"
|
||||||
style={{ marginRight: "2px" }}
|
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
></i>
|
></i>
|
||||||
Mail
|
Mail
|
||||||
@@ -200,16 +141,10 @@ function Header({
|
|||||||
handleToPrint(e, pdfUrl, setIsDownloading)
|
handleToPrint(e, pdfUrl, setIsDownloading)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div
|
<div className="flex flex-row">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i
|
<i
|
||||||
className="fa fa-print"
|
className="fa fa-print mr-[2px]"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
style={{ marginRight: "2px" }}
|
|
||||||
></i>
|
></i>
|
||||||
Print
|
Print
|
||||||
</div>
|
</div>
|
||||||
@@ -239,8 +174,9 @@ function Header({
|
|||||||
alertSendEmail();
|
alertSendEmail();
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
className="border-none font-[650] text-[14px]"
|
className={`${
|
||||||
style={{ color: isMailSend ? "gray" : themeColor }}
|
isMailSend ? "" : "op-link-primary"
|
||||||
|
} op-link no-underline font-[650] text-[14px]`}
|
||||||
data-tut={dataTut4}
|
data-tut={dataTut4}
|
||||||
>
|
>
|
||||||
{completeBtnTitle ? completeBtnTitle : "Send"}
|
{completeBtnTitle ? completeBtnTitle : "Send"}
|
||||||
@@ -255,18 +191,14 @@ function Header({
|
|||||||
embedWidgetsData();
|
embedWidgetsData();
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
style={{ color: themeColor }}
|
className="border-none font-[650] text-[14px] op-link op-link-primary no-underline"
|
||||||
className="border-none font-[650] text-[14px]"
|
|
||||||
>
|
>
|
||||||
Finish
|
Finish
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<DropdownMenu.Root>
|
<DropdownMenu.Root>
|
||||||
<DropdownMenu.Trigger asChild>
|
<DropdownMenu.Trigger asChild>
|
||||||
<div
|
<div className="font-[650] text-[18px] px-2 ml-[4px] op-link op-link-info no-underline">
|
||||||
className="border-none font-[650] text-[18px] px-2 ml-[4px]"
|
|
||||||
style={{ color: themeColor }}
|
|
||||||
>
|
|
||||||
<i
|
<i
|
||||||
className="fa fa-ellipsis-v"
|
className="fa fa-ellipsis-v"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
@@ -318,12 +250,12 @@ function Header({
|
|||||||
signersdata.length !== filterPrefill.length && (
|
signersdata.length !== filterPrefill.length && (
|
||||||
<div>
|
<div>
|
||||||
{filterPrefill.length === 0 ? (
|
{filterPrefill.length === 0 ? (
|
||||||
<span style={{ fontSize: "13px", color: "#f5405e" }}>
|
<span className="text-[13px] text-[#f5405e]">
|
||||||
Add {signersdata.length - filterPrefill.length}{" "}
|
Add {signersdata.length - filterPrefill.length}{" "}
|
||||||
recipients signature
|
recipients signature
|
||||||
</span>
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<span style={{ fontSize: "13px", color: "#f5405e" }}>
|
<span className="text-[13px] text-[#f5405e]">
|
||||||
Add {signersdata.length - filterPrefill.length} more
|
Add {signersdata.length - filterPrefill.length} more
|
||||||
recipients signature
|
recipients signature
|
||||||
</span>
|
</span>
|
||||||
@@ -343,21 +275,15 @@ function Header({
|
|||||||
<button
|
<button
|
||||||
onClick={() => navigate(-1)}
|
onClick={() => navigate(-1)}
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[18px] text-black font-[500] text-sm mr-[5px] bg-white"
|
className="op-btn op-btn-ghost op-btn-sm mr-[5px]"
|
||||||
>
|
>
|
||||||
Back
|
Back
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
disabled={isMailSend && true}
|
disabled={isMailSend && true}
|
||||||
data-tut="reactourFour"
|
data-tut="reactourFour"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[18px] font-[500] text-sm mr-[5px]"
|
className="op-btn op-btn-primary op-btn-sm mr-[5px]"
|
||||||
style={{
|
onClick={() => alertSendEmail()}
|
||||||
background: isMailSend ? "rgb(203, 203, 203)" : "#188ae2",
|
|
||||||
color: isMailSend ? "rgb(77, 75, 75)" : "white"
|
|
||||||
}}
|
|
||||||
onClick={() => {
|
|
||||||
alertSendEmail();
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{completeBtnTitle
|
{completeBtnTitle
|
||||||
? completeBtnTitle
|
? completeBtnTitle
|
||||||
@@ -376,34 +302,34 @@ function Header({
|
|||||||
onClick={() =>
|
onClick={() =>
|
||||||
handleDownloadCertificate(pdfDetails, setIsDownloading)
|
handleDownloadCertificate(pdfDetails, setIsDownloading)
|
||||||
}
|
}
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#08bc66]"
|
className="op-btn op-btn-secondary op-btn-sm mr-[5px] shadow"
|
||||||
>
|
>
|
||||||
<i
|
<i
|
||||||
className="fa-solid fa-award py-[3px]"
|
className="fa-solid fa-award py-[3px]"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
></i>
|
></i>
|
||||||
<span className="hidden lg:block ml-1">Certificate</span>
|
<span className="hidden lg:block">Certificate</span>
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={(e) => handleToPrint(e, pdfUrl, setIsDownloading)}
|
onClick={(e) => handleToPrint(e, pdfUrl, setIsDownloading)}
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#188ae2]"
|
className="op-btn op-btn-neutral op-btn-sm mr-[5px] shadow"
|
||||||
>
|
>
|
||||||
<i className="fa fa-print py-[3px]" aria-hidden="true"></i>
|
<i className="fa fa-print py-[3px]" aria-hidden="true"></i>
|
||||||
<span className="hidden lg:block ml-1">Print</span>
|
<span className="hidden lg:block">Print</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#f14343]"
|
className="op-btn op-btn-primary op-btn-sm mr-[5px] shadow"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
handleDownloadPdf(pdfDetails, pdfUrl, setIsDownloading)
|
handleDownloadPdf(pdfDetails, pdfUrl, setIsDownloading)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<i className="fa fa-download py-[3px]" aria-hidden="true"></i>
|
<i className="fa fa-download py-[3px]" aria-hidden="true"></i>
|
||||||
<span className="hidden lg:block ml-1">Download</span>
|
<span className="hidden lg:block">Download</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
@@ -411,61 +337,56 @@ function Header({
|
|||||||
<button
|
<button
|
||||||
onClick={() => navigate(-1)}
|
onClick={() => navigate(-1)}
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[18px] text-black font-[500] text-sm mr-[5px] bg-white"
|
className="op-btn op-btn-ghost op-btn-sm mr-[5px]"
|
||||||
>
|
>
|
||||||
Back
|
Back
|
||||||
</button>
|
</button>
|
||||||
{currentSigner && (
|
{currentSigner && (
|
||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[18px] text-white font-[500] text-[13px] mr-[5px] bg-[#de4337]"
|
className="op-btn op-btn-secondary op-btn-sm mr-[5px] shadow"
|
||||||
onClick={() => handleDeclinePdfAlert()}
|
onClick={() => handleDeclinePdfAlert()}
|
||||||
>
|
>
|
||||||
Decline
|
Decline
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[18px] text-white font-[500] text-[13px] mr-[5px] bg-[#188ae2]"
|
className="op-btn op-btn-primary op-btn-sm mr-[5px] shadow"
|
||||||
onClick={() => embedWidgetsData()}
|
onClick={() => embedWidgetsData()}
|
||||||
>
|
>
|
||||||
Finish
|
Finish
|
||||||
</button>
|
</button>
|
||||||
<DropdownMenu.Root>
|
<div className="op-dropdown op-dropdown-end">
|
||||||
<DropdownMenu.Trigger asChild>
|
<div
|
||||||
<div
|
tabIndex={0}
|
||||||
className="border-none font-[650] text-[16px] py-[3px] px-[11px] shadow rounded bg-white"
|
role="button"
|
||||||
style={{ color: themeColor }}
|
className="op-btn op-btn-info op-btn-sm shadow"
|
||||||
|
>
|
||||||
|
<i className="fa fa-ellipsis-v" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<ul
|
||||||
|
tabIndex={0}
|
||||||
|
className="op-dropdown-content z-[1] op-menu op-menu-sm p-1 shadow bg-base-100 rounded-box mt-1"
|
||||||
|
>
|
||||||
|
<li
|
||||||
|
onClick={() =>
|
||||||
|
handleDownloadPdf(
|
||||||
|
pdfDetails,
|
||||||
|
pdfUrl,
|
||||||
|
setIsDownloading
|
||||||
|
)
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<i
|
<span className="font-semibold text-[12px]">
|
||||||
className="fa fa-ellipsis-v"
|
|
||||||
aria-hidden="true"
|
|
||||||
></i>
|
|
||||||
</div>
|
|
||||||
</DropdownMenu.Trigger>
|
|
||||||
<DropdownMenu.Portal>
|
|
||||||
<DropdownMenu.Content
|
|
||||||
className="bg-white shadow-md rounded px-2 py-1"
|
|
||||||
sideOffset={5}
|
|
||||||
>
|
|
||||||
<DropdownMenu.Item
|
|
||||||
className="flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer"
|
|
||||||
onClick={() =>
|
|
||||||
handleDownloadPdf(
|
|
||||||
pdfDetails,
|
|
||||||
pdfUrl,
|
|
||||||
setIsDownloading
|
|
||||||
)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<i
|
<i
|
||||||
className="fa fa-arrow-down mr-[5px]"
|
className="fa fa-arrow-down"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
></i>
|
></i>{" "}
|
||||||
<span className="font-[500]">Download</span>
|
Download
|
||||||
</DropdownMenu.Item>
|
</span>
|
||||||
</DropdownMenu.Content>
|
</li>
|
||||||
</DropdownMenu.Portal>
|
</ul>
|
||||||
</DropdownMenu.Root>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -478,56 +399,51 @@ function Header({
|
|||||||
onClick={() =>
|
onClick={() =>
|
||||||
handleDownloadCertificate(pdfDetails, setIsDownloading)
|
handleDownloadCertificate(pdfDetails, setIsDownloading)
|
||||||
}
|
}
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#08bc66]"
|
className="op-btn op-btn-secondary op-btn-sm font-medium text-[13px] mr-[5px] shadow"
|
||||||
>
|
>
|
||||||
<i
|
<i className="fa-solid fa-award" aria-hidden="true"></i>
|
||||||
className="fa-solid fa-award py-[3px]"
|
<span className="hidden lg:block">Certificate</span>
|
||||||
aria-hidden="true"
|
|
||||||
></i>
|
|
||||||
<span className="hidden lg:block ml-1">Certificate</span>
|
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<button
|
<button
|
||||||
onClick={(e) => handleToPrint(e, pdfUrl, setIsDownloading)}
|
onClick={(e) => handleToPrint(e, pdfUrl, setIsDownloading)}
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#188ae2]"
|
className="op-btn op-btn-neutral op-btn-sm font-medium text-[13px] mr-[5px] shadow"
|
||||||
>
|
>
|
||||||
<i className="fa fa-print py-[3px]" aria-hidden="true"></i>
|
<i className="fa fa-print" aria-hidden="true"></i>
|
||||||
<span className="hidden lg:block ml-1">Print</span>
|
<span className="hidden lg:block">Print</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#f14343]"
|
className="op-btn op-btn-primary op-btn-sm font-medium text-[13px] mr-[5px] shadow"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
handleDownloadPdf(pdfDetails, pdfUrl, setIsDownloading)
|
handleDownloadPdf(pdfDetails, pdfUrl, setIsDownloading)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<i className="fa fa-download py-[3px]" aria-hidden="true"></i>
|
<i className="fa fa-download" aria-hidden="true"></i>
|
||||||
<span className="hidden lg:block ml-1">Download</span>
|
<span className="hidden lg:block">Download</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#3ba7e5]"
|
className="op-btn op-btn-info op-btn-sm font-medium text-[13px] mr-[5px] shadow"
|
||||||
onClick={() => setIsEmail(true)}
|
onClick={() => setIsEmail(true)}
|
||||||
>
|
>
|
||||||
<i className="fa fa-envelope py-[3px]" aria-hidden="true"></i>
|
<i className="fa fa-envelope" aria-hidden="true"></i>
|
||||||
<span className="hidden lg:block ml-1">Mail</span>
|
<span className="hidden lg:block">Mail</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => navigate(-1)}
|
||||||
navigate(-1);
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[18px] text-black font-[500] text-sm mr-[5px] bg-white"
|
className="op-btn op-btn-ghost op-btn-sm mr-[5px]"
|
||||||
>
|
>
|
||||||
Back
|
Back
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[18px] text-white font-[500] text-[13px] mr-[5px] bg-[#188ae2]"
|
className="op-btn op-btn-primary op-btn-sm mr-[5px]"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (!pdfUrl) {
|
if (!pdfUrl) {
|
||||||
embedWidgetsData();
|
embedWidgetsData();
|
||||||
@@ -542,10 +458,7 @@ function Header({
|
|||||||
)}
|
)}
|
||||||
{isDownloading === "pdf" && (
|
{isDownloading === "pdf" && (
|
||||||
<div className="fixed z-[200] inset-0 flex justify-center items-center bg-black bg-opacity-30">
|
<div className="fixed z-[200] inset-0 flex justify-center items-center bg-black bg-opacity-30">
|
||||||
<div
|
<Loader />
|
||||||
style={{ fontSize: "45px", color: "#3dd3e0" }}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<ModalUi
|
<ModalUi
|
||||||
@@ -557,7 +470,7 @@ function Header({
|
|||||||
}
|
}
|
||||||
handleClose={() => setIsDownloading("")}
|
handleClose={() => setIsDownloading("")}
|
||||||
>
|
>
|
||||||
<div className="p-3 md:p-5 text-[13px] md:text-base text-center">
|
<div className="p-3 md:p-5 text-[13px] md:text-base text-center text-base-content">
|
||||||
{isDownloading === "certificate"}{" "}
|
{isDownloading === "certificate"}{" "}
|
||||||
<p>
|
<p>
|
||||||
Your completion certificate is being generated. Please wait
|
Your completion certificate is being generated. Please wait
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
import ModalUi from "../../primitives/ModalUi";
|
import ModalUi from "../../primitives/ModalUi";
|
||||||
import { randomId, textWidget } from "../../constant/Utils";
|
import { randomId, textWidget } from "../../constant/Utils";
|
||||||
|
|
||||||
@@ -195,13 +194,13 @@ function PlaceholderCopy(props) {
|
|||||||
props.setIsPageCopy(false);
|
props.setIsPageCopy(false);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px] text-base-content">
|
||||||
{copyType.map((data, key) => {
|
{copyType.map((data, key) => {
|
||||||
return (
|
return (
|
||||||
<div key={key} style={{ display: "flex", flexDirection: "column" }}>
|
<div key={key} className="flex flex-col">
|
||||||
<label key={key} style={{ fontSize: "16px", fontWeight: "500" }}>
|
<label className="text-[16px] font-medium">
|
||||||
<input
|
<input
|
||||||
style={{ accentColor: "red", marginRight: "10px" }}
|
className="mr-[8px] op-radio op-radio-xs"
|
||||||
type="radio"
|
type="radio"
|
||||||
value={data}
|
value={data}
|
||||||
onChange={() => setSelectCopyType(data)}
|
onChange={() => setSelectCopyType(data)}
|
||||||
@@ -214,33 +213,22 @@ function PlaceholderCopy(props) {
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|
||||||
<div
|
<div className="flex bg-[#9f9f9f] w-full my-[15px]"></div>
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleApplyCopy();
|
handleApplyCopy();
|
||||||
handleUniqueId();
|
handleUniqueId();
|
||||||
}}
|
}}
|
||||||
style={{ background: themeColor }}
|
|
||||||
type="button"
|
type="button"
|
||||||
disabled={!selectCopyType}
|
disabled={!selectCopyType}
|
||||||
className="finishBtn"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
Apply
|
Apply
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-ghost"
|
||||||
onClick={() => {
|
onClick={() => handleUniqueId()}
|
||||||
handleUniqueId();
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -352,12 +352,9 @@ function PlaceholderType(props) {
|
|||||||
return (
|
return (
|
||||||
<div key={ind} className="flex items-center text-center gap-0.5">
|
<div key={ind} className="flex items-center text-center gap-0.5">
|
||||||
<input
|
<input
|
||||||
style={{
|
className={`${
|
||||||
// width: props.pos.Width,
|
ind === 0 ? "mt-0" : "mt-[5px]"
|
||||||
display: "flex",
|
} flex justify-center op-checkbox op-checkbox-xs rounded-[0.350rem]`}
|
||||||
justifyContent: "center",
|
|
||||||
marginTop: ind === 0 ? 0 : "5px"
|
|
||||||
}}
|
|
||||||
onBlur={handleInputBlur}
|
onBlur={handleInputBlur}
|
||||||
disabled={
|
disabled={
|
||||||
props.isNeedSign &&
|
props.isNeedSign &&
|
||||||
@@ -425,7 +422,7 @@ function PlaceholderType(props) {
|
|||||||
? "labelTextArea labelWidthMobile"
|
? "labelTextArea labelWidthMobile"
|
||||||
: "labelTextArea labelWidthDesktop"
|
: "labelTextArea labelWidthDesktop"
|
||||||
}
|
}
|
||||||
style={{ whiteSpace: "pre-wrap" }}
|
style={{ whiteSpace: "pre-wrap", color: "initial" }}
|
||||||
cols="50"
|
cols="50"
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -443,7 +440,7 @@ function PlaceholderType(props) {
|
|||||||
<select
|
<select
|
||||||
className="inputPlaceholder"
|
className="inputPlaceholder"
|
||||||
id="myDropdown"
|
id="myDropdown"
|
||||||
style={{ fontSize: "12px" }}
|
style={{ fontSize: "12px", color: "initial" }}
|
||||||
value={selectOption}
|
value={selectOption}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
setSelectOption(e.target.value);
|
setSelectOption(e.target.value);
|
||||||
@@ -528,7 +525,7 @@ function PlaceholderType(props) {
|
|||||||
? "labelTextArea labelWidthMobile"
|
? "labelTextArea labelWidthMobile"
|
||||||
: "labelTextArea labelWidthDesktop"
|
: "labelTextArea labelWidthDesktop"
|
||||||
}
|
}
|
||||||
style={{ whiteSpace: "pre-wrap" }}
|
style={{ whiteSpace: "pre-wrap", color: "initial" }}
|
||||||
cols="50"
|
cols="50"
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -567,7 +564,7 @@ function PlaceholderType(props) {
|
|||||||
? "labelTextArea labelWidthMobile"
|
? "labelTextArea labelWidthMobile"
|
||||||
: "labelTextArea labelWidthDesktop"
|
: "labelTextArea labelWidthDesktop"
|
||||||
}
|
}
|
||||||
style={{ whiteSpace: "pre-wrap" }}
|
style={{ whiteSpace: "pre-wrap", color: "initial" }}
|
||||||
cols="50"
|
cols="50"
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -606,7 +603,7 @@ function PlaceholderType(props) {
|
|||||||
? "labelTextArea labelWidthMobile"
|
? "labelTextArea labelWidthMobile"
|
||||||
: "labelTextArea labelWidthDesktop"
|
: "labelTextArea labelWidthDesktop"
|
||||||
}
|
}
|
||||||
style={{ whiteSpace: "pre-wrap" }}
|
style={{ whiteSpace: "pre-wrap", color: "initial" }}
|
||||||
cols="50"
|
cols="50"
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -728,7 +725,7 @@ function PlaceholderType(props) {
|
|||||||
? "labelTextArea labelWidthMobile"
|
? "labelTextArea labelWidthMobile"
|
||||||
: "labelTextArea labelWidthDesktop"
|
: "labelTextArea labelWidthDesktop"
|
||||||
}
|
}
|
||||||
style={{ whiteSpace: "pre-wrap" }}
|
style={{ whiteSpace: "pre-wrap", color: "initial" }}
|
||||||
cols="50"
|
cols="50"
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -748,12 +745,11 @@ function PlaceholderType(props) {
|
|||||||
return (
|
return (
|
||||||
<div key={ind} className="flex items-center text-center gap-0.5">
|
<div key={ind} className="flex items-center text-center gap-0.5">
|
||||||
<input
|
<input
|
||||||
style={{
|
className={`${ind === 0 ? "mt-0" : "mt-[5px]"} ${
|
||||||
width: props.pos.Width,
|
props?.pos?.Width
|
||||||
display: "flex",
|
? `w-[${props?.pos?.Width}px] h-[${props?.pos?.Width}px]`
|
||||||
justifyContent: "center",
|
: "w-[15px] h-[15px]"
|
||||||
marginTop: ind === 0 ? 0 : "5px"
|
} flex justify-center op-radio`}
|
||||||
}}
|
|
||||||
type="radio"
|
type="radio"
|
||||||
disabled={
|
disabled={
|
||||||
props.isNeedSign &&
|
props.isNeedSign &&
|
||||||
@@ -800,7 +796,11 @@ function PlaceholderType(props) {
|
|||||||
? "labelTextArea labelWidthMobile"
|
? "labelTextArea labelWidthMobile"
|
||||||
: "labelTextArea labelWidthDesktop"
|
: "labelTextArea labelWidthDesktop"
|
||||||
}
|
}
|
||||||
style={{ whiteSpace: "pre-wrap", overflow: "hidden" }}
|
style={{
|
||||||
|
whiteSpace: "pre-wrap",
|
||||||
|
overflow: "hidden",
|
||||||
|
color: "initial"
|
||||||
|
}}
|
||||||
cols="50"
|
cols="50"
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
|
|
||||||
function PrevNext({ pageNumber, allPages, changePage }) {
|
function PrevNext({ pageNumber, allPages, changePage }) {
|
||||||
//for go to previous page
|
//for go to previous page
|
||||||
@@ -12,40 +11,30 @@ function PrevNext({ pageNumber, allPages, changePage }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className="flex items-center">
|
||||||
<div className="preBtn1">
|
<button
|
||||||
<button
|
className="op-btn op-btn-secondary op-btn-xs md:op-btn-sm font-semibold text-xs"
|
||||||
className="py-[3px] px-[10px] text-xs bg-[#d3edeb] font-[600] mr-[5px]"
|
disabled={pageNumber <= 1}
|
||||||
disabled={pageNumber <= 1}
|
onClick={previousPage}
|
||||||
onClick={previousPage}
|
>
|
||||||
>
|
<span className="block lg:hidden">
|
||||||
<span className="block lg:hidden">
|
<i className="fa fa-backward" aria-hidden="true"></i>
|
||||||
<i
|
|
||||||
className="fa fa-backward"
|
|
||||||
aria-hidden="true"
|
|
||||||
style={{ color: themeColor, cursor: "pointer" }}
|
|
||||||
></i>
|
|
||||||
</span>
|
|
||||||
<span className="lg:block hidden">Prev</span>
|
|
||||||
</button>
|
|
||||||
<span className="text-xs font-[500]">
|
|
||||||
{pageNumber || (allPages ? 1 : "--")} of {allPages || "--"}
|
|
||||||
</span>
|
</span>
|
||||||
<button
|
<span className="lg:block hidden">Prev</span>
|
||||||
className="py-[3px] px-[10px] text-xs bg-[#d3edeb] font-[600] ml-[5px]"
|
</button>
|
||||||
disabled={pageNumber >= allPages}
|
<span className="text-xs text-base-content font-medium mx-2">
|
||||||
onClick={nextPage}
|
{pageNumber || (allPages ? 1 : "--")} of {allPages || "--"}
|
||||||
>
|
</span>
|
||||||
<span className="block lg:hidden">
|
<button
|
||||||
<i
|
className="op-btn op-btn-secondary op-btn-xs md:op-btn-sm font-semibold text-xs"
|
||||||
className="fa fa-forward"
|
disabled={pageNumber >= allPages}
|
||||||
aria-hidden="true"
|
onClick={nextPage}
|
||||||
style={{ color: themeColor, cursor: "pointer" }}
|
>
|
||||||
></i>
|
<span className="block lg:hidden">
|
||||||
</span>
|
<i className="fa fa-forward" aria-hidden="true"></i>
|
||||||
<span className="lg:block hidden">Next</span>
|
</span>
|
||||||
</button>
|
<span className="lg:block hidden">Next</span>
|
||||||
</div>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,37 +7,15 @@ import {
|
|||||||
isMobile,
|
isMobile,
|
||||||
nameColor
|
nameColor
|
||||||
} from "../../constant/Utils";
|
} from "../../constant/Utils";
|
||||||
|
const cursor =
|
||||||
|
"cursor-[url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAASElEQVR4nGNgwAMkJSUbpKSkOvCpIaT5PxSTbogUQjMYMwxeIIXmVFIxA8UGDDyQGg0DnIDi6JKUlCxHMqCeZAOghjSAMD5FAKfeaURdUFxCAAAAAElFTkSuQmCC'),_pointer]";
|
||||||
const RecipientList = (props) => {
|
const RecipientList = (props) => {
|
||||||
const [animationParent] = useAutoAnimate();
|
const [animationParent] = useAutoAnimate();
|
||||||
const [isHover, setIsHover] = useState();
|
const [isHover, setIsHover] = useState();
|
||||||
const [isEdit, setIsEdit] = useState(false);
|
const [isEdit, setIsEdit] = useState(false);
|
||||||
//function for onhover signer name change background color
|
//function for onhover signer name change background color
|
||||||
const inputRef = useRef(null);
|
const inputRef = useRef(null);
|
||||||
const onHoverStyle = (ind, blockColor) => {
|
|
||||||
const style = {
|
|
||||||
background: blockColor ? blockColor : color[ind % color.length],
|
|
||||||
padding: "10px",
|
|
||||||
marginTop: "2px",
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
borderBottom: "1px solid #e3e1e1",
|
|
||||||
alignItems: "center"
|
|
||||||
};
|
|
||||||
return style;
|
|
||||||
};
|
|
||||||
//function for onhover signer name remove background color
|
|
||||||
const nonHoverStyle = () => {
|
|
||||||
const style = {
|
|
||||||
padding: "10px",
|
|
||||||
marginTop: "2px",
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
borderBottom: "1px solid #e3e1e1",
|
|
||||||
alignItems: "center"
|
|
||||||
};
|
|
||||||
return style;
|
|
||||||
};
|
|
||||||
const isWidgetExist = (Id) => {
|
const isWidgetExist = (Id) => {
|
||||||
return props.signerPos.some((x) => x.Id === Id);
|
return props.signerPos.some((x) => x.Id === Id);
|
||||||
};
|
};
|
||||||
@@ -116,18 +94,21 @@ const RecipientList = (props) => {
|
|||||||
data-tut="reactourFirst"
|
data-tut="reactourFirst"
|
||||||
onMouseEnter={() => setIsHover(ind)}
|
onMouseEnter={() => setIsHover(ind)}
|
||||||
onMouseLeave={() => setIsHover(null)}
|
onMouseLeave={() => setIsHover(null)}
|
||||||
className={
|
className={`${
|
||||||
props.sendInOrder
|
props.sendInOrder
|
||||||
? props.isMailSend
|
? props.isMailSend
|
||||||
? "disabled"
|
? "pointer-events-none bg-opacity-80"
|
||||||
: "dragCursor"
|
: `text-[12px] font-bold ${cursor}`
|
||||||
: props.isMailSend && "disabled"
|
: props.isMailSend && "pointer-events-none bg-opacity-80"
|
||||||
}
|
} flex flex-row rounded-xl px-2 py-[10px] mt-1 mx-1 items-center last:mb-0.5`}
|
||||||
style={
|
style={{
|
||||||
(!isMobile && isHover === ind) || props.isSelectListId === ind
|
background:
|
||||||
? onHoverStyle(ind, obj?.blockColor)
|
(!isMobile && isHover === ind) || props.isSelectListId === ind
|
||||||
: nonHoverStyle(ind)
|
? obj?.blockColor
|
||||||
}
|
? obj?.blockColor
|
||||||
|
: color[ind % color.length]
|
||||||
|
: "transparent"
|
||||||
|
}}
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
props.setSignerObjId(obj?.objectId || "");
|
props.setSignerObjId(obj?.objectId || "");
|
||||||
@@ -141,38 +122,16 @@ const RecipientList = (props) => {
|
|||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div className="flex flex-row items-center w-full">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center",
|
|
||||||
width: "100%"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
<div
|
||||||
|
className="flex w-[30px] h-[30px] rounded-full items-center justify-center mr-2"
|
||||||
style={{
|
style={{
|
||||||
background: obj?.blockColor
|
background: obj?.blockColor
|
||||||
? darkenColor(obj?.blockColor, 0.4)
|
? darkenColor(obj?.blockColor, 0.4)
|
||||||
: nameColor[ind % nameColor.length],
|
: nameColor[ind % nameColor.length]
|
||||||
width: 30,
|
|
||||||
height: 30,
|
|
||||||
display: "flex",
|
|
||||||
borderRadius: 30 / 2,
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center",
|
|
||||||
marginRight: "12px"
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span
|
<span className="text-white uppercase font-bold text-center text-[12px]">
|
||||||
className={props.sendInOrder && "dragCursor"}
|
|
||||||
style={{
|
|
||||||
fontSize: "12px",
|
|
||||||
textAlign: "center",
|
|
||||||
fontWeight: "bold",
|
|
||||||
color: "white",
|
|
||||||
textTransform: "uppercase"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{isWidgetExist(obj.Id) ? (
|
{isWidgetExist(obj.Id) ? (
|
||||||
<i className="fa-solid fa-check"></i>
|
<i className="fa-solid fa-check"></i>
|
||||||
) : (
|
) : (
|
||||||
@@ -185,67 +144,72 @@ const RecipientList = (props) => {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
style={{
|
className={`${
|
||||||
display: "flex",
|
obj?.Name ? "flex-col" : "flex-row"
|
||||||
flexDirection: obj.Name ? "column" : "row",
|
} flex items-center`}
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{obj.Name ? (
|
{obj.Name ? (
|
||||||
<span className={"userName"}>{obj.Name}</span>
|
<span
|
||||||
|
className={`${
|
||||||
|
(!isMobile && isHover === ind) ||
|
||||||
|
props.isSelectListId === ind
|
||||||
|
? "text-[#424242]"
|
||||||
|
: "text-base-content"
|
||||||
|
} text-[12px] font-bold w-[100px] whitespace-nowrap overflow-hidden text-ellipsis`}
|
||||||
|
>
|
||||||
|
{obj.Name}
|
||||||
|
</span>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<span
|
||||||
<span
|
className={`${
|
||||||
className="userName"
|
(!isMobile && isHover === ind) ||
|
||||||
style={{ cursor: "pointer" }}
|
props.isSelectListId === ind
|
||||||
onClick={() => {
|
? "text-[#424242]"
|
||||||
setIsEdit({ [obj.Id]: true });
|
: "text-base-content"
|
||||||
props.setRoleName(obj.Role);
|
} text-[12px] font-bold w-[100px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer`}
|
||||||
}}
|
onClick={() => {
|
||||||
>
|
setIsEdit({ [obj.Id]: true });
|
||||||
{isEdit?.[obj.Id] && props.handleRoleChange ? (
|
props.setRoleName(obj.Role);
|
||||||
<input
|
}}
|
||||||
ref={inputRef}
|
>
|
||||||
style={{
|
{isEdit?.[obj.Id] && props.handleRoleChange ? (
|
||||||
backgroundColor: "transparent",
|
<input
|
||||||
width: "inherit",
|
ref={inputRef}
|
||||||
padding: "3px"
|
className="bg-transparent p-[3px"
|
||||||
}}
|
value={obj.Role}
|
||||||
value={obj.Role}
|
onChange={(e) => props.handleRoleChange(e, obj.Id)}
|
||||||
onChange={(e) => props.handleRoleChange(e, obj.Id)}
|
onBlur={() => {
|
||||||
onBlur={() => {
|
setIsEdit({});
|
||||||
setIsEdit({});
|
props.handleOnBlur(obj.Role, obj.Id);
|
||||||
props.handleOnBlur(obj.Role, obj.Id);
|
}}
|
||||||
}}
|
onKeyDown={(e) => {
|
||||||
onKeyDown={(e) => {
|
if (e.key === "Enter") {
|
||||||
if (e.key === "Enter") {
|
e.preventDefault();
|
||||||
e.preventDefault();
|
inputRef.current.blur();
|
||||||
inputRef.current.blur();
|
}
|
||||||
}
|
}}
|
||||||
}}
|
/>
|
||||||
/>
|
) : (
|
||||||
) : (
|
<span className="p-[3px]">{obj.Role}</span>
|
||||||
<span style={{ padding: "3px" }}>{obj.Role}</span>
|
)}
|
||||||
)}
|
</span>
|
||||||
</span>
|
|
||||||
</>
|
|
||||||
)}
|
)}
|
||||||
{obj.Name && (
|
{obj.Name && (
|
||||||
<span className={"useEmail"}>
|
<span
|
||||||
|
className={` ${
|
||||||
|
(!isMobile && isHover === ind) ||
|
||||||
|
props.isSelectListId === ind
|
||||||
|
? "text-[#424242]"
|
||||||
|
: "text-base-content"
|
||||||
|
} text-[10px] font-medium w-[100px] whitespace-nowrap overflow-hidden text-ellipsis`}
|
||||||
|
>
|
||||||
{obj?.Role || obj?.Email}
|
{obj?.Role || obj?.Email}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{isMobile && props.sendInOrder && (
|
{isMobile && props.sendInOrder && (
|
||||||
<div
|
<div className="flex flex-row items-center gap-[5px]">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center",
|
|
||||||
gap: 5
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
<div
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
if (ind !== 0) {
|
if (ind !== 0) {
|
||||||
@@ -253,7 +217,7 @@ const RecipientList = (props) => {
|
|||||||
handleChangeSequence(e, ind, "up");
|
handleChangeSequence(e, ind, "up");
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
style={{ color: ind === 0 ? "gray" : "black" }}
|
className={ind === 0 ? "text-[gray]" : "text-black"}
|
||||||
>
|
>
|
||||||
▲
|
▲
|
||||||
</div>
|
</div>
|
||||||
@@ -264,10 +228,11 @@ const RecipientList = (props) => {
|
|||||||
handleChangeSequence(e, ind, null, "down");
|
handleChangeSequence(e, ind, null, "down");
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
style={{
|
className={
|
||||||
color:
|
ind === props.signersdata.length - 1
|
||||||
ind === props.signersdata.length - 1 ? "gray" : "black"
|
? "text-[gray]"
|
||||||
}}
|
: "text-black"
|
||||||
|
}
|
||||||
>
|
>
|
||||||
▼
|
▼
|
||||||
</div>
|
</div>
|
||||||
@@ -279,7 +244,12 @@ const RecipientList = (props) => {
|
|||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
props.handleDeleteUser(obj.Id);
|
props.handleDeleteUser(obj.Id);
|
||||||
}}
|
}}
|
||||||
style={{ cursor: "pointer", marginLeft: "5px" }}
|
className={`${
|
||||||
|
(!isMobile && isHover === ind) ||
|
||||||
|
props.isSelectListId === ind
|
||||||
|
? "text-[#424242]"
|
||||||
|
: "text-base-content"
|
||||||
|
} cursor-pointer ml-[5px]`}
|
||||||
>
|
>
|
||||||
<i className="fa-regular fa-trash-can"></i>
|
<i className="fa-regular fa-trash-can"></i>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import RSC from "react-scrollbars-custom";
|
import RSC from "react-scrollbars-custom";
|
||||||
import { Document, Page } from "react-pdf";
|
import { Document, Page } from "react-pdf";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
|
|
||||||
function RenderAllPdfPage({
|
function RenderAllPdfPage({
|
||||||
signPdfUrl,
|
signPdfUrl,
|
||||||
@@ -40,15 +39,7 @@ function RenderAllPdfPage({
|
|||||||
const ispageNumber = signPageNumber.includes(index + 1);
|
const ispageNumber = signPageNumber.includes(index + 1);
|
||||||
return (
|
return (
|
||||||
ispageNumber && (
|
ispageNumber && (
|
||||||
<div
|
<div className="absolute z-20 top-[1px] -right-[13px] -translate-x-1/2 -translate-y-1/2">
|
||||||
style={{
|
|
||||||
position: "absolute",
|
|
||||||
zIndex: 2,
|
|
||||||
top: -12,
|
|
||||||
right: -7,
|
|
||||||
transform: "translate(50% -50%)"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i
|
<i
|
||||||
style={{ color: bookmarkColor || "red" }}
|
style={{ color: bookmarkColor || "red" }}
|
||||||
className="fa-solid fa-bookmark"
|
className="fa-solid fa-bookmark"
|
||||||
@@ -58,24 +49,10 @@ function RenderAllPdfPage({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div className="showPages">
|
<div>
|
||||||
<div
|
<div className=" hidden md:flex flex-row bg-base-100 h-full">
|
||||||
style={{
|
<div className="w-[140px]">
|
||||||
display: "flex",
|
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
|
||||||
flexDirection: "row",
|
|
||||||
boxShadow: "rgba(17, 12, 46, 0.15) 0px 48px 100px 0px",
|
|
||||||
backgroundColor: "white",
|
|
||||||
height: "100%"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div style={{ width: "140px" }}>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
background: themeColor
|
|
||||||
// color:"white"
|
|
||||||
}}
|
|
||||||
className="signedStyle"
|
|
||||||
>
|
|
||||||
Pages
|
Pages
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -95,21 +72,11 @@ function RenderAllPdfPage({
|
|||||||
{Array.from(new Array(allPages), (el, index) => (
|
{Array.from(new Array(allPages), (el, index) => (
|
||||||
<div
|
<div
|
||||||
key={index}
|
key={index}
|
||||||
style={{
|
className={`${
|
||||||
width: "100px",
|
pageNumber - 1 === index
|
||||||
border:
|
? "border-[red]"
|
||||||
pageNumber - 1 === index
|
: "border-[#878787]"
|
||||||
? "2px solid red"
|
} border-2 w-[100px] m-[10px] flex justify-center items-center relative`}
|
||||||
: "2px solid #878787",
|
|
||||||
// padding: "5px",
|
|
||||||
margin: "10px",
|
|
||||||
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center",
|
|
||||||
|
|
||||||
position: "relative"
|
|
||||||
}}
|
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setPageNumber(index + 1);
|
setPageNumber(index + 1);
|
||||||
if (setSignBtnPosition) {
|
if (setSignBtnPosition) {
|
||||||
@@ -119,13 +86,7 @@ function RenderAllPdfPage({
|
|||||||
>
|
>
|
||||||
{signerPos && addSignatureBookmark(index)}
|
{signerPos && addSignatureBookmark(index)}
|
||||||
|
|
||||||
<div
|
<div className="relative z-[1] overflow-hidden">
|
||||||
style={{
|
|
||||||
position: "relative",
|
|
||||||
zIndex: 1,
|
|
||||||
overflow: "hidden"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Page
|
<Page
|
||||||
key={`page_${index + 1}`}
|
key={`page_${index + 1}`}
|
||||||
pageNumber={index + 1}
|
pageNumber={index + 1}
|
||||||
|
|||||||
@@ -215,18 +215,16 @@ function RenderPdf({
|
|||||||
const handleAllUserName = (Id, Role, type) => {
|
const handleAllUserName = (Id, Role, type) => {
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<div style={{ color: "black", fontSize: 8, fontWeight: "500" }}>
|
<div className="text-black text-[8px] font-medium">
|
||||||
{
|
{
|
||||||
pdfDetails[0].Signers?.find(
|
pdfDetails[0].Signers?.find(
|
||||||
(signer) => signer.objectId === data.signerObjId
|
(signer) => signer.objectId === data.signerObjId
|
||||||
)?.Name
|
)?.Name
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
{type && (
|
{type && <div className="text-[11px] font-bold">{type}</div>}
|
||||||
<div style={{ fontWeight: "700", fontSize: 11 }}>{type}</div>
|
|
||||||
)}
|
|
||||||
{Role && (
|
{Role && (
|
||||||
<div style={{ color: "black", fontSize: 8, fontWeight: "500" }}>
|
<div className="text-black text-[8px] font-medium">
|
||||||
{`(${Role})`}
|
{`(${Role})`}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -290,14 +288,12 @@ function RenderPdf({
|
|||||||
if (checkSign?.Name) {
|
if (checkSign?.Name) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div style={{ color: "black", fontSize: 8, fontWeight: "500" }}>
|
<div className="text-black text-[8px] font-medium">
|
||||||
{checkSign?.Name}
|
{checkSign?.Name}
|
||||||
</div>
|
</div>
|
||||||
{type && (
|
{type && <div className="text-[11px] font-bold">{type}</div>}
|
||||||
<div style={{ fontWeight: "700", fontSize: 11 }}>{type}</div>
|
|
||||||
)}
|
|
||||||
{Role && (
|
{Role && (
|
||||||
<div style={{ color: "black", fontSize: 8, fontWeight: "500" }}>
|
<div className="text-black text-[8px] font-medium">
|
||||||
{`(${Role})`}
|
{`(${Role})`}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -306,24 +302,16 @@ function RenderPdf({
|
|||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{type && (
|
{type && <div className="text-[11px] font-bold">{type}</div>}
|
||||||
<div style={{ fontWeight: "700", fontSize: 11 }}>{type}</div>
|
<div className="text-black text-[8px] font-medium">{Role}</div>
|
||||||
)}
|
|
||||||
<div style={{ color: "black", fontSize: 8, fontWeight: "500" }}>
|
|
||||||
{Role}
|
|
||||||
</div>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{type && (
|
{type && <div className="text-[11px] font-bold">{type}</div>}
|
||||||
<div style={{ fontWeight: "700", fontSize: 11 }}>{type}</div>
|
<div className="text-black text-[8px] font-medium">{Role}</div>
|
||||||
)}
|
|
||||||
<div style={{ color: "black", fontSize: 8, fontWeight: "500" }}>
|
|
||||||
{Role}
|
|
||||||
</div>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -462,17 +450,9 @@ function RenderPdf({
|
|||||||
}))}
|
}))}
|
||||||
|
|
||||||
{/* this component for render pdf document is in middle of the component */}
|
{/* this component for render pdf document is in middle of the component */}
|
||||||
<div
|
<div className="flex items-center justify-center">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Document
|
<Document
|
||||||
onLoadError={() => {
|
onLoadError={() => setPdfLoadFail(true)}
|
||||||
setPdfLoadFail(true);
|
|
||||||
}}
|
|
||||||
loading={"Loading Document.."}
|
loading={"Loading Document.."}
|
||||||
onLoadSuccess={pageDetails}
|
onLoadSuccess={pageDetails}
|
||||||
// ref={pdfRef}'
|
// ref={pdfRef}'
|
||||||
@@ -519,10 +499,7 @@ function RenderPdf({
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
data-tut="reactourForth"
|
data-tut="reactourForth"
|
||||||
style={{
|
style={{ border: "0.1px solid #ebe8e8", width: pdfOriginalWidth }}
|
||||||
border: "0.1px solid #ebe8e8",
|
|
||||||
width: pdfOriginalWidth
|
|
||||||
}}
|
|
||||||
ref={drop}
|
ref={drop}
|
||||||
id="container"
|
id="container"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import React, { useRef, useState, useEffect } from "react";
|
import React, { useRef, useState, useEffect } from "react";
|
||||||
import SignatureCanvas from "react-signature-canvas";
|
import SignatureCanvas from "react-signature-canvas";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
|
|
||||||
function SignPad({
|
function SignPad({
|
||||||
isSignPad,
|
isSignPad,
|
||||||
@@ -78,21 +77,16 @@ function SignPad({
|
|||||||
//save button component
|
//save button component
|
||||||
const SaveBtn = () => {
|
const SaveBtn = () => {
|
||||||
return (
|
return (
|
||||||
<div style={{ marginTop: "2px" }}>
|
<div>
|
||||||
{(isTab === "draw" || isTab === "uploadImage") && (
|
{(isTab === "draw" || isTab === "uploadImage") && (
|
||||||
<button
|
<button
|
||||||
style={{
|
|
||||||
color: "black",
|
|
||||||
border: "1px solid #ccc"
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn saveBtn"
|
className="op-btn op-btn-ghost mr-1 mt-[2px]"
|
||||||
onClick={() => handleClear()}
|
onClick={() => handleClear()}
|
||||||
>
|
>
|
||||||
Clear
|
Clear
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setCurrWidgetsDetails({});
|
setCurrWidgetsDetails({});
|
||||||
@@ -127,19 +121,12 @@ function SignPad({
|
|||||||
setSignValue("");
|
setSignValue("");
|
||||||
setIsStamp(false);
|
setIsStamp(false);
|
||||||
}}
|
}}
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
disabled={
|
|
||||||
isSignImg || image || isDefaultSign || textWidth ? false : true
|
|
||||||
}
|
|
||||||
type="button"
|
type="button"
|
||||||
className={
|
className={`${
|
||||||
isSignImg || image || isDefaultSign || textWidth
|
isSignImg || image || isDefaultSign || textWidth
|
||||||
? "finishBtn saveBtn"
|
? ""
|
||||||
: "disabledFinish saveBtn"
|
: "pointer-events-none"
|
||||||
}
|
} op-btn op-btn-primary shadow-lg`}
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
</button>
|
</button>
|
||||||
@@ -214,8 +201,8 @@ function SignPad({
|
|||||||
const fontfamily = fontStyle
|
const fontfamily = fontStyle
|
||||||
? fontStyle
|
? fontStyle
|
||||||
: fontSelect
|
: fontSelect
|
||||||
? fontSelect
|
? fontSelect
|
||||||
: "Fasthand";
|
: "Fasthand";
|
||||||
|
|
||||||
//creating span for getting text content width
|
//creating span for getting text content width
|
||||||
const span = document.createElement("span");
|
const span = document.createElement("span");
|
||||||
@@ -256,7 +243,7 @@ function SignPad({
|
|||||||
|
|
||||||
const PenColorComponent = (props) => {
|
const PenColorComponent = (props) => {
|
||||||
return (
|
return (
|
||||||
<div style={{ display: "flex", flexDirection: "row" }}>
|
<div className="flex flex-row items-start">
|
||||||
{allColor.map((data, key) => {
|
{allColor.map((data, key) => {
|
||||||
return (
|
return (
|
||||||
<i
|
<i
|
||||||
@@ -267,10 +254,10 @@ function SignPad({
|
|||||||
key === 0 && penColor === "blue"
|
key === 0 && penColor === "blue"
|
||||||
? "2px solid blue"
|
? "2px solid blue"
|
||||||
: key === 1 && penColor === "red"
|
: key === 1 && penColor === "red"
|
||||||
? "2px solid red"
|
? "2px solid red"
|
||||||
: key === 2 && penColor === "black"
|
: key === 2 && penColor === "black"
|
||||||
? "2px solid black"
|
? "2px solid black"
|
||||||
: "2px solid white"
|
: "2px solid white"
|
||||||
}}
|
}}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
props?.convertToImg &&
|
props?.convertToImg &&
|
||||||
@@ -296,33 +283,14 @@ function SignPad({
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{isSignPad && (
|
{isSignPad && (
|
||||||
<div className="modaloverlay">
|
<div className="op-modal op-modal-open">
|
||||||
<div className="modalcontainer">
|
<div className="op-modal-box px-[13px] pt-2 pb-0">
|
||||||
<div
|
<div className="flex justify-between text-base-content items-center">
|
||||||
className="modalheader"
|
<div className="text-[1.2rem]">
|
||||||
style={{ padding: "0 13px", marginTop: "5px" }}
|
<div className="flex flex-row justify-between mt-[3px]">
|
||||||
>
|
<div className="flex flex-row justify-between gap-[5px] md:gap-[8px] text-[11px] md:text-base">
|
||||||
<div className="modaltitle">
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
justifyContent: "space-between",
|
|
||||||
background: "white",
|
|
||||||
marginTop: "3px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
justifyContent: "space-around",
|
|
||||||
alignItems: "end",
|
|
||||||
gap: 10
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{isStamp ? (
|
{isStamp ? (
|
||||||
<span style={{ color: themeColor }} className="signTab">
|
<span className="op-link-primary op-link">
|
||||||
{widgetType === "image"
|
{widgetType === "image"
|
||||||
? "Upload image"
|
? "Upload image"
|
||||||
: "Upload stamp image"}
|
: "Upload stamp image"}
|
||||||
@@ -337,23 +305,14 @@ function SignPad({
|
|||||||
setIsTab("draw");
|
setIsTab("draw");
|
||||||
setImage();
|
setImage();
|
||||||
}}
|
}}
|
||||||
style={{
|
className={`${
|
||||||
color: isTab === "draw" ? themeColor : "#515252",
|
isTab === "draw"
|
||||||
marginLeft: "2px"
|
? "op-link-primary"
|
||||||
}}
|
: "no-underline"
|
||||||
className="signTab"
|
} op-link underline-offset-8 ml-[2px]`}
|
||||||
>
|
>
|
||||||
Draw
|
Draw
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
border:
|
|
||||||
isTab === "draw"
|
|
||||||
? "1.5px solid #108783"
|
|
||||||
: "1.5px solid #ffffff"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span
|
<span
|
||||||
@@ -363,22 +322,14 @@ function SignPad({
|
|||||||
setIsTab("uploadImage");
|
setIsTab("uploadImage");
|
||||||
setSignatureType("");
|
setSignatureType("");
|
||||||
}}
|
}}
|
||||||
style={{
|
className={`${
|
||||||
color:
|
isTab === "uploadImage"
|
||||||
isTab === "uploadImage" ? themeColor : "#515252"
|
? "op-link-primary"
|
||||||
}}
|
: "no-underline"
|
||||||
className="signTab"
|
} op-link underline-offset-8 ml-[2px]`}
|
||||||
>
|
>
|
||||||
Upload Image
|
Upload Image
|
||||||
</span>
|
</span>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
border:
|
|
||||||
isTab === "uploadImage"
|
|
||||||
? "1.5px solid #108783"
|
|
||||||
: "1.5px solid #ffffff"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span
|
<span
|
||||||
@@ -389,23 +340,14 @@ function SignPad({
|
|||||||
setSignatureType("");
|
setSignatureType("");
|
||||||
setImage();
|
setImage();
|
||||||
}}
|
}}
|
||||||
style={{
|
className={`${
|
||||||
color: isTab === "type" ? themeColor : "#515252",
|
isTab === "type"
|
||||||
marginLeft: "2px"
|
? "op-link-primary"
|
||||||
}}
|
: "no-underline"
|
||||||
className="signTab"
|
} op-link underline-offset-8 ml-[2px]`}
|
||||||
>
|
>
|
||||||
Type
|
Type
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
border:
|
|
||||||
isTab === "type"
|
|
||||||
? "1.5px solid #108783"
|
|
||||||
: "1.5px solid #ffffff"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
{!isInitial && defaultSign ? (
|
{!isInitial && defaultSign ? (
|
||||||
<div>
|
<div>
|
||||||
@@ -417,24 +359,14 @@ function SignPad({
|
|||||||
setSignatureType("");
|
setSignatureType("");
|
||||||
setImage();
|
setImage();
|
||||||
}}
|
}}
|
||||||
style={{
|
className={`${
|
||||||
color:
|
isTab === "mysignature"
|
||||||
isTab === "mysignature"
|
? "op-link-primary"
|
||||||
? themeColor
|
: "no-underline"
|
||||||
: "#515252"
|
} op-link underline-offset-8 ml-[2px]`}
|
||||||
}}
|
|
||||||
className="signTab"
|
|
||||||
>
|
>
|
||||||
My Signature
|
My Signature
|
||||||
</span>
|
</span>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
border:
|
|
||||||
isTab === "mysignature"
|
|
||||||
? "1.5px solid #108783"
|
|
||||||
: "1.5px solid #ffffff"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
isInitial &&
|
isInitial &&
|
||||||
@@ -448,24 +380,14 @@ function SignPad({
|
|||||||
setSignatureType("");
|
setSignatureType("");
|
||||||
setImage();
|
setImage();
|
||||||
}}
|
}}
|
||||||
style={{
|
className={`${
|
||||||
color:
|
isTab === "mysignature"
|
||||||
isTab === "mysignature"
|
? "op-link-primary"
|
||||||
? themeColor
|
: "no-underline"
|
||||||
: "#515252"
|
} op-link underline-offset-8 ml-[2px]`}
|
||||||
}}
|
|
||||||
className="signTab"
|
|
||||||
>
|
>
|
||||||
My Initials
|
My Initials
|
||||||
</span>
|
</span>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
border:
|
|
||||||
isTab === "mysignature"
|
|
||||||
? "1.5px solid #108783"
|
|
||||||
: "1.5px solid #ffffff"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
@@ -475,8 +397,7 @@ function SignPad({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="closebtn"
|
className="text-[1.5rem] cursor-pointer"
|
||||||
style={{ color: "black" }}
|
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setPenColor("blue");
|
setPenColor("blue");
|
||||||
setIsSignPad(false);
|
setIsSignPad(false);
|
||||||
@@ -493,10 +414,10 @@ function SignPad({
|
|||||||
×
|
×
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="p-[20px] h-full">
|
||||||
{isDefaultSign ? (
|
{isDefaultSign ? (
|
||||||
<>
|
<>
|
||||||
<div style={{ display: "flex", justifyContent: "center" }}>
|
<div className="flex justify-center">
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
border: "1.3px solid #007bff",
|
border: "1.3px solid #007bff",
|
||||||
@@ -514,24 +435,19 @@ function SignPad({
|
|||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
alt="stamp img"
|
alt="stamp img"
|
||||||
style={{
|
className="w-full h-full object-contain bg-white"
|
||||||
width: "100%",
|
|
||||||
height: "100%",
|
|
||||||
background: "rgb(255, 255, 255)",
|
|
||||||
objectFit: "contain"
|
|
||||||
}}
|
|
||||||
draggable="false"
|
draggable="false"
|
||||||
src={isInitial ? myInitial : defaultSign}
|
src={isInitial ? myInitial : defaultSign}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ display: "flex", justifyContent: "flex-end" }}>
|
<div className="flex justify-end">
|
||||||
<SaveBtn />
|
<SaveBtn />
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
) : isImageSelect || isStamp ? (
|
) : isImageSelect || isStamp ? (
|
||||||
!image ? (
|
!image ? (
|
||||||
<div style={{ display: "flex", justifyContent: "center" }}>
|
<div className="flex justify-center">
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
border: "1.3px solid #007bff",
|
border: "1.3px solid #007bff",
|
||||||
@@ -562,7 +478,7 @@ function SignPad({
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<div style={{ display: "flex", justifyContent: "center" }}>
|
<div className="flex justify-center">
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
border: "1.3px solid #007bff",
|
border: "1.3px solid #007bff",
|
||||||
@@ -581,39 +497,26 @@ function SignPad({
|
|||||||
ref={imageRef}
|
ref={imageRef}
|
||||||
src={image.src}
|
src={image.src}
|
||||||
draggable="false"
|
draggable="false"
|
||||||
style={{
|
className=" object-contain h-full w-full"
|
||||||
objectFit: "contain",
|
|
||||||
height: "100%",
|
|
||||||
width: "100%"
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="flex justify-end">
|
||||||
style={{ display: "flex", justifyContent: "flex-end" }}
|
|
||||||
>
|
|
||||||
<SaveBtn />
|
<SaveBtn />
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
) : isTab === "type" ? (
|
) : isTab === "type" ? (
|
||||||
<div>
|
<div>
|
||||||
<div
|
<div className="flex justify-between items-center">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "space-between",
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span className="signatureText">
|
<span className="signatureText">
|
||||||
{isInitial ? "Initials" : "Signature"}:
|
{isInitial ? "Initials" : "Signature"}:
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<input
|
<input
|
||||||
maxLength={isInitial ? 3 : 30}
|
maxLength={isInitial ? 3 : 30}
|
||||||
style={{ fontFamily: fontSelect, color: penColor }}
|
style={{ fontFamily: fontSelect, color: penColor }}
|
||||||
type="text"
|
type="text"
|
||||||
className="signatureInput"
|
className="ml-1 op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-[20px]"
|
||||||
placeholder="Your signature"
|
placeholder="Your signature"
|
||||||
value={signValue}
|
value={signValue}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
@@ -622,7 +525,6 @@ function SignPad({
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="fontOptionContainer">
|
<div className="fontOptionContainer">
|
||||||
{fontOptions.map((font, ind) => {
|
{fontOptions.map((font, ind) => {
|
||||||
return (
|
return (
|
||||||
@@ -653,21 +555,14 @@ function SignPad({
|
|||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div className="flex flex-row justify-between mt-[10px]">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
justifyContent: "space-between",
|
|
||||||
marginTop: "10px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<PenColorComponent convertToImg={convertToImg} />
|
<PenColorComponent convertToImg={convertToImg} />
|
||||||
<SaveBtn />
|
<SaveBtn />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<div style={{ display: "flex", justifyContent: "center" }}>
|
<div className="flex justify-center">
|
||||||
<SignatureCanvas
|
<SignatureCanvas
|
||||||
ref={canvasRef}
|
ref={canvasRef}
|
||||||
penColor={penColor}
|
penColor={penColor}
|
||||||
@@ -687,14 +582,7 @@ function SignPad({
|
|||||||
dotSize={1}
|
dotSize={1}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="flex flex-row justify-between mt-[10px]">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
justifyContent: "space-between",
|
|
||||||
marginTop: "10px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<PenColorComponent />
|
<PenColorComponent />
|
||||||
<SaveBtn />
|
<SaveBtn />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
import "../../styles/signature.css";
|
import "../../styles/signature.css";
|
||||||
function Signedby({ pdfDetails }) {
|
function Signedby({ pdfDetails }) {
|
||||||
const getFirstLetter = (name) => {
|
const getFirstLetter = (name) => {
|
||||||
@@ -8,50 +7,18 @@ function Signedby({ pdfDetails }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="signerComponent">
|
<div className="hidden md:block w-[180px] h-full bg-base-100">
|
||||||
<div
|
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
className="signedStyle"
|
|
||||||
>
|
|
||||||
Signed By
|
Signed By
|
||||||
</div>
|
</div>
|
||||||
<div style={{ marginTop: "2px", background: "white" }}>
|
<div className="mt-[2px] bg-base-100">
|
||||||
<div
|
<div className="bg-[#93a3db] rounded-xl mx-1 flex flex-row items-center py-[10px]">
|
||||||
style={{
|
<div className="bg-[#576081] flex w-[30px] h-[30px] rounded-full justify-center items-center mx-1">
|
||||||
display: "flex",
|
<span className="text-[12px] text-center font-bold text-white uppercase">
|
||||||
flexDirection: "row",
|
|
||||||
padding: "10px",
|
|
||||||
background: "#93a3db"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
className="signerStyle"
|
|
||||||
style={{
|
|
||||||
background: "#abd1d0",
|
|
||||||
width: 20,
|
|
||||||
height: 20,
|
|
||||||
display: "flex",
|
|
||||||
borderRadius: 30 / 2,
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center",
|
|
||||||
marginRight: "20px",
|
|
||||||
marginTop: "5px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
style={{
|
|
||||||
fontSize: "8px",
|
|
||||||
textAlign: "center",
|
|
||||||
fontWeight: "bold"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{getFirstLetter(pdfDetails.ExtUserPtr.Name)}
|
{getFirstLetter(pdfDetails.ExtUserPtr.Name)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ display: "flex", flexDirection: "column" }}>
|
<div className="flex flex-col">
|
||||||
<span className="userName">{pdfDetails.ExtUserPtr.Name}</span>
|
<span className="userName">{pdfDetails.ExtUserPtr.Name}</span>
|
||||||
<span className="useEmail">{pdfDetails.ExtUserPtr.Email}</span>
|
<span className="useEmail">{pdfDetails.ExtUserPtr.Email}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,37 +1,22 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
import RecipientList from "./RecipientList";
|
import RecipientList from "./RecipientList";
|
||||||
import { Tooltip } from "react-tooltip";
|
import { Tooltip } from "react-tooltip";
|
||||||
|
|
||||||
function SignerListPlace(props) {
|
function SignerListPlace(props) {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div
|
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
|
||||||
style={{
|
<span>
|
||||||
background: themeColor,
|
|
||||||
padding: "5px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span className="signedStyle">
|
|
||||||
{props.title ? props.title : "Recipients"}
|
{props.title ? props.title : "Recipients"}
|
||||||
<span className="absolute text-xs z-[30] mt-1 ml-0.5">
|
<span className="text-xs mt-1 ml-0.5">
|
||||||
{props?.title === "Roles" && (
|
{props?.title === "Roles" && (
|
||||||
<>
|
<>
|
||||||
<a data-tooltip-id="my-tooltip">
|
<a data-tooltip-id="my-tooltip">
|
||||||
<sup>
|
<sup>
|
||||||
<i
|
<i className="fa-solid fa-question rounded-full border-[1.5px] border-base-content text-[11px] py-[1px] px-[3px]"></i>
|
||||||
className="fa-solid fa-question rounded-full"
|
|
||||||
style={{
|
|
||||||
borderColor: "white",
|
|
||||||
color: "white",
|
|
||||||
fontSize: 11,
|
|
||||||
borderWidth: 1.5,
|
|
||||||
padding: "1px 3px"
|
|
||||||
}}
|
|
||||||
></i>
|
|
||||||
</sup>
|
</sup>
|
||||||
</a>
|
</a>
|
||||||
<Tooltip id="my-tooltip">
|
<Tooltip id="my-tooltip" className="z-[100]">
|
||||||
<div className="max-w-[450px]">
|
<div className="max-w-[450px]">
|
||||||
<p className="font-bold">What are template roles?</p>
|
<p className="font-bold">What are template roles?</p>
|
||||||
<p>
|
<p>
|
||||||
@@ -68,36 +53,32 @@ function SignerListPlace(props) {
|
|||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="signerList">
|
<div className="overflow-auto hide-scrollbar max-h-[180px]">
|
||||||
<RecipientList {...props} />
|
<RecipientList {...props} />
|
||||||
</div>
|
</div>
|
||||||
{props.handleAddSigner ? (
|
<div className="mx-1">
|
||||||
<div
|
{props.handleAddSigner ? (
|
||||||
data-tut="reactourAddbtn"
|
<div
|
||||||
className="p-[10px] my-[2px] flex flex-row items-center justify-center border-[1px] border-[#47a3ad] hover:bg-[#47a3ad] text-[#47a3ad] hover:text-white cursor-pointer"
|
role="button"
|
||||||
onClick={() => props.handleAddSigner()}
|
data-tut="reactourAddbtn"
|
||||||
style={{
|
className="op-btn op-btn-accent op-btn-outline w-full mt-[14px]"
|
||||||
opacity: props.isMailSend && "0.5",
|
disabled={props?.isMailSend ? true : false}
|
||||||
pointerEvents: props.isMailSend && "none"
|
onClick={() => props.handleAddSigner()}
|
||||||
}}
|
>
|
||||||
>
|
<i className="fa-solid fa-plus"></i> Add role
|
||||||
<i className="fa-solid fa-plus"></i>
|
</div>
|
||||||
<span style={{ marginLeft: 2 }}>Add role</span>
|
) : (
|
||||||
</div>
|
<div
|
||||||
) : (
|
role="button"
|
||||||
<div
|
data-tut="reactourAddbtn"
|
||||||
data-tut="reactourAddbtn"
|
className="op-btn op-btn-accent op-btn-outline w-full mt-[14px]"
|
||||||
className="p-[10px] my-[2px] flex flex-row items-center justify-center border-[1px] border-[#47a3ad] hover:bg-[#47a3ad] text-[#47a3ad] hover:text-white cursor-pointer"
|
disabled={props?.isMailSend ? true : false}
|
||||||
onClick={() => props.setIsAddSigner(true)}
|
onClick={() => props.setIsAddSigner(true)}
|
||||||
style={{
|
>
|
||||||
opacity: props.isMailSend && "0.5",
|
<i className="fa-solid fa-plus"></i> Add recipients
|
||||||
pointerEvents: props.isMailSend && "none"
|
</div>
|
||||||
}}
|
)}
|
||||||
>
|
</div>
|
||||||
<i className="fa-solid fa-plus"></i>
|
|
||||||
<span style={{ marginLeft: 2 }}>Add recipients</span>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { rejectBtn, submitBtn, themeColor } from "../../constant/const";
|
import Loader from "../../primitives/Loader";
|
||||||
|
|
||||||
function VerifyEmail(props) {
|
function VerifyEmail(props) {
|
||||||
return (
|
return (
|
||||||
<div className="bg-black bg-opacity-[75%] absolute z-[999] flex flex-col items-center justify-center w-full h-full rounded">
|
<dialog className="op-modal op-modal-open absolute z-[1999]">
|
||||||
<div className="bg-white rounded outline-none md:w-[40%] w-[80%]">
|
<div className="md:w-[40%] w-[80%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm">
|
||||||
<div
|
<h3 className="font-bold text-lg pt-[15px] px-[20px] text-base-content">
|
||||||
style={{ backgroundColor: themeColor }}
|
|
||||||
className=" text-white p-[10px] rounded-t"
|
|
||||||
>
|
|
||||||
OTP verification
|
OTP verification
|
||||||
</div>
|
</h3>
|
||||||
{props.isVerifyModal ? (
|
{props.isVerifyModal ? (
|
||||||
<form
|
<form
|
||||||
onSubmit={(e) => {
|
onSubmit={(e) => {
|
||||||
@@ -18,25 +15,24 @@ function VerifyEmail(props) {
|
|||||||
props.handleVerifyEmail(e);
|
props.handleVerifyEmail(e);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div className="px-6 py-3">
|
<div className="px-6 py-3 text-base-content">
|
||||||
<label className="mb-2">Enter OTP</label>
|
<label className="mb-2">Enter OTP</label>
|
||||||
<input
|
<input
|
||||||
required
|
required
|
||||||
type="tel"
|
type="tel"
|
||||||
pattern="[0-9]{4}"
|
pattern="[0-9]{4}"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="w-full op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-xs"
|
||||||
placeholder="Enter OTP received over email"
|
placeholder="Enter OTP received over email"
|
||||||
value={props.otp}
|
value={props.otp}
|
||||||
onChange={(e) => props.setOtp(e.target.value)}
|
onChange={(e) => props.setOtp(e.target.value)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
|
||||||
<div className="px-6 my-3">
|
<div className="px-6 my-3">
|
||||||
<button type="submit" className={submitBtn}>
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
Verify
|
Verify
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className={`${rejectBtn} ml-2`}
|
className="op-btn op-btn-secondary ml-2"
|
||||||
onClick={(e) => props.handleResend(e)}
|
onClick={(e) => props.handleResend(e)}
|
||||||
>
|
>
|
||||||
Resend
|
Resend
|
||||||
@@ -44,29 +40,15 @@ function VerifyEmail(props) {
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
) : props.otpLoader ? (
|
) : props.otpLoader ? (
|
||||||
<div
|
<div className="h-[150px] flex items-center justify-center">
|
||||||
style={{
|
<Loader />
|
||||||
height: "150px",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="px-6 py-3">
|
<div className="px-6 py-3 text-base-content">
|
||||||
<p className="mb-2">Please verify your email !</p>
|
<p className="mb-2 text-sm">Please verify your email !</p>
|
||||||
<hr />
|
|
||||||
<div className="px-0 mt-3">
|
<div className="px-0 mt-3">
|
||||||
<button
|
<button
|
||||||
className={submitBtn}
|
className="op-btn op-btn-primary"
|
||||||
type="submit"
|
type="submit"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
props.handleVerifyBtn();
|
props.handleVerifyBtn();
|
||||||
@@ -78,7 +60,7 @@ function VerifyEmail(props) {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</dialog>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import {
|
|||||||
textWidget,
|
textWidget,
|
||||||
widgets
|
widgets
|
||||||
} from "../../constant/Utils";
|
} from "../../constant/Utils";
|
||||||
import { themeColor } from "../../constant/const";
|
|
||||||
function WidgetComponent({
|
function WidgetComponent({
|
||||||
dragSignature,
|
dragSignature,
|
||||||
signRef,
|
signRef,
|
||||||
@@ -256,117 +255,82 @@ function WidgetComponent({
|
|||||||
className="stickyfooter"
|
className="stickyfooter"
|
||||||
style={{ width: window.innerWidth + "px" }}
|
style={{ width: window.innerWidth + "px" }}
|
||||||
>
|
>
|
||||||
{isSigners && (
|
<div className="mx-1">
|
||||||
<div
|
{isSigners && (
|
||||||
data-tut={dataTut}
|
<div
|
||||||
style={{
|
data-tut={dataTut}
|
||||||
background: blockColor
|
className="py-[10px] flex justify-center items-center op-card"
|
||||||
? blockColor
|
|
||||||
: isSelectListId
|
|
||||||
? color[isSelectListId % color.length]
|
|
||||||
: color[0],
|
|
||||||
padding: "10px 20px",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
onClick={() => handleModal()}
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
style={{
|
style={{
|
||||||
fontSize: "13px",
|
background: blockColor
|
||||||
fontWeight: "700",
|
? blockColor
|
||||||
textAlign: "center"
|
: isSelectListId
|
||||||
|
? color[isSelectListId % color.length]
|
||||||
|
: color[0]
|
||||||
}}
|
}}
|
||||||
|
onClick={() => handleModal()}
|
||||||
>
|
>
|
||||||
{title ? title : "Recipient"}
|
<span className="text-[13px] font-bold flex items-center">
|
||||||
</span>
|
{title ? title : "Recipient"}
|
||||||
<span
|
{signersdata[isSelectListId]?.Role && (
|
||||||
style={{
|
<div>
|
||||||
fontSize: "13px",
|
{signersdata[isSelectListId]?.Name ? (
|
||||||
fontWeight: "700",
|
<>
|
||||||
display: "flex",
|
:{" "}
|
||||||
alignItems: "center"
|
{signersdata[isSelectListId]?.Name?.length > 12
|
||||||
}}
|
? `${signersdata[isSelectListId].Name.slice(
|
||||||
>
|
0,
|
||||||
{signersdata[isSelectListId]?.Role && (
|
12
|
||||||
<div>
|
)}...`
|
||||||
{signersdata[isSelectListId]?.Name ? (
|
: signersdata[isSelectListId]?.Name}
|
||||||
<>
|
</>
|
||||||
:{" "}
|
) : (
|
||||||
{signersdata[isSelectListId]?.Name?.length > 12
|
<>
|
||||||
? `${signersdata[isSelectListId].Name.slice(
|
:{" "}
|
||||||
0,
|
{signersdata[isSelectListId]?.Role?.length > 12
|
||||||
12
|
? `${signersdata[isSelectListId].Role.slice(
|
||||||
)}...`
|
0,
|
||||||
: signersdata[isSelectListId]?.Name}
|
12
|
||||||
</>
|
)}...`
|
||||||
) : (
|
: signersdata[isSelectListId]?.Role}
|
||||||
<>
|
</>
|
||||||
:{" "}
|
)}
|
||||||
{signersdata[isSelectListId]?.Role?.length > 12
|
</div>
|
||||||
? `${signersdata[isSelectListId].Role.slice(
|
)}
|
||||||
0,
|
<div className="ml-[6px] text-[16px]">
|
||||||
12
|
<i className="fa-solid fa-angle-down"></i>
|
||||||
)}...`
|
|
||||||
: signersdata[isSelectListId]?.Role}
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
</span>
|
||||||
<div style={{ marginLeft: 6, fontSize: 16 }}>
|
</div>
|
||||||
<i className="fa-solid fa-angle-down"></i>
|
)}
|
||||||
</div>
|
</div>
|
||||||
</span>
|
<div className="mx-1">
|
||||||
</div>
|
{handleAddSigner ? (
|
||||||
)}
|
|
||||||
{handleAddSigner ? (
|
|
||||||
<div
|
|
||||||
data-tut="reactourAddbtn"
|
|
||||||
style={{
|
|
||||||
margin: "5px 0 5px 0",
|
|
||||||
backgroundColor: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
className="p-[10px] my-[2px] flex flex-row items-center justify-center border-[1px] border-[#47a3ad] hover:bg-[#47a3ad] text-[#47a3ad] hover:text-white cursor-pointer"
|
|
||||||
onClick={() => handleAddSigner()}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-plus"></i>
|
|
||||||
<span style={{ marginLeft: 2 }}>Add role</span>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
setIsAddSigner && (
|
|
||||||
<div
|
<div
|
||||||
data-tut="reactourAddbtn"
|
data-tut="reactourAddbtn"
|
||||||
style={{
|
className="op-btn op-btn-accent w-full my-[2px]"
|
||||||
margin: "5px 0 5px 0",
|
onClick={() => handleAddSigner()}
|
||||||
backgroundColor: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
className="p-[10px] my-[2px] flex flex-row items-center justify-center border-[1px] border-[#47a3ad] hover:bg-[#47a3ad] text-[#47a3ad] hover:text-white cursor-pointer"
|
|
||||||
onClick={() => setIsAddSigner(true)}
|
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-plus"></i>
|
<i className="fa-solid fa-plus"></i>
|
||||||
<span style={{ marginLeft: 2 }}>Add recipients</span>
|
<span>Add role</span>
|
||||||
</div>
|
</div>
|
||||||
)
|
) : (
|
||||||
)}
|
setIsAddSigner && (
|
||||||
|
<div
|
||||||
|
data-tut="reactourAddbtn"
|
||||||
|
className="op-btn op-btn-accent w-full my-[2px]"
|
||||||
|
onClick={() => setIsAddSigner(true)}
|
||||||
|
>
|
||||||
|
<i className="fa-solid fa-plus"></i>
|
||||||
|
<span>Add recipients</span>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
ref={scrollContainerRef}
|
ref={scrollContainerRef}
|
||||||
style={{
|
className="bg-base-100 border-[2px] border-t-primary"
|
||||||
background: "white",
|
|
||||||
borderTop: `2px solid ${themeColor}`
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<div
|
<div className="flex whitespace-nowrap overflow-x-scroll pt-[10px] pb-[5px] pr-[5px]">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
overflowX: "scroll",
|
|
||||||
whiteSpace: "nowrap",
|
|
||||||
padding: "10px 5px 10px 1px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<WidgetList
|
<WidgetList
|
||||||
updateWidgets={updateWidgets}
|
updateWidgets={updateWidgets}
|
||||||
handleDivClick={handleDivClick}
|
handleDivClick={handleDivClick}
|
||||||
@@ -383,20 +347,14 @@ function WidgetComponent({
|
|||||||
) : (
|
) : (
|
||||||
<div
|
<div
|
||||||
data-tut={dataTut}
|
data-tut={dataTut}
|
||||||
className={
|
className={`${
|
||||||
isMailSend ? "disabled signerComponent " : "signerComponent"
|
isMailSend ? "bg-opacity-50 pointer-events-none" : ""
|
||||||
}
|
} hidden md:block w-[180px] h-full bg-base-100`}
|
||||||
>
|
>
|
||||||
<div
|
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
|
||||||
style={{
|
<span>Fields</span>
|
||||||
background: themeColor,
|
|
||||||
padding: "5px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span className="signedStyle">Fields</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div className="flex flex-col items-center my-3">
|
||||||
<div className="signLayoutContainer1">
|
|
||||||
<WidgetList
|
<WidgetList
|
||||||
updateWidgets={updateWidgets}
|
updateWidgets={updateWidgets}
|
||||||
handleDivClick={handleDivClick}
|
handleDivClick={handleDivClick}
|
||||||
@@ -413,7 +371,7 @@ function WidgetComponent({
|
|||||||
handleClose={handleModal}
|
handleClose={handleModal}
|
||||||
>
|
>
|
||||||
{signersdata.length > 0 ? (
|
{signersdata.length > 0 ? (
|
||||||
<div style={{ maxHeight: "600px", overflow: "auto" }}>
|
<div className="max-h-[600px] overflow-auto pb-1">
|
||||||
<RecipientList
|
<RecipientList
|
||||||
signerPos={signerPos}
|
signerPos={signerPos}
|
||||||
signersdata={signersdata}
|
signersdata={signersdata}
|
||||||
@@ -433,14 +391,7 @@ function WidgetComponent({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div
|
<div className=" p-[20px] text-[15px] font-medium text-center">
|
||||||
style={{
|
|
||||||
padding: 20,
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: "500",
|
|
||||||
textAlign: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Please add a {title ? title : "recipients"}
|
Please add a {title ? title : "recipients"}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import { getWidgetType } from "../../constant/Utils";
|
|||||||
function WidgetList(props) {
|
function WidgetList(props) {
|
||||||
return props.updateWidgets.map((item, ind) => {
|
return props.updateWidgets.map((item, ind) => {
|
||||||
return (
|
return (
|
||||||
<div key={ind} style={{ marginBottom: "5px" }}>
|
<div key={ind} className="mb-[5px]">
|
||||||
<div
|
<div
|
||||||
className="widgets"
|
className="select-none"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
props.addPositionOfSignature &&
|
props.addPositionOfSignature &&
|
||||||
props.addPositionOfSignature("onclick", item);
|
props.addPositionOfSignature("onclick", item);
|
||||||
|
|||||||
@@ -122,15 +122,15 @@ const WidgetNameModal = (props) => {
|
|||||||
props.widgetName === textInputWidget
|
props.widgetName === textInputWidget
|
||||||
? "pt-0"
|
? "pt-0"
|
||||||
: ""
|
: ""
|
||||||
} p-[20px]`}
|
} p-[20px] text-base-content`}
|
||||||
>
|
>
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem] text-[13px]">
|
||||||
<label htmlFor="name" style={{ fontSize: 13 }}>
|
<label htmlFor="name">
|
||||||
Name
|
Name
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[red]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
name="name"
|
name="name"
|
||||||
value={formdata.name}
|
value={formdata.name}
|
||||||
onChange={(e) => handleChange(e)}
|
onChange={(e) => handleChange(e)}
|
||||||
@@ -140,14 +140,15 @@ const WidgetNameModal = (props) => {
|
|||||||
{(props.defaultdata?.type === textInputWidget ||
|
{(props.defaultdata?.type === textInputWidget ||
|
||||||
props.widgetName === textInputWidget) && (
|
props.widgetName === textInputWidget) && (
|
||||||
<>
|
<>
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem]">
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<label
|
<label
|
||||||
htmlFor="textvalidate"
|
htmlFor="textvalidate"
|
||||||
className={
|
className={`${
|
||||||
!props.isSubscribe && isEnableSubscription && "disabled"
|
!props.isSubscribe && isEnableSubscription
|
||||||
}
|
? "bg-opacity-50 pointer-events-none"
|
||||||
style={{ fontSize: 13 }}
|
: ""
|
||||||
|
} text-[13px]`}
|
||||||
>
|
>
|
||||||
Validation
|
Validation
|
||||||
</label>
|
</label>
|
||||||
@@ -157,19 +158,15 @@ const WidgetNameModal = (props) => {
|
|||||||
{!props.isSubscribe && isEnableSubscription && <Upgrade />}
|
{!props.isSubscribe && isEnableSubscription && <Upgrade />}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className={
|
className={`${
|
||||||
!props.isSubscribe && isEnableSubscription && "disabled"
|
!props.isSubscribe && isEnableSubscription
|
||||||
}
|
? "bg-opacity-50 pointer-events-none"
|
||||||
style={{
|
: ""
|
||||||
display: "flex",
|
} flex flex-row gap-[10px] mb-[0.5rem]`}
|
||||||
flexDirection: "row",
|
|
||||||
gap: 10,
|
|
||||||
marginBottom: "0.5rem"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<div style={{ width: "100%", position: "relative" }}>
|
<div className="w-full relative group">
|
||||||
<input
|
<input
|
||||||
className="relative z-20 w-[87%] md:w-[92%] p-2.5 border-[1px] border-[#d1d5db] rounded-l-md outline-none text-xs"
|
className="z-20 relative op-input op-input-bordered rounded-r-none op-input-sm focus:outline-none group-hover:border-base-content w-[87%] md:w-[92%] text-xs"
|
||||||
name="textvalidate"
|
name="textvalidate"
|
||||||
placeholder="Enter custom regular expression"
|
placeholder="Enter custom regular expression"
|
||||||
value={formdata.textvalidate}
|
value={formdata.textvalidate}
|
||||||
@@ -177,7 +174,7 @@ const WidgetNameModal = (props) => {
|
|||||||
// onBlur={() => handleBlurRegex()}
|
// onBlur={() => handleBlurRegex()}
|
||||||
/>
|
/>
|
||||||
<select
|
<select
|
||||||
className="validationlist addUserInput"
|
className="validationlist op-input op-input-bordered op-input-sm focus:outline-none group-hover:border-base-content w-full text-xs"
|
||||||
name="textvalidate"
|
name="textvalidate"
|
||||||
value={formdata.textvalidate}
|
value={formdata.textvalidate}
|
||||||
onChange={(e) => handleChange(e)}
|
onChange={(e) => handleChange(e)}
|
||||||
@@ -185,17 +182,13 @@ const WidgetNameModal = (props) => {
|
|||||||
>
|
>
|
||||||
<option
|
<option
|
||||||
disabled={formdata?.textvalidate}
|
disabled={formdata?.textvalidate}
|
||||||
style={{ fontSize: "13px" }}
|
className="text-[13px]"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</option>
|
</option>
|
||||||
{inputOpt.map((data, ind) => {
|
{inputOpt.map((data, ind) => {
|
||||||
return (
|
return (
|
||||||
<option
|
<option className="text-[13px]" key={ind} value={data}>
|
||||||
style={{ fontSize: "13px" }}
|
|
||||||
key={ind}
|
|
||||||
value={data}
|
|
||||||
>
|
|
||||||
{data}
|
{data}
|
||||||
</option>
|
</option>
|
||||||
);
|
);
|
||||||
@@ -205,12 +198,12 @@ const WidgetNameModal = (props) => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem]">
|
||||||
<label htmlFor="name" style={{ fontSize: 13 }}>
|
<label htmlFor="name" className="text-[13px]">
|
||||||
Default value
|
Default value
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
name="defaultValue"
|
name="defaultValue"
|
||||||
value={formdata.defaultValue}
|
value={formdata.defaultValue}
|
||||||
onChange={(e) => handledefaultChange(e)}
|
onChange={(e) => handledefaultChange(e)}
|
||||||
@@ -228,37 +221,22 @@ const WidgetNameModal = (props) => {
|
|||||||
style={{ fontSize: 12 }}
|
style={{ fontSize: 12 }}
|
||||||
>
|
>
|
||||||
<i
|
<i
|
||||||
className="fas fa-exclamation-circle"
|
className="fas fa-exclamation-circle text-[15px]"
|
||||||
style={{ color: "#fab005", fontSize: 15 }}
|
style={{ color: "#fab005" }}
|
||||||
></i>{" "}
|
></i>
|
||||||
invalid default value
|
invalid default value
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem]">
|
||||||
<div
|
<div className="flex flex-row gap-[10px] mb-[0.5rem]">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
gap: 10,
|
|
||||||
marginBottom: "0.5rem"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{statusArr.map((data, ind) => {
|
{statusArr.map((data, ind) => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div key={ind} className="flex flex-row gap-[5px] items-center">
|
||||||
key={ind}
|
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
gap: 5,
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<input
|
<input
|
||||||
style={{ accentColor: "red", marginRight: "10px" }}
|
className="mr-[2px] op-radio op-radio-xs"
|
||||||
type="radio"
|
type="radio"
|
||||||
name="status"
|
name="status"
|
||||||
onChange={() =>
|
onChange={() =>
|
||||||
@@ -268,9 +246,7 @@ const WidgetNameModal = (props) => {
|
|||||||
formdata.status.toLowerCase() === data.toLowerCase()
|
formdata.status.toLowerCase() === data.toLowerCase()
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
<div style={{ fontSize: "13px", fontWeight: "500" }}>
|
<div className="text-[13px] font-medium">{data}</div>
|
||||||
{data}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
@@ -278,35 +254,20 @@ const WidgetNameModal = (props) => {
|
|||||||
</div>
|
</div>
|
||||||
{(props.defaultdata?.type === textInputWidget ||
|
{(props.defaultdata?.type === textInputWidget ||
|
||||||
props?.widgetName === textInputWidget) && (
|
props?.widgetName === textInputWidget) && (
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem]">
|
||||||
<label htmlFor="hint" style={{ fontSize: 13 }}>
|
<label htmlFor="hint" className="text-[13px]">
|
||||||
Hint
|
Hint
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
name="hint"
|
name="hint"
|
||||||
value={formdata.hint}
|
value={formdata.hint}
|
||||||
onChange={(e) => handleChange(e)}
|
onChange={(e) => handleChange(e)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div
|
<div className="h-[1px] w-full mb-[16px] bg-[#b7b3b3]"></div>
|
||||||
style={{
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
height: 1,
|
|
||||||
backgroundColor: "#b7b3b3",
|
|
||||||
width: "100%",
|
|
||||||
marginBottom: "16px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
|
||||||
style={{
|
|
||||||
color: "white",
|
|
||||||
padding: "5px 20px",
|
|
||||||
backgroundColor: "#32a3ac"
|
|
||||||
}}
|
|
||||||
type="submit"
|
|
||||||
className="finishBtn"
|
|
||||||
>
|
|
||||||
Save
|
Save
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import Alert from "../../../primitives/Alert";
|
import Alert from "../../../primitives/Alert";
|
||||||
|
import Loader from "../../../primitives/Loader";
|
||||||
|
|
||||||
const CreateFolder = ({ parentFolderId, onSuccess, folderCls }) => {
|
const CreateFolder = ({ parentFolderId, onSuccess, folderCls }) => {
|
||||||
const folderPtr = {
|
const folderPtr = {
|
||||||
@@ -113,11 +114,8 @@ const CreateFolder = ({ parentFolderId, onSuccess, folderCls }) => {
|
|||||||
{isAlert && <Alert type={alert.type}>{alert.message}</Alert>}
|
{isAlert && <Alert type={alert.type}>{alert.message}</Alert>}
|
||||||
<div id="createFolder" className="relative">
|
<div id="createFolder" className="relative">
|
||||||
{isLoader && (
|
{isLoader && (
|
||||||
<div className="absolute h-full w-full flex justify-center items-center ">
|
<div className="absolute h-full w-full flex justify-center items-center">
|
||||||
<div
|
<Loader />
|
||||||
style={{ fontSize: "45px", color: "#3dd3e0" }}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<h1 className="text-base font-semibold">Create Folder</h1>
|
<h1 className="text-base font-semibold">Create Folder</h1>
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ const SelectFolder = ({ required, onSuccess, folderCls, isReset }) => {
|
|||||||
<div className="relative max-w-sm">
|
<div className="relative max-w-sm">
|
||||||
<div
|
<div
|
||||||
onClick={() => SetIsOpen(true)}
|
onClick={() => SetIsOpen(true)}
|
||||||
className=" cursor-pointer rounded px-[20px] py-[20px] bg-white border border-gray-200 shadow flex max-w-sm gap-8 items-center"
|
className=" cursor-pointer rounded px-[20px] py-[20px] bg-base-100 border-[1px] border-base-200 shadow flex max-w-sm gap-8 items-center"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<i
|
<i
|
||||||
|
|||||||
@@ -3,16 +3,6 @@ import Parse from "parse";
|
|||||||
import "../../../styles/AddUser.css";
|
import "../../../styles/AddUser.css";
|
||||||
import AsyncSelect from "react-select/async";
|
import AsyncSelect from "react-select/async";
|
||||||
|
|
||||||
const customStyles = {
|
|
||||||
control: (provided) => ({
|
|
||||||
...provided,
|
|
||||||
fontSize: "13px" // Font size for the control
|
|
||||||
}),
|
|
||||||
option: (provided) => ({
|
|
||||||
...provided,
|
|
||||||
fontSize: "13px" // Font size for the options
|
|
||||||
})
|
|
||||||
};
|
|
||||||
const SelectSigners = (props) => {
|
const SelectSigners = (props) => {
|
||||||
const [userList, setUserList] = useState([]);
|
const [userList, setUserList] = useState([]);
|
||||||
const [selected, setSelected] = useState();
|
const [selected, setSelected] = useState();
|
||||||
@@ -79,32 +69,44 @@ const SelectSigners = (props) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="addusercontainer">
|
<div className="h-full px-[20px] py-[10px] text-base-content">
|
||||||
<div className="form-wrapper">
|
<div className="w-full mx-auto p-[8px]">
|
||||||
<div className="form-section" style={{ marginBottom: 0 }}>
|
<div className="mb-0">
|
||||||
<label style={{ fontSize: 14, fontWeight: "700" }}>Choose User</label>
|
<label className="text-[14px] font-bold">Choose from contacts</label>
|
||||||
<AsyncSelect
|
<AsyncSelect
|
||||||
cacheOptions
|
cacheOptions
|
||||||
defaultOptions
|
defaultOptions
|
||||||
value={selected}
|
value={selected}
|
||||||
loadingMessage={() => "Loading..."}
|
loadingMessage={() => "Loading..."}
|
||||||
noOptionsMessage={() => "User not Found"}
|
noOptionsMessage={() => "Contact not found"}
|
||||||
loadOptions={loadOptions}
|
loadOptions={loadOptions}
|
||||||
onChange={handleOptions}
|
onChange={handleOptions}
|
||||||
styles={customStyles}
|
unstyled
|
||||||
|
classNames={{
|
||||||
|
control: () =>
|
||||||
|
"op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full h-full text-[11px]",
|
||||||
|
valueContainer: () =>
|
||||||
|
"flex flex-row gap-x-[2px] gap-y-[2px] md:gap-y-0 w-full my-[2px]",
|
||||||
|
multiValue: () => "op-badge op-badge-primary h-full text-[11px]",
|
||||||
|
multiValueLabel: () => "mb-[2px]",
|
||||||
|
menu: () =>
|
||||||
|
"mt-1 shadow-md rounded-lg bg-base-200 text-base-content",
|
||||||
|
menuList: () => "shadow-md rounded-lg overflow-hidden",
|
||||||
|
option: () =>
|
||||||
|
"bg-base-200 text-base-content rounded-lg m-1 hover:bg-base-300 p-2",
|
||||||
|
noOptionsMessage: () => "p-2 bg-base-200 rounded-lg m-1 p-2"
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{isError ? (
|
<p
|
||||||
<p style={{ color: "red", fontSize: "12px", margin: "5px" }}>
|
className={`${
|
||||||
Please select signer
|
isError ? "text-[red]" : "text-transparent"
|
||||||
</p>
|
} text-[11px] ml-[6px] my-[2px]`}
|
||||||
) : (
|
>
|
||||||
<p style={{ color: "transparent", fontSize: "12px", margin: "5px" }}>
|
Please select signer
|
||||||
.
|
</p>
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
<div>
|
<div>
|
||||||
<button className="submitbutton" onClick={() => handleAdd()}>
|
<button className="op-btn op-btn-primary" onClick={() => handleAdd()}>
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,15 +1,30 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import Select from "react-select";
|
import Select from "react-select";
|
||||||
import AddSigner from "../../AddSigner";
|
import AddSigner from "../../AddSigner";
|
||||||
import Modal from "react-modal";
|
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import Tooltip from "../../../primitives/Tooltip";
|
import Tooltip from "../../../primitives/Tooltip";
|
||||||
|
import { createPortal } from "react-dom";
|
||||||
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]);
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const AddSignerModal = ({ isOpen, children }) => {
|
||||||
|
if (!isOpen) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return createPortal(
|
||||||
|
<div className="op-modal op-modal-open">
|
||||||
|
<div className="op-modal-box p-0 min-w-[90%] md:min-w-[500px] max-h-90 overflow-y-auto hide-scrollbar text-sm">
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
</div>,
|
||||||
|
document.body
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* react-sortable-hoc is depcreated not usable from react 18.x.x
|
* react-sortable-hoc is depcreated not usable from react 18.x.x
|
||||||
* need to replace it with @dnd-kit
|
* need to replace it with @dnd-kit
|
||||||
@@ -17,7 +32,6 @@ function arrayMove(array, from, to) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const SignersInput = (props) => {
|
const SignersInput = (props) => {
|
||||||
Modal.setAppElement("body");
|
|
||||||
const [state, setState] = useState(undefined);
|
const [state, setState] = useState(undefined);
|
||||||
// const [editFormData, setEditFormData] = useState([]);
|
// const [editFormData, setEditFormData] = useState([]);
|
||||||
const [selected, setSelected] = useState([]);
|
const [selected, setSelected] = useState([]);
|
||||||
@@ -108,15 +122,17 @@ const SignersInput = (props) => {
|
|||||||
<label className="block relative">
|
<label className="block relative">
|
||||||
Signers
|
Signers
|
||||||
{props.required && <span className="text-red-500 text-[13px]">*</span>}
|
{props.required && <span className="text-red-500 text-[13px]">*</span>}
|
||||||
<span className="absolute ml-1 text-xs z-50">
|
<span className="absolute ml-1 text-xs z-30">
|
||||||
<Tooltip
|
<Tooltip
|
||||||
id={"signer-tooltip"}
|
id={"signer-tooltip"}
|
||||||
message={"Begin typing a contact's name to see suggested signers from your saved contacts or add new ones. Arrange the signing order by adding signers in the desired sequence. Use the '+' button to include signers and the 'x' to remove them. Each signer will receive an email prompt to sign the document in the order listed."}
|
message={
|
||||||
|
"Begin typing a contact's name to see suggested signers from your saved contacts or add new ones. Arrange the signing order by adding signers in the desired sequence. Use the '+' button to include signers and the 'x' to remove them. Each signer will receive an email prompt to sign the document in the order listed."
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
<div style={{ display: "flex", gap: 5 }}>
|
<div className="flex gap-x-[5px]">
|
||||||
<div style={{ flexWrap: "wrap", width: "100%" }}>
|
<div className="w-full">
|
||||||
<Select
|
<Select
|
||||||
onSortEnd={onSortEnd}
|
onSortEnd={onSortEnd}
|
||||||
distance={4}
|
distance={4}
|
||||||
@@ -126,6 +142,22 @@ const SignersInput = (props) => {
|
|||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
closeMenuOnSelect={false}
|
closeMenuOnSelect={false}
|
||||||
required={props.required}
|
required={props.required}
|
||||||
|
noOptionsMessage={() => "Contact not found"}
|
||||||
|
unstyled
|
||||||
|
classNames={{
|
||||||
|
control: () =>
|
||||||
|
"op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full h-full text-[11px]",
|
||||||
|
valueContainer: () =>
|
||||||
|
"flex flex-row gap-x-[2px] gap-y-[2px] md:gap-y-0 w-full my-[2px]",
|
||||||
|
multiValue: () => "op-badge op-badge-primary h-full text-[11px]",
|
||||||
|
multiValueLabel: () => "mb-[2px]",
|
||||||
|
menu: () =>
|
||||||
|
"mt-1 shadow-md rounded-lg bg-base-200 text-base-content",
|
||||||
|
menuList: () => "shadow-md rounded-lg overflow-hidden",
|
||||||
|
option: () =>
|
||||||
|
"bg-base-200 text-base-content rounded-lg m-1 hover:bg-base-300 p-2",
|
||||||
|
noOptionsMessage: () => "p-2 bg-base-200 rounded-lg m-1 p-2"
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -133,66 +165,29 @@ const SignersInput = (props) => {
|
|||||||
setIsModel(true);
|
setIsModel(true);
|
||||||
openModal();
|
openModal();
|
||||||
}}
|
}}
|
||||||
style={{
|
className="cursor-pointer op-input op-input-bordered focus:outline-none hover:border-base-content max-h-[38px] min-w-[48px] flex justify-center items-center"
|
||||||
cursor: "pointer",
|
|
||||||
borderRadius: 4,
|
|
||||||
border: "1px solid #ccc",
|
|
||||||
minHeight: 38,
|
|
||||||
minWidth: 48,
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<i className="fas fa-plus"></i>
|
<i className="fas fa-plus"></i>
|
||||||
</div>
|
</div>
|
||||||
<Modal
|
<AddSignerModal isOpen={modalIsOpen}>
|
||||||
isOpen={modalIsOpen}
|
<h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]">
|
||||||
onRequestClose={handleModalCloseClick}
|
Add Signer
|
||||||
shouldCloseOnOverlayClick={false}
|
</h3>
|
||||||
id="modal1"
|
<button
|
||||||
contentLabel="Modal"
|
onClick={handleModalCloseClick}
|
||||||
style={{
|
className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2"
|
||||||
content: {
|
>
|
||||||
top: "50%",
|
✕
|
||||||
left: "50%",
|
</button>
|
||||||
right: "auto",
|
{isModal && (
|
||||||
bottom: "auto",
|
<AddSigner
|
||||||
transform: "translate(-50%, -50%)",
|
valueKey={"objectId"}
|
||||||
border: "1px transparent",
|
displayKey={"Name"}
|
||||||
padding: 0
|
details={handleNewDetails}
|
||||||
},
|
closePopup={handleModalCloseClick}
|
||||||
overlay: {
|
/>
|
||||||
width: "100%",
|
)}
|
||||||
backgroundColor: "rgba(0, 0, 0, 0.75)",
|
</AddSignerModal>
|
||||||
zIndex: 50
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div className="min-w-full md:min-w-[500px]">
|
|
||||||
<div
|
|
||||||
className="flex justify-between rounded-t items-center py-[10px] px-[20px] text-white"
|
|
||||||
style={{ background: "#32a3ac" }}
|
|
||||||
>
|
|
||||||
<div className="text-[1.2rem] font-normal">Add Signer</div>
|
|
||||||
<button
|
|
||||||
onClick={handleModalCloseClick}
|
|
||||||
className="text-[1.5rem] cursor-pointer focus:outline-none"
|
|
||||||
>
|
|
||||||
×
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{isModal && (
|
|
||||||
<AddSigner
|
|
||||||
valueKey={"objectId"}
|
|
||||||
displayKey={"Name"}
|
|
||||||
details={handleNewDetails}
|
|
||||||
closePopup={handleModalCloseClick}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</Modal>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -61,24 +61,24 @@ const SuggestionInput = (props) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col items-center relative">
|
<div className="flex flex-col items-center relative text-base-content">
|
||||||
<input
|
<input
|
||||||
type={props?.type || "text"}
|
type={props?.type || "text"}
|
||||||
value={inputValue}
|
value={inputValue}
|
||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
placeholder="Enter Email..."
|
placeholder="Enter Email..."
|
||||||
className="w-full border-[1px] border-gray-400 p-2 text-black rounded lowercase"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs lowercase"
|
||||||
required={props.required}
|
required={props.required}
|
||||||
/>
|
/>
|
||||||
{showSuggestions && (
|
{showSuggestions && (
|
||||||
<ul
|
<ul
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className="absolute z-50 left-0 top-[2.55rem] w-full max-h-[100px] overflow-auto bg-white border border-gray-300 rounded shadow-md"
|
className="absolute z-50 left-0 top-[2.55rem] w-full max-h-[100px] overflow-auto bg-base-200 border border-gray-300 rounded shadow-md"
|
||||||
>
|
>
|
||||||
{suggestions.map((suggestion, index) => (
|
{suggestions.map((suggestion, index) => (
|
||||||
<li
|
<li
|
||||||
key={index}
|
key={index}
|
||||||
className="py-2 px-2 w-full text-sm cursor-pointer hover:bg-gray-100"
|
className="py-2 px-2 w-full text-sm cursor-pointer hover:bg-base-300"
|
||||||
onClick={() => handleSuggestionClick(suggestion)}
|
onClick={() => handleSuggestionClick(suggestion)}
|
||||||
>
|
>
|
||||||
{suggestion.Email}
|
{suggestion.Email}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { NavLink } from "react-router-dom";
|
|||||||
|
|
||||||
const Menu = ({ item, isOpen, closeSidebar }) => {
|
const Menu = ({ item, isOpen, closeSidebar }) => {
|
||||||
return (
|
return (
|
||||||
<li key={item.title} role="none">
|
<li key={item.title} role="none" className="my-0.5">
|
||||||
<NavLink
|
<NavLink
|
||||||
to={
|
to={
|
||||||
item.pageType
|
item.pageType
|
||||||
@@ -12,8 +12,8 @@ const Menu = ({ item, isOpen, closeSidebar }) => {
|
|||||||
}
|
}
|
||||||
className={({ isActive }) =>
|
className={({ isActive }) =>
|
||||||
`${
|
`${
|
||||||
isActive ? "text-[#0056b3] bg-[#eef1f5]" : ""
|
isActive ? " bg-base-300 text-base-content" : ""
|
||||||
} mx-auto flex items-center hover:bg-[#eef1f5] p-3 lg:p-4 cursor-pointer`
|
} 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`
|
||||||
}
|
}
|
||||||
onClick={closeSidebar}
|
onClick={closeSidebar}
|
||||||
tabIndex={isOpen ? 0 : -1}
|
tabIndex={isOpen ? 0 : -1}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import dp from "../../assets/images/dp.png";
|
|||||||
|
|
||||||
const Sidebar = ({ isOpen, closeSidebar }) => {
|
const Sidebar = ({ isOpen, closeSidebar }) => {
|
||||||
const [menuList, setmenuList] = useState([]);
|
const [menuList, setmenuList] = useState([]);
|
||||||
|
const [submenuOpen, setSubmenuOpen] = useState(false);
|
||||||
let username = localStorage.getItem("username");
|
let username = localStorage.getItem("username");
|
||||||
const image = localStorage.getItem("profileImg") || dp;
|
const image = localStorage.getItem("profileImg") || dp;
|
||||||
const tenantname = localStorage.getItem("TenantName");
|
const tenantname = localStorage.getItem("TenantName");
|
||||||
@@ -33,10 +34,18 @@ const Sidebar = ({ isOpen, closeSidebar }) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const toggleSubmenu = (title) => {
|
||||||
|
setSubmenuOpen({ [title]: !submenuOpen[title] });
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleMenuItem = () => {
|
||||||
|
closeSidebar();
|
||||||
|
setSubmenuOpen({});
|
||||||
|
};
|
||||||
return (
|
return (
|
||||||
<aside
|
<aside
|
||||||
className={`bg-white text-[#444] h-screen w-full md:w-[300px] overflow-y-auto transform transition-transform z-40 md:translate-x-0
|
className={`absolute md:relative bg-base-100 h-screen overflow-y-auto transition-all z-[100] hide-scrollbar
|
||||||
${isOpen ? "translate-x-0 block" : "-translate-x-full hidden"}`}
|
${isOpen ? "w-full md:w-[300px]" : "w-0"}`}
|
||||||
>
|
>
|
||||||
<div className="flex px-2 py-3 gap-2 items-center shadow-md">
|
<div className="flex px-2 py-3 gap-2 items-center shadow-md">
|
||||||
<div className="w-[75px] h-[75px] rounded-full ring-[2px] ring-offset-2 ring-gray-400 overflow-hidden">
|
<div className="w-[75px] h-[75px] rounded-full ring-[2px] ring-offset-2 ring-gray-400 overflow-hidden">
|
||||||
@@ -47,13 +56,20 @@ const Sidebar = ({ isOpen, closeSidebar }) => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p className="text-[14px] font-bold">{username}</p>
|
<p className="text-[14px] font-bold text-base-content">{username}</p>
|
||||||
<p className={`text-[12px] ${tenantname ? "mt-2" : ""}`}>
|
<p
|
||||||
|
className={`text-[12px] text-base-content ${
|
||||||
|
tenantname ? "mt-2" : ""
|
||||||
|
}`}
|
||||||
|
>
|
||||||
{tenantname}
|
{tenantname}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<nav aria-label="OpenSign Sidebar Navigation">
|
<nav
|
||||||
|
className="op-menu op-menu-sm"
|
||||||
|
aria-label="OpenSign Sidebar Navigation"
|
||||||
|
>
|
||||||
<ul
|
<ul
|
||||||
className="text-sm"
|
className="text-sm"
|
||||||
role="menubar"
|
role="menubar"
|
||||||
@@ -65,19 +81,21 @@ const Sidebar = ({ isOpen, closeSidebar }) => {
|
|||||||
key={item.title}
|
key={item.title}
|
||||||
item={item}
|
item={item}
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
closeSidebar={closeSidebar}
|
closeSidebar={handleMenuItem}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<Submenu
|
<Submenu
|
||||||
key={item.title}
|
key={item.title}
|
||||||
item={item}
|
item={item}
|
||||||
closeSidebar={closeSidebar}
|
closeSidebar={closeSidebar}
|
||||||
|
toggleSubmenu={toggleSubmenu}
|
||||||
|
submenuOpen={submenuOpen}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
<footer className="mt-4 flex justify-center items-center text-[25px] text-black gap-3">
|
<footer className="mt-4 flex justify-center items-center text-[25px] text-base-content gap-3">
|
||||||
<SocialMedia />
|
<SocialMedia />
|
||||||
</footer>
|
</footer>
|
||||||
</aside>
|
</aside>
|
||||||
|
|||||||
@@ -1,19 +1,13 @@
|
|||||||
import React, { useState } from "react";
|
import React from "react";
|
||||||
import { NavLink } from "react-router-dom";
|
import { NavLink } from "react-router-dom";
|
||||||
|
|
||||||
const Submenu = ({ item, closeSidebar }) => {
|
const Submenu = ({ item, closeSidebar, toggleSubmenu, submenuOpen }) => {
|
||||||
const [submenuOpen, setSubmenuOpen] = useState(false);
|
|
||||||
const { title, icon, children } = item;
|
const { title, icon, children } = item;
|
||||||
|
|
||||||
const toggleSubmenu = () => {
|
|
||||||
setSubmenuOpen(!submenuOpen);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li role="none">
|
<li role="none" className="my-0.5">
|
||||||
<button
|
<button
|
||||||
onClick={toggleSubmenu}
|
onClick={() => toggleSubmenu(item.title)}
|
||||||
className="w-full flex items-center text-left text-[#444] p-3 lg:p-4 hover:bg-[#eef1f5] focus:outline-none focus:text-[#0056b3] focus:bg-[#eef1f5]"
|
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 "
|
||||||
aria-expanded={submenuOpen}
|
aria-expanded={submenuOpen}
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
aria-controls={`submenu-${title}`}
|
aria-controls={`submenu-${title}`}
|
||||||
@@ -23,23 +17,29 @@ const Submenu = ({ item, closeSidebar }) => {
|
|||||||
<span className="ml-3 lg:ml-4">{title}</span>
|
<span className="ml-3 lg:ml-4">{title}</span>
|
||||||
<i
|
<i
|
||||||
className={`${
|
className={`${
|
||||||
submenuOpen ? "fa-solid fa-angle-down" : "fa-solid fa-angle-right"
|
submenuOpen[item.title]
|
||||||
|
? "fa-solid fa-angle-down"
|
||||||
|
: "fa-solid fa-angle-right"
|
||||||
}`}
|
}`}
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
></i>
|
></i>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
{submenuOpen && (
|
{submenuOpen[item.title] && (
|
||||||
<ul id={`submenu-${title}`} role="menu" aria-label={`${title} submenu`}>
|
<ul id={`submenu-${title}`} role="menu" aria-label={`${title} submenu`}>
|
||||||
{children.map((childItem) => (
|
{children.map((childItem) => (
|
||||||
<li key={childItem.title} role="none">
|
<li key={childItem.title} role="none" className="my-0.5">
|
||||||
<NavLink
|
<NavLink
|
||||||
to={
|
to={
|
||||||
childItem.pageType
|
childItem.pageType
|
||||||
? `/${childItem.pageType}/${childItem.objectId}`
|
? `/${childItem.pageType}/${childItem.objectId}`
|
||||||
: `/${childItem.objectId}`
|
: `/${childItem.objectId}`
|
||||||
}
|
}
|
||||||
className="block pl-6 md:pl-8 py-2 text-sm text-gray-700 hover:bg-blue-500 hover:text-white focus:text-[#0056b3] focus:bg-[#eef1f5] cursor-pointer"
|
className={({ isActive }) =>
|
||||||
|
`${
|
||||||
|
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`
|
||||||
|
}
|
||||||
onClick={closeSidebar}
|
onClick={closeSidebar}
|
||||||
role="menuitem"
|
role="menuitem"
|
||||||
tabIndex={submenuOpen ? 0 : -1}
|
tabIndex={submenuOpen ? 0 : -1}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { isEnableSubscription, themeColor } from "./const";
|
import { isEnableSubscription } from "./const";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { rgb } from "pdf-lib";
|
import { rgb } from "pdf-lib";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
@@ -376,43 +376,21 @@ export const addWidgetOptions = (type) => {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
export const getWidgetType = (item, marginLeft) => {
|
export const getWidgetType = (item) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<div className="op-btn op-btn-primary op-btn-outline op-btn-sm focus:outline-none outline outline-[1.5px] w-fit md:w-[150px] ml-[6px] md:ml-0 p-0 overflow-hidden">
|
||||||
<div
|
<div className="w-full h-full flex md:justify-between items-center">
|
||||||
className="signatureBtn widgets"
|
<div className="flex justify-start items-center text-[13px] ml-1">
|
||||||
style={{
|
{!isMobile && <i className="fa-sharp fa-solid fa-grip-vertical"></i>}
|
||||||
boxShadow:
|
<span className="text-center text-[15px] ml-[5px] font-semibold">
|
||||||
"0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.18)",
|
|
||||||
marginLeft: marginLeft && `${marginLeft}px`
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div className="flex items-center mr-1">
|
|
||||||
{!isMobile && (
|
|
||||||
<i
|
|
||||||
className="fa-sharp fa-solid fa-grip-vertical"
|
|
||||||
style={{ color: "#908d8d", fontSize: "13px", marginLeft: 4 }}
|
|
||||||
></i>
|
|
||||||
)}
|
|
||||||
<span className=" font-[400] text-[15px] text-black ml-[5px]">
|
|
||||||
{item.type}
|
{item.type}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="text-[20px] op-btn op-btn-primary w-[40px] h-full flex justify-center items-center">
|
||||||
style={{
|
<i className={item.icon}></i>
|
||||||
backgroundColor: themeColor,
|
|
||||||
padding: "0 5px",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i
|
|
||||||
style={{ color: "white", fontSize: item.iconSize }}
|
|
||||||
className={item.icon}
|
|
||||||
></i>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
export const contactCls = "contracts_Contactbook";
|
export const contactCls = "contracts_Contactbook";
|
||||||
export const templateCls = "contracts_Template";
|
export const templateCls = "contracts_Template";
|
||||||
export const documentCls = "contracts_Document";
|
export const documentCls = "contracts_Document";
|
||||||
export const rejectBtn =
|
|
||||||
"bg-[#ffffff] rounded-sm shadow-md text-[12px] font-semibold uppercase text-black py-1.5 px-4 focus:outline-none text-center border-[1px] border-[#b4b4b4]";
|
|
||||||
export const submitBtn =
|
|
||||||
"bg-[#32a3ac] rounded-sm shadow-md text-[12px] font-semibold uppercase text-white py-1.5 px-4 focus:outline-none text-center";
|
|
||||||
export const modalSubmitBtnColor = "#17a2b8";
|
|
||||||
export const modalCancelBtnColor = "white";
|
|
||||||
export const themeColor = "#47a3ad";
|
export const themeColor = "#47a3ad";
|
||||||
export const iconColor = "#686968";
|
export const iconColor = "#686968";
|
||||||
export const isEnableSubscription = process.env.REACT_APP_ENABLE_SUBSCRIPTION;
|
export const isEnableSubscription = process.env.REACT_APP_ENABLE_SUBSCRIPTION;
|
||||||
|
|||||||
@@ -2,17 +2,16 @@
|
|||||||
@tailwind components;
|
@tailwind components;
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
body{
|
body {
|
||||||
background-color: white;
|
background-color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Custom CSS to hide scrollbar */
|
/* Custom CSS to hide scrollbar */
|
||||||
.hide-scrollbar::-webkit-scrollbar {
|
.hide-scrollbar::-webkit-scrollbar {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hide-scrollbar {
|
.hide-scrollbar {
|
||||||
-ms-overflow-style: none; /* IE and Edge */
|
-ms-overflow-style: none; /* IE and Edge */
|
||||||
scrollbar-width: none; /* Firefox */
|
scrollbar-width: none; /* Firefox */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -16,6 +16,7 @@ import {
|
|||||||
import DragElement from "./components/pdf/DragElement";
|
import DragElement from "./components/pdf/DragElement";
|
||||||
import TagManager from "react-gtm-module";
|
import TagManager from "react-gtm-module";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
|
import './polyfills'
|
||||||
const appId = process.env.REACT_APP_APPID
|
const appId = process.env.REACT_APP_APPID
|
||||||
? process.env.REACT_APP_APPID
|
? process.env.REACT_APP_APPID
|
||||||
: "opensign";
|
: "opensign";
|
||||||
|
|||||||
@@ -14,8 +14,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1231",
|
btnId: "1231",
|
||||||
hoverLabel: "Edit",
|
hoverLabel: "Edit",
|
||||||
btnColor: "#4bd396",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa-solid fa-pen",
|
btnIcon: "fa-solid fa-pen",
|
||||||
redirectUrl: "draftDocument",
|
redirectUrl: "draftDocument",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -23,8 +22,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "2142",
|
btnId: "2142",
|
||||||
hoverLabel: "Delete",
|
hoverLabel: "Delete",
|
||||||
btnColor: "#ff4848",
|
btnColor: "op-btn-secondary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-trash",
|
btnIcon: "fa fa-trash",
|
||||||
redirectUrl: "",
|
redirectUrl: "",
|
||||||
action: "delete"
|
action: "delete"
|
||||||
@@ -43,8 +41,7 @@ export default function reportJson(id) {
|
|||||||
btnId: "4536",
|
btnId: "4536",
|
||||||
btnLabel: "sign",
|
btnLabel: "sign",
|
||||||
hoverLabel: "Sign",
|
hoverLabel: "Sign",
|
||||||
btnColor: "#3ac9d6",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa-solid fa-signature",
|
btnIcon: "fa-solid fa-signature",
|
||||||
redirectUrl: "pdfRequestFiles",
|
redirectUrl: "pdfRequestFiles",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -62,8 +59,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "8901",
|
btnId: "8901",
|
||||||
hoverLabel: "Share",
|
hoverLabel: "Share",
|
||||||
btnColor: "#4bd396",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa-solid fa-share",
|
btnIcon: "fa-solid fa-share",
|
||||||
redirectUrl: "",
|
redirectUrl: "",
|
||||||
action: "share"
|
action: "share"
|
||||||
@@ -71,8 +67,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1588",
|
btnId: "1588",
|
||||||
hoverLabel: "View",
|
hoverLabel: "View",
|
||||||
btnColor: "#3ac9d6",
|
btnColor: "op-btn-secondary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-eye",
|
btnIcon: "fa fa-eye",
|
||||||
redirectUrl: "pdfRequestFiles",
|
redirectUrl: "pdfRequestFiles",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -80,7 +75,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "2234",
|
btnId: "2234",
|
||||||
hoverLabel: "option",
|
hoverLabel: "option",
|
||||||
btnColor: "transparent",
|
btnColor: "",
|
||||||
textColor: "black",
|
textColor: "black",
|
||||||
btnIcon: "fa-solid fa-ellipsis-vertical fa-lg",
|
btnIcon: "fa-solid fa-ellipsis-vertical fa-lg",
|
||||||
action: "option",
|
action: "option",
|
||||||
@@ -124,8 +119,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1378",
|
btnId: "1378",
|
||||||
hoverLabel: "Edit",
|
hoverLabel: "Edit",
|
||||||
btnColor: "#4bd396",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-eye",
|
btnIcon: "fa fa-eye",
|
||||||
redirectUrl: "draftDocument",
|
redirectUrl: "draftDocument",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -133,8 +127,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1278",
|
btnId: "1278",
|
||||||
hoverLabel: "Delete",
|
hoverLabel: "Delete",
|
||||||
btnColor: "#ff4848",
|
btnColor: "op-btn-secondary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-trash",
|
btnIcon: "fa fa-trash",
|
||||||
redirectUrl: "",
|
redirectUrl: "",
|
||||||
action: "delete"
|
action: "delete"
|
||||||
@@ -152,8 +145,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1458",
|
btnId: "1458",
|
||||||
hoverLabel: "View",
|
hoverLabel: "View",
|
||||||
btnColor: "#4bd396",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-eye",
|
btnIcon: "fa fa-eye",
|
||||||
redirectUrl: "draftDocument",
|
redirectUrl: "draftDocument",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -161,8 +153,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1358",
|
btnId: "1358",
|
||||||
hoverLabel: "Delete",
|
hoverLabel: "Delete",
|
||||||
btnColor: "#ff4848",
|
btnColor: "op-btn-secondary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-trash",
|
btnIcon: "fa fa-trash",
|
||||||
redirectUrl: "",
|
redirectUrl: "",
|
||||||
action: "delete"
|
action: "delete"
|
||||||
@@ -180,8 +171,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1898",
|
btnId: "1898",
|
||||||
hoverLabel: "View",
|
hoverLabel: "View",
|
||||||
btnColor: "#4bd396",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-eye",
|
btnIcon: "fa fa-eye",
|
||||||
redirectUrl: "draftDocument",
|
redirectUrl: "draftDocument",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -189,8 +179,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1998",
|
btnId: "1998",
|
||||||
hoverLabel: "Delete",
|
hoverLabel: "Delete",
|
||||||
btnColor: "#ff4848",
|
btnColor: "op-btn-secondary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-trash",
|
btnIcon: "fa fa-trash",
|
||||||
redirectUrl: "",
|
redirectUrl: "",
|
||||||
action: "delete"
|
action: "delete"
|
||||||
@@ -208,8 +197,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1999",
|
btnId: "1999",
|
||||||
hoverLabel: "Share",
|
hoverLabel: "Share",
|
||||||
btnColor: "#4bd396",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa-solid fa-share",
|
btnIcon: "fa-solid fa-share",
|
||||||
redirectUrl: "",
|
redirectUrl: "",
|
||||||
action: "share"
|
action: "share"
|
||||||
@@ -217,8 +205,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "1999",
|
btnId: "1999",
|
||||||
hoverLabel: "View",
|
hoverLabel: "View",
|
||||||
btnColor: "#3ac9d6",
|
btnColor: "op-btn-secondary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-eye",
|
btnIcon: "fa fa-eye",
|
||||||
redirectUrl: "pdfRequestFiles",
|
redirectUrl: "pdfRequestFiles",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -226,7 +213,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "2234",
|
btnId: "2234",
|
||||||
hoverLabel: "option",
|
hoverLabel: "option",
|
||||||
btnColor: "transparent",
|
btnColor: "",
|
||||||
textColor: "black",
|
textColor: "black",
|
||||||
btnIcon: "fa-solid fa-ellipsis-vertical fa-lg",
|
btnIcon: "fa-solid fa-ellipsis-vertical fa-lg",
|
||||||
action: "option",
|
action: "option",
|
||||||
@@ -269,8 +256,7 @@ export default function reportJson(id) {
|
|||||||
btnId: "2001",
|
btnId: "2001",
|
||||||
btnLabel: "sign",
|
btnLabel: "sign",
|
||||||
hoverLabel: "Sign",
|
hoverLabel: "Sign",
|
||||||
btnColor: "#3ac9d6",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa-solid fa-signature",
|
btnIcon: "fa-solid fa-signature",
|
||||||
redirectUrl: "pdfRequestFiles",
|
redirectUrl: "pdfRequestFiles",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -286,8 +272,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "2003",
|
btnId: "2003",
|
||||||
hoverLabel: "Edit",
|
hoverLabel: "Edit",
|
||||||
btnColor: "#4bd396",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa-solid fa-pen",
|
btnIcon: "fa-solid fa-pen",
|
||||||
redirectUrl: "draftDocument",
|
redirectUrl: "draftDocument",
|
||||||
action: "redirect"
|
action: "redirect"
|
||||||
@@ -295,8 +280,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "2004",
|
btnId: "2004",
|
||||||
hoverLabel: "Delete",
|
hoverLabel: "Delete",
|
||||||
btnColor: "#ff4848",
|
btnColor: "op-btn-secondary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-trash",
|
btnIcon: "fa fa-trash",
|
||||||
redirectUrl: "",
|
redirectUrl: "",
|
||||||
action: "delete"
|
action: "delete"
|
||||||
@@ -312,8 +296,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "2204",
|
btnId: "2204",
|
||||||
hoverLabel: "Delete",
|
hoverLabel: "Delete",
|
||||||
btnColor: "#f55a42",
|
btnColor: "op-btn-outline op-btn-error",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa-solid fa-trash",
|
btnIcon: "fa-solid fa-trash",
|
||||||
action: "delete"
|
action: "delete"
|
||||||
}
|
}
|
||||||
@@ -332,8 +315,7 @@ export default function reportJson(id) {
|
|||||||
btnId: "2234",
|
btnId: "2234",
|
||||||
btnLabel: "Use",
|
btnLabel: "Use",
|
||||||
hoverLabel: "Use",
|
hoverLabel: "Use",
|
||||||
btnColor: "#4bd396",
|
btnColor: "op-btn-primary",
|
||||||
textColor: "white",
|
|
||||||
btnIcon: "fa fa-plus",
|
btnIcon: "fa fa-plus",
|
||||||
redirectUrl: "placeHolderSign",
|
redirectUrl: "placeHolderSign",
|
||||||
action: "redirect",
|
action: "redirect",
|
||||||
@@ -345,6 +327,7 @@ export default function reportJson(id) {
|
|||||||
btnId: "1631",
|
btnId: "1631",
|
||||||
btnLabel: "Quick send",
|
btnLabel: "Quick send",
|
||||||
hoverLabel: "Quick send",
|
hoverLabel: "Quick send",
|
||||||
|
btnColor: "op-btn-secondary",
|
||||||
btnIcon: "fa-solid fa-envelope",
|
btnIcon: "fa-solid fa-envelope",
|
||||||
redirectUrl: "",
|
redirectUrl: "",
|
||||||
action: "bulksend",
|
action: "bulksend",
|
||||||
@@ -355,7 +338,7 @@ export default function reportJson(id) {
|
|||||||
{
|
{
|
||||||
btnId: "2234",
|
btnId: "2234",
|
||||||
hoverLabel: "option",
|
hoverLabel: "option",
|
||||||
btnColor: "transparent",
|
btnColor: "",
|
||||||
textColor: "black",
|
textColor: "black",
|
||||||
btnIcon: "fa-solid fa-ellipsis-vertical fa-lg",
|
btnIcon: "fa-solid fa-ellipsis-vertical fa-lg",
|
||||||
action: "option",
|
action: "option",
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
const dashboardJson = [
|
||||||
|
{
|
||||||
|
id: "35KBoSgoAK",
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
colsize: "col-span-12 md:col-span-6 lg:col-span-6",
|
||||||
|
widget: {
|
||||||
|
type: "Card",
|
||||||
|
icon: "fas fa-signature",
|
||||||
|
bgColor: "bg-[#f0058e]",
|
||||||
|
label: "Need your Signature",
|
||||||
|
description: null,
|
||||||
|
data: {
|
||||||
|
id: "e04ee9dc-932d-6b80-0202-703fd154eb74",
|
||||||
|
queryType: "",
|
||||||
|
class: "contracts_Document",
|
||||||
|
query:
|
||||||
|
'where={"$and":[{"AuditTrail.UserPtr":{"$ne":{"__type":"Pointer","className": "contracts_Users","objectId":"#objectId#"}}},{"AuditTrail.Activity":{"$ne":"Signed"}}],"Signers":{"$in":[{"__type":"Pointer","className":"contracts_Users","objectId":"#objectId#"}]},"IsDeclined":{"$ne":true},"IsCompleted":{"$ne":true},"Type":{"$ne":"Folder"},"Placeholders":{"$ne":null},"ExpiryDate":{"#*gt":{"__type":"#Date#","iso":"#today#"}}}&count=1',
|
||||||
|
key: "count",
|
||||||
|
Redirect_type: "Report",
|
||||||
|
Redirect_id: "4Hhwbp482K",
|
||||||
|
tourSection: "tourcard1",
|
||||||
|
tourMessage:
|
||||||
|
"Clicking on this card will take you to the list of documents awaiting your review."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
colsize: "col-span-12 md:col-span-6 lg:col-span-6",
|
||||||
|
widget: {
|
||||||
|
type: "Card",
|
||||||
|
icon: "fas fa-sign-out-alt",
|
||||||
|
bgColor: "bg-[#2ed8b6]",
|
||||||
|
label: "Out for signatures",
|
||||||
|
description: null,
|
||||||
|
data: {
|
||||||
|
id: "c1935cc0-28d4-3d73-b72a-8c1e3d18a17f",
|
||||||
|
queryType: "",
|
||||||
|
class: "contracts_Document",
|
||||||
|
query:
|
||||||
|
'where={"Type":{"#*ne":"Folder"},"Signers":{"#*exists":true,"#*ne":[]},"Placeholders":{"#*ne":null},"IsCompleted":{"#*ne":true},"IsDeclined":{"#*ne":true},"IsArchive":{"#*ne":true},"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"#UserId.objectId#"},"ExpiryDate":{"#*gt":{"__type":"#Date#","iso":"#today#"}}}&count=1',
|
||||||
|
key: "count",
|
||||||
|
Redirect_type: "Report",
|
||||||
|
Redirect_id: "1MwEuxLEkF",
|
||||||
|
tourSection: "tourcard2",
|
||||||
|
tourMessage:
|
||||||
|
"Clicking on this card will take you to a list of documents awaiting signature."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
colsize: "col-span-12 md:col-span-6 lg:col-span-6",
|
||||||
|
widget: {
|
||||||
|
type: "report",
|
||||||
|
reportId: "5Go51Q7T8r",
|
||||||
|
data: {
|
||||||
|
tourSection: "tourreport1",
|
||||||
|
tourMessage:
|
||||||
|
"This is a list of documents that are waiting for your signature."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
colsize: "col-span-12 md:col-span-6 lg:col-span-6",
|
||||||
|
widget: {
|
||||||
|
type: "report",
|
||||||
|
reportId: "d9k3UfYHBc",
|
||||||
|
data: {
|
||||||
|
tourSection: "tourreport2",
|
||||||
|
tourMessage:
|
||||||
|
"This is a list of documents you've sent to other parties for signature."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
colsize: "col-span-12 md:col-span-12 lg:col-span-12",
|
||||||
|
widget: {
|
||||||
|
type: "report",
|
||||||
|
reportId: "kC5mfynCi4",
|
||||||
|
data: {
|
||||||
|
tourSection: "tourreport3",
|
||||||
|
tourMessage:
|
||||||
|
"This are documents you have started but have not finalized for sending."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
export default dashboardJson;
|
||||||
@@ -12,6 +12,7 @@ import { useNavigate, useLocation, Outlet } from "react-router-dom";
|
|||||||
import { isEnableSubscription } from "../constant/const";
|
import { isEnableSubscription } from "../constant/const";
|
||||||
import { useCookies } from "react-cookie";
|
import { useCookies } from "react-cookie";
|
||||||
import { fetchSubscription } from "../constant/Utils";
|
import { fetchSubscription } from "../constant/Utils";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const HomeLayout = () => {
|
const HomeLayout = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -247,27 +248,14 @@ const HomeLayout = () => {
|
|||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className="sticky top-0 z-50">
|
<div className="sticky top-0 z-[101]">
|
||||||
{!isLoader && <Header showSidebar={showSidebar} />}
|
{!isLoader && <Header showSidebar={showSidebar} />}
|
||||||
</div>
|
</div>
|
||||||
{isUserValid ? (
|
{isUserValid ? (
|
||||||
<>
|
<>
|
||||||
{isLoader ? (
|
{isLoader ? (
|
||||||
<div
|
<div className="flex h-[100vh] justify-center items-center">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
@@ -277,7 +265,7 @@ const HomeLayout = () => {
|
|||||||
id="renderList"
|
id="renderList"
|
||||||
className="relative h-screen flex flex-col justify-between w-full overflow-y-auto"
|
className="relative h-screen flex flex-col justify-between w-full overflow-y-auto"
|
||||||
>
|
>
|
||||||
<div className="bg-[#eef1f5] p-3">{<Outlet />}</div>
|
<div className="bg-base-200 p-3">{<Outlet />}</div>
|
||||||
<div className="z-30">
|
<div className="z-30">
|
||||||
<Footer />
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
@@ -298,13 +286,10 @@ const HomeLayout = () => {
|
|||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<ModalUi title={"Session Expired"} isOpen={true} showClose={false}>
|
<ModalUi showHeader={false} isOpen={true} showClose={false}>
|
||||||
<div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5">
|
<div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5">
|
||||||
<p className="text-xl font-normal">Your session has expired.</p>
|
<p className="text-xl font-medium">Your session has expired.</p>
|
||||||
<button
|
<button onClick={handleLoginBtn} className="op-btn op-btn-neutral">
|
||||||
onClick={handleLoginBtn}
|
|
||||||
className="text-base px-3 py-1.5 rounded shadow-md text-white bg-[#1ab6ce]"
|
|
||||||
>
|
|
||||||
Login
|
Login
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -49,13 +49,13 @@ function ChangePassword() {
|
|||||||
return <Navigate to="/" />;
|
return <Navigate to="/" />;
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<div className="w-full bg-white shadow rounded p-2">
|
<div className="w-full bg-base-100 text-base-content shadow rounded p-2">
|
||||||
<Title title={"Change Password"} />
|
<Title title={"Change Password"} />
|
||||||
<div className="text-xl font-bold border-b-[1px] border-gray-300">
|
<div className="text-xl font-bold border-b-[1px] border-gray-300">
|
||||||
Change Password
|
Change Password
|
||||||
</div>
|
</div>
|
||||||
<div className="m-2">
|
<div className="m-2">
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit} className=" flex flex-col gap-y-2">
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="currentpassword" className="block text-xs ml-1">
|
<label htmlFor="currentpassword" className="block text-xs ml-1">
|
||||||
Current Password
|
Current Password
|
||||||
@@ -65,7 +65,7 @@ function ChangePassword() {
|
|||||||
name="currentpassword"
|
name="currentpassword"
|
||||||
value={currentpassword}
|
value={currentpassword}
|
||||||
onChange={(e) => setCurrentPassword(e.target.value)}
|
onChange={(e) => setCurrentPassword(e.target.value)}
|
||||||
className="px-3 py-2 mb-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm text-xs w-full"
|
||||||
placeholder="Current Password"
|
placeholder="Current Password"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
@@ -79,7 +79,7 @@ function ChangePassword() {
|
|||||||
name="newpassword"
|
name="newpassword"
|
||||||
value={newpassword}
|
value={newpassword}
|
||||||
onChange={(e) => setnewpassword(e.target.value)}
|
onChange={(e) => setnewpassword(e.target.value)}
|
||||||
className="px-3 py-2 mb-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm text-xs w-full"
|
||||||
placeholder="New Password"
|
placeholder="New Password"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
@@ -91,17 +91,14 @@ function ChangePassword() {
|
|||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
name="confirmpassword"
|
name="confirmpassword"
|
||||||
className="px-3 py-2 mb-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm text-xs w-full"
|
||||||
value={confirmpassword}
|
value={confirmpassword}
|
||||||
onChange={(e) => setconfirmpassword(e.target.value)}
|
onChange={(e) => setconfirmpassword(e.target.value)}
|
||||||
placeholder="Confirm Password"
|
placeholder="Confirm Password"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button type="submit" className="op-btn op-btn-primary shadow-md m-2">
|
||||||
type="submit"
|
|
||||||
className="bg-[#188ae2] m-2 px-4 py-3 rounded-sm shadow-md text-white text-xs font-semibold uppercase"
|
|
||||||
>
|
|
||||||
Change Password
|
Change Password
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -1,20 +1,19 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import Parse from "parse";
|
|
||||||
import "../styles/loader.css";
|
import "../styles/loader.css";
|
||||||
import GetDashboard from "../components/dashboard/GetDashboard";
|
import GetDashboard from "../components/dashboard/GetDashboard";
|
||||||
import { useNavigate, useParams } from "react-router-dom";
|
import { useNavigate, useParams } from "react-router-dom";
|
||||||
import Title from "../components/Title";
|
import Title from "../components/Title";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
import { saveTourSteps } from "../redux/reducers/TourStepsReducer";
|
import { saveTourSteps } from "../redux/reducers/TourStepsReducer";
|
||||||
|
import dashboardJson from "../json/dashboardJson";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const Dashboard = () => {
|
const Dashboard = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
const [dashboard, setdashboard] = useState([]);
|
const [dashboard, setdashboard] = useState({});
|
||||||
const [classnameArray, setclassnameArray] = useState([]);
|
const [loading, setloading] = useState(true);
|
||||||
const [loading, setloading] = useState(false);
|
|
||||||
const [defaultQuery, setDefaultQuery] = useState("");
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (localStorage.getItem("accesstoken")) {
|
if (localStorage.getItem("accesstoken")) {
|
||||||
@@ -30,53 +29,10 @@ const Dashboard = () => {
|
|||||||
}, [id]);
|
}, [id]);
|
||||||
|
|
||||||
const getDashboard = async (id) => {
|
const getDashboard = async (id) => {
|
||||||
setloading(true);
|
|
||||||
try {
|
try {
|
||||||
var forms = Parse.Object.extend("w_dashboard");
|
const dashboard = dashboardJson.find((x) => x.id === id);
|
||||||
var query = new Parse.Query(forms);
|
setdashboard(dashboard);
|
||||||
query.equalTo("objectId", id);
|
const dashboardTour = dashboard.columns
|
||||||
const results = await query.first();
|
|
||||||
const resultjson = results.toJSON();
|
|
||||||
let classArray = [];
|
|
||||||
let DefaultQuery = "";
|
|
||||||
resultjson.rows.forEach((x) => {
|
|
||||||
let col_lg = "",
|
|
||||||
col_md = "",
|
|
||||||
col_xs = "",
|
|
||||||
col_sm = "",
|
|
||||||
col_ = "",
|
|
||||||
obj = {};
|
|
||||||
let subItem = [];
|
|
||||||
let item = "";
|
|
||||||
x.columns.forEach((y) => {
|
|
||||||
if (y.widget.type === "customeHtml") {
|
|
||||||
DefaultQuery = y.widget.data[0].default;
|
|
||||||
}
|
|
||||||
if (Number(y["collg"]) > 0) {
|
|
||||||
col_lg = "col-lg-" + y["collg"];
|
|
||||||
}
|
|
||||||
if (Number(y["colmd"]) > 0) {
|
|
||||||
col_md = "col-md-" + y["colmd"];
|
|
||||||
}
|
|
||||||
if (Number(y["colxs"]) > 0) {
|
|
||||||
col_xs = "col-xs-" + y["colxs"];
|
|
||||||
}
|
|
||||||
if (Number(y["colsm"]) > 0) {
|
|
||||||
col_sm = "col-sm-" + y["colsm"];
|
|
||||||
}
|
|
||||||
if (Number(y["col"]) > 0) {
|
|
||||||
col_ = "col-" + y["col"];
|
|
||||||
}
|
|
||||||
item =
|
|
||||||
col_lg + " " + col_md + " " + col_xs + " " + col_sm + " " + col_;
|
|
||||||
subItem.push(item);
|
|
||||||
});
|
|
||||||
obj = subItem;
|
|
||||||
classArray.push(obj);
|
|
||||||
});
|
|
||||||
setdashboard(resultjson.rows);
|
|
||||||
// console.log("resultjson.rows ", resultjson.rows);
|
|
||||||
const arr = resultjson.rows[0].columns
|
|
||||||
.filter((col) => {
|
.filter((col) => {
|
||||||
if (col.widget.data && col.widget.data.tourSection) {
|
if (col.widget.data && col.widget.data.tourSection) {
|
||||||
return col;
|
return col;
|
||||||
@@ -90,14 +46,7 @@ const Dashboard = () => {
|
|||||||
// style: { backgroundColor: "#abd4d2" },
|
// style: { backgroundColor: "#abd4d2" },
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
dispatch(saveTourSteps(arr));
|
dispatch(saveTourSteps(dashboardTour));
|
||||||
// console.log("arr ", arr);
|
|
||||||
setclassnameArray(classArray);
|
|
||||||
if (localStorage.getItem("DashboardDefaultFilter")) {
|
|
||||||
setDefaultQuery(localStorage.getItem("DashboardDefaultFilter"));
|
|
||||||
} else {
|
|
||||||
setDefaultQuery(DefaultQuery);
|
|
||||||
}
|
|
||||||
setloading(false);
|
setloading(false);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Problem", e);
|
console.error("Problem", e);
|
||||||
@@ -105,32 +54,16 @@ const Dashboard = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let _dash = (
|
|
||||||
<GetDashboard
|
|
||||||
dashboard={dashboard}
|
|
||||||
classnameArray={classnameArray}
|
|
||||||
DefaultQuery={defaultQuery}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
if (loading) {
|
|
||||||
_dash = (
|
|
||||||
<div style={{ height: "300px", backgroundColor: "white" }}>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
marginLeft: "45%",
|
|
||||||
marginTop: "150px",
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<Title title="Dashboard" />
|
<Title title="Dashboard" />
|
||||||
{_dash}
|
{loading ? (
|
||||||
|
<div className="h-[300px] w-full bg-white flex justify-center items-center rounded-md">
|
||||||
|
<Loader />
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<GetDashboard dashboard={dashboard} />
|
||||||
|
)}
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,21 +1,26 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import Title from "../components/Title";
|
import Title from "../components/Title";
|
||||||
import { NavLink } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import login_img from "../assets/images/login_img.svg";
|
import login_img from "../assets/images/login_img.svg";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import Alert from "../primitives/Alert";
|
import Alert from "../primitives/Alert";
|
||||||
import { appInfo } from "../constant/appinfo";
|
import { appInfo } from "../constant/appinfo";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
import { fetchAppInfo } from "../redux/reducers/infoReducer";
|
import { fetchAppInfo } from "../redux/reducers/infoReducer";
|
||||||
|
import { isEnableSubscription } from "../constant/const";
|
||||||
|
import { getAppLogo } from "../constant/Utils";
|
||||||
|
|
||||||
function ForgotPassword() {
|
function ForgotPassword() {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
const navigate = useNavigate();
|
||||||
const [state, setState] = useState({
|
const [state, setState] = useState({
|
||||||
email: "",
|
email: "",
|
||||||
password: "",
|
password: "",
|
||||||
hideNav: ""
|
hideNav: ""
|
||||||
});
|
});
|
||||||
const [sentStatus, setSentStatus] = useState("");
|
const [sentStatus, setSentStatus] = useState("");
|
||||||
|
const [image, setImage] = useState();
|
||||||
|
|
||||||
const handleChange = (event) => {
|
const handleChange = (event) => {
|
||||||
const { name, value } = event.target;
|
const { name, value } = event.target;
|
||||||
setState({ ...state, [name]: value });
|
setState({ ...state, [name]: value });
|
||||||
@@ -51,15 +56,26 @@ function ForgotPassword() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
dispatch(fetchAppInfo());
|
dispatch(fetchAppInfo());
|
||||||
|
saveLogo();
|
||||||
resize();
|
resize();
|
||||||
window.addEventListener("resize", resize);
|
window.addEventListener("resize", resize);
|
||||||
return () => window.removeEventListener("resize", resize);
|
return () => window.removeEventListener("resize", resize);
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
}, []);
|
}, []);
|
||||||
|
const saveLogo = async () => {
|
||||||
let image = appInfo.applogo;
|
if (isEnableSubscription) {
|
||||||
|
const logo = await getAppLogo();
|
||||||
|
if (logo) {
|
||||||
|
setImage(logo);
|
||||||
|
} else {
|
||||||
|
setImage(appInfo?.applogo || undefined);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setImage(appInfo?.applogo || undefined);
|
||||||
|
}
|
||||||
|
};
|
||||||
return (
|
return (
|
||||||
<div className="bg-white">
|
<div>
|
||||||
<Title title="Forgot password page" />
|
<Title title="Forgot password page" />
|
||||||
{sentStatus === "success" && (
|
{sentStatus === "success" && (
|
||||||
<Alert type="success">
|
<Alert type="success">
|
||||||
@@ -69,29 +85,31 @@ function ForgotPassword() {
|
|||||||
{sentStatus === "failed" && (
|
{sentStatus === "failed" && (
|
||||||
<Alert type={"danger"}>Please setup email adapter </Alert>
|
<Alert type={"danger"}>Please setup email adapter </Alert>
|
||||||
)}
|
)}
|
||||||
<div>
|
<div className="md:p-10 lg:p-16">
|
||||||
<div className="md:m-10 lg:m-16 md:p-4 lg:p-10 p-5 bg-[#ffffff] md:border-[1px] md:border-gray-400 ">
|
<div className="md:p-4 lg:p-10 p-4 bg-base-100 text-base-content op-card">
|
||||||
<div className="w-[250px] h-[66px] inline-block">
|
<div className="w-[250px] h-[66px] inline-block overflow-hidden">
|
||||||
{state.hideNav ? (
|
{image && (
|
||||||
<img src={image} width="100%" alt="" />
|
<img
|
||||||
) : (
|
src={image}
|
||||||
<img src={image} width="100%" alt="" />
|
className="object-contain h-full"
|
||||||
|
alt="applogo"
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-2">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-2">
|
||||||
<div className="">
|
<div>
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<h2 className="text-[30px] mt-6">Welcome Back !</h2>
|
<h2 className="text-[30px] mt-6">Welcome Back !</h2>
|
||||||
<span className="text-[12px] text-[#878787]">
|
<span className="text-[12px] text-[#878787]">
|
||||||
Reset Your Password
|
Reset Your Password
|
||||||
</span>
|
</span>
|
||||||
<div className="shadow-md rounded my-4">
|
<div className="w-full my-4 op-card bg-base-100 shadow-md outline outline-1 outline-slate-300/50">
|
||||||
<div className="px-6 py-4">
|
<div className="px-6 py-4">
|
||||||
<label className="block text-xs">Email</label>
|
<label className="block text-xs">Email</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="email"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
|
||||||
name="email"
|
name="email"
|
||||||
|
className="op-input op-input-bordered op-input-sm w-full"
|
||||||
value={state.email}
|
value={state.email}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
required
|
required
|
||||||
@@ -99,19 +117,16 @@ function ForgotPassword() {
|
|||||||
<hr className="my-2 border-none" />
|
<hr className="my-2 border-none" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between items-center px-4">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-2 text-center text-xs font-bold">
|
||||||
<button
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
type="submit"
|
|
||||||
className="rounded-sm bg-[#3ac9d6] text-white px-4 py-3 text-xs font-semibold shadow uppercase"
|
|
||||||
>
|
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
<NavLink
|
<button
|
||||||
to="/"
|
onClick={() => navigate("/", { replace: true })}
|
||||||
className="rounded-sm bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] px-4 py-3 text-xs font-semibold shadow uppercase cursor-pointer"
|
className="op-btn op-btn-secondary"
|
||||||
>
|
>
|
||||||
Login
|
Login
|
||||||
</NavLink>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,11 +14,12 @@ import { SaveFileSize } from "../constant/saveFileSize";
|
|||||||
import { checkIsSubscribed, getFileName, toDataUrl } from "../constant/Utils";
|
import { checkIsSubscribed, getFileName, toDataUrl } from "../constant/Utils";
|
||||||
import { PDFDocument } from "pdf-lib";
|
import { PDFDocument } from "pdf-lib";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { isEnableSubscription, submitBtn } from "../constant/const";
|
import { isEnableSubscription } from "../constant/const";
|
||||||
import ModalUi from "../primitives/ModalUi";
|
import ModalUi from "../primitives/ModalUi";
|
||||||
import { Tooltip } from "react-tooltip";
|
import { Tooltip } from "react-tooltip";
|
||||||
import Upgrade from "../primitives/Upgrade";
|
import Upgrade from "../primitives/Upgrade";
|
||||||
import PremiumAlertHeader from "../primitives/PremiumAlertHeader";
|
import PremiumAlertHeader from "../primitives/PremiumAlertHeader";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
// `Form` render all type of Form on this basis of their provided in path
|
// `Form` render all type of Form on this basis of their provided in path
|
||||||
function Form() {
|
function Form() {
|
||||||
@@ -484,6 +485,9 @@ const Forms = (props) => {
|
|||||||
setpercentage(0);
|
setpercentage(0);
|
||||||
setTimeout(() => setIsReset(false), 50);
|
setTimeout(() => setIsReset(false), 50);
|
||||||
};
|
};
|
||||||
|
const handleCancel = () => {
|
||||||
|
navigate("/dashboard/35KBoSgoAK");
|
||||||
|
};
|
||||||
const handlePasswordSubmit = async (e) => {
|
const handlePasswordSubmit = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
setIsPassword(false);
|
setIsPassword(false);
|
||||||
@@ -561,7 +565,7 @@ const Forms = (props) => {
|
|||||||
setFormData((prev) => ({ ...prev, autoreminder: !formData.autoreminder }));
|
setFormData((prev) => ({ ...prev, autoreminder: !formData.autoreminder }));
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div className="shadow-md rounded my-2 p-3 bg-[#ffffff] md:border-[1px] md:border-gray-600/50">
|
<div className="shadow-md rounded my-2 p-3 bg-base-100 text-base-content md:border-[1px] md:border-gray-600/50">
|
||||||
<Title title={props?.title} />
|
<Title title={props?.title} />
|
||||||
{isAlert && (
|
{isAlert && (
|
||||||
<Alert type={isErr ? "danger" : "success"}>
|
<Alert type={isErr ? "danger" : "success"}>
|
||||||
@@ -571,16 +575,8 @@ const Forms = (props) => {
|
|||||||
</Alert>
|
</Alert>
|
||||||
)}
|
)}
|
||||||
{isSubmit ? (
|
{isSubmit ? (
|
||||||
<div style={{ height: "300px" }}>
|
<div className="h-[300px] flex justify-center items-center">
|
||||||
<div
|
<Loader />
|
||||||
style={{
|
|
||||||
marginLeft: "45%",
|
|
||||||
marginTop: "150px",
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
@@ -591,29 +587,30 @@ const Forms = (props) => {
|
|||||||
>
|
>
|
||||||
<form onSubmit={handlePasswordSubmit}>
|
<form onSubmit={handlePasswordSubmit}>
|
||||||
<div className="px-6 pt-3 pb-2">
|
<div className="px-6 pt-3 pb-2">
|
||||||
<label className="mb-2 text-xs">Password</label>
|
<label className="mb-2 text-xs text-base-content">
|
||||||
|
Password
|
||||||
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="password"
|
name="password"
|
||||||
value={formData.password}
|
value={formData.password}
|
||||||
onChange={(e) => handleStrInput(e)}
|
onChange={(e) => handleStrInput(e)}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="w-full op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-xs"
|
||||||
placeholder="Enter pdf password"
|
placeholder="Enter pdf password"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
{!isCorrectPass ? (
|
<p
|
||||||
<p className="ml-2 text-[11px] text-red-600">
|
className={`${
|
||||||
Please provide correct password
|
!isCorrectPass
|
||||||
</p>
|
? "text-red-600"
|
||||||
) : (
|
: "text-transparent pointer-events-none"
|
||||||
<p className="ml-2 text-[11px] text-transparent text-red-600">
|
} ml-2 text-[11px] `}
|
||||||
.
|
>
|
||||||
</p>
|
Please provide correct password
|
||||||
)}
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<div className="px-6 mb-3">
|
||||||
<div className="px-6 my-3">
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
<button type="submit" className={submitBtn}>
|
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -629,12 +626,12 @@ const Forms = (props) => {
|
|||||||
style={{ width: `${percentage}%` }}
|
style={{ width: `${percentage}%` }}
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-black text-sm">{percentage}%</span>
|
<span className="text-base-content text-sm">{percentage}%</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{isDecrypting && (
|
{isDecrypting && (
|
||||||
<div className="flex items-center gap-x-2">
|
<div className="flex items-center gap-x-2">
|
||||||
<span className="text-black text-sm">
|
<span className="text-base-content text-sm">
|
||||||
Decrypting pdf please wait...
|
Decrypting pdf please wait...
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -648,13 +645,13 @@ const Forms = (props) => {
|
|||||||
</label>
|
</label>
|
||||||
{fileupload.length > 0 ? (
|
{fileupload.length > 0 ? (
|
||||||
<div className="flex gap-2 justify-center items-center">
|
<div className="flex gap-2 justify-center items-center">
|
||||||
<div className="flex justify-between items-center px-2 py-2 w-full font-bold rounded border-[1px] border-[#ccc] text-gray-500 bg-white text-[13px]">
|
<div className="flex justify-between items-center op-input op-input-bordered op-input-sm w-full text-x text-[13px]">
|
||||||
<div className="break-all">
|
<div className="break-all">
|
||||||
file selected : {getFileName(fileupload)}
|
file selected : {getFileName(fileupload)}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
onClick={() => setFileUpload("")}
|
onClick={() => setFileUpload("")}
|
||||||
className="cursor-pointer px-[10px] text-[20px] font-bold bg-white text-red-500"
|
className="cursor-pointer px-[10px] text-[20px] font-bold text-red-500"
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-xmark"></i>
|
<i className="fa-solid fa-xmark"></i>
|
||||||
</div>
|
</div>
|
||||||
@@ -667,10 +664,10 @@ const Forms = (props) => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex gap-2 justify-center items-center">
|
<div className="flex gap-2 justify-center items-center ">
|
||||||
<input
|
<input
|
||||||
type="file"
|
type="file"
|
||||||
className="bg-white px-2 py-1.5 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-file-input op-file-input-bordered op-file-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
onChange={(e) => handleFileInput(e)}
|
onChange={(e) => handleFileInput(e)}
|
||||||
ref={inputFileRef}
|
ref={inputFileRef}
|
||||||
accept={
|
accept={
|
||||||
@@ -698,7 +695,7 @@ const Forms = (props) => {
|
|||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
name="Name"
|
name="Name"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={formData.Name}
|
value={formData.Name}
|
||||||
onChange={(e) => handleStrInput(e)}
|
onChange={(e) => handleStrInput(e)}
|
||||||
required
|
required
|
||||||
@@ -708,7 +705,7 @@ const Forms = (props) => {
|
|||||||
<label className="block">Description</label>
|
<label className="block">Description</label>
|
||||||
<input
|
<input
|
||||||
name="Description"
|
name="Description"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={formData.Description}
|
value={formData.Description}
|
||||||
onChange={(e) => handleStrInput(e)}
|
onChange={(e) => handleStrInput(e)}
|
||||||
/>
|
/>
|
||||||
@@ -726,7 +723,7 @@ const Forms = (props) => {
|
|||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
name="Note"
|
name="Note"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={formData.Note}
|
value={formData.Note}
|
||||||
onChange={(e) => handleStrInput(e)}
|
onChange={(e) => handleStrInput(e)}
|
||||||
required
|
required
|
||||||
@@ -748,7 +745,7 @@ const Forms = (props) => {
|
|||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
name="TimeToCompleteDays"
|
name="TimeToCompleteDays"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={formData.TimeToCompleteDays}
|
value={formData.TimeToCompleteDays}
|
||||||
onChange={(e) => handleStrInput(e)}
|
onChange={(e) => handleStrInput(e)}
|
||||||
required
|
required
|
||||||
@@ -786,7 +783,6 @@ const Forms = (props) => {
|
|||||||
<li>
|
<li>
|
||||||
<span className="font-bold">Yes:</span>
|
<span className="font-bold">Yes:</span>
|
||||||
<span>
|
<span>
|
||||||
{" "}
|
|
||||||
Selecting this option will send the signing
|
Selecting this option will send the signing
|
||||||
request to the first signer initially. Once the
|
request to the first signer initially. Once the
|
||||||
first signer completes their part, the next
|
first signer completes their part, the next
|
||||||
@@ -822,6 +818,7 @@ const Forms = (props) => {
|
|||||||
<input
|
<input
|
||||||
type="radio"
|
type="radio"
|
||||||
value={"true"}
|
value={"true"}
|
||||||
|
className="op-radio op-radio-xs"
|
||||||
name="SendinOrder"
|
name="SendinOrder"
|
||||||
checked={formData.SendinOrder === "true"}
|
checked={formData.SendinOrder === "true"}
|
||||||
onChange={handleStrInput}
|
onChange={handleStrInput}
|
||||||
@@ -833,6 +830,7 @@ const Forms = (props) => {
|
|||||||
type="radio"
|
type="radio"
|
||||||
value={"false"}
|
value={"false"}
|
||||||
name="SendinOrder"
|
name="SendinOrder"
|
||||||
|
className="op-radio op-radio-xs"
|
||||||
checked={formData.SendinOrder === "false"}
|
checked={formData.SendinOrder === "false"}
|
||||||
onChange={handleStrInput}
|
onChange={handleStrInput}
|
||||||
/>
|
/>
|
||||||
@@ -865,13 +863,11 @@ const Forms = (props) => {
|
|||||||
} relative block items-center mb-0`}
|
} relative block items-center mb-0`}
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
className="op-toggle transition-all checked:[--tglbg:#3368ff] checked:bg-white"
|
||||||
checked={formData.autoreminder}
|
checked={formData.autoreminder}
|
||||||
onChange={handleAutoReminder}
|
onChange={handleAutoReminder}
|
||||||
type="checkbox"
|
|
||||||
value=""
|
|
||||||
className="sr-only peer"
|
|
||||||
/>
|
/>
|
||||||
<div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600 mt-2"></div>
|
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
{formData?.autoreminder === true && (
|
{formData?.autoreminder === true && (
|
||||||
@@ -884,7 +880,7 @@ const Forms = (props) => {
|
|||||||
type="number"
|
type="number"
|
||||||
value={formData.remindOnceInEvery}
|
value={formData.remindOnceInEvery}
|
||||||
name="remindOnceInEvery"
|
name="remindOnceInEvery"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
onChange={handleStrInput}
|
onChange={handleStrInput}
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
@@ -892,21 +888,21 @@ const Forms = (props) => {
|
|||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
<div className="flex items-center mt-3 gap-2 text-white">
|
<div className="flex items-center mt-3 gap-2">
|
||||||
<button
|
<button
|
||||||
className={`${
|
className={`${
|
||||||
isSubmit && "cursor-progress"
|
isSubmit ? "cursor-progress" : ""
|
||||||
} bg-[#1ab6ce] rounded-sm shadow-md text-[13px] font-semibold uppercase text-white py-1.5 px-2.5 focus:outline-none`}
|
} op-btn op-btn-primary`}
|
||||||
type="submit"
|
type="submit"
|
||||||
disabled={isSubmit}
|
disabled={isSubmit}
|
||||||
>
|
>
|
||||||
Next
|
Next
|
||||||
</button>
|
</button>
|
||||||
<div
|
<div
|
||||||
className="cursor-pointer bg-[#188ae2] rounded-sm shadow-md text-[13px] font-semibold uppercase text-white py-1.5 px-2.5 text-center ml-[2px] focus:outline-none"
|
className="op-btn op-btn-ghost"
|
||||||
onClick={() => handleReset()}
|
onClick={() => handleCancel()}
|
||||||
>
|
>
|
||||||
Reset
|
Cancel
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -4,10 +4,11 @@ import axios from "axios";
|
|||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import Alert from "../primitives/Alert";
|
import Alert from "../primitives/Alert";
|
||||||
import ModalUi from "../primitives/ModalUi";
|
import ModalUi from "../primitives/ModalUi";
|
||||||
import { isEnableSubscription, rejectBtn, submitBtn } from "../constant/const";
|
import { isEnableSubscription } from "../constant/const";
|
||||||
import { checkIsSubscribed, copytoData, openInNewTab } from "../constant/Utils";
|
import { checkIsSubscribed, copytoData, openInNewTab } from "../constant/Utils";
|
||||||
import PremiumAlertHeader from "../primitives/PremiumAlertHeader";
|
import PremiumAlertHeader from "../primitives/PremiumAlertHeader";
|
||||||
import Tooltip from "../primitives/Tooltip";
|
import Tooltip from "../primitives/Tooltip";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
function GenerateToken() {
|
function GenerateToken() {
|
||||||
const navigation = useNavigate();
|
const navigation = useNavigate();
|
||||||
@@ -109,24 +110,11 @@ function GenerateToken() {
|
|||||||
{copied && <Alert type="success">Copied</Alert>}
|
{copied && <Alert type="success">Copied</Alert>}
|
||||||
{isErr && <Alert type="danger">Something went wrong!</Alert>}
|
{isErr && <Alert type="danger">Something went wrong!</Alert>}
|
||||||
{isLoader ? (
|
{isLoader ? (
|
||||||
<div
|
<div className="flex justify-center items-center h-screen">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="bg-white flex flex-col justify-center shadow rounded">
|
<div className="bg-base-100 text-base-content flex flex-col justify-center shadow rounded">
|
||||||
{!isEnableSubscription && <PremiumAlertHeader />}
|
{!isEnableSubscription && <PremiumAlertHeader />}
|
||||||
<h1 className={"ml-4 mt-3 mb-2 font-semibold"}>
|
<h1 className={"ml-4 mt-3 mb-2 font-semibold"}>
|
||||||
OpenSign™ API{" "}
|
OpenSign™ API{" "}
|
||||||
@@ -155,7 +143,7 @@ function GenerateToken() {
|
|||||||
{apiToken ? apiToken : "_____"}
|
{apiToken ? apiToken : "_____"}
|
||||||
</span>
|
</span>
|
||||||
<button
|
<button
|
||||||
className="rounded hover:bg-[#15b4e9] border-[1px] border-[#15b4e9] text-[#15b4e9] hover:text-white px-2.5 py-2 focus:outline-none ml-2"
|
className="op-btn op-btn-accent op-btn-outline op-btn-sm ml-2"
|
||||||
onClick={() => copytoclipboard(apiToken)}
|
onClick={() => copytoclipboard(apiToken)}
|
||||||
>
|
>
|
||||||
<i className="fa-solid fa-copy"></i>
|
<i className="fa-solid fa-copy"></i>
|
||||||
@@ -164,7 +152,7 @@ function GenerateToken() {
|
|||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={apiToken ? handleModal : handleSubmit}
|
onClick={apiToken ? handleModal : handleSubmit}
|
||||||
className="rounded hover:bg-[#15b4e9] border-[1px] border-[#15b4e9] text-[#15b4e9] hover:text-white text-xs md:text-sm lg:text-base px-2 py-2 focus:outline-none"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
{apiToken ? "Regenerate Token" : "Generate Token"}
|
{apiToken ? "Regenerate Token" : "Generate Token"}
|
||||||
</button>
|
</button>
|
||||||
@@ -178,7 +166,7 @@ function GenerateToken() {
|
|||||||
"https://docs.opensignlabs.com/docs/API-docs/opensign-api-v-1"
|
"https://docs.opensignlabs.com/docs/API-docs/opensign-api-v-1"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
className="rounded hover:bg-[#15b4e9] border-[1px] my-2 border-[#15b4e9] text-[#15b4e9] hover:text-white px-11 py-2 text-xs md:text-base focus:outline-none"
|
className="op-btn op-btn-secondary my-2"
|
||||||
>
|
>
|
||||||
View Docs
|
View Docs
|
||||||
</button>
|
</button>
|
||||||
@@ -219,7 +207,7 @@ function GenerateToken() {
|
|||||||
handleClose={handleModal}
|
handleClose={handleModal}
|
||||||
>
|
>
|
||||||
<div className="m-[20px]">
|
<div className="m-[20px]">
|
||||||
<div className="text-lg font-normal text-black">
|
<div className="text-lg font-normal text-base-content">
|
||||||
Are you sure you want to regenerate token it will expire old
|
Are you sure you want to regenerate token it will expire old
|
||||||
token?
|
token?
|
||||||
</div>
|
</div>
|
||||||
@@ -227,11 +215,14 @@ function GenerateToken() {
|
|||||||
<div className="flex items-center mt-3 gap-2 text-white">
|
<div className="flex items-center mt-3 gap-2 text-white">
|
||||||
<button
|
<button
|
||||||
onClick={handleSubmit}
|
onClick={handleSubmit}
|
||||||
className={submitBtn + "ml-[2px]"}
|
className="op-btn op-btn-primary ml-[2px]"
|
||||||
>
|
>
|
||||||
Yes
|
Yes
|
||||||
</button>
|
</button>
|
||||||
<button onClick={handleModal} className={rejectBtn}>
|
<button
|
||||||
|
onClick={handleModal}
|
||||||
|
className="op-btn op-btn-secondary"
|
||||||
|
>
|
||||||
No
|
No
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,16 +1,12 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import { useNavigate, useParams } from "react-router-dom";
|
import { useNavigate, useParams } from "react-router-dom";
|
||||||
import loader from "../assets/images/loader2.gif";
|
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import {
|
import { isEnableSubscription } from "../constant/const";
|
||||||
isEnableSubscription,
|
|
||||||
modalSubmitBtnColor,
|
|
||||||
themeColor
|
|
||||||
} from "../constant/const";
|
|
||||||
import { contractUsers, getAppLogo } from "../constant/Utils";
|
import { contractUsers, getAppLogo } from "../constant/Utils";
|
||||||
import logo from "../assets/images/logo.png";
|
import logo from "../assets/images/logo.png";
|
||||||
import { appInfo } from "../constant/appinfo";
|
import { appInfo } from "../constant/appinfo";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
function GuestLogin() {
|
function GuestLogin() {
|
||||||
const { id, userMail, contactBookId, base64url } = useParams();
|
const { id, userMail, contactBookId, base64url } = useParams();
|
||||||
@@ -185,16 +181,14 @@ function GuestLogin() {
|
|||||||
setContact((prev) => ({ ...prev, [e.target.name]: e.target.value }));
|
setContact((prev) => ({ ...prev, [e.target.name]: e.target.value }));
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div style={{ padding: "2rem", background: "white" }}>
|
<div className="p-[2rem]">
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
<div className="flex flex-col justify-center items-center h-[100vh]">
|
<div className="flex flex-col justify-center items-center h-[100vh]">
|
||||||
<img className="w-[80px] h-[80px]" alt="loader" src={loader} />
|
<Loader />
|
||||||
<span style={{ fontSize: "13px", color: "gray" }}>
|
<span className="text-[13px] text-[gray]">{isLoading.message}</span>
|
||||||
{isLoading.message}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="m-1 md:m-2 border-[0.5px] border-[#c5c7c9] p-[30px] shadow-md">
|
<div className="m-1 md:m-2 p-[30px] text-base-content bg-base-100 op-card shadow-md">
|
||||||
<div className="md:w-[250px] md:h-[66px] inline-block overflow-hidden mt-2 mb-11">
|
<div className="md:w-[250px] md:h-[66px] inline-block overflow-hidden mt-2 mb-11">
|
||||||
{appLogo && (
|
{appLogo && (
|
||||||
<img src={appLogo} className="object-contain h-full" alt="logo" />
|
<img src={appLogo} className="object-contain h-full" alt="logo" />
|
||||||
@@ -203,24 +197,23 @@ function GuestLogin() {
|
|||||||
{contactId ? (
|
{contactId ? (
|
||||||
<>
|
<>
|
||||||
{!EnterOTP ? (
|
{!EnterOTP ? (
|
||||||
<div className="w-full md:w-[50%]">
|
<div className="w-full md:w-[50%] text-base-content">
|
||||||
<h1 className="text-2xl md:text-[30px]">Welcome Back!</h1>
|
<h1 className="text-2xl md:text-[30px]">Welcome Back!</h1>
|
||||||
<legend className="text-[12px] text-[#878787] mt-2">
|
<legend className="text-[12px] text-[#878787] mt-2">
|
||||||
Verification code is sent to your email
|
Verification code is sent to your email
|
||||||
</legend>
|
</legend>
|
||||||
<div className="p-[20px] outline outline-1 outline-slate-300/50 my-2 rounded shadow-md">
|
<div className="p-[20px] outline outline-1 outline-slate-300/50 my-2 op-card shadow-md">
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
name="mobile"
|
name="mobile"
|
||||||
value={email}
|
value={email}
|
||||||
className="outline-none px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs disabled:bg-[#e0e5f5]"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
disabled
|
disabled
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4">
|
<div className="mt-2">
|
||||||
<button
|
<button
|
||||||
className="w-[100px] text-white text-sm font-medium py-1 rounded-sm shadow-md hover:shadow-lg focus:outline-none"
|
className="op-btn op-btn-primary"
|
||||||
style={{ background: themeColor }}
|
|
||||||
onClick={(e) => handleSendOTPBtn(e)}
|
onClick={(e) => handleSendOTPBtn(e)}
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
>
|
>
|
||||||
@@ -229,25 +222,27 @@ function GuestLogin() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<form className="w-full md:w-[50%]" onSubmit={VerifyOTP}>
|
<form
|
||||||
|
className="w-full md:w-[50%] text-base-content"
|
||||||
|
onSubmit={VerifyOTP}
|
||||||
|
>
|
||||||
<h1 className="text-2xl md:text-[30px]">Welcome Back!</h1>
|
<h1 className="text-2xl md:text-[30px]">Welcome Back!</h1>
|
||||||
<legend className="text-[12px] text-[#878787] mt-2">
|
<legend className="text-[12px] text-[#878787] mt-2">
|
||||||
You will get a OTP via Email
|
You will get a OTP via Email
|
||||||
</legend>
|
</legend>
|
||||||
<div className="p-[20px] pt-[15px] outline outline-1 outline-slate-300/50 my-2 rounded shadow-md">
|
<div className="p-[20px] pt-[15px] outline outline-1 outline-slate-300/50 op-card my-2 shadow-md">
|
||||||
<p>Enter Verification Code</p>
|
<p className="text-sm">Enter Verification Code</p>
|
||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
className="mt-1 outline-none px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs bg-[#e0e5f5]"
|
className="mt-2 op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
name="OTP"
|
name="OTP"
|
||||||
value={OTP}
|
value={OTP}
|
||||||
onChange={(e) => setOTP(e.target.value)}
|
onChange={(e) => setOTP(e.target.value)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4">
|
<div className="mt-2">
|
||||||
<button
|
<button
|
||||||
style={{ background: themeColor }}
|
className="op-btn op-btn-primary"
|
||||||
className="w-[100px] text-white text-sm font-medium py-1 rounded-sm shadow-md hover:shadow-lg focus:outline-none"
|
|
||||||
type="submit"
|
type="submit"
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
>
|
>
|
||||||
@@ -258,16 +253,16 @@ function GuestLogin() {
|
|||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<div className="w-full md:w-[50%]">
|
<div className="w-full md:w-[50%] text-base-content">
|
||||||
<h1 className="text-2xl md:text-[30px]">Welcome</h1>
|
<h1 className="text-2xl md:text-[30px]">Welcome</h1>
|
||||||
<legend className="text-[12px] text-[#878787] mt-2">
|
<legend className="text-[12px] text-[#878787] mt-2">
|
||||||
Provide your details
|
Provide your details
|
||||||
</legend>
|
</legend>
|
||||||
<form
|
<form
|
||||||
className="p-[20px] pt-[15px] outline outline-1 outline-slate-300/50 my-2 rounded shadow-md"
|
className="p-[20px] pt-[15px] outline outline-1 outline-slate-300/50 my-2 op-card shadow-md"
|
||||||
onSubmit={handleUserData}
|
onSubmit={handleUserData}
|
||||||
>
|
>
|
||||||
<div className="mb-3">
|
<div className="mb-2">
|
||||||
<label
|
<label
|
||||||
htmlFor="name"
|
htmlFor="name"
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
className="block text-xs text-gray-700 font-semibold"
|
||||||
@@ -280,12 +275,12 @@ function GuestLogin() {
|
|||||||
name="name"
|
name="name"
|
||||||
value={contact.name}
|
value={contact.name}
|
||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded disabled:bg-[#e0e5f5] focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-2">
|
||||||
<label
|
<label
|
||||||
htmlFor="email"
|
htmlFor="email"
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
className="block text-xs text-gray-700 font-semibold"
|
||||||
@@ -298,12 +293,12 @@ function GuestLogin() {
|
|||||||
name="email"
|
name="email"
|
||||||
value={contact.email}
|
value={contact.email}
|
||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 disabled:bg-[#e0e5f5] rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
required
|
required
|
||||||
disabled
|
disabled
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-2">
|
||||||
<label
|
<label
|
||||||
htmlFor="phone"
|
htmlFor="phone"
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
className="block text-xs text-gray-700 font-semibold"
|
||||||
@@ -315,15 +310,14 @@ function GuestLogin() {
|
|||||||
name="phone"
|
name="phone"
|
||||||
value={contact.phone}
|
value={contact.phone}
|
||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4 flex justify-start">
|
<div className="mt-2 flex justify-start">
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
style={{ backgroundColor: modalSubmitBtnColor }}
|
className="op-btn op-btn-primary"
|
||||||
className="mr-2 px-[20px] py-1.5 text-white rounded shadow-md text-center focus:outline-none "
|
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
>
|
>
|
||||||
{loading ? "Loading..." : "Next"}
|
{loading ? "Loading..." : "Next"}
|
||||||
|
|||||||
@@ -10,16 +10,13 @@ import { NavLink, useNavigate, useLocation } from "react-router-dom";
|
|||||||
import login_img from "../assets/images/login_img.svg";
|
import login_img from "../assets/images/login_img.svg";
|
||||||
import { useWindowSize } from "../hook/useWindowSize";
|
import { useWindowSize } from "../hook/useWindowSize";
|
||||||
import ModalUi from "../primitives/ModalUi";
|
import ModalUi from "../primitives/ModalUi";
|
||||||
import {
|
import { isEnableSubscription } from "../constant/const";
|
||||||
isEnableSubscription,
|
|
||||||
modalCancelBtnColor,
|
|
||||||
modalSubmitBtnColor
|
|
||||||
} from "../constant/const";
|
|
||||||
import Alert from "../primitives/Alert";
|
import Alert from "../primitives/Alert";
|
||||||
import { appInfo } from "../constant/appinfo";
|
import { appInfo } from "../constant/appinfo";
|
||||||
import { fetchAppInfo } from "../redux/reducers/infoReducer";
|
import { fetchAppInfo } from "../redux/reducers/infoReducer";
|
||||||
import { showTenant } from "../redux/reducers/ShowTenant";
|
import { showTenant } from "../redux/reducers/ShowTenant";
|
||||||
import { fetchSubscription, getAppLogo, openInNewTab } from "../constant/Utils";
|
import { fetchSubscription, getAppLogo, openInNewTab } from "../constant/Utils";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
function Login() {
|
function Login() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
@@ -1063,47 +1060,30 @@ function Login() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div className="bg-white">
|
<div>
|
||||||
<Title title={"Login Page"} />
|
<Title title={"Login Page"} />
|
||||||
{state.loading && (
|
{state.loading && (
|
||||||
<div
|
<div
|
||||||
aria-live="assertive"
|
aria-live="assertive"
|
||||||
style={{
|
className="fixed w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-50"
|
||||||
position: "fixed",
|
|
||||||
width: "100vw",
|
|
||||||
height: "100vh",
|
|
||||||
backgroundColor: "rgba(0,0,0,0.2)",
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
zIndex: 2
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<div
|
<Loader />
|
||||||
role="status"
|
|
||||||
style={{
|
|
||||||
position: "fixed",
|
|
||||||
fontSize: "50px",
|
|
||||||
color: "#3ac9d6",
|
|
||||||
top: "50%",
|
|
||||||
left: "50%",
|
|
||||||
transform: "translate(-50%, -50%)"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
>
|
|
||||||
<span className="sr-only">Loading...</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{appInfo && appInfo.appId ? (
|
{appInfo && appInfo.appId ? (
|
||||||
<>
|
<>
|
||||||
<div aria-labelledby="loginHeading" role="region">
|
<div
|
||||||
<div className="md:m-10 lg:m-16 md:p-4 lg:p-10 p-4 bg-[#ffffff] md:border-[1px] md:border-gray-400 ">
|
aria-labelledby="loginHeading"
|
||||||
|
role="region"
|
||||||
|
className="md:p-10 lg:p-16"
|
||||||
|
>
|
||||||
|
<div className="md:p-4 lg:p-10 p-4 bg-base-100 text-base-content op-card">
|
||||||
<div className="w-[250px] h-[66px] inline-block overflow-hidden">
|
<div className="w-[250px] h-[66px] inline-block overflow-hidden">
|
||||||
{image && (
|
{image && (
|
||||||
<img
|
<img
|
||||||
src={image}
|
src={image}
|
||||||
className="object-contain h-full"
|
className="object-contain h-full"
|
||||||
alt="The image displays the OpenSign logo with a stylized blue square with an open corner, accompanied by the tagline Seal the Deal, Openly."
|
alt="applogo"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -1115,20 +1095,20 @@ function Login() {
|
|||||||
<legend className="text-[12px] text-[#878787]">
|
<legend className="text-[12px] text-[#878787]">
|
||||||
Login to your account
|
Login to your account
|
||||||
</legend>
|
</legend>
|
||||||
<div className="px-6 py-4 outline outline-1 outline-slate-300/50 my-2 rounded shadow-md">
|
<div className="w-full px-6 py-3 my-1 op-card bg-base-100 shadow-md outline outline-1 outline-slate-300/50">
|
||||||
<label className="block text-xs" htmlFor="email">
|
<label className="block text-xs" htmlFor="email">
|
||||||
Email
|
Email
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
id="email"
|
id="email"
|
||||||
type="text"
|
type="email"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
name="email"
|
name="email"
|
||||||
value={state.email}
|
value={state.email}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<hr className="my-2 border-none" />
|
<hr className="my-1 border-none" />
|
||||||
{!isLoginSSO && (
|
{!isLoginSSO && (
|
||||||
<>
|
<>
|
||||||
<label className="block text-xs" htmlFor="password">
|
<label className="block text-xs" htmlFor="password">
|
||||||
@@ -1140,18 +1120,14 @@ function Login() {
|
|||||||
type={
|
type={
|
||||||
state.passwordVisible ? "text" : "password"
|
state.passwordVisible ? "text" : "password"
|
||||||
}
|
}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
name="password"
|
name="password"
|
||||||
value={state.password}
|
value={state.password}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
className={`absolute top-[50%] right-[10px] -translate-y-[50%] cursor-pointer ${
|
className="absolute cursor-pointer top-[50%] right-[10px] -translate-y-[50%] text-base-content"
|
||||||
state.passwordVisible
|
|
||||||
? "text-[#007bff]"
|
|
||||||
: "text-black"
|
|
||||||
}`}
|
|
||||||
onClick={togglePasswordVisibility}
|
onClick={togglePasswordVisibility}
|
||||||
>
|
>
|
||||||
{state.passwordVisible ? (
|
{state.passwordVisible ? (
|
||||||
@@ -1166,45 +1142,40 @@ function Login() {
|
|||||||
<div className="relative mt-1">
|
<div className="relative mt-1">
|
||||||
<NavLink
|
<NavLink
|
||||||
to="/forgetpassword"
|
to="/forgetpassword"
|
||||||
className="text-[13px] text-[#002864] hover:underline underline-offset-1 focus:outline-none cursor-pointer ml-1"
|
className="text-[13px] op-link op-link-primary underline-offset-1 focus:outline-none ml-1"
|
||||||
>
|
>
|
||||||
Forgot Password?
|
Forgot Password?
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<div className="flex flex-col md:flex-row justify-between items-stretch gap-8 text-center text-xs font-bold mt-2">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-2 text-center text-xs font-bold mt-2">
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="rounded-sm bg-[#3ac9d6] text-white w-full py-3 shadow outline-none uppercase focus:ring-2 focus:ring-blue-600"
|
className="op-btn op-btn-primary"
|
||||||
disabled={state.loading}
|
disabled={state.loading}
|
||||||
>
|
>
|
||||||
{state.loading ? "Loading..." : "Login"}
|
{state.loading ? "Loading..." : "Login"}
|
||||||
</button>
|
</button>
|
||||||
<NavLink
|
<button
|
||||||
className="rounded-sm cursor-pointer bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] w-full py-3 shadow uppercase"
|
type="button"
|
||||||
to={
|
className="op-btn op-btn-accent"
|
||||||
location.search
|
disabled={state.loading}
|
||||||
? "/signup" + location.search
|
onClick={() =>
|
||||||
: "/signup"
|
navigate(
|
||||||
|
location.search
|
||||||
|
? "/signup" + location.search
|
||||||
|
: "/signup"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
style={width < 768 ? { textAlign: "center" } : {}}
|
|
||||||
>
|
>
|
||||||
Create Account
|
Create Account
|
||||||
</NavLink>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<br />
|
{(appInfo.googleClietId || isEnableSubscription) && (
|
||||||
{appInfo.googleClietId && (
|
<div className="op-divider my-4 text-sm">OR</div>
|
||||||
<div className="text-sm flex justify-center items-center">
|
|
||||||
<hr className="border-[1px] border-gray-300 w-full" />
|
|
||||||
<span className="px-2 text-gray-500 cursor-default">
|
|
||||||
OR
|
|
||||||
</span>
|
|
||||||
<hr className="border-[1px] border-gray-300 w-full" />
|
|
||||||
</div>
|
|
||||||
)}
|
)}
|
||||||
<br />
|
|
||||||
<div className="flex flex-col justify-center items-center gap-y-3">
|
<div className="flex flex-col justify-center items-center gap-y-3">
|
||||||
{/* {appInfo?.fbAppId && (
|
{/* {appInfo?.fbAppId && (
|
||||||
<LoginFacebook
|
<LoginFacebook
|
||||||
@@ -1248,18 +1219,18 @@ function Login() {
|
|||||||
<Alert type={state.alertType}>{state.alertMsg}</Alert>
|
<Alert type={state.alertType}>{state.alertMsg}</Alert>
|
||||||
</div>
|
</div>
|
||||||
<ModalUi isOpen={isModal} title="Additional Info" showClose={false}>
|
<ModalUi isOpen={isModal} title="Additional Info" showClose={false}>
|
||||||
<form className="px-4 py-3">
|
<form className="px-4 py-3 text-base-content">
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label
|
||||||
htmlFor="Company"
|
htmlFor="Company"
|
||||||
style={{ display: "flex" }}
|
style={{ display: "flex" }}
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
className="block text-xs text-gray-700 font-semibold"
|
||||||
>
|
>
|
||||||
Company <span style={{ fontSize: 13, color: "red" }}>*</span>
|
Company <span className="text-[red] text-[13px]">*</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
id="Company"
|
id="Company"
|
||||||
value={userDetails.Company}
|
value={userDetails.Company}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
@@ -1278,11 +1249,11 @@ function Login() {
|
|||||||
className="block text-xs text-gray-700 font-semibold"
|
className="block text-xs text-gray-700 font-semibold"
|
||||||
>
|
>
|
||||||
Job Title
|
Job Title
|
||||||
<span style={{ fontSize: 13, color: "red" }}>*</span>
|
<span className="text-[red] text-[13px]">*</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
id="JobTitle"
|
id="JobTitle"
|
||||||
value={userDetails.Destination}
|
value={userDetails.Destination}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
@@ -1294,23 +1265,18 @@ function Login() {
|
|||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4">
|
<div className="mt-4 gap-2 flex flex-row">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="px-3 py-1.5 text-white rounded shadow-md text-center focus:outline-none "
|
className="op-btn op-btn-primary"
|
||||||
onClick={(e) => handleSubmitbtn(e)}
|
onClick={(e) => handleSubmitbtn(e)}
|
||||||
style={{
|
|
||||||
marginRight: 10,
|
|
||||||
backgroundColor: modalSubmitBtnColor
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
Login
|
Login
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none"
|
className="op-btn op-btn-ghost"
|
||||||
onClick={handleCloseModal}
|
onClick={handleCloseModal}
|
||||||
style={{ width: 75, backgroundColor: modalCancelBtnColor }}
|
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
@@ -1320,15 +1286,11 @@ function Login() {
|
|||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<div
|
<div
|
||||||
style={{
|
aria-live="assertive"
|
||||||
position: "fixed",
|
className="fixed w-full h-full flex justify-center items-center z-50"
|
||||||
fontSize: "50px",
|
>
|
||||||
color: "#3ac9d6",
|
<Loader />
|
||||||
top: "50%",
|
</div>
|
||||||
left: "45%"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import { toDataUrl } from "../constant/Utils";
|
|||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import { appInfo } from "../constant/appinfo";
|
import { appInfo } from "../constant/appinfo";
|
||||||
import { SaveFileSize } from "../constant/saveFileSize";
|
import { SaveFileSize } from "../constant/saveFileSize";
|
||||||
|
import Alert from "../primitives/Alert";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
const ManageSign = () => {
|
const ManageSign = () => {
|
||||||
const appName = appInfo.appname;
|
const appName = appInfo.appname;
|
||||||
const [penColor, setPenColor] = useState("blue");
|
const [penColor, setPenColor] = useState("blue");
|
||||||
@@ -17,7 +19,7 @@ const ManageSign = () => {
|
|||||||
const [isvalue, setIsValue] = useState(false);
|
const [isvalue, setIsValue] = useState(false);
|
||||||
const allColor = ["blue", "red", "black"];
|
const allColor = ["blue", "red", "black"];
|
||||||
const [isLoader, setIsLoader] = useState(true);
|
const [isLoader, setIsLoader] = useState(true);
|
||||||
const [isSuccess, setIsSuccess] = useState(false);
|
const [isAlert, setIsAlert] = useState({ type: "success", message: "" });
|
||||||
const [Initials, setInitials] = useState("");
|
const [Initials, setInitials] = useState("");
|
||||||
const [isInitials, setIsInitials] = useState(false);
|
const [isInitials, setIsInitials] = useState(false);
|
||||||
const [id, setId] = useState("");
|
const [id, setId] = useState("");
|
||||||
@@ -185,12 +187,20 @@ const ManageSign = () => {
|
|||||||
updateSign.set("UserId", userId);
|
updateSign.set("UserId", userId);
|
||||||
const res = await updateSign.save();
|
const res = await updateSign.save();
|
||||||
setIsLoader(false);
|
setIsLoader(false);
|
||||||
setIsSuccess(true);
|
setIsAlert({
|
||||||
|
type: "success",
|
||||||
|
message: "Signature saved successfully."
|
||||||
|
});
|
||||||
|
setTimeout(() => setIsAlert({}), 2000);
|
||||||
return res;
|
return res;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
setIsLoader(false);
|
setIsLoader(false);
|
||||||
alert(`${err.message}`);
|
setIsAlert({
|
||||||
|
type: "danger",
|
||||||
|
message: `${err.message}`
|
||||||
|
});
|
||||||
|
setTimeout(() => setIsAlert({}), 2000);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
@@ -201,12 +211,20 @@ const ManageSign = () => {
|
|||||||
updateSign.set("UserId", userId);
|
updateSign.set("UserId", userId);
|
||||||
const res = await updateSign.save();
|
const res = await updateSign.save();
|
||||||
setIsLoader(false);
|
setIsLoader(false);
|
||||||
setIsSuccess(true);
|
setIsAlert({
|
||||||
|
type: "success",
|
||||||
|
message: "Signature saved successfully."
|
||||||
|
});
|
||||||
|
setTimeout(() => setIsAlert({}), 2000);
|
||||||
return res;
|
return res;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
setIsLoader(false);
|
setIsLoader(false);
|
||||||
alert(`${err.message}`);
|
setIsAlert({
|
||||||
|
type: "success",
|
||||||
|
message: `${err.message}`
|
||||||
|
});
|
||||||
|
setTimeout(() => setIsAlert({}), 2000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -224,24 +242,13 @@ const ManageSign = () => {
|
|||||||
setIsValue(true);
|
setIsValue(true);
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div className="relative h-full bg-white flex shadow rounded overflow-auto">
|
<div className="relative h-full bg-base-100 text-base-content flex shadow rounded overflow-auto">
|
||||||
{isLoader && (
|
{isLoader && (
|
||||||
<div className="absolute bg-black bg-opacity-75 z-50 w-full h-full flex justify-center items-center">
|
<div className="absolute bg-black bg-opacity-30 z-50 w-full h-full flex justify-center items-center">
|
||||||
<div
|
<Loader />
|
||||||
style={{ color: "#3dd3e0" }}
|
|
||||||
className="loader-37 text-[45px]"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{isSuccess && (
|
|
||||||
<div
|
|
||||||
className="alert alert-success successBox"
|
|
||||||
role="alert"
|
|
||||||
onAnimationEnd={() => setIsSuccess(false)}
|
|
||||||
>
|
|
||||||
Signature saved successfully!
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
{isAlert?.message && <Alert type={isAlert.type}>{isAlert.message}</Alert>}
|
||||||
<div
|
<div
|
||||||
className="mainDiv"
|
className="mainDiv"
|
||||||
style={{
|
style={{
|
||||||
@@ -249,39 +256,13 @@ const ManageSign = () => {
|
|||||||
paddingRight: "10px"
|
paddingRight: "10px"
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ margin: 20 }}>
|
<div className="m-[20px]">
|
||||||
<div
|
<div className="font-[700] text-[15px] pb-[8px]">My Signature</div>
|
||||||
style={{
|
|
||||||
fontWeight: "700",
|
|
||||||
fontSize: 15,
|
|
||||||
color: "#000",
|
|
||||||
paddingBottom: 8
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
My Signature
|
|
||||||
</div>
|
|
||||||
<div className="signBlock mt-4">
|
<div className="signBlock mt-4">
|
||||||
<div>
|
<div>
|
||||||
<div style={{ position: "relative" }}>
|
<div className="relative">
|
||||||
<div
|
<div className="flex flex-row justify-between w-1/2 pl-[10px]">
|
||||||
style={{
|
<div className="flex flex-row justify-around items-center gap-[10px] mb-[10px]">
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
justifyContent: "space-between",
|
|
||||||
width: "50%",
|
|
||||||
paddingLeft: 10
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
justifyContent: "space-around",
|
|
||||||
alignItems: "center",
|
|
||||||
gap: 10,
|
|
||||||
marginBottom: 10
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<>
|
<>
|
||||||
<span
|
<span
|
||||||
onClick={() => handleSignatureBtn()}
|
onClick={() => handleSignatureBtn()}
|
||||||
@@ -307,24 +288,14 @@ const ManageSign = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ position: "relative" }}>
|
<div className="relative">
|
||||||
<div>
|
<div>
|
||||||
{image ? (
|
{image ? (
|
||||||
<div
|
<div className="signatureCanvas relative border-[2px] border-[#888]">
|
||||||
style={{
|
|
||||||
position: "relative",
|
|
||||||
border: "2px solid #888"
|
|
||||||
}}
|
|
||||||
className="signatureCanvas"
|
|
||||||
>
|
|
||||||
<img
|
<img
|
||||||
alt="preview image"
|
alt="preview image"
|
||||||
src={image}
|
src={image}
|
||||||
style={{
|
className="w-full h-full object-contain"
|
||||||
width: "100%",
|
|
||||||
height: "100%",
|
|
||||||
objectFit: "contain"
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
@@ -366,10 +337,10 @@ const ManageSign = () => {
|
|||||||
key === 0 && penColor === "blue"
|
key === 0 && penColor === "blue"
|
||||||
? "2px solid blue"
|
? "2px solid blue"
|
||||||
: key === 1 && penColor === "red"
|
: key === 1 && penColor === "red"
|
||||||
? "2px solid red"
|
? "2px solid red"
|
||||||
: key === 2 && penColor === "black"
|
: key === 2 && penColor === "black"
|
||||||
? "2px solid black"
|
? "2px solid black"
|
||||||
: "2px solid white"
|
: "2px solid white"
|
||||||
}}
|
}}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (key === 0) {
|
if (key === 0) {
|
||||||
@@ -474,10 +445,10 @@ const ManageSign = () => {
|
|||||||
key === 0 && initialPen === "blue"
|
key === 0 && initialPen === "blue"
|
||||||
? "2px solid blue"
|
? "2px solid blue"
|
||||||
: key === 1 && initialPen === "red"
|
: key === 1 && initialPen === "red"
|
||||||
? "2px solid red"
|
? "2px solid red"
|
||||||
: key === 2 && initialPen === "black"
|
: key === 2 && initialPen === "black"
|
||||||
? "2px solid black"
|
? "2px solid black"
|
||||||
: "2px solid white"
|
: "2px solid white"
|
||||||
}}
|
}}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (key === 0) {
|
if (key === 0) {
|
||||||
@@ -509,20 +480,11 @@ const ManageSign = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/* {!warning && (
|
|
||||||
<div className="warning signWarning" style={{ fontSize: 12 }}>
|
|
||||||
<i
|
|
||||||
className="fas fa-exclamation-circle"
|
|
||||||
style={{ color: "#fab005", fontSize: 15 }}
|
|
||||||
></i>{" "}
|
|
||||||
Please upload signature/Image
|
|
||||||
</div>
|
|
||||||
)} */}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ paddingTop: 10 }}>
|
<div style={{ paddingTop: 10 }}>
|
||||||
<button
|
<button
|
||||||
className="customBtn successBtn"
|
className="op-btn op-btn-primary"
|
||||||
onClick={(e) => handleSubmit(e)}
|
onClick={(e) => handleSubmit(e)}
|
||||||
>
|
>
|
||||||
save
|
save
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import React, { useEffect, useState, useRef } from "react";
|
import React, { useEffect, useState, useRef } from "react";
|
||||||
import "../styles/opensigndrive.css";
|
import "../styles/opensigndrive.css";
|
||||||
import loader from "../assets/images/loader2.gif";
|
import { iconColor } from "../constant/const";
|
||||||
import { themeColor, iconColor } from "../constant/const";
|
|
||||||
import { getDrive } from "../constant/Utils";
|
import { getDrive } from "../constant/Utils";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import Title from "../components/Title";
|
import Title from "../components/Title";
|
||||||
@@ -10,27 +9,15 @@ import ModalUi from "../primitives/ModalUi";
|
|||||||
import TourContentWithBtn from "../primitives/TourContentWithBtn";
|
import TourContentWithBtn from "../primitives/TourContentWithBtn";
|
||||||
import Tour from "reactour";
|
import Tour from "reactour";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const DriveBody = React.lazy(() =>
|
const DriveBody = React.lazy(
|
||||||
import("../components/opensigndrive/DriveBody")
|
() => import("../components/opensigndrive/DriveBody")
|
||||||
);
|
);
|
||||||
const Loader = () => {
|
const AppLoader = () => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div className="h-[100vh] flex justify-center items-center">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -279,7 +266,8 @@ function Opensigndrive() {
|
|||||||
setNewFolderName(value);
|
setNewFolderName(value);
|
||||||
};
|
};
|
||||||
//function for create folder
|
//function for create folder
|
||||||
const handleAddFolder = async () => {
|
const handleAddFolder = async (e) => {
|
||||||
|
e.preventDefault();
|
||||||
if (newFolderName) {
|
if (newFolderName) {
|
||||||
setIsFolderLoader(true);
|
setIsFolderLoader(true);
|
||||||
const getParentObjId = folderName[folderName.length - 1];
|
const getParentObjId = folderName[folderName.length - 1];
|
||||||
@@ -450,21 +438,10 @@ function Opensigndrive() {
|
|||||||
<React.Fragment key={id}>
|
<React.Fragment key={id}>
|
||||||
<span
|
<span
|
||||||
onClick={() => handleRoute(id, folderData)}
|
onClick={() => handleRoute(id, folderData)}
|
||||||
style={{
|
className="text-[#a64b4e] font-normal cursor-pointer"
|
||||||
color: "#a64b4e",
|
|
||||||
fontWeight: "400",
|
|
||||||
cursor: "pointer"
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{data.name}
|
{data.name}
|
||||||
<span
|
<span className="text-[#a64b4e] font-extralight cursor-pointer mx-[4px]">
|
||||||
style={{
|
|
||||||
color: "#a64b4e",
|
|
||||||
fontWeight: "200",
|
|
||||||
cursor: "pointer",
|
|
||||||
margin: "0 4px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
>
|
>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
@@ -545,411 +522,290 @@ function Opensigndrive() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<div style={{ backgroundColor: "white" }} className="folderComponent">
|
<div className="bg-base-100 text-base-content rounded-xl w-full">
|
||||||
<Title title={"OpenSign™ Drive"} drive={true} />
|
<Title title={"OpenSign™ Drive"} drive={true} />
|
||||||
|
<ModalUi
|
||||||
<div>
|
isOpen={isAlert.isShow}
|
||||||
<ModalUi
|
title={"Alert"}
|
||||||
headerColor={"#dc3545"}
|
handleClose={() => {
|
||||||
isOpen={isAlert.isShow}
|
setIsAlert({
|
||||||
title={"Alert"}
|
isShow: false,
|
||||||
handleClose={() => {
|
alertMessage: ""
|
||||||
setIsAlert({
|
});
|
||||||
isShow: false,
|
}}
|
||||||
alertMessage: ""
|
>
|
||||||
});
|
<div className="h-full p-[20px] pb-[15px]">
|
||||||
}}
|
<p>{isAlert.alertMessage}</p>
|
||||||
>
|
<div className="h-[1px] bg-[#9f9f9f] w-full my-[15px]"></div>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<button
|
||||||
<p>{isAlert.alertMessage}</p>
|
onClick={() =>
|
||||||
|
setIsAlert({
|
||||||
<div
|
isShow: false,
|
||||||
style={{
|
alertMessage: ""
|
||||||
height: "1px",
|
})
|
||||||
backgroundColor: "#9f9f9f",
|
}
|
||||||
width: "100%",
|
type="button"
|
||||||
marginTop: "15px",
|
className="op-btn op-btn-neutral op-btn-sm"
|
||||||
marginBottom: "15px"
|
>
|
||||||
}}
|
Close
|
||||||
></div>
|
</button>
|
||||||
<button
|
</div>
|
||||||
onClick={() =>
|
</ModalUi>
|
||||||
setIsAlert({
|
<ModalUi
|
||||||
isShow: false,
|
isOpen={isFolder}
|
||||||
alertMessage: ""
|
title={"Add New Folder"}
|
||||||
})
|
handleClose={oncloseFolder}
|
||||||
}
|
>
|
||||||
type="button"
|
<div className="h-full p-[20px] pt-[10px] pb-[15px]">
|
||||||
className="finishBtn cancelBtn"
|
{folderLoader ? (
|
||||||
|
<div className="h-[200px] flex justify-center items-center">
|
||||||
|
<Loader />
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<form
|
||||||
|
onSubmit={handleAddFolder}
|
||||||
|
className="flex flex-col text-base-content"
|
||||||
>
|
>
|
||||||
Close
|
<label className="py-[8px] text-[15px] font-[400] mb-0">
|
||||||
</button>
|
Name
|
||||||
</div>
|
<span className="text-[red]">*</span>
|
||||||
</ModalUi>
|
</label>
|
||||||
<ModalUi
|
<input
|
||||||
isOpen={isFolder}
|
required
|
||||||
title={"Add New Folder"}
|
className="op-input op-input-bordered op-input-sm"
|
||||||
handleClose={oncloseFolder}
|
type="text"
|
||||||
>
|
value={newFolderName}
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
onChange={(e) => handleFolderName(e)}
|
||||||
{folderLoader ? (
|
/>
|
||||||
<div
|
<span className="text-[red] text-[12px] mt-[6px]">{error}</span>
|
||||||
style={{
|
<div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div>
|
||||||
height: "200px",
|
<div className="flex flex-row">
|
||||||
display: "flex",
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
flexDirection: "column",
|
Add
|
||||||
justifyContent: "center",
|
</button>
|
||||||
alignItems: "center"
|
<button
|
||||||
}}
|
type="button"
|
||||||
>
|
className="op-btn op-btn-ghost ml-1"
|
||||||
<img
|
onClick={oncloseFolder}
|
||||||
alt="loader img"
|
>
|
||||||
src={loader}
|
Close
|
||||||
style={{ width: "50px", height: "50px" }}
|
</button>
|
||||||
/>
|
|
||||||
<span style={{ fontSize: "13px", color: "gray" }}>
|
|
||||||
Loading...
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
</form>
|
||||||
<form
|
)}
|
||||||
onSubmit={(e) => {
|
</div>
|
||||||
e.preventDefault();
|
</ModalUi>
|
||||||
handleAddFolder();
|
{isLoading.isLoad ? (
|
||||||
}}
|
<div className="flex flex-col justify-center items-center h-[100vh] w-full">
|
||||||
style={{ display: "flex", flexDirection: "column" }}
|
<Loader />
|
||||||
>
|
<span className="text-[13px] text-[gray]">{isLoading.message}</span>
|
||||||
<label
|
</div>
|
||||||
style={{
|
) : handleError ? (
|
||||||
margin: "10px 0px 10px 0px",
|
<div className="flex justify-center items-center h-[100vh] w-full">
|
||||||
fontSize: "15px",
|
<span className="text-[20px] text-[gray]">{handleError}</span>
|
||||||
fontWeight: "400"
|
</div>
|
||||||
}}
|
) : (
|
||||||
>
|
<>
|
||||||
Name
|
<div className="flex flex-row justify-between items-center px-[25px] pt-[20px]">
|
||||||
<span style={{ color: "red" }}>*</span>
|
{tourData && (
|
||||||
</label>
|
<Tour
|
||||||
|
onRequestClose={closeTour}
|
||||||
<input
|
steps={tourData}
|
||||||
required
|
isOpen={isTour}
|
||||||
className="form-control inputStyle"
|
closeWithMask={false}
|
||||||
type="text"
|
scrollOffset={-100}
|
||||||
value={newFolderName}
|
rounded={5}
|
||||||
onChange={(e) => handleFolderName(e)}
|
/>
|
||||||
// className="addFolderInput"
|
|
||||||
/>
|
|
||||||
<span
|
|
||||||
style={{ color: "red", fontSize: "12px", marginTop: "6px" }}
|
|
||||||
>
|
|
||||||
{error}
|
|
||||||
</span>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<div style={{ display: "flex", flexDirection: "row" }}>
|
|
||||||
<button
|
|
||||||
style={{ background: themeColor }}
|
|
||||||
type="submit"
|
|
||||||
className="finishBtn"
|
|
||||||
>
|
|
||||||
Add
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className="finishBtn cancelBtn"
|
|
||||||
onClick={oncloseFolder}
|
|
||||||
>
|
|
||||||
Close
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
<div
|
||||||
</ModalUi>
|
data-tut="reactourFirst"
|
||||||
|
onMouseEnter={(e) => handleMouseEnter(e)}
|
||||||
{isLoading.isLoad ? (
|
ref={scrollRef}
|
||||||
<div
|
className="w-full whitespace-nowrap cursor-pointer select-none overflow-x-auto"
|
||||||
style={{
|
>
|
||||||
display: "flex",
|
{handleFolderTab(folderName)}
|
||||||
justifyContent: "center",
|
</div>
|
||||||
alignItems: "center",
|
<div className="dropMenuBD">
|
||||||
height: "100vh",
|
|
||||||
width: "100%",
|
|
||||||
flexDirection: "column"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
alt="loader img"
|
|
||||||
src={loader}
|
|
||||||
style={{ width: "80px", height: "80px" }}
|
|
||||||
/>
|
|
||||||
<span style={{ fontSize: "13px", color: "gray" }}>
|
|
||||||
{isLoading.message}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
) : handleError ? (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center",
|
|
||||||
height: "100vh",
|
|
||||||
width: "100%"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span style={{ fontSize: "20px", color: "gray" }}>
|
|
||||||
{handleError}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<div className="folderContainer">
|
|
||||||
{tourData && (
|
|
||||||
<Tour
|
|
||||||
onRequestClose={closeTour}
|
|
||||||
steps={tourData}
|
|
||||||
isOpen={isTour}
|
|
||||||
closeWithMask={false}
|
|
||||||
scrollOffset={-100}
|
|
||||||
rounded={5}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<div
|
<div
|
||||||
data-tut="reactourFirst"
|
id="folder-menu"
|
||||||
onMouseEnter={(e) => handleMouseEnter(e)}
|
className={
|
||||||
ref={scrollRef}
|
isNewFol ? "dropdown show dropDownStyle" : "dropdown"
|
||||||
style={{
|
}
|
||||||
width: "100%"
|
onClick={() => setIsNewFol(!isNewFol)}
|
||||||
}}
|
|
||||||
className="folderPath"
|
|
||||||
>
|
>
|
||||||
{handleFolderTab(folderName)}
|
<div className="sort" data-tut="reactourSecond">
|
||||||
</div>
|
<i
|
||||||
<div className="dropMenuBD">
|
className="fa fa-plus-square"
|
||||||
<div
|
aria-hidden="true"
|
||||||
id="folder-menu"
|
style={{ fontSize: "25px", color: `${iconColor}` }}
|
||||||
className={
|
></i>
|
||||||
isNewFol ? "dropdown show dropDownStyle" : "dropdown"
|
|
||||||
}
|
|
||||||
onClick={() => setIsNewFol(!isNewFol)}
|
|
||||||
>
|
|
||||||
<div className="sort" data-tut="reactourSecond">
|
|
||||||
<i
|
|
||||||
className="fa fa-plus-square"
|
|
||||||
aria-hidden="true"
|
|
||||||
style={{ fontSize: "25px", color: `${iconColor}` }}
|
|
||||||
></i>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
className={
|
|
||||||
isNewFol ? "dropdown-menu show" : "dropdown-menu"
|
|
||||||
}
|
|
||||||
aria-labelledby="dropdownMenuButton"
|
|
||||||
aria-expanded={isNewFol ? "true" : "false"}
|
|
||||||
>
|
|
||||||
{" "}
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "column"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
className="dropdown-item itemColor"
|
|
||||||
onClick={() => setIsFolder(true)}
|
|
||||||
>
|
|
||||||
<i
|
|
||||||
style={{ marginRight: "5px" }}
|
|
||||||
className="fa fa-plus"
|
|
||||||
aria-hidden="true"
|
|
||||||
></i>
|
|
||||||
Create folder
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
className="dropdown-item itemColor"
|
|
||||||
onClick={() => navigate("/form/sHAnZphf69")}
|
|
||||||
>
|
|
||||||
<i
|
|
||||||
style={{ marginRight: "5px" }}
|
|
||||||
className="fas fa-pen-nib"
|
|
||||||
></i>
|
|
||||||
Sign Yourself
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
className="dropdown-item itemColor"
|
|
||||||
onClick={() => navigate("/form/8mZzFxbG1z")}
|
|
||||||
>
|
|
||||||
{" "}
|
|
||||||
<i
|
|
||||||
style={{ marginRight: "5px" }}
|
|
||||||
className="fa fa-file-signature"
|
|
||||||
></i>
|
|
||||||
Request Signatures{" "}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
id="menu-container"
|
className={isNewFol ? "dropdown-menu show" : "dropdown-menu"}
|
||||||
className={isShowSort ? "dropdown show" : "dropdown"}
|
aria-labelledby="dropdownMenuButton"
|
||||||
onClick={() => setIsShowSort(!isShowSort)}
|
aria-expanded={isNewFol ? "true" : "false"}
|
||||||
>
|
>
|
||||||
<div
|
<div className="flex flex-col">
|
||||||
data-tut="reactourThird"
|
|
||||||
className=" sort "
|
|
||||||
data-toggle="dropdown"
|
|
||||||
>
|
|
||||||
<i
|
|
||||||
className="fa fa-sort-amount-asc"
|
|
||||||
aria-hidden="true"
|
|
||||||
style={{
|
|
||||||
marginRight: "5px",
|
|
||||||
fontSize: "14px",
|
|
||||||
color: `${iconColor}`
|
|
||||||
}}
|
|
||||||
></i>
|
|
||||||
<span
|
<span
|
||||||
style={{
|
className="dropdown-item itemColor"
|
||||||
fontSize: "15px",
|
onClick={() => setIsFolder(true)}
|
||||||
color: `${iconColor}`
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{selectedSort}
|
<i className="fa fa-plus mr-[5px]" aria-hidden="true"></i>
|
||||||
|
Create folder
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="dropdown-item itemColor"
|
||||||
|
onClick={() => navigate("/form/sHAnZphf69")}
|
||||||
|
>
|
||||||
|
<i className="fas fa-pen-nib mr-[5px"></i>
|
||||||
|
Sign Yourself
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="dropdown-item itemColor"
|
||||||
|
onClick={() => navigate("/form/8mZzFxbG1z")}
|
||||||
|
>
|
||||||
|
<i className="fa fa-file-signature mr-[5px"></i>
|
||||||
|
Request Signatures
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
|
||||||
className={
|
|
||||||
isShowSort ? "dropdown-menu show" : "dropdown-menu"
|
|
||||||
}
|
|
||||||
aria-labelledby="dropdownMenuButton"
|
|
||||||
aria-expanded={isShowSort ? "true" : "false"}
|
|
||||||
>
|
|
||||||
{sortingValue.map((value, ind) => {
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
key={ind}
|
|
||||||
onClick={() => {
|
|
||||||
setSelectedSort(value);
|
|
||||||
sortingData(value, null, pdfData);
|
|
||||||
}}
|
|
||||||
className="dropdown-item itemColor"
|
|
||||||
style={{
|
|
||||||
paddingLeft: selectedSort !== value && "33px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{selectedSort === value && (
|
|
||||||
<i
|
|
||||||
className="fa fa-check"
|
|
||||||
aria-hidden="true"
|
|
||||||
style={{ marginRight: "5px" }}
|
|
||||||
></i>
|
|
||||||
)}
|
|
||||||
{value}
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
|
|
||||||
<hr className="hrStyle" />
|
|
||||||
{sortOrder.map((order, ind) => {
|
|
||||||
return (
|
|
||||||
<span
|
|
||||||
key={ind}
|
|
||||||
onClick={() => {
|
|
||||||
setSortingOrder(order);
|
|
||||||
sortingData(null, order, pdfData);
|
|
||||||
}}
|
|
||||||
className="dropdown-item itemColor"
|
|
||||||
style={{
|
|
||||||
paddingLeft: sortingOrder !== order && "33px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{sortingOrder === order && (
|
|
||||||
<i
|
|
||||||
className="fa fa-check"
|
|
||||||
aria-hidden="true"
|
|
||||||
style={{ marginRight: "5px" }}
|
|
||||||
></i>
|
|
||||||
)}
|
|
||||||
{order}
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
id="menu-container"
|
||||||
|
className={isShowSort ? "dropdown show" : "dropdown"}
|
||||||
|
onClick={() => setIsShowSort(!isShowSort)}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
data-tut="reactourThird"
|
||||||
|
className="sort "
|
||||||
|
data-toggle="dropdown"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
className="fa fa-sort-amount-asc mr-[5px] text-[14px]"
|
||||||
|
aria-hidden="true"
|
||||||
|
style={{ color: `${iconColor}` }}
|
||||||
|
></i>
|
||||||
|
<span style={{ fontSize: "15px", color: `${iconColor}` }}>
|
||||||
|
{selectedSort}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className={
|
||||||
|
isShowSort ? "dropdown-menu show" : "dropdown-menu"
|
||||||
|
}
|
||||||
|
aria-labelledby="dropdownMenuButton"
|
||||||
|
aria-expanded={isShowSort ? "true" : "false"}
|
||||||
|
>
|
||||||
|
{sortingValue.map((value, ind) => {
|
||||||
|
return (
|
||||||
|
<span
|
||||||
|
key={ind}
|
||||||
|
onClick={() => {
|
||||||
|
setSelectedSort(value);
|
||||||
|
sortingData(value, null, pdfData);
|
||||||
|
}}
|
||||||
|
className="dropdown-item itemColor"
|
||||||
|
style={{
|
||||||
|
paddingLeft: selectedSort !== value && "33px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{selectedSort === value && (
|
||||||
|
<i
|
||||||
|
className="fa fa-check mr-[5px"
|
||||||
|
aria-hidden="true"
|
||||||
|
></i>
|
||||||
|
)}
|
||||||
|
{value}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
|
||||||
<div>
|
<hr className="hrStyle" />
|
||||||
{isList ? (
|
{sortOrder.map((order, ind) => {
|
||||||
<div className="sort" onClick={() => setIsList(!isList)}>
|
return (
|
||||||
<i
|
<span
|
||||||
onClick={() => setIsList(!isList)}
|
key={ind}
|
||||||
className="fa fa-th-large"
|
onClick={() => {
|
||||||
style={{ fontSize: "24px", color: `${iconColor}` }}
|
setSortingOrder(order);
|
||||||
aria-hidden="true"
|
sortingData(null, order, pdfData);
|
||||||
></i>
|
}}
|
||||||
</div>
|
className="dropdown-item itemColor"
|
||||||
) : (
|
style={{
|
||||||
<div
|
paddingLeft: sortingOrder !== order && "33px"
|
||||||
data-tut="reactourForth"
|
}}
|
||||||
className="sort"
|
>
|
||||||
|
{sortingOrder === order && (
|
||||||
|
<i
|
||||||
|
className="fa fa-check mr-[5px"
|
||||||
|
aria-hidden="true"
|
||||||
|
></i>
|
||||||
|
)}
|
||||||
|
{order}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{isList ? (
|
||||||
|
<div className="sort" onClick={() => setIsList(!isList)}>
|
||||||
|
<i
|
||||||
onClick={() => setIsList(!isList)}
|
onClick={() => setIsList(!isList)}
|
||||||
>
|
className="fa fa-th-large"
|
||||||
<i
|
style={{ fontSize: "24px", color: `${iconColor}` }}
|
||||||
className="fa fa-list"
|
aria-hidden="true"
|
||||||
aria-hidden="true"
|
></i>
|
||||||
style={{ fontSize: "23px", color: `${iconColor}` }}
|
</div>
|
||||||
></i>
|
) : (
|
||||||
</div>
|
<div
|
||||||
)}
|
data-tut="reactourForth"
|
||||||
</div>
|
className="sort"
|
||||||
|
onClick={() => setIsList(!isList)}
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
className="fa fa-list"
|
||||||
|
aria-hidden="true"
|
||||||
|
style={{ fontSize: "23px", color: `${iconColor}` }}
|
||||||
|
></i>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{pdfData && pdfData.length === 0 ? (
|
{pdfData && pdfData.length === 0 ? (
|
||||||
<div
|
<div className="flex justify-center items-center w-full h-[50vh]">
|
||||||
style={{
|
<span className="text-base-content font-bold">
|
||||||
display: "flex",
|
No Data Found!
|
||||||
justifyContent: "center",
|
</span>
|
||||||
alignItems: "center",
|
</div>
|
||||||
height: "50vh",
|
) : (
|
||||||
width: "100%"
|
<div data-tut="reactourFifth">
|
||||||
}}
|
<React.Suspense fallback={<AppLoader />}>
|
||||||
>
|
<DriveBody
|
||||||
<span style={{ fontWeight: "bold" }}>No Data Found!</span>
|
dataTutSixth="reactourSixth"
|
||||||
</div>
|
dataTutSeventh="reactourSeventh"
|
||||||
) : (
|
pdfData={pdfData}
|
||||||
<div data-tut="reactourFifth">
|
setFolderName={setFolderName}
|
||||||
<React.Suspense fallback={<Loader />}>
|
setIsLoading={setIsLoading}
|
||||||
<DriveBody
|
setDocId={setDocId}
|
||||||
dataTutSixth="reactourSixth"
|
getPdfDocumentList={getPdfDocumentList}
|
||||||
dataTutSeventh="reactourSeventh"
|
isDocId={docId}
|
||||||
pdfData={pdfData}
|
setPdfData={setPdfData}
|
||||||
setFolderName={setFolderName}
|
isList={isList}
|
||||||
setIsLoading={setIsLoading}
|
setIsAlert={setIsAlert}
|
||||||
setDocId={setDocId}
|
setSkip={setSkip}
|
||||||
getPdfDocumentList={getPdfDocumentList}
|
sortingData={sortingData}
|
||||||
isDocId={docId}
|
/>
|
||||||
setPdfData={setPdfData}
|
{loading && (
|
||||||
isList={isList}
|
<div className="text-center pb-[20px]">Loading...</div>
|
||||||
setIsAlert={setIsAlert}
|
)}
|
||||||
setSkip={setSkip}
|
</React.Suspense>
|
||||||
sortingData={sortingData}
|
</div>
|
||||||
/>
|
)}
|
||||||
{loading && (
|
</>
|
||||||
<div style={{ textAlign: "center" }}>Loading...</div>
|
)}
|
||||||
)}
|
|
||||||
</React.Suspense>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,11 @@ import Title from "../components/Title";
|
|||||||
|
|
||||||
const PageNotFound = ({ prefix }) => {
|
const PageNotFound = ({ prefix }) => {
|
||||||
return (
|
return (
|
||||||
<div className="flex items-center justify-center h-screen w-full bg-white rounded">
|
<div className="flex items-center justify-center h-screen w-full bg-base-100 text-base-content rounded">
|
||||||
<Title title={"Page Not Found"} />
|
<Title title={"Page Not Found"} />
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<h1 className="text-[60px] lg:text-[120px] font-semibold text-black">
|
<h1 className="text-[60px] lg:text-[120px] font-semibold">404</h1>
|
||||||
404
|
<p className="text-[30px] lg:text-[50px]">
|
||||||
</h1>
|
|
||||||
<p className="text-[30px] lg:text-[50px] text-black">
|
|
||||||
{prefix ? prefix : "Page"} Not Found
|
{prefix ? prefix : "Page"} Not Found
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { PDFDocument } from "pdf-lib";
|
|||||||
import "../styles/signature.css";
|
import "../styles/signature.css";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import loader from "../assets/images/loader2.gif";
|
|
||||||
import { DndProvider } from "react-dnd";
|
import { DndProvider } from "react-dnd";
|
||||||
import { HTML5Backend } from "react-dnd-html5-backend";
|
import { HTML5Backend } from "react-dnd-html5-backend";
|
||||||
import { useLocation, useNavigate, useParams } from "react-router-dom";
|
import { useLocation, useNavigate, useParams } from "react-router-dom";
|
||||||
@@ -35,7 +34,7 @@ import {
|
|||||||
handleDownloadCertificate,
|
handleDownloadCertificate,
|
||||||
darkenColor
|
darkenColor
|
||||||
} from "../constant/Utils";
|
} from "../constant/Utils";
|
||||||
import Loader from "../primitives/LoaderWithMsg";
|
import LoaderWithMsg from "../primitives/LoaderWithMsg";
|
||||||
import HandleError from "../primitives/HandleError";
|
import HandleError from "../primitives/HandleError";
|
||||||
import Header from "../components/pdf/PdfHeader";
|
import Header from "../components/pdf/PdfHeader";
|
||||||
import RenderPdf from "../components/pdf/RenderPdf";
|
import RenderPdf from "../components/pdf/RenderPdf";
|
||||||
@@ -46,6 +45,7 @@ import ModalUi from "../primitives/ModalUi";
|
|||||||
import VerifyEmail from "../components/pdf/VerifyEmail";
|
import VerifyEmail from "../components/pdf/VerifyEmail";
|
||||||
import TourContentWithBtn from "../primitives/TourContentWithBtn";
|
import TourContentWithBtn from "../primitives/TourContentWithBtn";
|
||||||
import { appInfo } from "../constant/appinfo";
|
import { appInfo } from "../constant/appinfo";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
function useQuery() {
|
function useQuery() {
|
||||||
return new URLSearchParams(useLocation().search);
|
return new URLSearchParams(useLocation().search);
|
||||||
}
|
}
|
||||||
@@ -170,7 +170,11 @@ function PdfRequestFiles() {
|
|||||||
const handleResend = async (e) => {
|
const handleResend = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
setOtpLoader(true);
|
setOtpLoader(true);
|
||||||
await handleSendOTP(Parse.User.current().getEmail());
|
const localuser = localStorage.getItem(
|
||||||
|
`Parse/${appInfo.appId}/currentUser`
|
||||||
|
);
|
||||||
|
const currentUser = JSON.parse(JSON.stringify(localuser));
|
||||||
|
await handleSendOTP(currentUser?.email);
|
||||||
setOtpLoader(false);
|
setOtpLoader(false);
|
||||||
alert("OTP sent on you email");
|
alert("OTP sent on you email");
|
||||||
};
|
};
|
||||||
@@ -178,10 +182,14 @@ function PdfRequestFiles() {
|
|||||||
const handleVerifyEmail = async (e) => {
|
const handleVerifyEmail = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
setOtpLoader(true);
|
setOtpLoader(true);
|
||||||
|
const localuser = localStorage.getItem(
|
||||||
|
`Parse/${appInfo.appId}/currentUser`
|
||||||
|
);
|
||||||
|
const currentUser = JSON.parse(JSON.stringify(localuser));
|
||||||
try {
|
try {
|
||||||
const resEmail = await Parse.Cloud.run("verifyemail", {
|
const resEmail = await Parse.Cloud.run("verifyemail", {
|
||||||
otp: otp,
|
otp: otp,
|
||||||
email: Parse.User.current().getEmail()
|
email: currentUser?.email
|
||||||
});
|
});
|
||||||
if (resEmail?.message === "Email is verified.") {
|
if (resEmail?.message === "Email is verified.") {
|
||||||
setIsEmailVerified(true);
|
setIsEmailVerified(true);
|
||||||
@@ -202,7 +210,11 @@ function PdfRequestFiles() {
|
|||||||
//`handleVerifyBtn` function is used to send otp on user mail
|
//`handleVerifyBtn` function is used to send otp on user mail
|
||||||
const handleVerifyBtn = async () => {
|
const handleVerifyBtn = async () => {
|
||||||
setIsVerifyModal(true);
|
setIsVerifyModal(true);
|
||||||
await handleSendOTP(Parse.User.current().getEmail());
|
const localuser = localStorage.getItem(
|
||||||
|
`Parse/${appInfo.appId}/currentUser`
|
||||||
|
);
|
||||||
|
const currentUser = JSON.parse(JSON.stringify(localuser));
|
||||||
|
await handleSendOTP(currentUser?.email);
|
||||||
};
|
};
|
||||||
async function checkIsSubscribed(extUserId, contactId) {
|
async function checkIsSubscribed(extUserId, contactId) {
|
||||||
const isGuestSign = location.pathname.includes("/load/") || false;
|
const isGuestSign = location.pathname.includes("/load/") || false;
|
||||||
@@ -497,7 +509,6 @@ function PdfRequestFiles() {
|
|||||||
const objectId = res[0].objectId;
|
const objectId = res[0].objectId;
|
||||||
setSignerUserId(objectId);
|
setSignerUserId(objectId);
|
||||||
const tourData = res[0].TourStatus && res[0].TourStatus;
|
const tourData = res[0].TourStatus && res[0].TourStatus;
|
||||||
|
|
||||||
if (tourData && tourData.length > 0) {
|
if (tourData && tourData.length > 0) {
|
||||||
setTourStatus(tourData);
|
setTourStatus(tourData);
|
||||||
setRequestSignTour(tourData[0]?.requestSign || false);
|
setRequestSignTour(tourData[0]?.requestSign || false);
|
||||||
@@ -1150,9 +1161,9 @@ function PdfRequestFiles() {
|
|||||||
|
|
||||||
await axios
|
await axios
|
||||||
.put(
|
.put(
|
||||||
`${localStorage.getItem("baseUrl")}classes/${localStorage.getItem(
|
`${localStorage.getItem(
|
||||||
"_appName"
|
"baseUrl"
|
||||||
)}_Document/${documentId}`,
|
)}classes/contracts_Document/${documentId}`,
|
||||||
data,
|
data,
|
||||||
{
|
{
|
||||||
headers: {
|
headers: {
|
||||||
@@ -1377,47 +1388,29 @@ function PdfRequestFiles() {
|
|||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{isLoading.isLoad ? (
|
{isLoading.isLoad ? (
|
||||||
<Loader isLoading={isLoading} />
|
<LoaderWithMsg isLoading={isLoading} />
|
||||||
) : handleError ? (
|
) : handleError ? (
|
||||||
<HandleError handleError={handleError} />
|
<HandleError handleError={handleError} />
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
{isUiLoading && (
|
{isUiLoading && (
|
||||||
<div
|
<div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80">
|
||||||
style={{
|
<Loader />
|
||||||
position: "absolute",
|
<span className="text-[13px] font-bold">
|
||||||
height: "100vh",
|
|
||||||
width: "100%",
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
flexDirection: "column",
|
|
||||||
alignItems: "center",
|
|
||||||
zIndex: "999",
|
|
||||||
backgroundColor: "#e6f2f2",
|
|
||||||
opacity: 0.8
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
alt="no img"
|
|
||||||
src={loader}
|
|
||||||
style={{ width: "100px", height: "100px" }}
|
|
||||||
/>
|
|
||||||
<span style={{ fontSize: "13px", fontWeight: "bold" }}>
|
|
||||||
This might take some time
|
This might take some time
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{isCelebration && (
|
{isCelebration && (
|
||||||
<div style={{ position: "relative", zIndex: "1000" }}>
|
<div className="relative z-[1000]">
|
||||||
<Confetti
|
<Confetti
|
||||||
width={window.innerWidth}
|
width={window.innerWidth}
|
||||||
height={window.innerHeight}
|
height={window.innerHeight}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div
|
<div
|
||||||
className="relative flex flex-col md:flex-row justify-between bg-[#ebebeb]"
|
className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"
|
||||||
style={{
|
style={{
|
||||||
pointerEvents:
|
pointerEvents:
|
||||||
isExpired ||
|
isExpired ||
|
||||||
@@ -1429,7 +1422,6 @@ function PdfRequestFiles() {
|
|||||||
>
|
>
|
||||||
{!requestSignTour && requestSignTourFunction()}
|
{!requestSignTour && requestSignTourFunction()}
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={isAlert.isShow}
|
isOpen={isAlert.isShow}
|
||||||
title={"Alert message"}
|
title={"Alert message"}
|
||||||
handleClose={() => {
|
handleClose={() => {
|
||||||
@@ -1439,28 +1431,15 @@ function PdfRequestFiles() {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px]">
|
||||||
<p>{isAlert.alertMessage}</p>
|
<p>{isAlert.alertMessage}</p>
|
||||||
|
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() =>
|
||||||
setIsAlert({
|
setIsAlert({ isShow: false, alertMessage: "" })
|
||||||
isShow: false,
|
}
|
||||||
alertMessage: ""
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
Ok
|
Ok
|
||||||
</button>
|
</button>
|
||||||
@@ -1514,63 +1493,44 @@ function PdfRequestFiles() {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={defaultSignImg ? themeColor : "#dc3545"}
|
|
||||||
isOpen={defaultSignAlert.isShow}
|
isOpen={defaultSignAlert.isShow}
|
||||||
title={"Auto sign"}
|
title={"Auto sign"}
|
||||||
handleClose={() => {
|
handleClose={() =>
|
||||||
setDefaultSignAlert({
|
setDefaultSignAlert({ isShow: false, alertMessage: "" })
|
||||||
isShow: false,
|
}
|
||||||
alertMessage: ""
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px]">
|
||||||
<p>{defaultSignAlert.alertMessage}</p>
|
<p>{defaultSignAlert.alertMessage}</p>
|
||||||
|
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
{defaultSignImg ? (
|
{defaultSignImg ? (
|
||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
onClick={() => addDefaultSignature()}
|
onClick={() => addDefaultSignature()}
|
||||||
style={{
|
|
||||||
background: themeColor
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
Yes
|
Yes
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() =>
|
||||||
setDefaultSignAlert({
|
setDefaultSignAlert({
|
||||||
isShow: false,
|
isShow: false,
|
||||||
alertMessage: ""
|
alertMessage: ""
|
||||||
});
|
})
|
||||||
}}
|
}
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-secondary"
|
||||||
>
|
>
|
||||||
Close
|
Close
|
||||||
</button>
|
</button>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() =>
|
||||||
setIsAlert({
|
setIsAlert({ isShow: false, alertMessage: "" })
|
||||||
isShow: false,
|
}
|
||||||
alertMessage: ""
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
Ok
|
Ok
|
||||||
</button>
|
</button>
|
||||||
@@ -1610,7 +1570,7 @@ function PdfRequestFiles() {
|
|||||||
"md:min-w-[440px] md:max-w-[400px]"
|
"md:min-w-[440px] md:max-w-[400px]"
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px] text-base-content">
|
||||||
{isCompleted?.message ? (
|
{isCompleted?.message ? (
|
||||||
<p>{isCompleted?.message}</p>
|
<p>{isCompleted?.message}</p>
|
||||||
) : (
|
) : (
|
||||||
@@ -1631,32 +1591,27 @@ function PdfRequestFiles() {
|
|||||||
setIsDownloading
|
setIsDownloading
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#08bc66]"
|
className="font-[500] text-[13px] mr-[5px] op-btn op-btn-secondary"
|
||||||
>
|
>
|
||||||
<i
|
<i
|
||||||
className="fa-solid fa-award py-[3px]"
|
className="fa-solid fa-award"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
></i>
|
></i>
|
||||||
<span className="hidden lg:block ml-1">
|
<span className="hidden lg:block">Certificate</span>
|
||||||
Certificate
|
|
||||||
</span>
|
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={(e) =>
|
onClick={(e) =>
|
||||||
handleToPrint(e, pdfUrl, setIsDownloading)
|
handleToPrint(e, pdfUrl, setIsDownloading)
|
||||||
}
|
}
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#188ae2]"
|
className="font-[500] text-[13px] mr-[5px] op-btn op-btn-neutral"
|
||||||
>
|
>
|
||||||
<i
|
<i className="fa fa-print" aria-hidden="true"></i>
|
||||||
className="fa fa-print py-[3px]"
|
<span className="hidden lg:block">Print</span>
|
||||||
aria-hidden="true"
|
|
||||||
></i>
|
|
||||||
<span className="hidden lg:block ml-1">Print</span>
|
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center shadow rounded-[3px] py-[3px] px-[11px] text-white font-[500] text-[13px] mr-[5px] bg-[#f14343]"
|
className="font-[500] text-[13px] mr-[5px] op-btn op-btn-primary"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
handleDownloadPdf(
|
handleDownloadPdf(
|
||||||
pdfDetails,
|
pdfDetails,
|
||||||
@@ -1666,12 +1621,10 @@ function PdfRequestFiles() {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<i
|
<i
|
||||||
className="fa fa-download py-[3px]"
|
className="fa fa-download"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
></i>
|
></i>
|
||||||
<span className="hidden lg:block ml-1">
|
<span className="hidden lg:block">Download</span>
|
||||||
Download
|
|
||||||
</span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -1679,10 +1632,7 @@ function PdfRequestFiles() {
|
|||||||
</ModalUi>
|
</ModalUi>
|
||||||
{isDownloading === "pdf" && (
|
{isDownloading === "pdf" && (
|
||||||
<div className="fixed z-[1000] inset-0 flex justify-center items-center bg-black bg-opacity-30">
|
<div className="fixed z-[1000] inset-0 flex justify-center items-center bg-black bg-opacity-30">
|
||||||
<div
|
<Loader />
|
||||||
style={{ fontSize: "45px", color: "#3dd3e0" }}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<ModalUi
|
<ModalUi
|
||||||
@@ -1778,63 +1728,37 @@ function PdfRequestFiles() {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div className="signerComponent">
|
<div className="hidden md:block w-[180px] h-full bg-base-100">
|
||||||
<div
|
<div
|
||||||
style={{ maxHeight: window.innerHeight - 70 + "px" }}
|
style={{ maxHeight: window.innerHeight - 70 + "px" }}
|
||||||
className="autoSignScroll"
|
className="overflow-y-auto hide-scrollbar"
|
||||||
>
|
>
|
||||||
{signedSigners.length > 0 && (
|
{signedSigners.length > 0 && (
|
||||||
<div data-tut="reactourSecond">
|
<div data-tut="reactourSecond">
|
||||||
<div
|
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
|
||||||
style={{ background: themeColor }}
|
|
||||||
className="signedStyle"
|
|
||||||
>
|
|
||||||
Signed by
|
Signed by
|
||||||
</div>
|
</div>
|
||||||
<div style={{ marginTop: "2px" }}>
|
<div className="mt-[2px]">
|
||||||
{signedSigners.map((obj, ind) => {
|
{signedSigners.map((obj, ind) => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
className="rounded-xl mx-1 flex flex-row items-center py-[10px] mt-1"
|
||||||
style={{
|
style={{
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center",
|
|
||||||
padding: "10px 0",
|
|
||||||
background: checkSignerBackColor(obj)
|
background: checkSignerBackColor(obj)
|
||||||
}}
|
}}
|
||||||
key={ind}
|
key={ind}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
className="signerStyle"
|
className="flex w-[30px] h-[30px] rounded-full justify-center items-center mx-1"
|
||||||
style={{
|
style={{
|
||||||
background: checkUserNameColor(obj),
|
background: checkUserNameColor(obj)
|
||||||
width: 30,
|
|
||||||
height: 30,
|
|
||||||
display: "flex",
|
|
||||||
borderRadius: 30 / 2,
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center",
|
|
||||||
margin: "0 10px 0 5px"
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span
|
<span className="text-[12px] text-center font-bold text-white uppercase">
|
||||||
style={{
|
|
||||||
fontSize: "12px",
|
|
||||||
textAlign: "center",
|
|
||||||
fontWeight: "bold",
|
|
||||||
color: "black",
|
|
||||||
textTransform: "uppercase"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{getFirstLetter(obj?.Name || obj?.Role)}
|
{getFirstLetter(obj?.Name || obj?.Role)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="flex flex-col">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "column"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span className="userName">
|
<span className="userName">
|
||||||
{obj?.Name || obj?.Role}
|
{obj?.Name || obj?.Role}
|
||||||
</span>
|
</span>
|
||||||
@@ -1851,61 +1775,30 @@ function PdfRequestFiles() {
|
|||||||
|
|
||||||
{unsignedSigners.length > 0 && (
|
{unsignedSigners.length > 0 && (
|
||||||
<div data-tut="reactourFirst">
|
<div data-tut="reactourFirst">
|
||||||
<div
|
<div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300">
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white",
|
|
||||||
padding: "5px",
|
|
||||||
fontFamily: "sans-serif",
|
|
||||||
marginTop: signedSigners.length > 0 && "20px"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Yet to sign
|
Yet to sign
|
||||||
</div>
|
</div>
|
||||||
<div style={{ marginTop: "5px" }}>
|
<div className="mt-[5px]">
|
||||||
{unsignedSigners.map((obj, ind) => {
|
{unsignedSigners.map((obj, ind) => {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
className="rounded-xl mx-1 flex flex-row items-center py-[10px] mt-1"
|
||||||
style={{
|
style={{
|
||||||
display: "flex",
|
|
||||||
flexDirection: "row",
|
|
||||||
alignItems: "center",
|
|
||||||
padding: "10px 0",
|
|
||||||
background: checkSignerBackColor(obj)
|
background: checkSignerBackColor(obj)
|
||||||
}}
|
}}
|
||||||
key={ind}
|
key={ind}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
className="signerStyle"
|
className="flex w-[30px] h-[30px] rounded-full justify-center items-center mx-1"
|
||||||
style={{
|
style={{
|
||||||
background: checkUserNameColor(obj),
|
background: checkUserNameColor(obj)
|
||||||
width: 30,
|
|
||||||
height: 30,
|
|
||||||
display: "flex",
|
|
||||||
borderRadius: 30 / 2,
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center",
|
|
||||||
margin: "0 10px 0 5px"
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span
|
<span className="text-[12px] text-center font-bold text-black uppercase">
|
||||||
style={{
|
|
||||||
fontSize: "12px",
|
|
||||||
textAlign: "center",
|
|
||||||
fontWeight: "bold",
|
|
||||||
color: "black",
|
|
||||||
textTransform: "uppercase"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{getFirstLetter(obj?.Name || obj?.email)}
|
{getFirstLetter(obj?.Name || obj?.email)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="flex flex-col">
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
flexDirection: "column"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span className="userName">
|
<span className="userName">
|
||||||
{obj?.Name || obj?.Role}
|
{obj?.Name || obj?.Role}
|
||||||
</span>
|
</span>
|
||||||
@@ -1936,34 +1829,21 @@ function PdfRequestFiles() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={validateAlert}
|
isOpen={validateAlert}
|
||||||
title={"Validation alert"}
|
title={"Validation alert"}
|
||||||
handleClose={() => {
|
handleClose={() => setValidateAlert(false)}
|
||||||
setValidateAlert(false);
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-[100%] p-[20px]">
|
||||||
<p>
|
<p>
|
||||||
The input does not meet the criteria set by the regular
|
The input does not meet the criteria set by the regular
|
||||||
expression.
|
expression.
|
||||||
</p>
|
</p>
|
||||||
|
<div className="h-[1px] bg-[#9f9f9f] w-full my-[15px]"></div>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
<button
|
||||||
onClick={() => setValidateAlert(false)}
|
onClick={() => setValidateAlert(false)}
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-ghost"
|
||||||
>
|
>
|
||||||
Close
|
Close
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { useNavigate, useLocation } from "react-router-dom";
|
|||||||
import { appInfo } from "../constant/appinfo";
|
import { appInfo } from "../constant/appinfo";
|
||||||
import { showTenant } from "../redux/reducers/ShowTenant";
|
import { showTenant } from "../redux/reducers/ShowTenant";
|
||||||
import { fetchAppInfo } from "../redux/reducers/infoReducer";
|
import { fetchAppInfo } from "../redux/reducers/infoReducer";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const PgSignUp = () => {
|
const PgSignUp = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -411,21 +412,8 @@ const PgSignUp = () => {
|
|||||||
<div className="bg-white">
|
<div className="bg-white">
|
||||||
<Title title={"Pgsignup page"} />
|
<Title title={"Pgsignup page"} />
|
||||||
{isLoader ? (
|
{isLoader ? (
|
||||||
<div
|
<div className="flex justify-center items-center h-[100vh]">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<form id="signup" className="pgsignup-content" onSubmit={handleSubmit}>
|
<form id="signup" className="pgsignup-content" onSubmit={handleSubmit}>
|
||||||
|
|||||||
@@ -10,9 +10,8 @@ import { useDrag, useDrop } from "react-dnd";
|
|||||||
import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage";
|
import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage";
|
||||||
import WidgetComponent from "../components/pdf/WidgetComponent";
|
import WidgetComponent from "../components/pdf/WidgetComponent";
|
||||||
import Tour from "reactour";
|
import Tour from "reactour";
|
||||||
import loader from "../assets/images/loader2.gif";
|
|
||||||
import { useLocation, useParams } from "react-router-dom";
|
import { useLocation, useParams } from "react-router-dom";
|
||||||
import Loader from "../primitives/LoaderWithMsg";
|
import LoaderWithMsg from "../primitives/LoaderWithMsg";
|
||||||
import HandleError from "../primitives/HandleError";
|
import HandleError from "../primitives/HandleError";
|
||||||
import SignerListPlace from "../components/pdf/SignerListPlace";
|
import SignerListPlace from "../components/pdf/SignerListPlace";
|
||||||
import Header from "../components/pdf/PdfHeader";
|
import Header from "../components/pdf/PdfHeader";
|
||||||
@@ -49,7 +48,8 @@ import { SaveFileSize } from "../constant/saveFileSize";
|
|||||||
import { EmailBody } from "../components/pdf/EmailBody";
|
import { EmailBody } from "../components/pdf/EmailBody";
|
||||||
import Upgrade from "../primitives/Upgrade";
|
import Upgrade from "../primitives/Upgrade";
|
||||||
import Alert from "../primitives/Alert";
|
import Alert from "../primitives/Alert";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
import mail_sent_gif from "../assets/gif/mail_sent.gif";
|
||||||
function PlaceHolderSign() {
|
function PlaceHolderSign() {
|
||||||
const editorRef = useRef();
|
const editorRef = useRef();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -1014,7 +1014,11 @@ function PlaceHolderSign() {
|
|||||||
className="flex flex-row justify-between items-center mb-1"
|
className="flex flex-row justify-between items-center mb-1"
|
||||||
key={ind}
|
key={ind}
|
||||||
>
|
>
|
||||||
{copied && <Alert type="success">Copied</Alert>}
|
{copied && (
|
||||||
|
<Alert type="success">
|
||||||
|
<div className="ml-3">Copied</div>
|
||||||
|
</Alert>
|
||||||
|
)}
|
||||||
<span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis ">
|
<span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis ">
|
||||||
{data.signerEmail}
|
{data.signerEmail}
|
||||||
</span>
|
</span>
|
||||||
@@ -1022,26 +1026,13 @@ function PlaceHolderSign() {
|
|||||||
<button
|
<button
|
||||||
onClick={() => copytoclipboard(data.url)}
|
onClick={() => copytoclipboard(data.url)}
|
||||||
type="button"
|
type="button"
|
||||||
className="flex flex-row items-center text-white font-[500]"
|
className="flex flex-row items-center op-link op-link-primary"
|
||||||
>
|
>
|
||||||
<i
|
<i className="fa-solid fa-link" aria-hidden="true"></i>
|
||||||
className="fa-solid fa-link underline text-blue-700"
|
<span className=" hidden md:block ml-1 ">Copy link</span>
|
||||||
aria-hidden="true"
|
|
||||||
></i>
|
|
||||||
<span className=" hidden md:block ml-1 underline text-blue-700">
|
|
||||||
Copy link
|
|
||||||
</span>
|
|
||||||
</button>
|
</button>
|
||||||
<RWebShare
|
<RWebShare data={{ url: data.url, title: "Sign url" }}>
|
||||||
data={{
|
<i className="fa-solid fa-share-from-square op-link op-link-secondary no-underline"></i>
|
||||||
url: data.url,
|
|
||||||
title: "Sign url"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i
|
|
||||||
className="fa-solid fa-share-from-square cursor-pointer "
|
|
||||||
style={{ color: themeColor }}
|
|
||||||
></i>
|
|
||||||
</RWebShare>
|
</RWebShare>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1633,32 +1624,18 @@ function PlaceHolderSign() {
|
|||||||
<Title title={state?.title ? state.title : "New Document"} />
|
<Title title={state?.title ? state.title : "New Document"} />
|
||||||
<DndProvider backend={HTML5Backend}>
|
<DndProvider backend={HTML5Backend}>
|
||||||
{isLoading.isLoad ? (
|
{isLoading.isLoad ? (
|
||||||
<Loader isLoading={isLoading} />
|
<LoaderWithMsg isLoading={isLoading} />
|
||||||
) : handleError ? (
|
) : handleError ? (
|
||||||
<HandleError handleError={handleError} />
|
<HandleError handleError={handleError} />
|
||||||
) : (
|
) : (
|
||||||
<div className="signatureContainer" ref={divRef}>
|
<div
|
||||||
|
className="op-card overflow-hidden flex flex-row justify-between bg-base-300 relative"
|
||||||
|
ref={divRef}
|
||||||
|
>
|
||||||
{isUiLoading && (
|
{isUiLoading && (
|
||||||
<div
|
<div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80">
|
||||||
style={{
|
<Loader />
|
||||||
position: "absolute",
|
<span className="text-[13px] font-bold">
|
||||||
height: "100vh",
|
|
||||||
width: "100%",
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
flexDirection: "column",
|
|
||||||
alignItems: "center",
|
|
||||||
zIndex: "999",
|
|
||||||
backgroundColor: "#e6f2f2",
|
|
||||||
opacity: 0.8
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
alt="no img"
|
|
||||||
src={loader}
|
|
||||||
style={{ width: "100px", height: "100px" }}
|
|
||||||
/>
|
|
||||||
<span style={{ fontSize: "13px", fontWeight: "bold" }}>
|
|
||||||
This might take some time
|
This might take some time
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -1704,11 +1681,6 @@ function PlaceHolderSign() {
|
|||||||
{/* this modal is used show alert set placeholder for all signers before send mail */}
|
{/* this modal is used show alert set placeholder for all signers before send mail */}
|
||||||
|
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={
|
|
||||||
isSendAlert.mssg === "sure" || isSendAlert.mssg === textWidget
|
|
||||||
? "#dc3545"
|
|
||||||
: isSendAlert.mssg === "confirm" && themeColor
|
|
||||||
}
|
|
||||||
isOpen={isSendAlert.alert}
|
isOpen={isSendAlert.alert}
|
||||||
title={
|
title={
|
||||||
isSendAlert.mssg === "sure" || isSendAlert.mssg === textWidget
|
isSendAlert.mssg === "sure" || isSendAlert.mssg === textWidget
|
||||||
@@ -1718,10 +1690,7 @@ function PlaceHolderSign() {
|
|||||||
handleClose={() => setIsSendAlert({})}
|
handleClose={() => setIsSendAlert({})}
|
||||||
showHeaderMessage={isSendAlert.mssg === "confirm"}
|
showHeaderMessage={isSendAlert.mssg === "confirm"}
|
||||||
>
|
>
|
||||||
<div
|
<div className="max-h-96 overflow-y-scroll scroll-hide p-[20px] text-base-content">
|
||||||
className="max-h-96 overflow-y-scroll scroll-hide"
|
|
||||||
style={{ padding: 20 }}
|
|
||||||
>
|
|
||||||
{isSendAlert.mssg === "sure" ? (
|
{isSendAlert.mssg === "sure" ? (
|
||||||
<span>
|
<span>
|
||||||
Please ensure there's at least one signature widget
|
Please ensure there's at least one signature widget
|
||||||
@@ -1732,85 +1701,67 @@ function PlaceHolderSign() {
|
|||||||
) : (
|
) : (
|
||||||
isSendAlert.mssg === "confirm" && (
|
isSendAlert.mssg === "confirm" && (
|
||||||
<>
|
<>
|
||||||
<>
|
{!isCustomize && (
|
||||||
{!isCustomize && (
|
<span>
|
||||||
<span>
|
Are you sure you want to send out this document for
|
||||||
Are you sure you want to send out this document
|
signatures?
|
||||||
for signatures?
|
</span>
|
||||||
</span>
|
)}
|
||||||
)}
|
{isCustomize &&
|
||||||
{isCustomize &&
|
(!isEnableSubscription || isSubscribe) && (
|
||||||
(!isEnableSubscription || isSubscribe) && (
|
<>
|
||||||
<>
|
<EmailBody
|
||||||
<EmailBody
|
editorRef={editorRef}
|
||||||
editorRef={editorRef}
|
requestBody={requestBody}
|
||||||
requestBody={requestBody}
|
requestSubject={requestSubject}
|
||||||
requestSubject={requestSubject}
|
handleOnchangeRequest={handleOnchangeRequest}
|
||||||
handleOnchangeRequest={handleOnchangeRequest}
|
setRequestSubject={setRequestSubject}
|
||||||
setRequestSubject={setRequestSubject}
|
/>
|
||||||
/>
|
<div
|
||||||
<div
|
className="flex justify-end items-center gap-1 mt-2 op-link op-link-primary"
|
||||||
className={
|
onClick={() => {
|
||||||
"flex justify-end items-center gap-1 mt-2 underline text-blue-700 focus:outline-none cursor-pointer "
|
setRequestBody(defaultBody);
|
||||||
}
|
setRequestSubject(defaultSubject);
|
||||||
onClick={() => {
|
|
||||||
setRequestBody(defaultBody);
|
|
||||||
setRequestSubject(defaultSubject);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span>Reset to default</span>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
<div
|
|
||||||
className={
|
|
||||||
"flex flex-row md:items-center gap-2 md:gap-6 mt-2 "
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<div className="flex flex-row gap-2">
|
|
||||||
<button
|
|
||||||
onClick={() => sendEmailToSigners()}
|
|
||||||
className=" shadow rounded-[2px] py-[3px] px-[25px] font-[500] text-sm "
|
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Send
|
<span>Reset to default</span>
|
||||||
</button>
|
|
||||||
{isCustomize && (
|
|
||||||
<button
|
|
||||||
onClick={() => {
|
|
||||||
setIsCustomize(false);
|
|
||||||
}}
|
|
||||||
className=" shadow rounded-[2px] py-[3px] px-[25px] font-[500] text-sm border-[0.1px] border-gray-300"
|
|
||||||
>
|
|
||||||
Close
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{!isCustomize &&
|
|
||||||
(isSubscribe || !isEnableSubscription) && (
|
|
||||||
<span
|
|
||||||
className={
|
|
||||||
"cursor-pointer underline text-blue-700 focus:outline-none"
|
|
||||||
}
|
|
||||||
onClick={() => {
|
|
||||||
setIsCustomize(!isCustomize);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Cutomize Email
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{!isSubscribe && isEnableSubscription && (
|
|
||||||
<div className="mt-2">
|
|
||||||
<Upgrade message="Upgrade to customize Email" />
|
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<div className="flex flex-row md:items-center gap-2 md:gap-6 mt-2">
|
||||||
|
<div className="flex flex-row gap-2">
|
||||||
|
<button
|
||||||
|
onClick={() => sendEmailToSigners()}
|
||||||
|
className="op-btn op-btn-primary font-[500] text-sm shadow"
|
||||||
|
>
|
||||||
|
Send
|
||||||
|
</button>
|
||||||
|
{isCustomize && (
|
||||||
|
<button
|
||||||
|
onClick={() => setIsCustomize(false)}
|
||||||
|
className="op-btn op-btn-ghost font-[500] text-sm"
|
||||||
|
>
|
||||||
|
Close
|
||||||
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</>
|
|
||||||
|
{!isCustomize &&
|
||||||
|
(isSubscribe || !isEnableSubscription) && (
|
||||||
|
<span
|
||||||
|
className="op-link op-link-accent text-sm"
|
||||||
|
onClick={() => setIsCustomize(!isCustomize)}
|
||||||
|
>
|
||||||
|
Cutomize Email
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{!isSubscribe && isEnableSubscription && (
|
||||||
|
<div className="mt-2">
|
||||||
|
<Upgrade message="Upgrade to customize Email" />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
@@ -1818,28 +1769,15 @@ function PlaceHolderSign() {
|
|||||||
{isSendAlert.mssg === "confirm" && (
|
{isSendAlert.mssg === "confirm" && (
|
||||||
<>
|
<>
|
||||||
<div className="flex justify-center items-center mt-3">
|
<div className="flex justify-center items-center mt-3">
|
||||||
<span
|
<span className="h-[1px] w-[20%] bg-[#ccc]"></span>
|
||||||
style={{
|
|
||||||
height: 1,
|
|
||||||
width: "20%",
|
|
||||||
backgroundColor: "#ccc"
|
|
||||||
}}
|
|
||||||
></span>
|
|
||||||
<span className="ml-[5px] mr-[5px]">or</span>
|
<span className="ml-[5px] mr-[5px]">or</span>
|
||||||
<span
|
<span className="h-[1px] w-[20%] bg-[#ccc]"></span>
|
||||||
style={{
|
|
||||||
height: 1,
|
|
||||||
width: "20%",
|
|
||||||
backgroundColor: "#ccc"
|
|
||||||
}}
|
|
||||||
></span>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-3 mb-3">{handleShareList()}</div>
|
<div className="mt-3 mb-3">{handleShareList()}</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</ModalUi>
|
</ModalUi>
|
||||||
|
|
||||||
{/* this modal is used show send mail message and after send mail success message */}
|
{/* this modal is used show send mail message and after send mail success message */}
|
||||||
<ModalUi
|
<ModalUi
|
||||||
isOpen={isSend}
|
isOpen={isSend}
|
||||||
@@ -1849,77 +1787,61 @@ function PlaceHolderSign() {
|
|||||||
setSignerPos([]);
|
setSignerPos([]);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-[100%] p-[20px]">
|
||||||
{mailStatus === "success" ? (
|
{mailStatus === "success" ? (
|
||||||
<p>You have successfully sent mails to all recipients!</p>
|
<div className="text-center mb-[10px]">
|
||||||
|
<img
|
||||||
|
src={mail_sent_gif}
|
||||||
|
className="w-[120px] h-[120px] mx-auto"
|
||||||
|
/>
|
||||||
|
<p>You have successfully sent mails to all recipients!</p>
|
||||||
|
{isCurrUser && (
|
||||||
|
<p>Do you want to sign documents right now ?</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<p>Please setup mail adapter to send mail!</p>
|
<p>Please setup mail adapter to send mail!</p>
|
||||||
)}
|
)}
|
||||||
{isCurrUser && (
|
{!mailStatus && (
|
||||||
<p>Do you want to sign documents right now ?</p>
|
<div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div>
|
||||||
)}
|
)}
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
{isCurrUser && (
|
{isCurrUser && (
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => handleRecipientSign()}
|
||||||
handleRecipientSign();
|
|
||||||
}}
|
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn"
|
className="op-btn op-btn-primary mr-1"
|
||||||
>
|
>
|
||||||
Yes
|
Yes
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setIsSend(false);
|
setIsSend(false);
|
||||||
setSignerPos([]);
|
setSignerPos([]);
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-ghost"
|
||||||
>
|
>
|
||||||
{isCurrUser ? "No" : "Close"}
|
{isCurrUser ? "No" : "Close"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ModalUi>
|
</ModalUi>
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={isShowEmail}
|
isOpen={isShowEmail}
|
||||||
title={"signers alert"}
|
title={"signers alert"}
|
||||||
handleClose={() => {
|
handleClose={() => {
|
||||||
setIsShowEmail(false);
|
setIsShowEmail(false);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-[100%] p-[20px]">
|
||||||
<p>Please select signer for add placeholder!</p>
|
<p>Please select signer for add placeholder!</p>
|
||||||
<div
|
<div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div>
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setIsShowEmail(false);
|
setIsShowEmail(false);
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
Ok
|
Ok
|
||||||
</button>
|
</button>
|
||||||
@@ -2073,12 +1995,13 @@ function PlaceHolderSign() {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
<div className="signerComponent" aria-disabled>
|
<div
|
||||||
|
className="hidden md:block w-[180px] h-full bg-base-100"
|
||||||
|
aria-disabled
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{ maxHeight: window.innerHeight - 70 + "px" }}
|
||||||
maxHeight: window.innerHeight - 70 + "px"
|
className="overflow-y-auto hide-scrollbar"
|
||||||
}}
|
|
||||||
className="autoSignScroll"
|
|
||||||
>
|
>
|
||||||
<SignerListPlace
|
<SignerListPlace
|
||||||
signerPos={signerPos}
|
signerPos={signerPos}
|
||||||
@@ -2124,33 +2047,22 @@ function PlaceHolderSign() {
|
|||||||
</DndProvider>
|
</DndProvider>
|
||||||
<div>
|
<div>
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={isAlreadyPlace.status}
|
isOpen={isAlreadyPlace.status}
|
||||||
title={"Document Alert"}
|
title={"Document Alert"}
|
||||||
showClose={false}
|
showClose={false}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-[100%] p-[20px]">
|
||||||
<p>{isAlreadyPlace.message}</p>
|
<p>{isAlreadyPlace.message}</p>
|
||||||
|
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
<button
|
||||||
onClick={() => handleRecipientSign()}
|
onClick={() => handleRecipientSign()}
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
View
|
View
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ModalUi>
|
</ModalUi>
|
||||||
|
|
||||||
<LinkUserModal
|
<LinkUserModal
|
||||||
handleAddUser={handleAddUser}
|
handleAddUser={handleAddUser}
|
||||||
isAddUser={isAddUser}
|
isAddUser={isAddUser}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import checkmark from "../assets/images/checkmark.png";
|
|||||||
import plansArr from "../json/plansArr";
|
import plansArr from "../json/plansArr";
|
||||||
import Title from "../components/Title";
|
import Title from "../components/Title";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
|
import { openInNewTab } from "../constant/Utils";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
const listItemStyle = {
|
const listItemStyle = {
|
||||||
paddingLeft: "20px", // Add padding to create space for the image
|
paddingLeft: "20px", // Add padding to create space for the image
|
||||||
backgroundImage: `url(${checkmark})`, // Set your image as the list style image
|
backgroundImage: `url(${checkmark})`, // Set your image as the list style image
|
||||||
@@ -84,55 +86,33 @@ const PlanSubscriptions = () => {
|
|||||||
<>
|
<>
|
||||||
<Title title={"Subscriptions"} />
|
<Title title={"Subscriptions"} />
|
||||||
{isLoader ? (
|
{isLoader ? (
|
||||||
<div
|
<div className="flex items-center justify-center h-screen">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div
|
<div className="overflow-y-auto max-h-full">
|
||||||
style={{
|
|
||||||
backgroundColor: "white",
|
|
||||||
overflowY: "auto",
|
|
||||||
maxHeight: "100%"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div className="block my-2">
|
<div className="block my-2">
|
||||||
<div className="flex flex-col justify-center items-center w-full">
|
<div className="flex flex-col justify-center items-center w-full">
|
||||||
<div className="mb-6 mt-2 flex flex-row border-[1px] p-2 border-gray-300 rounded text-sm">
|
<div
|
||||||
<span
|
role="tablist"
|
||||||
|
className="op-tabs op-tabs-boxed bg-base-100 my-2 shadow-lg transition-all"
|
||||||
|
>
|
||||||
|
<a
|
||||||
onClick={() => setYearlyVisible(false)}
|
onClick={() => setYearlyVisible(false)}
|
||||||
className={`${
|
role="tab"
|
||||||
!yearlyVisible
|
className={`${!yearlyVisible ? "op-tab-active" : ""} op-tab`}
|
||||||
? "bg-[#002862] text-white"
|
|
||||||
: "bg-white text-black"
|
|
||||||
} px-4 py-1 rounded cursor-pointer`}
|
|
||||||
>
|
>
|
||||||
Monthly
|
Monthly
|
||||||
</span>
|
</a>
|
||||||
<span
|
<a
|
||||||
onClick={() => setYearlyVisible(true)}
|
onClick={() => setYearlyVisible(true)}
|
||||||
className={`${
|
role="tab"
|
||||||
yearlyVisible
|
className={`${yearlyVisible ? "op-tab-active" : ""} op-tab`}
|
||||||
? "bg-[#002862] text-white"
|
|
||||||
: "bg-white text-black"
|
|
||||||
} px-4 py-1 rounded cursor-pointer`}
|
|
||||||
>
|
>
|
||||||
Yearly (10% off)
|
Yearly (10% off)
|
||||||
</span>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<ul className="flex flex-col md:flex-row h-full bg-white justify-center">
|
<ul className="op-card flex flex-col md:flex-row h-full bg-base-100 justify-center shadow-lg">
|
||||||
{plansArr.map((item) => (
|
{plansArr.map((item) => (
|
||||||
<li
|
<li
|
||||||
className="flex flex-col text-center border-collapse border-[1px] border-gray-300 max-w-[250px]"
|
className="flex flex-col text-center border-collapse border-[1px] border-gray-300 max-w-[250px]"
|
||||||
@@ -207,9 +187,7 @@ const PlanSubscriptions = () => {
|
|||||||
<ul className="mx-1 p-3 text-left break-words text-sm list-none">
|
<ul className="mx-1 p-3 text-left break-words text-sm list-none">
|
||||||
{item.benefits.map((subitem, index) => (
|
{item.benefits.map((subitem, index) => (
|
||||||
<li style={listItemStyle} key={index} className="m-1">
|
<li style={listItemStyle} key={index} className="m-1">
|
||||||
<span style={{ position: "relative" }}>
|
<span className="relative">{subitem}</span>
|
||||||
{subitem}
|
|
||||||
</span>
|
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -217,22 +195,23 @@ const PlanSubscriptions = () => {
|
|||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm flex justify-center items-center">
|
<div className="text-sm flex justify-center items-center mt-3 mb-2">
|
||||||
<hr className="border-[1px] border-gray-300 w-[20%]" />
|
<hr className="border-[2px] border-gray-350 w-[20%]" />
|
||||||
<span className="px-2 text-gray-500 cursor-default">or</span>
|
<span className="px-2 text-base-content cursor-default">or</span>
|
||||||
<hr className="border-[1px] border-gray-300 w-[20%]" />
|
<hr className="border-[2px] border-gray-350 w-[20%]" />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col justify-center w-full items-center">
|
<div className="flex flex-col justify-center items-center">
|
||||||
<h3 className="text-[#002862] mt-1 mb-2">
|
<h3 className="text-[#002862] mt-1 mb-2">
|
||||||
Host it yourself for free
|
Host it yourself for free
|
||||||
</h3>
|
</h3>
|
||||||
<NavLink
|
<div
|
||||||
to={"https://github.com/OpenSignLabs/OpenSign"}
|
className="op-btn op-btn-primary w-[200px]"
|
||||||
className="bg-[#002862] w-[200px] text-center text-white py-2 rounded uppercase hover:no-underline hover:text-white cursor-pointer"
|
onClick={() =>
|
||||||
target={"_blank"}
|
openInNewTab("https://github.com/OpenSignLabs/OpenSign")
|
||||||
|
}
|
||||||
>
|
>
|
||||||
Visit Github
|
Visit Github
|
||||||
</NavLink>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { useParams } from "react-router-dom";
|
|||||||
import Title from "../components/Title";
|
import Title from "../components/Title";
|
||||||
import PageNotFound from "./PageNotFound";
|
import PageNotFound from "./PageNotFound";
|
||||||
import TourContentWithBtn from "../primitives/TourContentWithBtn";
|
import TourContentWithBtn from "../primitives/TourContentWithBtn";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const Report = () => {
|
const Report = () => {
|
||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
@@ -173,21 +174,8 @@ const Report = () => {
|
|||||||
<>
|
<>
|
||||||
<Title title={reportName} />
|
<Title title={reportName} />
|
||||||
{isLoader ? (
|
{isLoader ? (
|
||||||
<div
|
<div className="h-[100vh] flex justify-center items-center">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -3,16 +3,12 @@ import { useLocation, useNavigate } from "react-router-dom";
|
|||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { appInfo } from "../constant/appinfo";
|
import { appInfo } from "../constant/appinfo";
|
||||||
import {
|
import { isEnableSubscription } from "../constant/const";
|
||||||
isEnableSubscription,
|
|
||||||
modalCancelBtnColor,
|
|
||||||
modalSubmitBtnColor
|
|
||||||
} from "../constant/const";
|
|
||||||
import { fetchSubscription } from "../constant/Utils";
|
import { fetchSubscription } from "../constant/Utils";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
import { showTenant } from "../redux/reducers/ShowTenant";
|
import { showTenant } from "../redux/reducers/ShowTenant";
|
||||||
import ModalUi from "../primitives/ModalUi";
|
import ModalUi from "../primitives/ModalUi";
|
||||||
import loader from "../assets/images/loader2.gif";
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
const SSOVerify = () => {
|
const SSOVerify = () => {
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
@@ -291,36 +287,27 @@ const SSOVerify = () => {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className="w-full h-screen flex flex-col justify-center items-center text-sm md:text-xl ">
|
<div className="w-full h-screen flex flex-col justify-center items-center text-sm md:text-xl ">
|
||||||
{message === "Verifying SSO..." && (
|
{message === "Verifying SSO..." && <Loader />}
|
||||||
<img alt="loader" src={loader} className="w-[80px] h-[80px]" />
|
<div className="text-base-content">{message}</div>
|
||||||
)}
|
|
||||||
<div className="text-[gray]">{message}</div>
|
|
||||||
</div>
|
</div>
|
||||||
<ModalUi isOpen={isModal} title="Additional Info" showClose={false}>
|
<ModalUi isOpen={isModal} title="Additional Info" showClose={false}>
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
{isLoader && (
|
{isLoader && (
|
||||||
<div className="absolute w-full h-full bg-black bg-opacity-25 flex justify-center items-center">
|
<div className="absolute w-full h-full bg-black bg-opacity-25 flex justify-center items-center">
|
||||||
<div
|
<Loader />
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<form className="px-4 py-3" onSubmit={handleSubmitbtn}>
|
<form
|
||||||
|
className="px-4 py-3 text-base-content"
|
||||||
|
onSubmit={handleSubmitbtn}
|
||||||
|
>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="Company" className="block text-xs font-semibold">
|
||||||
htmlFor="Company"
|
Phone <span className="text-[13px] text-[red]">*</span>
|
||||||
style={{ display: "flex" }}
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Phone <span style={{ fontSize: 13, color: "red" }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="tel"
|
type="tel"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
id="Phone"
|
id="Phone"
|
||||||
value={userDetails.phone}
|
value={userDetails.phone}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
@@ -337,16 +324,12 @@ const SSOVerify = () => {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="Company" className="block text-xs font-semibold">
|
||||||
htmlFor="Company"
|
Company <span className="text-[13px] text-[red]">*</span>
|
||||||
style={{ display: "flex" }}
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Company <span style={{ fontSize: 13, color: "red" }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
id="Company"
|
id="Company"
|
||||||
value={userDetails.Company}
|
value={userDetails.Company}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
@@ -360,17 +343,13 @@ const SSOVerify = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<label
|
<label htmlFor="JobTitle" className="block text-xs font-semibold">
|
||||||
htmlFor="JobTitle"
|
|
||||||
style={{ display: "flex" }}
|
|
||||||
className="block text-xs text-gray-700 font-semibold"
|
|
||||||
>
|
|
||||||
Job Title
|
Job Title
|
||||||
<span style={{ fontSize: 13, color: "red" }}>*</span>
|
<span className="text-[13px] text-[red]">*</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
id="JobTitle"
|
id="JobTitle"
|
||||||
value={userDetails.Destination}
|
value={userDetails.Destination}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
@@ -384,21 +363,13 @@ const SSOVerify = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4">
|
<div className="mt-4">
|
||||||
<button
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
type="submit"
|
|
||||||
className="px-3 py-1.5 text-white rounded shadow-md text-center focus:outline-none "
|
|
||||||
style={{
|
|
||||||
marginRight: 10,
|
|
||||||
backgroundColor: modalSubmitBtnColor
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Login
|
Login
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="py-1.5 text-black border-[1px] border-[#ccc] shadow-md rounded focus:outline-none"
|
className="op-btn op-btn-ghost ml-2"
|
||||||
onClick={handleCloseModal}
|
onClick={handleCloseModal}
|
||||||
style={{ width: 75, backgroundColor: modalCancelBtnColor }}
|
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React, { useState, useEffect } from "react";
|
|||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import Title from "../components/Title";
|
import Title from "../components/Title";
|
||||||
import { useNavigate, NavLink, useLocation } from "react-router-dom";
|
import { useNavigate, useLocation } from "react-router-dom";
|
||||||
import login_img from "../assets/images/login_img.svg";
|
import login_img from "../assets/images/login_img.svg";
|
||||||
import { useWindowSize } from "../hook/useWindowSize";
|
import { useWindowSize } from "../hook/useWindowSize";
|
||||||
import Alert from "../primitives/Alert";
|
import Alert from "../primitives/Alert";
|
||||||
@@ -12,6 +12,7 @@ import { fetchAppInfo } from "../redux/reducers/infoReducer";
|
|||||||
import { showTenant } from "../redux/reducers/ShowTenant";
|
import { showTenant } from "../redux/reducers/ShowTenant";
|
||||||
import { isEnableSubscription } from "../constant/const";
|
import { isEnableSubscription } from "../constant/const";
|
||||||
import { getAppLogo, openInNewTab } from "../constant/Utils";
|
import { getAppLogo, openInNewTab } from "../constant/Utils";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
const Signup = () => {
|
const Signup = () => {
|
||||||
const { width } = useWindowSize();
|
const { width } = useWindowSize();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -501,68 +502,45 @@ const Signup = () => {
|
|||||||
setSpecialCharValid(/[!@#$%^&*()\-_=+{};:,<.>]/.test(newPassword));
|
setSpecialCharValid(/[!@#$%^&*()\-_=+{};:,<.>]/.test(newPassword));
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<div className="bg-white">
|
<div className="">
|
||||||
{state.loading && (
|
{state.loading && (
|
||||||
<div
|
<div className="fixed w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-50">
|
||||||
style={{
|
<Loader />
|
||||||
position: "fixed",
|
|
||||||
width: "100vw",
|
|
||||||
height: "100vh",
|
|
||||||
backgroundColor: "rgba(0,0,0,0.2)",
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
zIndex: 2
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
position: "fixed",
|
|
||||||
fontSize: "50px",
|
|
||||||
color: "#3ac9d6",
|
|
||||||
top: "50%",
|
|
||||||
left: "45%"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<Title title={"Signup page"} />
|
<Title title={"Signup page"} />
|
||||||
|
|
||||||
{appInfo && appInfo.applogo ? (
|
{appInfo && appInfo.applogo ? (
|
||||||
<div>
|
<div className="md:p-10 lg:p-16">
|
||||||
<div className="md:m-10 lg:m-16 md:p-4 lg:p-10 p-5 bg-[#ffffff] md:border-[1px] md:border-gray-400 ">
|
<div className="md:p-4 lg:p-10 p-4 bg-base-100 text-base-content op-card">
|
||||||
<div className="w-[250px] h-[66px] inline-block overflow-hidden">
|
<div className="w-[250px] h-[66px] inline-block overflow-hidden">
|
||||||
{image && (
|
{image && (
|
||||||
<img src={image} className="object-contain h-full" alt="logo" />
|
<img src={image} className="object-contain h-full" alt="logo" />
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-2">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-2">
|
||||||
<div className="">
|
<div>
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<h2 className="text-[30px] mt-6">Create Account !</h2>
|
<h2 className="text-[30px] mt-6">Create Account !</h2>
|
||||||
<div className="outline outline-1 outline-slate-300/50 shadow-md rounded my-4">
|
<div className="w-full my-4 op-card bg-base-100 shadow-md outline outline-1 outline-slate-300/50">
|
||||||
<div className="px-6 py-4 text-xs">
|
<div className="px-6 py-4 text-xs">
|
||||||
<label className="block ">
|
<label className="block ">
|
||||||
Name{" "}
|
Name <span className="text-[red] text-[13px]">*</span>
|
||||||
<span style={{ color: "red", fontSize: 13 }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={name}
|
value={name}
|
||||||
onChange={(e) => setName(e.target.value)}
|
onChange={(e) => setName(e.target.value)}
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<hr className="my-2 border-none" />
|
<hr className="my-2 border-none" />
|
||||||
<label>
|
<label>
|
||||||
Email{" "}
|
Email <span className="text-[red] text-[13px]">*</span>
|
||||||
<span style={{ color: "red", fontSize: 13 }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
id="email"
|
id="email"
|
||||||
type="text"
|
type="email"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs lowercase"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={email}
|
value={email}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
setEmail(e.target.value?.toLowerCase())
|
setEmail(e.target.value?.toLowerCase())
|
||||||
@@ -571,12 +549,11 @@ const Signup = () => {
|
|||||||
/>
|
/>
|
||||||
<hr className="my-2 border-none" />
|
<hr className="my-2 border-none" />
|
||||||
<label>
|
<label>
|
||||||
Phone{" "}
|
Phone <span className="text-[red] text-[13px]">*</span>
|
||||||
<span style={{ color: "red", fontSize: 13 }}>*</span>
|
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="tel"
|
type="tel"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={phone}
|
value={phone}
|
||||||
onChange={(e) => setPhone(e.target.value)}
|
onChange={(e) => setPhone(e.target.value)}
|
||||||
required
|
required
|
||||||
@@ -584,11 +561,11 @@ const Signup = () => {
|
|||||||
<hr className="my-2 border-none" />
|
<hr className="my-2 border-none" />
|
||||||
<label>
|
<label>
|
||||||
Company{" "}
|
Company{" "}
|
||||||
<span style={{ color: "red", fontSize: 13 }}>*</span>
|
<span className="text-[red] text-[13px]">*</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={company}
|
value={company}
|
||||||
onChange={(e) => setCompany(e.target.value)}
|
onChange={(e) => setCompany(e.target.value)}
|
||||||
required
|
required
|
||||||
@@ -596,11 +573,11 @@ const Signup = () => {
|
|||||||
<hr className="my-2 border-none" />
|
<hr className="my-2 border-none" />
|
||||||
<label>
|
<label>
|
||||||
Job Title{" "}
|
Job Title{" "}
|
||||||
<span style={{ color: "red", fontSize: 13 }}>*</span>
|
<span className="text-[red] text-[13px]">*</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
value={jobTitle}
|
value={jobTitle}
|
||||||
onChange={(e) => setJobTitle(e.target.value)}
|
onChange={(e) => setJobTitle(e.target.value)}
|
||||||
required
|
required
|
||||||
@@ -608,21 +585,19 @@ const Signup = () => {
|
|||||||
<hr className="my-2 border-none" />
|
<hr className="my-2 border-none" />
|
||||||
<label>
|
<label>
|
||||||
Password{" "}
|
Password{" "}
|
||||||
<span style={{ color: "red", fontSize: 13 }}>*</span>
|
<span className="text-[red] text-[13px]">*</span>
|
||||||
</label>
|
</label>
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<input
|
<input
|
||||||
type={showPassword ? "text" : "password"}
|
type={showPassword ? "text" : "password"}
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
name="password"
|
name="password"
|
||||||
value={password}
|
value={password}
|
||||||
onChange={(e) => handlePasswordChange(e)}
|
onChange={(e) => handlePasswordChange(e)}
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
className={`absolute top-[50%] right-[10px] -translate-y-[50%] cursor-pointer ${
|
className={`absolute top-[50%] right-[10px] -translate-y-[50%] cursor-pointer text-base-content`}
|
||||||
showPassword ? "text-[#007bff]" : "text-black"
|
|
||||||
}`}
|
|
||||||
onClick={togglePasswordVisibility}
|
onClick={togglePasswordVisibility}
|
||||||
>
|
>
|
||||||
{showPassword ? (
|
{showPassword ? (
|
||||||
@@ -665,6 +640,7 @@ const Signup = () => {
|
|||||||
<div className="mt-2.5 ml-1 flex flex-row items-center">
|
<div className="mt-2.5 ml-1 flex flex-row items-center">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
|
className="op-checkbox op-checkbox-sm"
|
||||||
id="termsandcondition"
|
id="termsandcondition"
|
||||||
checked={isAuthorize}
|
checked={isAuthorize}
|
||||||
onChange={(e) => setIsAuthorize(e.target.checked)}
|
onChange={(e) => setIsAuthorize(e.target.checked)}
|
||||||
@@ -690,28 +666,31 @@ const Signup = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col md:flex-row justify-between items-stretch gap-8 text-center text-xs font-bold mt-2">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-2 text-center text-xs font-bold mt-2">
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
className="rounded-sm bg-[#3ac9d6] text-white w-full py-3 shadow uppercase"
|
className="op-btn op-btn-primary"
|
||||||
disabled={state.loading}
|
disabled={state.loading}
|
||||||
>
|
>
|
||||||
{state.loading ? "Loading..." : "Register"}
|
{state.loading ? "Loading..." : "Register"}
|
||||||
</button>
|
</button>
|
||||||
<NavLink
|
<button
|
||||||
className="rounded-sm cursor-pointer bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] w-full py-3 shadow uppercase"
|
type="button"
|
||||||
to={location.search ? "/" + location.search : "/"}
|
className="op-btn op-btn-secondary"
|
||||||
style={width < 768 ? { textAlign: "center" } : {}}
|
disabled={state.loading}
|
||||||
|
onClick={() =>
|
||||||
|
navigate(location.search ? "/" + location.search : "/")
|
||||||
|
}
|
||||||
>
|
>
|
||||||
Login
|
Login
|
||||||
</NavLink>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{width >= 768 && (
|
{width >= 768 && (
|
||||||
<div className="self-center">
|
<div className="self-center">
|
||||||
<div className="mx-auto md:w-[300px] lg:w-[400px] xl:w-[500px]">
|
<div className="mx-auto md:w-[300px] lg:w-[400px] xl:w-[500px]">
|
||||||
<img src={login_img} alt="bisec" width="100%" />
|
<img src={login_img} alt="loader" width="100%" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -720,16 +699,9 @@ const Signup = () => {
|
|||||||
<Alert type={state.alertType}>{state.alertMsg}</Alert>
|
<Alert type={state.alertType}>{state.alertMsg}</Alert>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div
|
<div className="fixed w-full h-full flex justify-center items-center z-50">
|
||||||
style={{
|
<Loader />
|
||||||
position: "fixed",
|
</div>
|
||||||
fontSize: "50px",
|
|
||||||
color: "#3ac9d6",
|
|
||||||
top: "50%",
|
|
||||||
left: "45%"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,11 +2,10 @@ import React, { useState, useRef, useEffect } from "react";
|
|||||||
import { PDFDocument } from "pdf-lib";
|
import { PDFDocument } from "pdf-lib";
|
||||||
import "../styles/signature.css";
|
import "../styles/signature.css";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import { isEnableSubscription, themeColor } from "../constant/const";
|
import { isEnableSubscription } from "../constant/const";
|
||||||
import Confetti from "react-confetti";
|
import Confetti from "react-confetti";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import Loader from "../primitives/LoaderWithMsg";
|
import LoaderWithMsg from "../primitives/LoaderWithMsg";
|
||||||
import loader from "../assets/images/loader2.gif";
|
|
||||||
import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage";
|
import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage";
|
||||||
import { DndProvider } from "react-dnd";
|
import { DndProvider } from "react-dnd";
|
||||||
import { HTML5Backend } from "react-dnd-html5-backend";
|
import { HTML5Backend } from "react-dnd-html5-backend";
|
||||||
@@ -48,7 +47,7 @@ import Title from "../components/Title";
|
|||||||
import ModalUi from "../primitives/ModalUi";
|
import ModalUi from "../primitives/ModalUi";
|
||||||
import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption";
|
import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption";
|
||||||
import VerifyEmail from "../components/pdf/VerifyEmail";
|
import VerifyEmail from "../components/pdf/VerifyEmail";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
//For signYourself inProgress section signer can add sign and complete doc sign.
|
//For signYourself inProgress section signer can add sign and complete doc sign.
|
||||||
function SignYourSelf() {
|
function SignYourSelf() {
|
||||||
const [pdfDetails, setPdfDetails] = useState([]);
|
const [pdfDetails, setPdfDetails] = useState([]);
|
||||||
@@ -1093,43 +1092,29 @@ function SignYourSelf() {
|
|||||||
<DndProvider backend={HTML5Backend}>
|
<DndProvider backend={HTML5Backend}>
|
||||||
<Title title={"Self Sign"} />
|
<Title title={"Self Sign"} />
|
||||||
{isLoading.isLoad ? (
|
{isLoading.isLoad ? (
|
||||||
<Loader isLoading={isLoading} />
|
<LoaderWithMsg isLoading={isLoading} />
|
||||||
) : handleError ? (
|
) : handleError ? (
|
||||||
<HandleError handleError={handleError} />
|
<HandleError handleError={handleError} />
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
{isUiLoading && (
|
{isUiLoading && (
|
||||||
<div
|
<div className="absolute h-[100vh] w-full z-[999] flex flex-col justify-center items-start bg-[#e6f2f2] bg-opacity-80">
|
||||||
style={{
|
<Loader />
|
||||||
position: "absolute",
|
<span className="font-bold text-[13px]">
|
||||||
height: "100vh",
|
|
||||||
width: "100%",
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
flexDirection: "column",
|
|
||||||
alignItems: "center",
|
|
||||||
zIndex: "999",
|
|
||||||
backgroundColor: "#e6f2f2",
|
|
||||||
opacity: 0.8
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
alt="no img"
|
|
||||||
src={loader}
|
|
||||||
style={{ width: "100px", height: "100px" }}
|
|
||||||
/>
|
|
||||||
<span style={{ fontSize: "13px", fontWeight: "bold" }}>
|
|
||||||
This might take some time
|
This might take some time
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{isCelebration && (
|
{isCelebration && (
|
||||||
<div style={{ position: "relative", zIndex: "999" }}>
|
<div className="relative z-[999]">
|
||||||
<Confetti width={window.innerWidth} height={window.innerHeight} />
|
<Confetti width={window.innerWidth} height={window.innerHeight} />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="signatureContainer" ref={divRef}>
|
<div
|
||||||
|
className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"
|
||||||
|
ref={divRef}
|
||||||
|
>
|
||||||
{!isEmailVerified && (
|
{!isEmailVerified && (
|
||||||
<VerifyEmail
|
<VerifyEmail
|
||||||
isVerifyModal={isVerifyModal}
|
isVerifyModal={isVerifyModal}
|
||||||
@@ -1174,7 +1159,6 @@ function SignYourSelf() {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={isAlert.isShow}
|
isOpen={isAlert.isShow}
|
||||||
title={isAlert?.header || "Alert"}
|
title={isAlert?.header || "Alert"}
|
||||||
handleClose={() => {
|
handleClose={() => {
|
||||||
@@ -1184,7 +1168,7 @@ function SignYourSelf() {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="p-[20px] h-full">
|
||||||
<p>{isAlert.alertMessage}</p>
|
<p>{isAlert.alertMessage}</p>
|
||||||
</div>
|
</div>
|
||||||
</ModalUi>
|
</ModalUi>
|
||||||
@@ -1197,20 +1181,11 @@ function SignYourSelf() {
|
|||||||
setShowAlreadySignDoc({ status: false });
|
setShowAlreadySignDoc({ status: false });
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="p-[20px] h-full">
|
||||||
<p>{showAlreadySignDoc.mssg}</p>
|
<p>{showAlreadySignDoc.mssg}</p>
|
||||||
|
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
<button
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-ghost shadow-md"
|
||||||
onClick={() => setShowAlreadySignDoc({ status: false })}
|
onClick={() => setShowAlreadySignDoc({ status: false })}
|
||||||
>
|
>
|
||||||
Close
|
Close
|
||||||
@@ -1336,7 +1311,7 @@ function SignYourSelf() {
|
|||||||
maxHeight: window.innerHeight - 70 + "px",
|
maxHeight: window.innerHeight - 70 + "px",
|
||||||
backgroundColor: "white"
|
backgroundColor: "white"
|
||||||
}}
|
}}
|
||||||
className="autoSignScroll"
|
className="overflow-y-auto hide-scrollbar"
|
||||||
>
|
>
|
||||||
{!isCompleted ? (
|
{!isCompleted ? (
|
||||||
<div>
|
<div>
|
||||||
@@ -1348,7 +1323,6 @@ function SignYourSelf() {
|
|||||||
handleDivClick={handleDivClick}
|
handleDivClick={handleDivClick}
|
||||||
handleMouseLeave={handleMouseLeave}
|
handleMouseLeave={handleMouseLeave}
|
||||||
isDragSign={isDragSign}
|
isDragSign={isDragSign}
|
||||||
themeColor={themeColor}
|
|
||||||
dragStamp={dragStamp}
|
dragStamp={dragStamp}
|
||||||
dragRef={dragRef}
|
dragRef={dragRef}
|
||||||
isDragStamp={isDragStamp}
|
isDragStamp={isDragStamp}
|
||||||
@@ -1369,31 +1343,22 @@ function SignYourSelf() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={validateAlert}
|
isOpen={validateAlert}
|
||||||
title={"Validation alert"}
|
title={"Validation alert"}
|
||||||
handleClose={() => {
|
handleClose={() => {
|
||||||
setValidateAlert(false);
|
setValidateAlert(false);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="p-[20px] h-full">
|
||||||
<p>
|
<p>
|
||||||
The input does not meet the criteria set by the regular expression.
|
The input does not meet the criteria set by the regular expression.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div
|
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
<button
|
||||||
onClick={() => setValidateAlert(false)}
|
onClick={() => setValidateAlert(false)}
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-ghost shadow-md"
|
||||||
>
|
>
|
||||||
Close
|
Close
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage";
|
|||||||
import { useParams, useNavigate } from "react-router-dom";
|
import { useParams, useNavigate } from "react-router-dom";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import "../styles/signature.css";
|
import "../styles/signature.css";
|
||||||
import { isEnableSubscription, themeColor } from "../constant/const";
|
import { isEnableSubscription } from "../constant/const";
|
||||||
import { DndProvider } from "react-dnd";
|
import { DndProvider } from "react-dnd";
|
||||||
import { HTML5Backend } from "react-dnd-html5-backend";
|
import { HTML5Backend } from "react-dnd-html5-backend";
|
||||||
import { useDrag, useDrop } from "react-dnd";
|
import { useDrag, useDrop } from "react-dnd";
|
||||||
import WidgetComponent from "../components/pdf/WidgetComponent";
|
import WidgetComponent from "../components/pdf/WidgetComponent";
|
||||||
import Tour from "reactour";
|
import Tour from "reactour";
|
||||||
import Loader from "../primitives/LoaderWithMsg";
|
import LoaderWithMsg from "../primitives/LoaderWithMsg";
|
||||||
import HandleError from "../primitives/HandleError";
|
import HandleError from "../primitives/HandleError";
|
||||||
import SignerListPlace from "../components/pdf/SignerListPlace";
|
import SignerListPlace from "../components/pdf/SignerListPlace";
|
||||||
import Header from "../components/pdf/PdfHeader";
|
import Header from "../components/pdf/PdfHeader";
|
||||||
@@ -1207,11 +1207,14 @@ const TemplatePlaceholder = () => {
|
|||||||
<Title title={"Template"} />
|
<Title title={"Template"} />
|
||||||
<DndProvider backend={HTML5Backend}>
|
<DndProvider backend={HTML5Backend}>
|
||||||
{isLoading.isLoad ? (
|
{isLoading.isLoad ? (
|
||||||
<Loader isLoading={isLoading} />
|
<LoaderWithMsg isLoading={isLoading} />
|
||||||
) : handleError ? (
|
) : handleError ? (
|
||||||
<HandleError handleError={handleError} />
|
<HandleError handleError={handleError} />
|
||||||
) : (
|
) : (
|
||||||
<div className="signatureContainer" ref={divRef}>
|
<div
|
||||||
|
className="op-card overflow-hidden flex flex-row justify-between bg-base-300 relative"
|
||||||
|
ref={divRef}
|
||||||
|
>
|
||||||
{/* this component used for UI interaction and show their functionality */}
|
{/* this component used for UI interaction and show their functionality */}
|
||||||
{!checkTourStatus && (
|
{!checkTourStatus && (
|
||||||
//this tour component used in your html component where you want to put
|
//this tour component used in your html component where you want to put
|
||||||
@@ -1254,23 +1257,21 @@ const TemplatePlaceholder = () => {
|
|||||||
>
|
>
|
||||||
{/* this modal is used show alert set placeholder for all signers before send mail */}
|
{/* this modal is used show alert set placeholder for all signers before send mail */}
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={isSendAlert}
|
isOpen={isSendAlert}
|
||||||
title={"Fields required"}
|
title={"Fields required"}
|
||||||
handleClose={() => setIsSendAlert(false)}
|
handleClose={() => setIsSendAlert(false)}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px]">
|
||||||
<p>Please add at least one signature field for all roles.</p>
|
<p>Please add at least one signature field for all roles.</p>
|
||||||
</div>
|
</div>
|
||||||
</ModalUi>
|
</ModalUi>
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={!IsReceipent}
|
isOpen={!IsReceipent}
|
||||||
title={"Roles"}
|
title={"Roles"}
|
||||||
handleClose={() => setIsReceipent(true)}
|
handleClose={() => setIsReceipent(true)}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px] text-center font-medium">
|
||||||
<p>Please add a role</p>
|
<p>Please add roles first</p>
|
||||||
</div>
|
</div>
|
||||||
</ModalUi>
|
</ModalUi>
|
||||||
{/* this modal is used show send mail message and after send mail success message */}
|
{/* this modal is used show send mail message and after send mail success message */}
|
||||||
@@ -1279,32 +1280,18 @@ const TemplatePlaceholder = () => {
|
|||||||
title={"Create Document"}
|
title={"Create Document"}
|
||||||
handleClose={() => setIsCreateDocModal(false)}
|
handleClose={() => setIsCreateDocModal(false)}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px]">
|
||||||
<p>
|
<p>
|
||||||
Do you want to create a document using the template you just
|
Do you want to create a document using the template you just
|
||||||
created ?
|
created ?
|
||||||
</p>
|
</p>
|
||||||
<div
|
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
{currentEmail.length > 0 && (
|
{currentEmail.length > 0 && (
|
||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => handleCreateDocModal()}
|
||||||
handleCreateDocModal();
|
|
||||||
}}
|
|
||||||
style={{
|
|
||||||
background: themeColor,
|
|
||||||
color: "white"
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
Yes
|
Yes
|
||||||
</button>
|
</button>
|
||||||
@@ -1313,7 +1300,7 @@ const TemplatePlaceholder = () => {
|
|||||||
setIsCreateDocModal(false);
|
setIsCreateDocModal(false);
|
||||||
}}
|
}}
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-secondary ml-2"
|
||||||
>
|
>
|
||||||
No
|
No
|
||||||
</button>
|
</button>
|
||||||
@@ -1321,32 +1308,21 @@ const TemplatePlaceholder = () => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</ModalUi>
|
</ModalUi>
|
||||||
{isCreateDoc && <Loader isLoading={isLoading} />}
|
{isCreateDoc && <LoaderWithMsg isLoading={isLoading} />}
|
||||||
<ModalUi
|
<ModalUi
|
||||||
headerColor={"#dc3545"}
|
|
||||||
isOpen={isShowEmail}
|
isOpen={isShowEmail}
|
||||||
title={"signers alert"}
|
title={"signers alert"}
|
||||||
handleClose={() => {
|
handleClose={() => {
|
||||||
setIsShowEmail(false);
|
setIsShowEmail(false);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div style={{ height: "100%", padding: 20 }}>
|
<div className="h-full p-[20px]">
|
||||||
<p>Please select signer for add placeholder!</p>
|
<p>Please select signer for add placeholder!</p>
|
||||||
<div
|
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
|
||||||
style={{
|
|
||||||
height: "1px",
|
|
||||||
backgroundColor: "#9f9f9f",
|
|
||||||
width: "100%",
|
|
||||||
marginTop: "15px",
|
|
||||||
marginBottom: "15px"
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => setIsShowEmail(false)}
|
||||||
setIsShowEmail(false);
|
|
||||||
}}
|
|
||||||
type="button"
|
type="button"
|
||||||
className="finishBtn cancelBtn"
|
className="op-btn op-btn-primary"
|
||||||
>
|
>
|
||||||
Ok
|
Ok
|
||||||
</button>
|
</button>
|
||||||
@@ -1396,7 +1372,7 @@ const TemplatePlaceholder = () => {
|
|||||||
// signerObjId={signerObjId}
|
// signerObjId={signerObjId}
|
||||||
Id={uniqueId}
|
Id={uniqueId}
|
||||||
/>
|
/>
|
||||||
{/* pdf header which contain funish back button */}
|
{/* pdf header which contain finish, back button */}
|
||||||
<Header
|
<Header
|
||||||
completeBtnTitle={"Save"}
|
completeBtnTitle={"Save"}
|
||||||
isPlaceholder={true}
|
isPlaceholder={true}
|
||||||
@@ -1499,10 +1475,10 @@ const TemplatePlaceholder = () => {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
<div className="signerComponent">
|
<div className="hidden md:block w-[180px] h-full bg-base-100">
|
||||||
<div
|
<div
|
||||||
style={{ maxHeight: window.innerHeight - 70 + "px" }}
|
style={{ maxHeight: window.innerHeight - 70 + "px" }}
|
||||||
className="autoSignScroll"
|
className="overflow-y-auto hide-scrollbar"
|
||||||
>
|
>
|
||||||
<SignerListPlace
|
<SignerListPlace
|
||||||
isMailSend={isMailSend}
|
isMailSend={isMailSend}
|
||||||
|
|||||||
@@ -12,10 +12,11 @@ import sanitizeFileName from "../primitives/sanitizeFileName";
|
|||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import PremiumAlertHeader from "../primitives/PremiumAlertHeader";
|
import PremiumAlertHeader from "../primitives/PremiumAlertHeader";
|
||||||
import Tooltip from "../primitives/Tooltip";
|
import Tooltip from "../primitives/Tooltip";
|
||||||
import { isEnableSubscription, rejectBtn, submitBtn } from "../constant/const";
|
import { isEnableSubscription } from "../constant/const";
|
||||||
import { checkIsSubscribed, handleSendOTP } from "../constant/Utils";
|
import { checkIsSubscribed, handleSendOTP } from "../constant/Utils";
|
||||||
import Upgrade from "../primitives/Upgrade";
|
import Upgrade from "../primitives/Upgrade";
|
||||||
import ModalUi from "../primitives/ModalUi";
|
import ModalUi from "../primitives/ModalUi";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
function UserProfile() {
|
function UserProfile() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -296,37 +297,25 @@ function UserProfile() {
|
|||||||
// setPublicUserName(extendUser && extendUser?.[0]?.UserName);
|
// setPublicUserName(extendUser && extendUser?.[0]?.UserName);
|
||||||
setCompany(extendUser && extendUser?.[0]?.Company);
|
setCompany(extendUser && extendUser?.[0]?.Company);
|
||||||
setJobTitle(extendUser?.[0]?.JobTitle);
|
setJobTitle(extendUser?.[0]?.JobTitle);
|
||||||
|
setIsDisableDocId(extendUser?.[0]?.HeaderDocId);
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<Title title={"Profile"} />
|
<Title title={"Profile"} />
|
||||||
{isLoader ? (
|
{isLoader ? (
|
||||||
<div
|
<div className="h-[100vh] flex justify-center items-center">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex justify-center items-center w-full relative">
|
<div className="flex justify-center items-center w-full relative">
|
||||||
{/* {userNameError && (
|
{/* {userNameError && (
|
||||||
<div
|
<div
|
||||||
className={`z-[1000] fixed top-[50%] transform border-[1px] text-sm border-[#f0a8a8] bg-[#f4bebe] text-[#c42121] rounded py-[.75rem] px-[1.25rem]`}
|
className={`z-[1000] fixed top-[50%] transform border-[1px] text-sm border-[#f0a8a8] bg-[#f4bebe] text-[#c42121] rounded py-[.75rem] px-[1.25rem]`}
|
||||||
>
|
>
|
||||||
{userNameError}
|
{userNameError}
|
||||||
</div>
|
</div>
|
||||||
)} */}
|
)} */}
|
||||||
<div className="bg-white flex flex-col justify-center shadow rounded w-[450px]">
|
<div className="bg-base-100 text-base-content flex flex-col justify-center shadow rounded-xl w-[450px]">
|
||||||
<div className="flex flex-col justify-center items-center my-4">
|
<div className="flex flex-col justify-center items-center my-4">
|
||||||
<div className="w-[200px] h-[200px] overflow-hidden rounded-full">
|
<div className="w-[200px] h-[200px] overflow-hidden rounded-full">
|
||||||
<img
|
<img
|
||||||
@@ -338,7 +327,7 @@ function UserProfile() {
|
|||||||
{editmode && (
|
{editmode && (
|
||||||
<input
|
<input
|
||||||
type="file"
|
type="file"
|
||||||
className="max-w-[270px] text-sm py-1 px-2 mt-4 border-[1px] border-[#15b4e9] text-black rounded"
|
className="op-file-input op-file-input-bordered op-file-input-sm max-w-[270px] mt-4 text-sm"
|
||||||
accept="image/png, image/gif, image/jpeg"
|
accept="image/png, image/gif, image/jpeg"
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
let files = e.target.files;
|
let files = e.target.files;
|
||||||
@@ -364,7 +353,7 @@ function UserProfile() {
|
|||||||
<ul className="w-full flex flex-col p-2 text-sm">
|
<ul className="w-full flex flex-col p-2 text-sm">
|
||||||
<li
|
<li
|
||||||
className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all ${
|
className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all ${
|
||||||
editmode ? "py-1" : "py-2"
|
editmode ? "py-1.5" : "py-2"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<span className="font-semibold">Name:</span>{" "}
|
<span className="font-semibold">Name:</span>{" "}
|
||||||
@@ -372,7 +361,7 @@ function UserProfile() {
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
value={name}
|
value={name}
|
||||||
className="py-1 px-2 text-sm border-[1px] border-[#15b4e9] text-black rounded"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
|
||||||
onChange={(e) => SetName(e.target.value)}
|
onChange={(e) => SetName(e.target.value)}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -381,14 +370,14 @@ function UserProfile() {
|
|||||||
</li>
|
</li>
|
||||||
<li
|
<li
|
||||||
className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all ${
|
className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all ${
|
||||||
editmode ? "py-1" : "py-2"
|
editmode ? "py-1.5" : "py-2"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<span className="font-semibold">Phone:</span>{" "}
|
<span className="font-semibold">Phone:</span>{" "}
|
||||||
{editmode ? (
|
{editmode ? (
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="py-1 px-2 text-sm border-[1px] border-[#15b4e9] text-black rounded"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
|
||||||
onChange={(e) => SetPhone(e.target.value)}
|
onChange={(e) => SetPhone(e.target.value)}
|
||||||
value={Phone}
|
value={Phone}
|
||||||
/>
|
/>
|
||||||
@@ -402,7 +391,7 @@ function UserProfile() {
|
|||||||
</li>
|
</li>
|
||||||
<li
|
<li
|
||||||
className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all ${
|
className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all ${
|
||||||
editmode ? "py-1" : "py-2"
|
editmode ? "py-1.5" : "py-2"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<span className="font-semibold">Company:</span>{" "}
|
<span className="font-semibold">Company:</span>{" "}
|
||||||
@@ -410,7 +399,7 @@ function UserProfile() {
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
value={company}
|
value={company}
|
||||||
className="py-1 px-2 text-sm border-[1px] border-[#15b4e9] text-black rounded"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
|
||||||
onChange={(e) => setCompany(e.target.value)}
|
onChange={(e) => setCompany(e.target.value)}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -419,7 +408,7 @@ function UserProfile() {
|
|||||||
</li>
|
</li>
|
||||||
<li
|
<li
|
||||||
className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all ${
|
className={`flex justify-between items-center border-t-[1px] border-gray-300 break-all ${
|
||||||
editmode ? "py-1" : "py-2"
|
editmode ? "py-1.5" : "py-2"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<span className="font-semibold">Job title:</span>{" "}
|
<span className="font-semibold">Job title:</span>{" "}
|
||||||
@@ -427,7 +416,7 @@ function UserProfile() {
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
value={jobTitle}
|
value={jobTitle}
|
||||||
className="py-1 px-2 text-sm border-[1px] border-[#15b4e9] text-black rounded"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
|
||||||
onChange={(e) => setJobTitle(e.target.value)}
|
onChange={(e) => setJobTitle(e.target.value)}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -463,7 +452,7 @@ function UserProfile() {
|
|||||||
all your publicly set templates.`}
|
all your publicly set templates.`}
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
<div className="flex items-center">
|
<div className="flex text-xs items-center">
|
||||||
<span>opensign-me.vercel.app/</span>
|
<span>opensign-me.vercel.app/</span>
|
||||||
{editmode ? (
|
{editmode ? (
|
||||||
<input
|
<input
|
||||||
@@ -471,14 +460,14 @@ function UserProfile() {
|
|||||||
value={publicUserName}
|
value={publicUserName}
|
||||||
disabled={!editmode}
|
disabled={!editmode}
|
||||||
placeholder="enter user name"
|
placeholder="enter user name"
|
||||||
className="border-[1px] border-gray-200 rounded-[3px]"
|
className="op-input op-input-bordered focus:outline-none hover:border-base-content op-input-xs"
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<input
|
<input
|
||||||
value={extendUser?.[0]?.UserName}
|
value={extendUser?.[0]?.UserName}
|
||||||
disabled
|
disabled
|
||||||
placeholder="enter user name"
|
placeholder="enter user name"
|
||||||
className="border-[1px] border-gray-200 rounded-[3px]"
|
className="op-input op-input-bordered op-input-xs"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -498,27 +487,23 @@ function UserProfile() {
|
|||||||
url={
|
url={
|
||||||
"https://docs.opensignlabs.com/docs/help/Settings/disabledocumentid"
|
"https://docs.opensignlabs.com/docs/help/Settings/disabledocumentid"
|
||||||
}
|
}
|
||||||
/>{" "}
|
/>
|
||||||
{!isSubscribe && isEnableSubscription && <Upgrade />}
|
{!isSubscribe && isEnableSubscription && <Upgrade />}
|
||||||
</span>{" "}
|
</span>
|
||||||
<label
|
<label
|
||||||
className={
|
className={`${
|
||||||
isSubscribe || !isEnableSubscription
|
isSubscribe || !isEnableSubscription
|
||||||
? `${
|
? `${editmode ? "cursor-pointer" : ""}`
|
||||||
editmode ? "cursor-pointer" : ""
|
: "pointer-events-none opacity-50"
|
||||||
} relative inline-flex items-center mb-0`
|
} relative block items-center mb-0`}
|
||||||
: "relative inline-flex items-center mb-0 pointer-events-none opacity-50"
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
disabled={editmode ? false : true}
|
disabled={editmode ? false : true}
|
||||||
|
type="checkbox"
|
||||||
|
className="op-toggle transition-all checked:[--tglbg:#3368ff] checked:bg-white"
|
||||||
checked={isDisableDocId}
|
checked={isDisableDocId}
|
||||||
onChange={handleDisableDocId}
|
onChange={handleDisableDocId}
|
||||||
type="checkbox"
|
|
||||||
value=""
|
|
||||||
className="sr-only peer"
|
|
||||||
/>
|
/>
|
||||||
<div className="w-9 h-5 bg-gray-200 peer-focus:outline-none peer-focus:ring-1 peer-focus:ring-black rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-black peer-checked:bg-blue-600"></div>
|
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
{!isEnableSubscription && (
|
{!isEnableSubscription && (
|
||||||
@@ -530,44 +515,29 @@ function UserProfile() {
|
|||||||
)}
|
)}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div className="flex justify-center pt-2 pb-3 md:pt-3 md:pb-4">
|
<div className="flex justify-center gap-2 pt-2 pb-3 md:pt-3 md:pb-4">
|
||||||
{editmode ? (
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={handleSubmit}
|
|
||||||
className="rounded shadow focus:outline-none border-[2px] border-[#15b4e9] bg-white text-[#15b4e9] px-4 py-2 mr-4"
|
|
||||||
>
|
|
||||||
Save
|
|
||||||
</button>
|
|
||||||
) : (
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={() => {
|
|
||||||
setEditMode(true);
|
|
||||||
}}
|
|
||||||
className="rounded shadow focus:outline-none text-white bg-[#e7505a] px-4 py-2 mr-4"
|
|
||||||
>
|
|
||||||
Edit
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => {
|
onClick={(e) =>
|
||||||
if (editmode) {
|
editmode ? handleSubmit(e) : setEditMode(true)
|
||||||
handleCancel();
|
}
|
||||||
} else {
|
className="op-btn op-btn-primary"
|
||||||
navigate("/changepassword");
|
>
|
||||||
}
|
{editmode ? "Save" : "Edit"}
|
||||||
}}
|
</button>
|
||||||
className={`rounded shadow focus:outline-none text-white bg-[#3598dc] ${
|
<button
|
||||||
editmode ? "px-4 py-2 " : "p-2"
|
type="button"
|
||||||
|
onClick={() =>
|
||||||
|
editmode ? handleCancel() : navigate("/changepassword")
|
||||||
|
}
|
||||||
|
className={`op-btn ${
|
||||||
|
editmode ? "op-btn-ghost" : "op-btn-secondary"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{editmode ? "Cancel" : "Change Password"}
|
{editmode ? "Cancel" : "Change Password"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{isVerifyModal && (
|
{isVerifyModal && (
|
||||||
<ModalUi
|
<ModalUi
|
||||||
isOpen
|
isOpen
|
||||||
@@ -575,43 +545,29 @@ function UserProfile() {
|
|||||||
handleClose={handleCloseVerifyModal}
|
handleClose={handleCloseVerifyModal}
|
||||||
>
|
>
|
||||||
{otpLoader ? (
|
{otpLoader ? (
|
||||||
<div
|
<div className="h-[150px] flex justify-center items-center">
|
||||||
style={{
|
<Loader />
|
||||||
height: "150px",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<form onSubmit={(e) => handleVerifyEmail(e)}>
|
<form onSubmit={(e) => handleVerifyEmail(e)}>
|
||||||
<div className="px-6 py-3">
|
<div className="px-6 py-3 text-base-content">
|
||||||
<label className="mb-2">Enter OTP</label>
|
<label className="mb-2">Enter OTP</label>
|
||||||
<input
|
<input
|
||||||
required
|
required
|
||||||
type="tel"
|
type="tel"
|
||||||
pattern="[0-9]{4}"
|
pattern="[0-9]{4}"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="w-full op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-xs"
|
||||||
placeholder="Enter OTP received over email"
|
placeholder="Enter OTP received over email"
|
||||||
value={otp}
|
value={otp}
|
||||||
onChange={(e) => setOtp(e.target.value)}
|
onChange={(e) => setOtp(e.target.value)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<div className="px-6 mb-3">
|
||||||
<div className="px-6 my-3">
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
<button type="submit" className={submitBtn}>
|
|
||||||
Verify
|
Verify
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className={`${rejectBtn} ml-2`}
|
className="op-btn op-btn-secondary ml-2"
|
||||||
onClick={(e) => handleResend(e)}
|
onClick={(e) => handleResend(e)}
|
||||||
>
|
>
|
||||||
Resend
|
Resend
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ import axios from "axios";
|
|||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import Alert from "../primitives/Alert";
|
import Alert from "../primitives/Alert";
|
||||||
import ModalUi from "../primitives/ModalUi";
|
import ModalUi from "../primitives/ModalUi";
|
||||||
import { isEnableSubscription, rejectBtn, submitBtn } from "../constant/const";
|
import { isEnableSubscription } from "../constant/const";
|
||||||
import { checkIsSubscribed, openInNewTab } from "../constant/Utils";
|
import { checkIsSubscribed, openInNewTab } from "../constant/Utils";
|
||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import PremiumAlertHeader from "../primitives/PremiumAlertHeader";
|
import PremiumAlertHeader from "../primitives/PremiumAlertHeader";
|
||||||
import Tooltip from "../primitives/Tooltip";
|
import Tooltip from "../primitives/Tooltip";
|
||||||
|
import Loader from "../primitives/Loader";
|
||||||
|
|
||||||
function Webhook() {
|
function Webhook() {
|
||||||
const navigation = useNavigate();
|
const navigation = useNavigate();
|
||||||
@@ -97,28 +98,15 @@ function Webhook() {
|
|||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<Title title={"Webhook"} />
|
<Title title={"Webhook"} />
|
||||||
{isGenerate && <Alert type="success">Webhook added successfully!</Alert>}
|
{isGenerate && <Alert type="success">Webhook added successfully.</Alert>}
|
||||||
{isErr && <Alert type="danger">Something went wrong!</Alert>}
|
{isErr && <Alert type="danger">Something went wrong.</Alert>}
|
||||||
|
|
||||||
{isLoader ? (
|
{isLoader ? (
|
||||||
<div
|
<div className="h-[100vh] flex justify-center items-center">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="bg-white flex flex-col justify-center shadow rounded">
|
<div className="bg-base-100 text-base-content flex flex-col justify-center shadow rounded">
|
||||||
{!isEnableSubscription && <PremiumAlertHeader />}
|
{!isEnableSubscription && <PremiumAlertHeader />}
|
||||||
<h1 className={"ml-4 mt-3 mb-2 font-semibold"}>
|
<h1 className={"ml-4 mt-3 mb-2 font-semibold"}>
|
||||||
OpenSign™ Webhook{" "}
|
OpenSign™ Webhook{" "}
|
||||||
@@ -146,14 +134,14 @@ function Webhook() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleModal}
|
onClick={handleModal}
|
||||||
className="rounded hover:bg-[#15b4e9] border-[1px] border-[#15b4e9] text-[#15b4e9] hover:text-white px-4 py-2 text-xs md:text-base focus:outline-none"
|
className="op-btn op-btn-primary "
|
||||||
>
|
>
|
||||||
{webhook ? "Update Webhook" : "Add Webhook"}
|
{webhook ? "Update Webhook" : "Add Webhook"}
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div className="flex items-center justify-center ">
|
<div className="flex items-center justify-center ">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
@@ -161,7 +149,7 @@ function Webhook() {
|
|||||||
"https://docs.opensignlabs.com/docs/API-docs/save-update-webhook"
|
"https://docs.opensignlabs.com/docs/API-docs/save-update-webhook"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
className="rounded hover:bg-[#15b4e9] border-[1px] my-2 border-[#15b4e9] text-[#15b4e9] hover:text-white px-11 py-2 text-xs md:text-base focus:outline-none"
|
className="op-btn op-btn-secondary my-2"
|
||||||
>
|
>
|
||||||
View Docs
|
View Docs
|
||||||
</button>
|
</button>
|
||||||
@@ -203,24 +191,27 @@ function Webhook() {
|
|||||||
>
|
>
|
||||||
{error && <Alert type="danger">{error}</Alert>}
|
{error && <Alert type="danger">{error}</Alert>}
|
||||||
<div className="m-[20px]">
|
<div className="m-[20px]">
|
||||||
<div className="text-lg font-normal text-black">
|
<div className="text-lg font-normal text-base-content">
|
||||||
<label className="text-sm ml-2">Webhook</label>
|
<label className="text-sm ml-2">Webhook</label>
|
||||||
<input
|
<input
|
||||||
value={webhook}
|
value={webhook}
|
||||||
onChange={(e) => setWebhook(e.target.value)}
|
onChange={(e) => setWebhook(e.target.value)}
|
||||||
placeholder="Enter webhook url"
|
placeholder="Enter webhook url"
|
||||||
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<hr className="bg-[#ccc] mt-4 " />
|
<hr className="bg-[#ccc] mt-3" />
|
||||||
<div className="flex items-center mt-3 gap-2 text-white">
|
<div className="flex items-center mt-3 gap-2">
|
||||||
<button
|
<button
|
||||||
onClick={handleSubmit}
|
onClick={handleSubmit}
|
||||||
className={submitBtn + "ml-[2px]"}
|
className="op-btn op-btn-primary ml-[2px]"
|
||||||
>
|
>
|
||||||
Yes
|
Yes
|
||||||
</button>
|
</button>
|
||||||
<button onClick={handleModal} className={rejectBtn}>
|
<button
|
||||||
|
onClick={handleModal}
|
||||||
|
className="op-btn op-btn-secondary"
|
||||||
|
>
|
||||||
No
|
No
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
// below code is used to handle undefined Promise.withResolvers for safari
|
||||||
|
if (typeof Promise.withResolvers === "undefined") {
|
||||||
|
Promise.withResolvers = function () {
|
||||||
|
let resolve, reject;
|
||||||
|
const promise = new Promise((res, rej) => {
|
||||||
|
resolve = res;
|
||||||
|
reject = rej;
|
||||||
|
});
|
||||||
|
return { promise, resolve, reject };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Usage:
|
||||||
|
// const { promise, resolve, reject } = Promise.withResolvers()
|
||||||
|
// console.log(promise, resolve, reject) // Promise { <pending> } [Function (anonymous)] [Function (anonymous)]
|
||||||
|
// ... Do something async and then call resolve or reject!
|
||||||
@@ -2,6 +2,7 @@ import React, { useState, useEffect } from "react";
|
|||||||
import Parse from "parse";
|
import Parse from "parse";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import "../styles/AddUser.css";
|
import "../styles/AddUser.css";
|
||||||
|
import Loader from "./Loader";
|
||||||
const AddContact = (props) => {
|
const AddContact = (props) => {
|
||||||
const [name, setName] = useState("");
|
const [name, setName] = useState("");
|
||||||
const [phone, setPhone] = useState("");
|
const [phone, setPhone] = useState("");
|
||||||
@@ -195,40 +196,36 @@ const AddContact = (props) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="addusercontainer">
|
<div className="h-full px-[20px] py-[10px]">
|
||||||
{isLoader && (
|
{isLoader && (
|
||||||
<div className="loaderdiv">
|
<div className="fixed inset-0 flex justify-center items-center bg-black bg-opacity-30">
|
||||||
<div
|
<Loader />
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="form-wrapper">
|
<div className="w-full mx-auto p-[8px]">
|
||||||
<div style={{ fontSize: 14, fontWeight: "700" }}>Add User</div>
|
<div className="text-[14px] font-[700]">Add User</div>
|
||||||
|
|
||||||
{isUserExist && (
|
{isUserExist && (
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem] flex items-center mt-1">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
id="addYourself"
|
id="addYourself"
|
||||||
checked={addYourself}
|
checked={addYourself}
|
||||||
onChange={handleAddYourselfChange}
|
onChange={handleAddYourselfChange}
|
||||||
className="form-checkbox"
|
className="op-checkbox op-checkbox-sm"
|
||||||
/>
|
/>
|
||||||
<label htmlFor="addYourself" className="checkbox-label ">
|
<label
|
||||||
|
htmlFor="addYourself"
|
||||||
|
className="ml-[0.5rem] text-base-content mb-0"
|
||||||
|
>
|
||||||
Add Yourself
|
Add Yourself
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<form onSubmit={handleSubmit}>
|
<form className="text-base-content" onSubmit={handleSubmit}>
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem]">
|
||||||
<label htmlFor="name" style={{ fontSize: 13 }}>
|
<label htmlFor="name" className="text-[13px]">
|
||||||
Name
|
Name
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[13px] text-[red]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
@@ -237,13 +234,13 @@ const AddContact = (props) => {
|
|||||||
onChange={(e) => setName(e.target.value)}
|
onChange={(e) => setName(e.target.value)}
|
||||||
required
|
required
|
||||||
disabled={addYourself}
|
disabled={addYourself}
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem]">
|
||||||
<label htmlFor="email" style={{ fontSize: 13 }}>
|
<label htmlFor="email" className="text-[13px]">
|
||||||
Email
|
Email
|
||||||
<span style={{ color: "red", fontSize: 13 }}> *</span>
|
<span className="text-[13px] text-[red]"> *</span>
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
@@ -252,11 +249,11 @@ const AddContact = (props) => {
|
|||||||
onChange={(e) => setEmail(e.target.value?.toLowerCase())}
|
onChange={(e) => setEmail(e.target.value?.toLowerCase())}
|
||||||
required
|
required
|
||||||
disabled={addYourself}
|
disabled={addYourself}
|
||||||
className="addUserInput lowercase"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs lowercase"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-section">
|
<div className="mb-[0.75rem]">
|
||||||
<label htmlFor="phone" style={{ fontSize: 13 }}>
|
<label htmlFor="phone" className="text-[13px]">
|
||||||
Phone
|
Phone
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
@@ -265,18 +262,18 @@ const AddContact = (props) => {
|
|||||||
value={phone}
|
value={phone}
|
||||||
onChange={(e) => setPhone(e.target.value)}
|
onChange={(e) => setPhone(e.target.value)}
|
||||||
disabled={addYourself}
|
disabled={addYourself}
|
||||||
className="addUserInput"
|
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="buttoncontainer">
|
<div className="mt-6 flex justify-start gap-2">
|
||||||
<button type="submit" className="submitbutton">
|
<button type="submit" className="op-btn op-btn-primary">
|
||||||
Submit
|
Submit
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => handleReset()}
|
onClick={() => handleReset()}
|
||||||
className="resetbutton"
|
className="op-btn op-btn-secondary"
|
||||||
>
|
>
|
||||||
Reset
|
Reset
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -5,25 +5,25 @@ const Alert = ({ children, type }) => {
|
|||||||
function theme(color) {
|
function theme(color) {
|
||||||
switch (color) {
|
switch (color) {
|
||||||
case "success":
|
case "success":
|
||||||
return "border-[#c3e6cb] bg-[#d4edda] text-[#155724]";
|
return "op-alert-success";
|
||||||
case "info":
|
case "info":
|
||||||
return "border-[#adcdeb] bg-[#c1daf0] text-[#153756]";
|
return "op-alert-info";
|
||||||
case "danger":
|
case "danger":
|
||||||
return "border-[#f0a8a8] bg-[#f4bebe] text-[#c42121]";
|
return "op-alert-error";
|
||||||
|
case "warning":
|
||||||
|
return "op-alert-warning";
|
||||||
default:
|
default:
|
||||||
return "border-[#d6d6d6] bg-[#d9d9d9] text-[#575757]";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<>
|
children && (
|
||||||
{children && (
|
<div className="z-[1000] fixed top-20 left-1/2 transform -translate-x-1/2 text-sm">
|
||||||
<div
|
<div className={`op-alert ${textcolor}`}>
|
||||||
className={`z-[1000] fixed top-20 left-1/2 transform -translate-x-1/2 border-[1px] text-sm ${textcolor} rounded py-[.75rem] px-[1.25rem] z-50`}
|
<span>{children}</span>
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
</div>
|
||||||
</>
|
)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -2,15 +2,8 @@ import React from "react";
|
|||||||
|
|
||||||
function HandleError({ handleError }) {
|
function HandleError({ handleError }) {
|
||||||
return (
|
return (
|
||||||
<div
|
<div className="flex justify-center items-center h-[100vh]">
|
||||||
style={{
|
<span className="text-[20px] text-[gray]">{handleError}</span>
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center",
|
|
||||||
alignItems: "center",
|
|
||||||
height: "100vh"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span style={{ fontSize: "20px", color: "gray" }}>{handleError}</span>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,12 @@
|
|||||||
import React, { Suspense } from "react";
|
import React, { Suspense } from "react";
|
||||||
|
import Loader from "./Loader";
|
||||||
|
|
||||||
const LazyPage = ({ Page }) => {
|
const LazyPage = ({ Page }) => {
|
||||||
return (
|
return (
|
||||||
<Suspense
|
<Suspense
|
||||||
fallback={
|
fallback={
|
||||||
<div
|
<div className="flex justify-center items-center h-[100vh]">
|
||||||
style={{
|
<Loader />
|
||||||
height: "100vh",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
fontSize: "45px",
|
|
||||||
color: "#3dd3e0"
|
|
||||||
}}
|
|
||||||
className="loader-37"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -18,31 +18,7 @@ const LinkUserModal = (props) => {
|
|||||||
closePopup={props.closePopup}
|
closePopup={props.closePopup}
|
||||||
signersData={props?.signersData}
|
signersData={props?.signersData}
|
||||||
/>
|
/>
|
||||||
<div
|
<div className="op-divider text-base-content mx-[25%] my-1">or</div>
|
||||||
style={{
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
gap: 5,
|
|
||||||
margin: "0 30%",
|
|
||||||
color: "#808080"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
style={{
|
|
||||||
height: 1,
|
|
||||||
width: "100%",
|
|
||||||
backgroundColor: "#ccc"
|
|
||||||
}}
|
|
||||||
></span>
|
|
||||||
<span>or</span>
|
|
||||||
<span
|
|
||||||
style={{
|
|
||||||
height: 1,
|
|
||||||
width: "100%",
|
|
||||||
backgroundColor: "#ccc"
|
|
||||||
}}
|
|
||||||
></span>
|
|
||||||
</div>
|
|
||||||
<AddContact details={props.handleAddUser} closePopup={props.closePopup} />
|
<AddContact details={props.handleAddUser} closePopup={props.closePopup} />
|
||||||
</ModalUi>
|
</ModalUi>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
const Loader = () => {
|
||||||
|
return (
|
||||||
|
<div className="op-loading op-loading-infinity w-[5rem] text-accent"></div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Loader;
|
||||||
@@ -1,27 +1,14 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import loader from "../assets/images/loader2.gif";
|
import Loader from "./Loader";
|
||||||
|
|
||||||
function Loader({ isLoading }) {
|
function LoaderWithMsg({ isLoading }) {
|
||||||
return (
|
return (
|
||||||
<div
|
<div className="flex flex-col justify-center items-center h-[100vh]">
|
||||||
style={{
|
{/* <img alt="loader" src={loader} className="w-[80px] h-[80px]" /> */}
|
||||||
display: "flex",
|
<Loader />
|
||||||
justifyContent: "center",
|
<span className="text-[13px] text-base-cotent">{isLoading.message}</span>
|
||||||
alignItems: "center",
|
|
||||||
height: "100vh",
|
|
||||||
flexDirection: "column"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
alt="no img"
|
|
||||||
src={loader}
|
|
||||||
style={{ width: "80px", height: "80px" }}
|
|
||||||
/>
|
|
||||||
<span style={{ fontSize: "13px", color: "gray" }}>
|
|
||||||
{isLoading.message}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Loader;
|
export default LoaderWithMsg;
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ const ModalUi = ({
|
|||||||
children,
|
children,
|
||||||
title,
|
title,
|
||||||
isOpen,
|
isOpen,
|
||||||
headColor,
|
|
||||||
handleClose,
|
handleClose,
|
||||||
showHeader = true,
|
showHeader = true,
|
||||||
showClose = true,
|
showClose = true,
|
||||||
@@ -16,27 +15,26 @@ const ModalUi = ({
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{isOpen && (
|
{isOpen && (
|
||||||
<div className="fixed z-[999] top-0 left-0 w-[100%] h-[100%] bg-black bg-opacity-[75%]">
|
<dialog className="op-modal op-modal-open">
|
||||||
<div
|
<div
|
||||||
className={`${
|
className={`${
|
||||||
reduceWidth || "md:min-w-[500px]"
|
reduceWidth || "md:min-w-[500px]"
|
||||||
} fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] overflow-y-auto hide-scrollbar `}
|
} op-modal-box p-0 max-h-90 min-w-[90%] overflow-y-auto hide-scrollbar text-sm`}
|
||||||
>
|
>
|
||||||
{showHeader && (
|
{showHeader && (
|
||||||
<div
|
<>
|
||||||
className="flex justify-between rounded-t items-center py-[15px] px-[20px] text-white"
|
<h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]">
|
||||||
style={{ background: headColor ? headColor : "#32a3ac" }}
|
{title}
|
||||||
>
|
</h3>
|
||||||
<div className="text-[1.2rem] font-normal">{title}</div>
|
|
||||||
{showClose && (
|
{showClose && (
|
||||||
<div
|
<button
|
||||||
className="text-[1.5rem] cursor-pointer"
|
className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2"
|
||||||
onClick={() => handleClose && handleClose()}
|
onClick={() => handleClose && handleClose()}
|
||||||
>
|
>
|
||||||
×
|
✕
|
||||||
</div>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</>
|
||||||
)}
|
)}
|
||||||
{!isEnableSubscription && showHeaderMessage && (
|
{!isEnableSubscription && showHeaderMessage && (
|
||||||
<PremiumAlertHeader
|
<PremiumAlertHeader
|
||||||
@@ -47,7 +45,7 @@ const ModalUi = ({
|
|||||||
)}
|
)}
|
||||||
<div>{children}</div>
|
<div>{children}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</dialog>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import "../styles/signature.css";
|
import "../styles/signature.css";
|
||||||
import { rejectBtn } from "../constant/const";
|
|
||||||
|
|
||||||
function CustomModal({
|
function CustomModal({
|
||||||
show,
|
show,
|
||||||
@@ -12,12 +11,12 @@ function CustomModal({
|
|||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
show && (
|
show && (
|
||||||
<div className="bg-black bg-opacity-[75%] absolute z-[999] flex flex-col items-center justify-center w-full h-full rounded">
|
<dialog className="op-modal op-modal-open absolute z-[1999]">
|
||||||
<div className="bg-white rounded outline-none md:w-[40%] w-[80%]">
|
<div className="w-[80%] md:w-[40%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm">
|
||||||
<div className="bg-[#de4337] text-white p-[10px] rounded-t">
|
<h3 className="text-[#de4337] font-bold text-lg pt-[15px] px-[20px]">
|
||||||
{headMsg && headMsg}
|
{headMsg && headMsg}
|
||||||
</div>
|
</h3>
|
||||||
<div className="p-[15px]">
|
<div className="p-[10px] px-[20px]">
|
||||||
<p className="text-[15px]">{bodyMssg && bodyMssg}</p>
|
<p className="text-[15px]">{bodyMssg && bodyMssg}</p>
|
||||||
</div>
|
</div>
|
||||||
{footerMessage && (
|
{footerMessage && (
|
||||||
@@ -25,8 +24,7 @@ function CustomModal({
|
|||||||
<div className="h-[1px] bg-[#9f9f9f] w-full"></div>
|
<div className="h-[1px] bg-[#9f9f9f] w-full"></div>
|
||||||
<div className="m-[15px] ">
|
<div className="m-[15px] ">
|
||||||
<button
|
<button
|
||||||
className={`${rejectBtn} text-white mr-2`}
|
className="op-btn op-btn-primary mr-2"
|
||||||
style={{ background: "#de4337" }}
|
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => declineDoc()}
|
onClick={() => declineDoc()}
|
||||||
>
|
>
|
||||||
@@ -34,7 +32,7 @@ function CustomModal({
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className={rejectBtn}
|
className="op-btn op-btn-secondary"
|
||||||
onClick={() => setIsDecline({ isDeclined: false })}
|
onClick={() => setIsDecline({ isDeclined: false })}
|
||||||
>
|
>
|
||||||
Close
|
Close
|
||||||
@@ -43,7 +41,7 @@ function CustomModal({
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</dialog>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,22 +12,14 @@ export default function TourContentWithBtn({ message, isChecked }) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<p>{message}</p>
|
<p>{message}</p>
|
||||||
<label
|
<label className="flex items-center justify-center mb-0">
|
||||||
style={{
|
|
||||||
textAlign: "center",
|
|
||||||
display: "flex",
|
|
||||||
justifyContent: "center"
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
style={{ marginRight: 3 }}
|
className="op-checkbox op-checkbox-xs mr-1"
|
||||||
checked={isCheck}
|
checked={isCheck}
|
||||||
onChange={handleCheck}
|
onChange={handleCheck}
|
||||||
/>{" "}
|
/>
|
||||||
<span style={{ color: "#787878", fontSize: 12 }}>
|
<span className="#787878 text-[12px]">Don't show this again</span>
|
||||||
Don't show this again
|
|
||||||
</span>
|
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -49,13 +49,10 @@ const Validate = () => {
|
|||||||
<Outlet />
|
<Outlet />
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<ModalUi title={"Session Expired"} isOpen={true} showClose={false}>
|
<ModalUi showHeader={false} isOpen={true} showClose={false}>
|
||||||
<div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5">
|
<div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5">
|
||||||
<p className="text-xl font-normal">Your session has expired.</p>
|
<p className="text-xl font-medium">Your session has expired.</p>
|
||||||
<button
|
<button onClick={handleLoginBtn} className="op-btn op-btn-neutral">
|
||||||
onClick={handleLoginBtn}
|
|
||||||
className="text-base px-3 py-1.5 rounded shadow-md text-white bg-[#1ab6ce]"
|
|
||||||
>
|
|
||||||
Login
|
Login
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -90,7 +90,6 @@
|
|||||||
background-size: 1rem auto;
|
background-size: 1rem auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@media (max-width: 375px) {
|
@media (max-width: 375px) {
|
||||||
.validationlist {
|
.validationlist {
|
||||||
background-position: right 0.5rem top 50%;
|
background-position: right 0.5rem top 50%;
|
||||||
|
|||||||
@@ -208,7 +208,6 @@
|
|||||||
height: 100px;
|
height: 100px;
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -858,7 +858,6 @@ option {
|
|||||||
|
|
||||||
#navbar {
|
#navbar {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
z-index: 49;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Navbar links */
|
/* Navbar links */
|
||||||
|
|||||||
@@ -4,5 +4,70 @@ module.exports = {
|
|||||||
theme: {
|
theme: {
|
||||||
extend: {}
|
extend: {}
|
||||||
},
|
},
|
||||||
plugins: []
|
plugins: [require("daisyui")],
|
||||||
|
daisyui: {
|
||||||
|
// themes: true,
|
||||||
|
themes: [
|
||||||
|
"light",
|
||||||
|
"dark",
|
||||||
|
"cupcake",
|
||||||
|
"bumblebee",
|
||||||
|
"emerald",
|
||||||
|
"corporate",
|
||||||
|
"synthwave",
|
||||||
|
"retro",
|
||||||
|
"cyberpunk",
|
||||||
|
"valentine",
|
||||||
|
"halloween",
|
||||||
|
"garden",
|
||||||
|
"forest",
|
||||||
|
"aqua",
|
||||||
|
"lofi",
|
||||||
|
"pastel",
|
||||||
|
"fantasy",
|
||||||
|
"wireframe",
|
||||||
|
"black",
|
||||||
|
"luxury",
|
||||||
|
"dracula",
|
||||||
|
"cmyk",
|
||||||
|
"autumn",
|
||||||
|
"business",
|
||||||
|
"acid",
|
||||||
|
"lemonade",
|
||||||
|
"night",
|
||||||
|
"coffee",
|
||||||
|
"winter",
|
||||||
|
"dim",
|
||||||
|
"nord",
|
||||||
|
"sunset",
|
||||||
|
{
|
||||||
|
opensigncss: {
|
||||||
|
primary: "#034687",
|
||||||
|
"primary-content": "#ccd9e8",
|
||||||
|
secondary: "#151B25",
|
||||||
|
"secondary-content": "#cacccf",
|
||||||
|
accent: "#E10032",
|
||||||
|
"accent-content": "#ffd8d5",
|
||||||
|
neutral: "#F0D7D9",
|
||||||
|
"neutral-content": "#141111",
|
||||||
|
"base-100": "#ffffff",
|
||||||
|
"base-200": "#dedede",
|
||||||
|
"base-300": "#bebebe",
|
||||||
|
"base-content": "#161616",
|
||||||
|
info: "#00b6ff",
|
||||||
|
"info-content": "#f5f5f4",
|
||||||
|
success: "#00a96e",
|
||||||
|
"success-content": "#f5f5f4",
|
||||||
|
warning: "#ffbe00",
|
||||||
|
"warning-content": "#ccd9e8",
|
||||||
|
error: "#ff0000",
|
||||||
|
"error-content": "#f3f4f6",
|
||||||
|
"--rounded-btn": "1.9rem",
|
||||||
|
"--tab-border": "2px",
|
||||||
|
"--tab-radius": "0.7rem"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
prefix: "op-"
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -247,3 +247,6 @@ export function sanitizeFileName(fileName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const useLocal = process.env.USE_LOCAL ? process.env.USE_LOCAL.toLowerCase() : 'false';
|
export const useLocal = process.env.USE_LOCAL ? process.env.USE_LOCAL.toLowerCase() : 'false';
|
||||||
|
export const smtpsecure = process.env.SMTP_PORT && process.env.SMTP_PORT !== '465' ? false : true;
|
||||||
|
export const smtpenable =
|
||||||
|
process.env.SMTP_ENABLE && process.env.SMTP_ENABLE.toLowerCase() === 'true' ? true : false;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { updateMailCount } from '../../Utils.js';
|
import { smtpenable, updateMailCount } from '../../Utils.js';
|
||||||
async function getDocument(docId) {
|
async function getDocument(docId) {
|
||||||
try {
|
try {
|
||||||
const query = new Parse.Query('contracts_Document');
|
const query = new Parse.Query('contracts_Document');
|
||||||
@@ -25,9 +25,7 @@ async function sendMailOTPv1(request) {
|
|||||||
|
|
||||||
if (email) {
|
if (email) {
|
||||||
const recipient = request.params.email;
|
const recipient = request.params.email;
|
||||||
const mailsender = process.env.SMTP_ENABLE
|
const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER;
|
||||||
? process.env.SMTP_USER_EMAIL
|
|
||||||
: process.env.MAILGUN_SENDER;
|
|
||||||
try {
|
try {
|
||||||
await Parse.Cloud.sendEmail({
|
await Parse.Cloud.sendEmail({
|
||||||
from: 'Opensign™' + ' <' + mailsender + '>',
|
from: 'Opensign™' + ' <' + mailsender + '>',
|
||||||
|
|||||||
@@ -81,11 +81,16 @@ export default async function linkContactToDoc(req) {
|
|||||||
const updateDoc = new Parse.Object('contracts_Document');
|
const updateDoc = new Parse.Object('contracts_Document');
|
||||||
updateDoc.id = docId;
|
updateDoc.id = docId;
|
||||||
const signers = _docRes?.Signers || [];
|
const signers = _docRes?.Signers || [];
|
||||||
signers.push({
|
const signerobj = {
|
||||||
__type: 'Pointer',
|
__type: 'Pointer',
|
||||||
className: 'contracts_Contactbook',
|
className: 'contracts_Contactbook',
|
||||||
objectId: existContact.id,
|
objectId: existContact.id,
|
||||||
});
|
};
|
||||||
|
// The splice method is used to add a signer at the desired index
|
||||||
|
// index is the variable where the signer needs to be added
|
||||||
|
// 0 indicates that no elements should be deleted
|
||||||
|
// signerobj is the reference to the signer object
|
||||||
|
signers.splice(index, 0, signerobj);
|
||||||
updateDoc.set('Signers', signers);
|
updateDoc.set('Signers', signers);
|
||||||
|
|
||||||
Placeholders[index] = {
|
Placeholders[index] = {
|
||||||
@@ -128,11 +133,16 @@ export default async function linkContactToDoc(req) {
|
|||||||
const updateDoc = new Parse.Object('contracts_Document');
|
const updateDoc = new Parse.Object('contracts_Document');
|
||||||
updateDoc.id = docId;
|
updateDoc.id = docId;
|
||||||
const signers = _docRes?.Signers || [];
|
const signers = _docRes?.Signers || [];
|
||||||
signers.push({
|
const signerobj = {
|
||||||
__type: 'Pointer',
|
__type: 'Pointer',
|
||||||
className: 'contracts_Contactbook',
|
className: 'contracts_Contactbook',
|
||||||
objectId: contactRes.id,
|
objectId: contactRes.id,
|
||||||
});
|
};
|
||||||
|
// The splice method is used to add a signer at the desired index
|
||||||
|
// index is the variable where the signer needs to be added
|
||||||
|
// 0 indicates that no elements should be deleted
|
||||||
|
// signerobj is the reference to the signer object
|
||||||
|
signers.splice(index, 0, signerobj);
|
||||||
updateDoc.set('Signers', signers);
|
updateDoc.set('Signers', signers);
|
||||||
|
|
||||||
Placeholders[index] = {
|
Placeholders[index] = {
|
||||||
@@ -175,11 +185,16 @@ export default async function linkContactToDoc(req) {
|
|||||||
const updateDoc = new Parse.Object('contracts_Document');
|
const updateDoc = new Parse.Object('contracts_Document');
|
||||||
updateDoc.id = docId;
|
updateDoc.id = docId;
|
||||||
const signers = _docRes?.Signers || [];
|
const signers = _docRes?.Signers || [];
|
||||||
signers.push({
|
const signerobj = {
|
||||||
__type: 'Pointer',
|
__type: 'Pointer',
|
||||||
className: 'contracts_Contactbook',
|
className: 'contracts_Contactbook',
|
||||||
objectId: contactRes.id,
|
objectId: contactRes.id,
|
||||||
});
|
};
|
||||||
|
// The splice method is used to add a signer at the desired index
|
||||||
|
// index is the variable where the signer needs to be added
|
||||||
|
// 0 indicates that no elements should be deleted
|
||||||
|
// signerobj is the reference to the signer object
|
||||||
|
signers.splice(index, 0, signerobj);
|
||||||
updateDoc.set('Signers', signers);
|
updateDoc.set('Signers', signers);
|
||||||
|
|
||||||
Placeholders[index] = {
|
Placeholders[index] = {
|
||||||
@@ -227,13 +242,17 @@ export default async function linkContactToDoc(req) {
|
|||||||
const updateDoc = new Parse.Object('contracts_Document');
|
const updateDoc = new Parse.Object('contracts_Document');
|
||||||
updateDoc.id = docId;
|
updateDoc.id = docId;
|
||||||
const signers = _docRes?.Signers || [];
|
const signers = _docRes?.Signers || [];
|
||||||
signers.push({
|
const signerobj = {
|
||||||
__type: 'Pointer',
|
__type: 'Pointer',
|
||||||
className: 'contracts_Contactbook',
|
className: 'contracts_Contactbook',
|
||||||
objectId: contactRes.id,
|
objectId: contactRes.id,
|
||||||
});
|
};
|
||||||
|
// The splice method is used to add a signer at the desired index
|
||||||
|
// index is the variable where the signer needs to be added
|
||||||
|
// 0 indicates that no elements should be deleted
|
||||||
|
// signerobj is the reference to the signer object
|
||||||
|
signers.splice(index, 0, signerobj);
|
||||||
updateDoc.set('Signers', signers);
|
updateDoc.set('Signers', signers);
|
||||||
|
|
||||||
Placeholders[index] = {
|
Placeholders[index] = {
|
||||||
...Placeholders[index],
|
...Placeholders[index],
|
||||||
signerObjId: contactRes.id,
|
signerObjId: contactRes.id,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import fs from 'node:fs';
|
|||||||
import https from 'https';
|
import https from 'https';
|
||||||
import formData from 'form-data';
|
import formData from 'form-data';
|
||||||
import Mailgun from 'mailgun.js';
|
import Mailgun from 'mailgun.js';
|
||||||
import { updateMailCount } from '../../Utils.js';
|
import { smtpenable, smtpsecure, updateMailCount } from '../../Utils.js';
|
||||||
import sendMailGmailProvider from './sendMailGmailProvider.js';
|
import sendMailGmailProvider from './sendMailGmailProvider.js';
|
||||||
import { createTransport } from 'nodemailer';
|
import { createTransport } from 'nodemailer';
|
||||||
async function sendMailProvider(req) {
|
async function sendMailProvider(req) {
|
||||||
@@ -10,11 +10,11 @@ async function sendMailProvider(req) {
|
|||||||
let transporterSMTP;
|
let transporterSMTP;
|
||||||
let mailgunClient;
|
let mailgunClient;
|
||||||
let mailgunDomain;
|
let mailgunDomain;
|
||||||
if (process.env.SMTP_ENABLE) {
|
if (smtpenable) {
|
||||||
transporterSMTP = createTransport({
|
transporterSMTP = createTransport({
|
||||||
host: process.env.SMTP_HOST,
|
host: process.env.SMTP_HOST,
|
||||||
port: process.env.SMTP_PORT || 465,
|
port: process.env.SMTP_PORT || 465,
|
||||||
secure: process.env.SMTP_SECURE || true,
|
secure: smtpsecure,
|
||||||
auth: {
|
auth: {
|
||||||
user: process.env.SMTP_USER_EMAIL,
|
user: process.env.SMTP_USER_EMAIL,
|
||||||
pass: process.env.SMTP_PASS,
|
pass: process.env.SMTP_PASS,
|
||||||
@@ -54,8 +54,8 @@ async function sendMailProvider(req) {
|
|||||||
const pdfName = req.params.pdfName && `${req.params.pdfName}.pdf`;
|
const pdfName = req.params.pdfName && `${req.params.pdfName}.pdf`;
|
||||||
const file = {
|
const file = {
|
||||||
filename: pdfName || 'exported.pdf',
|
filename: pdfName || 'exported.pdf',
|
||||||
content: process.env.SMTP_ENABLE ? PdfBuffer : undefined, //fs.readFileSync('./exports/exported_file_1223.pdf'),
|
content: smtpenable ? PdfBuffer : undefined, //fs.readFileSync('./exports/exported_file_1223.pdf'),
|
||||||
data: process.env.SMTP_ENABLE ? undefined : PdfBuffer,
|
data: smtpenable ? undefined : PdfBuffer,
|
||||||
};
|
};
|
||||||
|
|
||||||
let attachment;
|
let attachment;
|
||||||
@@ -64,8 +64,8 @@ async function sendMailProvider(req) {
|
|||||||
const certificateBuffer = fs.readFileSync('./exports/certificate.pdf');
|
const certificateBuffer = fs.readFileSync('./exports/certificate.pdf');
|
||||||
const certificate = {
|
const certificate = {
|
||||||
filename: 'certificate.pdf',
|
filename: 'certificate.pdf',
|
||||||
content: process.env.SMTP_ENABLE ? certificateBuffer : undefined, //fs.readFileSync('./exports/exported_file_1223.pdf'),
|
content: smtpenable ? certificateBuffer : undefined, //fs.readFileSync('./exports/exported_file_1223.pdf'),
|
||||||
data: process.env.SMTP_ENABLE ? undefined : certificateBuffer,
|
data: smtpenable ? undefined : certificateBuffer,
|
||||||
};
|
};
|
||||||
attachment = [file, certificate];
|
attachment = [file, certificate];
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -73,9 +73,7 @@ async function sendMailProvider(req) {
|
|||||||
console.log('Err in read certificate sendmailv3', err);
|
console.log('Err in read certificate sendmailv3', err);
|
||||||
}
|
}
|
||||||
const from = req.params.from || '';
|
const from = req.params.from || '';
|
||||||
const mailsender = process.env.SMTP_ENABLE
|
const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER;
|
||||||
? process.env.SMTP_USER_EMAIL
|
|
||||||
: process.env.MAILGUN_SENDER;
|
|
||||||
|
|
||||||
const messageParams = {
|
const messageParams = {
|
||||||
from: from + ' <' + mailsender + '>',
|
from: from + ' <' + mailsender + '>',
|
||||||
@@ -83,8 +81,8 @@ async function sendMailProvider(req) {
|
|||||||
subject: req.params.subject,
|
subject: req.params.subject,
|
||||||
text: req.params.text || 'mail',
|
text: req.params.text || 'mail',
|
||||||
html: req.params.html || '',
|
html: req.params.html || '',
|
||||||
attachments: process.env.SMTP_ENABLE ? attachment : undefined,
|
attachments: smtpenable ? attachment : undefined,
|
||||||
attachment: process.env.SMTP_ENABLE ? undefined : attachment,
|
attachment: smtpenable ? undefined : attachment,
|
||||||
};
|
};
|
||||||
if (transporterSMTP) {
|
if (transporterSMTP) {
|
||||||
const res = await transporterSMTP.sendMail(messageParams);
|
const res = await transporterSMTP.sendMail(messageParams);
|
||||||
@@ -120,9 +118,7 @@ async function sendMailProvider(req) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const from = req.params.from || '';
|
const from = req.params.from || '';
|
||||||
const mailsender = process.env.SMTP_ENABLE
|
const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER;
|
||||||
? process.env.SMTP_USER_EMAIL
|
|
||||||
: process.env.MAILGUN_SENDER;
|
|
||||||
|
|
||||||
const messageParams = {
|
const messageParams = {
|
||||||
from: from + ' <' + mailsender + '>',
|
from: from + ' <' + mailsender + '>',
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user