- {forms?.map((form, index) => (
-
+ {props.Placeholders?.some((x) => !x.signerObjId) ? (
+
+
+ ) : (
+
+ All roles in this document are currently linked to contacts. To
+ 'quick send' copies of this template to multiple
+ signers, please ensure that at least one role is not linked to
+ any contact.
-
-
-
-
-
- ) : (
-
- All roles in this document are currently linked to contacts. To
- 'quick send' copies of this template to multiple
- signers, please ensure that at least one role is not linked to any
- contact.
-
- )}
- >
+ )}
+ >
+ ) : (
+
+ Please ensure there's at least one signature widget added for
+ all recipients.
+
+ )
) : (
Please add at least one role to this template in order to 'quick
diff --git a/apps/OpenSign/src/components/pdf/RenderPdf.js b/apps/OpenSign/src/components/pdf/RenderPdf.js
index 716c404e2..2bac6b85e 100644
--- a/apps/OpenSign/src/components/pdf/RenderPdf.js
+++ b/apps/OpenSign/src/components/pdf/RenderPdf.js
@@ -204,8 +204,10 @@ function RenderPdf({
};
//function for render placeholder block over pdf document
const checkSignedSignes = (data) => {
- const checkSign = signedSigners.filter(
- (sign) => sign.objectId === data.signerObjId
+ let checkSign = [];
+ //condition to handle quick send flow and using normal request sign flow
+ checkSign = signedSigners.filter(
+ (sign) => sign?.Id === data?.Id || sign?.objectId === data?.signerObjId
);
if (data.signerObjId === signerObjectId) {
setCurrentSigner(true);
diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js
index 3a24c4398..25a91a20c 100644
--- a/apps/OpenSign/src/constant/Utils.js
+++ b/apps/OpenSign/src/constant/Utils.js
@@ -669,6 +669,7 @@ export const createDocument = async (template, placeholders, signerData) => {
Name: Doc.Name,
URL: Doc.URL,
SignedUrl: Doc.SignedUrl,
+ SentToOthers: Doc.SentToOthers,
Description: Doc.Description,
Note: Doc.Note,
Placeholders: placeholdersArr,
diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js
index f054f7530..426a3aadf 100644
--- a/apps/OpenSign/src/pages/PdfRequestFiles.js
+++ b/apps/OpenSign/src/pages/PdfRequestFiles.js
@@ -32,7 +32,8 @@ import {
contactBook,
handleDownloadPdf,
handleToPrint,
- handleDownloadCertificate
+ handleDownloadCertificate,
+ darkenColor
} from "../constant/Utils";
import Loader from "../primitives/LoaderWithMsg";
import HandleError from "../primitives/HandleError";
@@ -74,7 +75,7 @@ function PdfRequestFiles() {
const [selectWidgetId, setSelectWidgetId] = useState("");
const [otpLoader, setOtpLoader] = useState(false);
const [isCelebration, setIsCelebration] = useState(false);
- const [requestSignTour, setRequestSignTour] = useState(true);
+ const [requestSignTour, setRequestSignTour] = useState(false);
const [tourStatus, setTourStatus] = useState([]);
const [isLoading, setIsLoading] = useState({
isLoad: true,
@@ -296,6 +297,10 @@ function PdfRequestFiles() {
setExpiredDate(expireDateFormat);
} // Check if the current signer is not a last signer and handle the complete message.
else if (isNextUser) {
+ setIsCelebration(true);
+ setTimeout(() => {
+ setIsCelebration(false);
+ }, 5000);
setIsCompleted({
isModal: true,
message:
@@ -330,7 +335,7 @@ function PdfRequestFiles() {
}
}
}
- const checkDocIdExist =
+ const audittrailData =
documentData[0].AuditTrail &&
documentData[0].AuditTrail.length > 0 &&
documentData[0].AuditTrail.filter((data) => data.Activity === "Signed");
@@ -399,41 +404,53 @@ function PdfRequestFiles() {
let signers = [];
let unSignedSigner = [];
- //check document is signed or not
- if (checkDocIdExist && checkDocIdExist.length > 0) {
+ const placeholdersOrSigners = [];
+ for (const placeholder of documentData[0].Placeholders) {
+ //`emailExist` variable to handle condition for quick send flow and show unsigned signers list
+ const emailExist = placeholder?.email;
+ if (emailExist) {
+ placeholdersOrSigners.push(placeholder);
+ } else {
+ const getSignerData = documentData[0].Signers.filter(
+ (data) => data.objectId === placeholder?.signerObjId
+ );
+ placeholdersOrSigners.push(getSignerData[0]);
+ }
+ }
+ //condition to check already signed document by someone
+ if (audittrailData && audittrailData.length > 0) {
setIsDocId(true);
- const signerRes = documentData[0].Signers;
- //comparison auditTrail user details with signers user details
- for (let i = 0; i < signerRes.length; i++) {
- const signerId = signerRes[i].objectId;
+ for (const item of placeholdersOrSigners) {
+ const checkEmail = item?.email;
+ //if email exist then compare user signed by using email else signers objectId
+ const emailOrId = checkEmail ? item.email : item.objectId;
+ //`isSignedSignature` variable to handle break loop whenever it get true
let isSignedSignature = false;
- for (let j = 0; j < checkDocIdExist.length; j++) {
- const signedExist =
- checkDocIdExist[j] && checkDocIdExist[j].UserPtr.objectId;
- //checking signerObjId and auditTrail User objId
- // if match then add signed data in signer array and break loop
+ //checking the signer who signed the document by using audit trail details.
+ //and save signedSigners and unsignedSigners details
+ for (const doc of audittrailData) {
+ const signedExist = checkEmail
+ ? doc?.UserPtr.Email
+ : doc?.UserPtr.objectId;
- if (signerId === signedExist) {
- signers.push({ ...signerRes[i], ...signerRes[i] });
+ if (emailOrId === signedExist) {
+ signers.push({ ...item });
isSignedSignature = true;
break;
}
- // if does not match then add unsigned data in unSignedSigner array
}
if (!isSignedSignature) {
- unSignedSigner.push({ ...signerRes[i], ...signerRes[i] });
+ unSignedSigner.push({ ...item });
}
}
setSignedSigners(signers);
setUnSignedSigners(unSignedSigner);
setSignerPos(documentData[0].Placeholders);
} else {
- let unsigned = [];
- for (let i = 0; i < documentData.length; i++) {
- unsigned.push(documentData[i].Signers);
- }
- setUnSignedSigners(unsigned[0]);
+ //else condition is show there are no details in audit trail then direct push all signers details
+ //in unsignedsigners array
+ setUnSignedSigners(placeholdersOrSigners);
setSignerPos(documentData[0].Placeholders);
}
setPdfDetails(documentData);
@@ -447,7 +464,7 @@ function PdfRequestFiles() {
declined ||
currDate > expireUpdateDate
) {
- setRequestSignTour(false);
+ setRequestSignTour(true);
} else {
//else condition to check current user exist in contracts_Users class and check tour message status
//if not then check user exist in contracts_Contactbook class and check tour message status
@@ -463,33 +480,25 @@ function PdfRequestFiles() {
setContractName("_Users");
currUserId = res[0].objectId;
setSignerUserId(currUserId);
- const tourstatus = res[0].TourStatus && res[0].TourStatus;
- if (tourstatus && tourstatus.length > 0) {
- setTourStatus(tourstatus);
- const checkTourRequestSign = tourstatus.filter(
- (data) => data.requestSign
- );
- if (checkTourRequestSign && checkTourRequestSign.length > 0) {
- setRequestSignTour(checkTourRequestSign[0].requestSign);
- }
+ const tourData = res[0].TourStatus && res[0].TourStatus;
+ if (tourData && tourData.length > 0) {
+ setTourStatus(tourData);
+ setRequestSignTour(tourData[0]?.requestSign || false);
}
} else if (res?.length === 0) {
const res = await contactBook(currUserId);
+
if (res === "Error: Something went wrong!") {
setHandleError("Error: Something went wrong!");
} else if (res[0] && res.length) {
setContractName("_Contactbook");
const objectId = res[0].objectId;
setSignerUserId(objectId);
- const tourstatus = res[0].TourStatus && res[0].TourStatus;
- if (tourstatus && tourstatus.length > 0) {
- setTourStatus(tourstatus);
- const checkTourRequestSign = tourstatus.filter(
- (data) => data.requestSign
- );
- if (checkTourRequestSign && checkTourRequestSign.length > 0) {
- setRequestSignTour(checkTourRequestSign[0].requestSign);
- }
+ const tourData = res[0].TourStatus && res[0].TourStatus;
+
+ if (tourData && tourData.length > 0) {
+ setTourStatus(tourData);
+ setRequestSignTour(tourData[0]?.requestSign || false);
}
} else if (res.length === 0) {
setHandleError("Error: User does not exist!");
@@ -552,7 +561,6 @@ function PdfRequestFiles() {
setIsLoading(loadObj);
});
};
-
//function for embed signature or image url in pdf
async function embedWidgetsData() {
try {
@@ -996,8 +1004,10 @@ function PdfRequestFiles() {
}
const getFirstLetter = (name) => {
- const firstLetter = name.charAt(0);
- return firstLetter;
+ if (name) {
+ const firstLetter = name.charAt(0);
+ return firstLetter;
+ }
};
//function for image upload or update
const onImageChange = (event) => {
@@ -1109,9 +1119,23 @@ function PdfRequestFiles() {
};
const checkSignerBackColor = (obj) => {
- const data = signerPos.filter((data) => data.signerObjId === obj.objectId);
+ let data = "";
+ if (obj?.Id) {
+ data = signerPos.filter((data) => data.Id === obj.Id);
+ } else {
+ data = signerPos.filter((data) => data.signerObjId === obj.objectId);
+ }
return data && data.length > 0 && data[0].blockColor;
};
+ const checkUserNameColor = (obj) => {
+ const getBackColor = checkSignerBackColor(obj);
+ if (getBackColor) {
+ const color = darkenColor(getBackColor, 0.4);
+ return color;
+ } else {
+ return "#abd1d0";
+ }
+ };
//function for set decline true on press decline button
const declineDoc = async () => {
@@ -1210,7 +1234,7 @@ function PdfRequestFiles() {
};
//function to close tour and save tour status
const closeRequestSignTour = async () => {
- setRequestSignTour(false);
+ setRequestSignTour(true);
if (isDontShow) {
let updatedTourStatus = [];
if (tourStatus.length > 0) {
@@ -1332,7 +1356,6 @@ function PdfRequestFiles() {
/>
);
};
-
return (
@@ -1401,7 +1424,7 @@ function PdfRequestFiles() {
}}
ref={divRef}
>
- {requestSignTour && requestSignTourFunction()}
+ {!requestSignTour && requestSignTourFunction()}
- {getFirstLetter(obj.Name)}
+ {getFirstLetter(obj?.Name || obj?.Role)}
- {obj.Name}
+
+ {obj?.Name || obj?.Role}
+
- {obj.Email}
+ {obj?.Email || obj?.email}
@@ -1850,7 +1875,7 @@ function PdfRequestFiles() {
- {getFirstLetter(obj.Name)}
+ {getFirstLetter(obj?.Name || obj?.email)}