diff --git a/.env.local_dev b/.env.local_dev index 807d61ec0..7884fb0b9 100644 --- a/.env.local_dev +++ b/.env.local_dev @@ -42,75 +42,68 @@ DO_SECRET_ACCESS_KEY= # Digital ocean spaces region or AWS s3 region DO_REGION=us-west # local storage -USE_LOCAL=FALSE +USE_LOCAL=TRUE -# Email using Mailgun or SMTP if set enable config (The app will not initialize if any of these variables are not set) ********************************************************************************************************************* -MAILGUN_API_KEY= +# Email mailgun config (The app will not initialize if any of these 3 variables are not set) ********************************************************************************************************************* +MAILGUN_API_KEY=XXXXX MAILGUN_DOMAIN=mail.yourdomain.com MAILGUN_SENDER=postmaster@mail.yourdomain.com -SMTP_ENABLE= -SMTP_HOST= -SMTP_PORT= -SMTP_USER_EMAIL= -SMTP_PASS= - # Base64 encoded PFX or p12 document signing certificate file ********************************************************************************************************************* -PFX_BASE64='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 -c6yryFgECIld0S5kDk7JAgIIAA==' +PFX_BASE64='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' # Provide Pass pharse of above PFX or p12 document -PASS_PHRASE= \ No newline at end of file +PASS_PHRASE=opensign diff --git a/apps/OpenSign/.gitignore b/apps/OpenSign/.gitignore index cc964cb27..b96e769c8 100644 --- a/apps/OpenSign/.gitignore +++ b/apps/OpenSign/.gitignore @@ -10,6 +10,7 @@ # production /build +/mfbuild # misc .env diff --git a/apps/OpenSign/src/components/LoginFacebook.js b/apps/OpenSign/src/components/LoginFacebook.js index e6b77eed3..1dd0297a4 100644 --- a/apps/OpenSign/src/components/LoginFacebook.js +++ b/apps/OpenSign/src/components/LoginFacebook.js @@ -27,14 +27,14 @@ const LoginFacebook = ({ setThirdpartyLoader(true); const details = { Email: response.email, - Name: response.name, + Name: response.name }; setUserDetails({ ...userDetails, ...details }); const fDetails = { Id: response.userID, AccessToken: response.accessToken, Name: response.name, - Email: response.email, + Email: response.email }; setFBDetails({ ...fBDetails, ...fDetails }); const res = await checkExtUser(fDetails); @@ -42,9 +42,11 @@ const LoginFacebook = ({ }; const checkExtUser = async (details) => { - const extUser = new Parse.Query("contracts_Users"); - extUser.equalTo("Email", details.Email); - const extRes = await extUser.first(); + // const extUser = new Parse.Query("contracts_Users"); + // extUser.equalTo("Email", details.Email); + // const extRes = await extUser.first(); + const params = { email: details.Email }; + const extRes = await Parse.Cloud.run("getUserDetails", params); // console.log("extRes ", extRes); if (extRes) { const params = { ...details, Phone: extRes.get("Phone") }; @@ -209,18 +211,19 @@ const LoginFacebook = ({
diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 5fbf3309c..7cc01c213 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -42,7 +42,42 @@ const GoogleSignInBtn = ({ width: "187px" }); }); + const clearStorage = async () => { + await Parse.User.logOut(); + + let baseUrl = localStorage.getItem("BaseUrl12"); + let appid = localStorage.getItem("AppID12"); + let applogo = localStorage.getItem("appLogo"); + let domain = localStorage.getItem("domain"); + let appversion = localStorage.getItem("appVersion"); + let appTitle = localStorage.getItem("appTitle"); + let defaultmenuid = localStorage.getItem("defaultmenuid"); + let PageLanding = localStorage.getItem("PageLanding"); + let _appName = localStorage.getItem("_appName"); + let _app_objectId = localStorage.getItem("_app_objectId"); + let appName = localStorage.getItem("appName"); + let userSettings = localStorage.getItem("userSettings"); + + localStorage.clear(); + + localStorage.setItem("BaseUrl12", baseUrl); + localStorage.setItem("AppID12", appid); + localStorage.setItem("appLogo", applogo); + localStorage.setItem("domain", domain); + localStorage.setItem("appversion", appversion); + localStorage.setItem("appTitle", appTitle); + localStorage.setItem("defaultmenuid", defaultmenuid); + localStorage.setItem("PageLanding", PageLanding); + localStorage.setItem("_appName", _appName); + localStorage.setItem("_app_objectId", _app_objectId); + localStorage.setItem("appName", appName); + localStorage.setItem("userSettings", userSettings); + localStorage.setItem("baseUrl", baseUrl); + localStorage.setItem("parseAppId", appid); + + }; const responseGoogle = async (response) => { + clearStorage(); setThirdpartyLoader(true); // console.log("response ", response); if (response.credential) { @@ -66,9 +101,11 @@ const GoogleSignInBtn = ({ } }; const checkExtUser = async (details) => { - const extUser = new Parse.Query("contracts_Users"); - extUser.equalTo("Email", details.Gmail); - const extRes = await extUser.first(); + // const extUser = new Parse.Query("contracts_Users"); + // extUser.equalTo("Email", details.Gmail); + // const extRes = await extUser.first(); + const params = { email: details.Gmail }; + const extRes = await Parse.Cloud.run("getUserDetails", params); // console.log("extRes ", extRes); if (extRes) { const params = { ...details, Phone: extRes.get("Phone") }; @@ -261,17 +298,17 @@ const GoogleSignInBtn = ({
setUserDetails({ @@ -285,18 +322,19 @@ const GoogleSignInBtn = ({
diff --git a/apps/OpenSign/src/components/TreeWidget.js b/apps/OpenSign/src/components/TreeWidget.js index 24aa61689..b028ffb62 100644 --- a/apps/OpenSign/src/components/TreeWidget.js +++ b/apps/OpenSign/src/components/TreeWidget.js @@ -49,12 +49,9 @@ const TreeWidget = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - var emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - var q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - res = await q.first(); + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); if (res) res = res.toJSON(); } if (res) { @@ -79,12 +76,9 @@ const TreeWidget = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - res = await q.first(); + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); if (res) res = res.toJSON(); } @@ -121,10 +115,15 @@ const TreeWidget = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - emp = Parse.Object.extend(localStorage.getItem("extended_class")); - q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - res = await q.first(); + // emp = Parse.Object.extend(localStorage.getItem("extended_class")); + // q = new Parse.Query(emp); + // q.equalTo("UserId", currentUser); + // res = await q.first(); + // if (res) res = res.toJSON(); + const currentUser = Parse.User.current(); + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); if (res) res = res.toJSON(); } @@ -532,7 +531,7 @@ const TreeWidget = (props) => { padding: 0 }, overlay: { - width:"100%", + width: "100%", backgroundColor: "rgba(0, 0, 0, 0.75)", zIndex: 50 } diff --git a/apps/OpenSign/src/components/dashboard/DashboardCard.js b/apps/OpenSign/src/components/dashboard/DashboardCard.js index c51f7ba42..08d2a8904 100644 --- a/apps/OpenSign/src/components/dashboard/DashboardCard.js +++ b/apps/OpenSign/src/components/dashboard/DashboardCard.js @@ -1,7 +1,6 @@ import React, { useState, useEffect } from "react"; import axios from "axios"; import Parse from "parse"; -import onSearchFilter from "../../constant/searchQuery"; import getReplacedHashQuery from "../../constant/getReplacedHashQuery"; import "../../styles/loader.css"; import { useNavigate } from "react-router-dom"; @@ -35,14 +34,9 @@ const DashboardCard = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - var emp = Parse.Object.extend(localStorage.getItem("extended_class")); - var q = new Parse.Query(emp); - q.equalTo("UserId", { - __type: "Pointer", - className: "_User", - objectId: currentUser + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") }); - res = await q.first(); if (res) res = res.toJSON(); } if (res) { @@ -50,12 +44,7 @@ const DashboardCard = (props) => { var reg = /(\#.*?\#)/gi; // eslint-disable-line var str = props.Data.query; var test = ""; - if (str.includes("#filterCondition#")) { - str = str.replace( - "#filterCondition#", - onSearchFilter(props.DefaultQuery) - ); - } + if (props.Data.extendkey) { let a = props.Data.extendkey.split("."); if (a.length > 0) { @@ -110,13 +99,10 @@ const DashboardCard = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); resr = data[0]; } else { - let emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - let q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - let t = await q.first(); - resr = t.toJSON(); + resr = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); + if (resr) resr = resr.toJSON(); } let json = resr; @@ -150,47 +136,65 @@ const DashboardCard = (props) => { "X-Parse-Application-Id": parseAppId, "X-Parse-Session-Token": localStorage.getItem("accesstoken") }; - await axios.get(url, { headers: headers }).then((res) => { - if (res.data.results.length > 0) { - setLoading(false); - if (props.Data.key !== "count") { - setresponse(res.data.results[0][props.Data.key]); - } else { - if (props.Label === "Need your Signature") { - const listData = res.data?.results.filter( - (x) => x.Signers.length > 0 + // handle need your sign report count + if (props.Data.Redirect_id === "4Hhwbp482K") { + const params = { + reportId: props.Data.Redirect_id, + skip: 0, + limit: 200 + }; + const url = `${parseBaseUrl}/functions/getReport`; + await axios + .post(url, params, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + sessiontoken: localStorage.getItem("accesstoken") + } + }) + .then((res) => { + const listData = res.data?.result.filter( + (x) => x.Signers.length > 0 + ); + let arr = []; + for (const obj of listData) { + const isSigner = obj.Signers.some( + (item) => item.UserId.objectId === currentUser.id ); - let arr = []; - for (const obj of listData) { - const isSigner = obj.Signers.some( - (item) => item.UserId.objectId === currentUser.id - ); - if (isSigner) { - let isRecord; - if (obj?.AuditTrail && obj?.AuditTrail.length > 0) { - isRecord = obj?.AuditTrail.some( - (item) => - item?.UserPtr?.UserId?.objectId === currentUser.id && - item.Activity === "Signed" - ); - } else { - isRecord = false; - } - if (isRecord === false) { - arr.push(obj); - } + if (isSigner) { + let isRecord; + if (obj?.AuditTrail && obj?.AuditTrail.length > 0) { + isRecord = obj?.AuditTrail.some( + (item) => + item?.UserPtr?.UserId?.objectId === currentUser.id && + item.Activity === "Signed" + ); + } else { + isRecord = false; + } + if (isRecord === false) { + arr.push(obj); } } - setresponse(arr.length); + } + setresponse(arr.length); + setLoading(false); + }); + } else { + await axios.get(url, { headers: headers }).then((res) => { + if (res.data.results.length > 0) { + setLoading(false); + if (props.Data.key !== "count") { + setresponse(res.data.results[0][props.Data.key]); } else { setresponse(res.data[props.Data.key]); } + } else { + setresponse(0); + setLoading(false); } - } else { - setresponse(0); - setLoading(false); - } - }); + }); + } } catch (e) { console.error("Problem", e); setLoading(false); @@ -227,13 +231,10 @@ const DashboardCard = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - var emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - var q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - let resr = await q.first(); - res = resr.toJSON(); + let resr = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); + if (res) res = resr.toJSON(); } let json = res; diff --git a/apps/OpenSign/src/components/dashboard/DashboardReport.js b/apps/OpenSign/src/components/dashboard/DashboardReport.js index 4a0575f14..985d55c28 100644 --- a/apps/OpenSign/src/components/dashboard/DashboardReport.js +++ b/apps/OpenSign/src/components/dashboard/DashboardReport.js @@ -9,39 +9,58 @@ function DashboardReport(props) { const [isLoader, setIsLoader] = useState(true); const [reportName, setReportName] = useState(""); const [actions, setActions] = useState([]); + const [isNextRecord, setIsNextRecord] = useState(false); + const [isMoreDocs, setIsMoreDocs] = useState(true); + const abortController = new AbortController(); + const docPerPage = 5; + useEffect(() => { setReportName(""); getReportData(props.Record.reportId); + + // Function returned from useEffect is called on unmount + return () => { + setIsLoader(true); + setList([]); + setIsNextRecord(false); + // Here it'll abort the fetch + abortController.abort(); + }; + // eslint-disable-next-line }, [props.Record.reportId]); - const getReportData = async (id) => { + // below useEffect call when isNextRecord state is true and fetch next record + useEffect(() => { + if (isNextRecord) { + getReportData(props.Record.reportId, List.length, 200); + } + // eslint-disable-next-line + }, [isNextRecord]); + + const getReportData = async (id, skipUserRecord = 0, limit = 200) => { setIsLoader(true); const json = reportJson(id); if (json) { setActions(json.actions); setReportName(json.reportName); - const { className, params, keys, orderBy } = json; Parse.serverURL = localStorage.getItem("BaseUrl12"); Parse.initialize(localStorage.getItem("AppID12")); - const serverURL = - localStorage.getItem("BaseUrl12") + "classes/" + className; + const currentUser = Parse.User.current().id; - const strParams = JSON.stringify(params); - const strKeys = keys.join(); const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("AppID12"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") + sessiontoken: localStorage.getItem("accesstoken") }; try { - const url = `${serverURL}?where=${strParams}&keys=${strKeys}&order=${orderBy}&include=AuditTrail.UserPtr`; - const res = await axios.get(url, { headers: headers }); - // console.log("res ", res.data?.results); + const params = { reportId: id, skip: skipUserRecord, limit: limit }; + const url = `${localStorage.getItem("BaseUrl12")}/functions/getReport`; + const res = await axios.post(url, params, { + headers: headers, + signal: abortController.signal // is used to cancel fetch query + }); if (id === "5Go51Q7T8r") { - const currentUser = Parse.User.current().id; - const listData = res.data?.results.filter( - (x) => x.Signers.length > 0 - ); + const listData = res.data?.result.filter((x) => x.Signers.length > 0); let arr = []; for (const obj of listData) { const isSigner = obj.Signers.some( @@ -63,14 +82,34 @@ function DashboardReport(props) { } } } - setList(arr); + if (arr.length === docPerPage) { + setIsMoreDocs(true); + } else { + setIsMoreDocs(false); + } + setList((prevRecord) => + prevRecord.length > 0 ? [...prevRecord, ...arr] : arr + ); } else { - setList(res.data?.results); + if (res.data.result.length === docPerPage) { + setIsMoreDocs(true); + } else { + setIsMoreDocs(false); + } + setIsNextRecord(false); + setList((prevRecord) => + prevRecord.length > 0 + ? [...prevRecord, ...res.data.result] + : res.data.result + ); } setIsLoader(false); } catch (err) { - console.log("err ", err); - setIsLoader(false); + const isCancel = axios.isCancel(err); + if (!isCancel) { + console.log("err ", err); + setIsLoader(false); + } } } else { setIsLoader(false); @@ -101,8 +140,10 @@ function DashboardReport(props) { ) : (
diff --git a/apps/OpenSign/src/components/dashboard/GetDashboard.js b/apps/OpenSign/src/components/dashboard/GetDashboard.js index 8133f6f59..144505ef9 100644 --- a/apps/OpenSign/src/components/dashboard/GetDashboard.js +++ b/apps/OpenSign/src/components/dashboard/GetDashboard.js @@ -1,5 +1,4 @@ -import React, { useState, Suspense, lazy } from "react"; -import moment from "moment"; +import React, { Suspense, lazy } from "react"; import ErrorBoundary from "../ErrorBoundary"; const DashboardCard = lazy(() => import("./DashboardCard")); @@ -7,258 +6,6 @@ const DashboardCard = lazy(() => import("./DashboardCard")); const DashboardReport = lazy(() => import("./DashboardReport")); const GetDashboard = (props) => { - const [filter, setfilter] = useState(""); - const [option, setoption] = useState(""); - - const onSearchFilter = (e) => { - let _search = e.target.value; - localStorage.setItem("DashboardDefaultFilter", _search); - switch (_search) { - case "Today": { - let d = new Date(); - let formDate = new Date( - Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0) - ).toISOString(); - let Todate = new Date( - Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59) - ).toISOString(); - let Query = `'$gte':'${formDate}','$lte':'${Todate}'`; - setfilter(Query); - setoption(_search); - break; - } - case "Yesterday": { - let d1 = new Date(); - d1.setDate(d1.getDate() - 1); - let yesFrDate = new Date( - Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate(), 0, 0, 0) - ).toISOString(); - - let YesTodate = new Date( - Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate(), 23, 59, 59) - ).toISOString(); - let Query1 = `'$gte':'${yesFrDate}','$lte':'${YesTodate}'`; - setfilter(Query1); - setoption(_search); - break; - } - case "This week": { - let oneDay = 24 * 60 * 60 * 1000; - let curr = new Date(); // get current date - let first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week - - let firstday = new Date( - new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 0, - 0, - 0 - ) - ).setDate(first) - ).toISOString(); - let diffDays = Math.round( - Math.abs( - (new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 23, - 59, - 59 - ) - ) - - new Date(firstday)) / - oneDay - ) - ); //Days since last week - let last = first + diffDays; - let lastday = new Date( - new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 23, - 59, - 59 - ) - ).setDate(last) - ).toISOString(); - let Query2 = `'$gte':'${firstday}','$lte':'${lastday}'`; - setfilter(Query2); - setoption(_search); - break; - } - case "Last 7 days": { - let d7 = new Date(); - let d7l = new Date(); - d7.setDate(d7.getDate() - 7); - let l7t = new Date( - Date.UTC(d7l.getFullYear(), d7l.getMonth(), d7l.getDate(), 23, 59, 59) - ).toISOString(); - let date7 = new Date( - Date.UTC(d7.getFullYear(), d7.getMonth(), d7.getDate(), 0, 0, 0) - ).toISOString(); - let Query7 = `'$gte':'${date7}','$lte':'${l7t}'`; - setfilter(Query7); - setoption(_search); - break; - } - case "Last 14 days": { - let d14 = new Date(); - let d14l = new Date(); - let l14t = new Date( - Date.UTC( - d14l.getFullYear(), - d14l.getMonth(), - d14l.getDate(), - 23, - 59, - 59 - ) - ).toISOString(); - d14.setDate(d14.getDate() - 14); - let date14 = new Date( - Date.UTC(d14.getFullYear(), d14.getMonth(), d14.getDate(), 0, 0, 0) - ).toISOString(); - - let Query14 = `'$gte':'${date14}','$lte':'${l14t}'`; - setfilter(Query14); - setoption(_search); - break; - } - case "Last 30 days": { - let d30 = new Date(); - let d30l = new Date(); - let l30t = new Date( - Date.UTC( - d30l.getFullYear(), - d30l.getMonth(), - d30l.getDate(), - 23, - 59, - 59 - ) - ).toISOString(); - d30.setDate(d30.getDate() - 30); - let date30 = new Date( - Date.UTC(d30.getFullYear(), d30.getMonth(), d30.getDate(), 0, 0, 0) - ).toISOString(); - let Query30 = `'$gte':'${date30}','$lte':'${l30t}'`; - setfilter(Query30); - setoption(_search); - break; - } - case "Last week": { - const from_date = moment().startOf("week").subtract(7, "days"); - const to_date = moment().endOf("week").subtract(7, "days"); - let Queryl = `'$gte':'${from_date.toISOString()}','$lte':'${to_date.toISOString()}'`; - setfilter(Queryl); - setoption(_search); - break; - } - case "This month": { - const tdate = new Date(); - let tfirstDay = new Date( - tdate.getFullYear(), - tdate.getMonth(), - 1 - ).toISOString(); - let tlastDay = new Date( - tdate.getFullYear(), - tdate.getMonth() + 1, - 0 - ).toISOString(); - let Querylt = `'$gte':'${tfirstDay}','$lte':'${tlastDay}'`; - setfilter(Querylt); - setoption(_search); - break; - } - case "Last month": { - const ldate = new Date(); - var lfirstDay = new Date( - ldate.getFullYear(), - ldate.getMonth() - 1, - 2 - ).toISOString(); - var llastDay = new Date( - ldate.getFullYear(), - ldate.getMonth(), - 1 - ).toISOString(); - let Queryltl = `'$gte':'${lfirstDay}','$lte':'${llastDay}'`; - setfilter(Queryltl); - setoption(_search); - break; - } - case "All": { - let fall = new Date( - new Date().getFullYear() - 100, - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let fall_year = `'$gte':'${fall}'`; - setfilter(fall_year); - setoption(_search); - break; - } - case "This year": { - let fcy = new Date( - new Date().getFullYear(), - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let lcy = new Date( - new Date().getFullYear(), - 11, - 31, - 23, - 59, - 59 - ).toISOString(); - let cur_year = `'$gte':'${fcy}','$lte':'${lcy}'`; - setfilter(cur_year); - setoption(_search); - break; - } - case "Last year": { - let fly = new Date( - new Date().getFullYear() - 1, - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let lly = new Date( - new Date().getFullYear() - 1, - 11, - 31, - 23, - 59, - 59 - ).toISOString(); - let last_year = `'$gte':'${fly}','$lte':'${lly}'`; - setfilter(last_year); - setoption(_search); - break; - } - default: { - setoption(_search); - break; - } - } - }; const renderSwitchWithTour = (col) => { switch (col.widget.type) { case "Card": @@ -272,7 +19,6 @@ const GetDashboard = (props) => { {
); - case "customeHtml": - return ( -
- - -
-
- ); - - case "customeTag": - return ( -

- {col.widget.label} -

- ); case "report": { - let _filter = `${col.widget.filterKey}:${filter}`; return (
please wait
}>
- +
@@ -346,7 +54,6 @@ const GetDashboard = (props) => { { ); - case "customeHtml": - return ( -
- - -
-
- ); - - case "customeTag": - return ( -

- {col.widget.label} -

- ); case "report": { - let _filter = `${col.widget.filterKey}:${filter}`; return ( please wait}>
- +
); diff --git a/apps/OpenSign/src/components/fields/HiddenField.js b/apps/OpenSign/src/components/fields/HiddenField.js index 20b16d453..09d582ed4 100644 --- a/apps/OpenSign/src/components/fields/HiddenField.js +++ b/apps/OpenSign/src/components/fields/HiddenField.js @@ -1,6 +1,6 @@ import React, { Component } from "react"; import Parse from "parse"; -import axios from "axios"; +// import axios from "axios"; export class HiddenField extends Component { state = { @@ -37,31 +37,46 @@ export class HiddenField extends Component { this.setState({ _fields: custome_Filed }); } else { if (currentUser) { - let url = `${this.state.baseUrl}classes/${localStorage.getItem( - "extended_class" - )}?where={"UserId":{"__type":"Pointer","className":"_User","objectId":"${ - currentUser.id - }"}}&keys=${this.props.schema.data.valueKey}`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": this.state.parseAppId - }; - await axios.get(url, { headers: headers }).then((res) => { - let custome_Filed = ""; - let _rdata = res.data.results; - let splitArray = this.props.schema.data.valueKey.split("."); - if (splitArray.length > 1) { - custome_Filed = _rdata[0][splitArray[0]][splitArray[1]]; - } else { - console.log(_rdata[0][splitArray[0]]); - custome_Filed = _rdata[0][splitArray[0]]; - } - this.setState({ _fields: custome_Filed }); + // let url = `${this.state.baseUrl}classes/${localStorage.getItem( + // "extended_class" + // )}?where={"UserId":{"__type":"Pointer","className":"_User","objectId":"${ + // currentUser.id + // }"}}&keys=${this.props.schema.data.valueKey}`; + // const headers = { + // "Content-Type": "application/json", + // "X-Parse-Application-Id": this.state.parseAppId + // }; + // await axios.get(url, { headers: headers }).then((res) => { + // let custome_Filed = ""; + // let _rdata = res.data.results; + // let splitArray = this.props.schema.data.valueKey.split("."); + // if (splitArray.length > 1) { + // custome_Filed = _rdata[0][splitArray[0]][splitArray[1]]; + // } else { + // console.log(_rdata[0][splitArray[0]]); + // custome_Filed = _rdata[0][splitArray[0]]; + // } + // this.setState({ _fields: custome_Filed }); + // }); + + const res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") }); + let custome_Filed = ""; + const result = res.toJSON(); + let _rdata = [result]; + let splitArray = this.props.schema.data.valueKey.split("."); + if (splitArray.length > 1) { + custome_Filed = _rdata[0][splitArray[0]][splitArray[1]]; + } else { + console.log(_rdata[0][splitArray[0]]); + custome_Filed = _rdata[0][splitArray[0]]; + } + this.setState({ _fields: custome_Filed }); } } } catch (error) { - console.log('err', error) + console.log("err", error); } } }; diff --git a/apps/OpenSign/src/components/fields/Level1Dropdown.js b/apps/OpenSign/src/components/fields/Level1Dropdown.js index 1b25c33fb..42228a6f6 100644 --- a/apps/OpenSign/src/components/fields/Level1Dropdown.js +++ b/apps/OpenSign/src/components/fields/Level1Dropdown.js @@ -120,12 +120,10 @@ const Level1Dropdown = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - var emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - var q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - res = await q.first(); + const currentUser = Parse.User.current(); + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); if (res) res = res.toJSON(); } @@ -339,7 +337,7 @@ const Level1Dropdown = (props) => { x.className = x.className.replace("show", ""); }, 5000); } catch (error) { - console.log("Err", error) + console.log("Err", error); } } }; diff --git a/apps/OpenSign/src/constant/searchQuery.js b/apps/OpenSign/src/constant/searchQuery.js deleted file mode 100644 index d9d5531bf..000000000 --- a/apps/OpenSign/src/constant/searchQuery.js +++ /dev/null @@ -1,210 +0,0 @@ -import moment from "moment"; - -export default function onSearchFilter(_search) { - switch (_search) { - case "Today": { - let d = new Date(); - let formDate = new Date( - Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0) - ).toISOString(); - let Todate = new Date( - Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59) - ).toISOString(); - let Query = `'$gte':'${formDate}','$lte':'${Todate}'`; - return Query; - } - case "Yesterday": { - let d1 = new Date(); - d1.setDate(d1.getDate() - 1); - let yesFrDate = new Date( - Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate(), 0, 0, 0) - ).toISOString(); - - let YesTodate = new Date( - Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate(), 23, 59, 59) - ).toISOString(); - let Query1 = `'$gte':'${yesFrDate}','$lte':'${YesTodate}'`; - return Query1; - } - - case "This week": { - let oneDay = 24 * 60 * 60 * 1000; - let curr = new Date(); // get current date - let first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week - - let firstday = new Date( - new Date( - Date.UTC(curr.getFullYear(), curr.getMonth(), curr.getDate(), 0, 0, 0) - ).setDate(first) - ).toISOString(); - let diffDays = Math.round( - Math.abs( - (new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 23, - 59, - 59 - ) - ) - - new Date(firstday)) / - oneDay - ) - ); //Days since last week - let last = first + diffDays; - let lastday = new Date( - new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 23, - 59, - 59 - ) - ).setDate(last) - ).toISOString(); - let Query2 = `'$gte':'${firstday}','$lte':'${lastday}'`; - return Query2; - } - - case "Last 7 days": { - let d7 = new Date(); - let d7l = new Date(); - d7.setDate(d7.getDate() - 7); - let l7t = new Date( - Date.UTC(d7l.getFullYear(), d7l.getMonth(), d7l.getDate(), 23, 59, 59) - ).toISOString(); - let date7 = new Date( - Date.UTC(d7.getFullYear(), d7.getMonth(), d7.getDate(), 0, 0, 0) - ).toISOString(); - let Query7 = `'$gte':'${date7}','$lte':'${l7t}'`; - return Query7; - } - case "Last 14 days": { - let d14 = new Date(); - let d14l = new Date(); - let l14t = new Date( - Date.UTC( - d14l.getFullYear(), - d14l.getMonth(), - d14l.getDate(), - 23, - 59, - 59 - ) - ).toISOString(); - d14.setDate(d14.getDate() - 14); - let date14 = new Date( - Date.UTC(d14.getFullYear(), d14.getMonth(), d14.getDate(), 0, 0, 0) - ).toISOString(); - - let Query14 = `'$gte':'${date14}','$lte':'${l14t}'`; - return Query14; - } - - case "Last 30 days": { - let d30 = new Date(); - let d30l = new Date(); - let l30t = new Date( - Date.UTC( - d30l.getFullYear(), - d30l.getMonth(), - d30l.getDate(), - 23, - 59, - 59 - ) - ).toISOString(); - d30.setDate(d30.getDate() - 30); - let date30 = new Date( - Date.UTC(d30.getFullYear(), d30.getMonth(), d30.getDate(), 0, 0, 0) - ).toISOString(); - return `'$gte':'${date30}','$lte':'${l30t}'`; - } - case "Last week": { - const from_date = moment().startOf("week").subtract(7, "days"); - const to_date = moment().endOf("week").subtract(7, "days"); - return `'$gte':'${from_date.toISOString()}','$lte':'${to_date.toISOString()}'`; - } - case "This month": { - var tdate = new Date(); - var tfirstDay = new Date( - tdate.getFullYear(), - tdate.getMonth(), - 1 - ).toISOString(); - var tlastDay = new Date( - tdate.getFullYear(), - tdate.getMonth() + 1, - 0 - ).toISOString(); - let Querylt = `'$gte':'${tfirstDay}','$lte':'${tlastDay}'`; - return Querylt; - } - case "Last month": { - var ldate = new Date(); - var lfirstDay = new Date( - ldate.getFullYear(), - ldate.getMonth() - 1, - 2 - ).toISOString(); - var llastDay = new Date( - ldate.getFullYear(), - ldate.getMonth(), - 1 - ).toISOString(); - let Queryltl = `'$gte':'${lfirstDay}','$lte':'${llastDay}'`; - return Queryltl; - } - case "All": { - let fall = new Date( - new Date().getFullYear() - 100, - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let fall_year = `'$gte':'${fall}'`; - return fall_year; - } - case "This year": { - let fcy = new Date(new Date().getFullYear(), 0, 1, 0, 0, 0).toISOString(); - let lcy = new Date( - new Date().getFullYear(), - 11, - 31, - 23, - 59, - 59 - ).toISOString(); - let cur_year = `'$gte':'${fcy}','$lte':'${lcy}'`; - return cur_year; - } - case "Last year": { - let fly = new Date( - new Date().getFullYear() - 1, - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let lly = new Date( - new Date().getFullYear() - 1, - 11, - 31, - 23, - 59, - 59 - ).toISOString(); - let last_year = `'$gte':'${fly}','$lte':'${lly}'`; - return last_year; - } - default: - return ""; - } -} diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index 960559938..364b0af2d 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -1,6 +1,4 @@ -import Parse from "parse"; export default function reportJson(id) { - const currentUserId = Parse.User.current().id; // console.log("json ", json); switch (id) { @@ -8,28 +6,6 @@ export default function reportJson(id) { case "ByHuevtCFY": return { reportName: "Draft Documents", - className: "contracts_Document", - params: { - Type: null, - $or: [ - { Signers: null, SignedUrl: null }, - { Signers: { $exists: true }, Placeholders: null } - ], - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "sign", @@ -45,27 +21,6 @@ export default function reportJson(id) { case "4Hhwbp482K": return { reportName: "Need your sign", - className: "contracts_Document", - params: { - Type: { $ne: "Folder" }, - IsCompleted: { $ne: true }, - IsDeclined: { $ne: true }, - ExpiryDate: { - $gt: { __type: "Date", iso: new Date().toISOString() } - }, - Placeholders: { $ne: null } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name", - "Signers.UserId", - "AuditTrail" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "sign", @@ -81,31 +36,6 @@ export default function reportJson(id) { case "1MwEuxLEkF": return { reportName: "In-progress documents", - className: "contracts_Document", - params: { - Type: { $ne: "Folder" }, - Signers: { $ne: null }, - Placeholders: { $ne: null }, - IsCompleted: { $ne: true }, - IsDeclined: { $ne: true }, - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - }, - ExpiryDate: { - $gt: { __type: "Date", iso: new Date().toISOString() } - } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -121,27 +51,6 @@ export default function reportJson(id) { case "kQUoW4hUXz": return { reportName: "Completed Documents", - className: "contracts_Document", - params: { - Type: null, - IsCompleted: true, - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - }, - IsDeclined: { $ne: true } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name", - "TimeToCompleteDays" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -153,63 +62,10 @@ export default function reportJson(id) { } ] }; - // OpenSignDrive™ documents Drafts - case "VRFDmUmw5B": - return { - reportName: "OpenSignDrive™ Drafts", - className: "contracts_Document", - params: { - Type: "AIDoc", - $or: [ - { Signers: null, SignedUrl: null }, - { Signers: { $exists: true }, Placeholders: null } - ], - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name" - ], - orderBy: "-updatedAt", - actions: [ - { - btnLabel: "edit", - btnColor: "#3ac9d6", - textColor: "white", - btnIcon: "fa fa-plus", - redirectUrl: - "remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9MZWdhR2VuaWUtTWljcm9hcHBWMi9yZW1vdGVFbnRyeS5qcw==&moduleToLoad=AppRoutes&remoteName=legageniemicroapp/legagenie" - } - ] - }; // declined documents report case "UPr2Fm5WY3": return { reportName: "Declined Documents", - className: "contracts_Document", - params: { Type: null, IsDeclined: true }, - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -225,39 +81,6 @@ export default function reportJson(id) { case "zNqBHXHsYH": return { reportName: "Expired Documents", - className: "contracts_Document", - params: { - IsCompleted: { $ne: true }, - IsDeclined: { $ne: true }, - Type: { $ne: "Folder" }, - $and: [ - { - $or: [ - { Signers: { $ne: null }, SignedUrl: { $ne: null } }, - { Placeholders: { $ne: null } } - ] - }, - { - ExpiryDate: { - $lt: { __type: "Date", iso: new Date().toISOString() } - } - } - ], - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -273,31 +96,6 @@ export default function reportJson(id) { case "d9k3UfYHBc": return { reportName: "Recently sent for signatures", - className: "contracts_Document", - params: { - Type: { $ne: "Folder" }, - Signers: { $ne: null }, - Placeholders: { $ne: null }, - IsCompleted: { $ne: true }, - IsDeclined: { $ne: true }, - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - }, - ExpiryDate: { - $gt: { __type: "Date", iso: new Date().toISOString() } - } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -313,27 +111,6 @@ export default function reportJson(id) { case "5Go51Q7T8r": return { reportName: "Recent signature requests", - className: "contracts_Document", - params: { - Type: { $ne: "Folder" }, - IsCompleted: { $ne: true }, - IsDeclined: { $ne: true }, - ExpiryDate: { - $gt: { __type: "Date", iso: new Date().toISOString() } - }, - Placeholders: { $ne: null } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name", - "Signers.UserId", - "AuditTrail" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "Sign", @@ -349,28 +126,6 @@ export default function reportJson(id) { case "kC5mfynCi4": return { reportName: "Drafts", - className: "contracts_Document", - params: { - Type: null, - $or: [ - { Signers: null, SignedUrl: null }, - { Signers: { $exists: true }, Placeholders: null } - ], - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - } - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "sign", diff --git a/apps/OpenSign/src/json/plansArr.json b/apps/OpenSign/src/json/plansArr.json index 57439a344..ed75ffcb9 100644 --- a/apps/OpenSign/src/json/plansArr.json +++ b/apps/OpenSign/src/json/plansArr.json @@ -26,7 +26,7 @@ "planName": "THANKS PLAN", "currency": "$", "price": "29.99", - "subtitle": "Use code 'FREEBETA' to get this for free(First 100 users)", + "subtitle": "Use code 'FREEBETA' to get this for free(First 1000 users)", "btnText": "Subscribe", "url": "https://subscriptions.zoho.in/subscribe/ef798486e6a0a11ea65f2bae8f2af901dbadf3175d495584fd25b9af5d2f2b9e/thanks", "benefits": [ diff --git a/apps/OpenSign/src/layout/HomeLayout.js b/apps/OpenSign/src/layout/HomeLayout.js index eaa479716..f2df02822 100644 --- a/apps/OpenSign/src/layout/HomeLayout.js +++ b/apps/OpenSign/src/layout/HomeLayout.js @@ -6,7 +6,7 @@ import { useWindowSize } from "../hook/useWindowSize"; import Tour from "reactour"; import axios from "axios"; import { useSelector } from "react-redux"; - +import Parse from "parse"; const HomeLayout = ({ children }) => { const { width } = useWindowSize(); const [isOpen, setIsOpen] = useState(false); @@ -124,20 +124,11 @@ const HomeLayout = ({ children }) => { }; async function checkTourStatus() { - const serverUrl = localStorage.getItem("baseUrl"); - const appId = localStorage.getItem("AppID12"); - const extUserClass = localStorage.getItem("extended_class"); - const json = JSON.parse(localStorage.getItem("Extand_Class")); - const extUserId = json && json.length > 0 && json[0].objectId; - // console.log("extUserId ", extUserId); - const res = await axios.get( - serverUrl + "classes/" + extUserClass + "/" + extUserId, - { - headers: { - "X-Parse-Application-Id": appId - } - } - ); + const currentUser = Parse.User.current(); + const cloudRes = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); + const res = { data: cloudRes.toJSON() }; if (res.data && res.data.TourStatus && res.data.TourStatus.length > 0) { const tourStatus = res.data.TourStatus; // console.log("res ", res.data.TourStatus); diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 4bf02a818..676230a25 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -7,11 +7,11 @@ const ReportTable = ({ List, actions, setIsNextRecord, - isMoreDocs + isMoreDocs, + docPerPage }) => { const navigate = useNavigate(); const [currentPage, setCurrentPage] = useState(1); - const docPerPage = 10; // const pageNumbers = []; // For loop is used to calculate page numbers visible below table @@ -22,7 +22,7 @@ const ReportTable = ({ calculatedPageNumbers.push(i); } return calculatedPageNumbers; - }, [List]); + }, [List, docPerPage]); // below useEffect reset currenpage to 1 if user change route useEffect(() => { return () => setCurrentPage(1); @@ -154,7 +154,7 @@ const ReportTable = ({
- {List.length > 10 && ( + {List.length > docPerPage && ( <> {currentPage > 1 && ( )} - {List.length > 10 && ( + {List.length > docPerPage && ( <> {pageNumbers.includes(currentPage + 1) && (
- {!state.hideNav && ( + {width >= 768 && (
-
Additional Info
+
+ Additional Info +
diff --git a/apps/OpenSign/src/routes/Pgsignup.js b/apps/OpenSign/src/routes/Pgsignup.js index bda1934a4..79f033a6c 100644 --- a/apps/OpenSign/src/routes/Pgsignup.js +++ b/apps/OpenSign/src/routes/Pgsignup.js @@ -67,9 +67,8 @@ const PgSignUp = (props) => { const userSettings = JSON.parse(localStorage.getItem("userSettings")); const extClass = userSettings[0].extended_class; // console.log("extClass ", extClass); - const checkUser = new Parse.Query(extClass); - checkUser.equalTo("Email", userDetails.email); - const res = await checkUser.first(); + const params = { email: userDetails.email }; + const res = await Parse.Cloud.run("getUserDetails", params); // console.log("res", res); if (res) { const checkUser = new Parse.Query(extClass); @@ -152,6 +151,7 @@ const PgSignUp = (props) => { if (res) { const params = { userDetails: { + jobTitle: zohoRes.data.result.jobTitle, company: zohoRes.data.result.company, name: zohoRes.data.result.name, email: zohoRes.data.result.email, @@ -279,13 +279,6 @@ const PgSignUp = (props) => { "" ); localStorage.setItem("_user_role", _role); - - if (element.enableCart) { - localStorage.setItem("EnableCart", element.enableCart); - props.setEnableCart(element.enableCart); - } else { - localStorage.removeItem("EnableCart"); - } // Get TenentID from Extendend Class localStorage.setItem( "extended_class", @@ -293,14 +286,12 @@ const PgSignUp = (props) => { ); localStorage.setItem("userpointer", element.userpointer); - const extendedClass = Parse.Object.extend( - element.extended_class - ); - let query = new Parse.Query(extendedClass); - query.equalTo("UserId", Parse.User.current()); - query.include("TenantId"); - await query.find().then( - (results) => { + const currentUser = Parse.User.current(); + await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }).then( + (result) => { + const results = [result]; let tenentInfo = []; if (results) { let extendedInfo_stringify = @@ -415,7 +406,7 @@ const PgSignUp = (props) => { } }) .catch((err) => { - console.log('err', err) + console.log("err", err); setIsLoader(false); }); } @@ -448,10 +439,10 @@ const PgSignUp = (props) => { ) : (
-

Choose Password

+

Choose Password


{ /> { @@ -28,7 +28,12 @@ const PlanSubscriptions = () => { : ""; const phone = userDetails && userDetails.phone ? "&mobile=" + userDetails.phone : ""; - const details = "?shipping_country_code=US&" + name + email + company + phone; + const details = + "?shipping_country_code=US&billing_country_code=US&billing_state_code=CA&" + + name + + email + + company + + phone; useEffect(() => { if (localStorage.getItem("accesstoken")) { setIsLoader(false); @@ -41,7 +46,7 @@ const PlanSubscriptions = () => { return ( <> - + <Title title={"Subscriptions"} /> {isLoader ? ( <div style={{ @@ -131,15 +136,13 @@ const PlanSubscriptions = () => { <p>{item.subtitle}</p> </div> </div> - <div className="bg-[#002862] w-full text-white py-2 rounded"> - <NavLink - to={item.url + details} - className="rounded uppercase hover:no-underline hover:text-white" - target="_self" - > - {item.btnText} - </NavLink> - </div> + <NavLink + to={item.url + details} + className="bg-[#002862] w-full text-white py-2 rounded uppercase hover:no-underline hover:text-white" + target="_self" + > + {item.btnText} + </NavLink> </div> <hr className="w-full bg-gray-300 p-[.5px]" /> <ul className="mx-1 p-3 text-left break-words text-sm list-none"> diff --git a/apps/OpenSign/src/routes/Report.js b/apps/OpenSign/src/routes/Report.js index efec224ac..c1e8d7689 100644 --- a/apps/OpenSign/src/routes/Report.js +++ b/apps/OpenSign/src/routes/Report.js @@ -15,6 +15,7 @@ const Report = () => { const [isNextRecord, setIsNextRecord] = useState(false); const [isMoreDocs, setIsMoreDocs] = useState(true); const abortController = new AbortController(); + const docPerPage = 10; // below useEffect is call when id param change useEffect(() => { @@ -47,30 +48,24 @@ const Report = () => { if (json) { setActions(json.actions); setReportName(json.reportName); - const { className, params, keys, orderBy } = json; Parse.serverURL = localStorage.getItem("BaseUrl12"); Parse.initialize(localStorage.getItem("AppID12")); const currentUser = Parse.User.current().id; - const serverURL = - localStorage.getItem("BaseUrl12") + "classes/" + className; - const strParams = JSON.stringify(params); - const strKeys = keys.join(); const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("AppID12"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") + sessiontoken: localStorage.getItem("accesstoken") }; try { - const url = `${serverURL}?where=${strParams}&keys=${strKeys}&order=${orderBy}&skip=${skipUserRecord}&limit=${limit}&include=AuditTrail.UserPtr`; - const res = await axios.get(url, { + const params = { reportId: id, skip: skipUserRecord, limit: limit }; + const url = `${localStorage.getItem("BaseUrl12")}/functions/getReport`; + const res = await axios.post(url, params, { headers: headers, signal: abortController.signal // is used to cancel fetch query }); if (id === "4Hhwbp482K") { - const listData = res.data?.results.filter( - (x) => x.Signers.length > 0 - ); + const listData = res.data?.result.filter((x) => x.Signers.length > 0); let arr = []; for (const obj of listData) { const isSigner = obj.Signers.some( @@ -92,7 +87,7 @@ const Report = () => { } } } - if (arr.length === 10) { + if (arr.length === docPerPage) { setIsMoreDocs(true); } else { setIsMoreDocs(false); @@ -101,17 +96,16 @@ const Report = () => { prevRecord.length > 0 ? [...prevRecord, ...arr] : arr ); } else { - if (res.data.results.length === 10) { + if (res.data.result.length === docPerPage) { setIsMoreDocs(true); - console.log("here"); } else { setIsMoreDocs(false); } setIsNextRecord(false); setList((prevRecord) => prevRecord.length > 0 - ? [...prevRecord, ...res.data.results] - : res.data.results + ? [...prevRecord, ...res.data.result] + : res.data.result ); } setIsLoader(false); @@ -155,6 +149,7 @@ const Report = () => { actions={actions} setIsNextRecord={setIsNextRecord} isMoreDocs={isMoreDocs} + docPerPage={docPerPage} /> ) : ( <div className="flex items-center justify-center h-screen w-full bg-white rounded"> diff --git a/apps/OpenSign/src/routes/Signup.js b/apps/OpenSign/src/routes/Signup.js index d688eaacc..72a80588e 100644 --- a/apps/OpenSign/src/routes/Signup.js +++ b/apps/OpenSign/src/routes/Signup.js @@ -6,8 +6,10 @@ import Title from "../components/Title"; import { fetchAppInfo, showTenantName } from "../redux/actions"; import { useNavigate, NavLink } from "react-router-dom"; import login_img from "../assets/images/login_img.svg"; +import { useWindowSize } from "../hook/useWindowSize"; const Signup = (props) => { + const { width } = useWindowSize(); const navigate = useNavigate(); const [name, setName] = useState(""); const [phone, setPhone] = useState(""); @@ -18,7 +20,6 @@ const Signup = (props) => { const [company, setCompany] = useState(""); const [jobTitle, setJobTitle] = useState(""); const [state, setState] = useState({ - hideNav: "", loading: false, toastColor: "#5cb85c", toastDescription: "" @@ -52,58 +53,34 @@ const Signup = (props) => { res .then(async (r) => { if (r) { - let roleurl = `${parseBaseUrl}functions/AddUserToRole`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": parseAppId, - sessionToken: - r.getSessionToken() || localStorage.getItem("accesstoken") - }; - let body = { - appName: props.appInfo.appname, - roleName: props.appInfo.defaultRole, - userId: r.id - }; - await axios.post(roleurl, body, { headers: headers }); - let roleData = props.appInfo.settings; if (roleData && roleData.length > 0) { - roleData.forEach((rld) => { - if (rld.role === props.appInfo.defaultRole) { - const extCls = Parse.Object.extend(rld.extended_class); - const newObj = new extCls(); - newObj.set("UserId", { - __type: "Pointer", - className: "_User", - objectId: r.id - }); - newObj.set("UserRole", props.appInfo.defaultRole); - newObj.set("Email", email); - newObj.set("Name", name); - newObj.set("Phone", phone); - newObj.set("Company", company); - newObj.set("JobTitle", jobTitle); - newObj - .save() - .then((ex) => { - if (ex) { - handleNavigation(r.getSessionToken()); - } - }) - .catch((err) => { - alert(err.message); - setState({ loading: false }); - }); + const params = { + userDetails: { + jobTitle: jobTitle, + company: company, + name: name, + email: email, + phone: phone, + role: props.appInfo.defaultRole } - }); + }; + try { + const usersignup = await Parse.Cloud.run("usersignup", params); + if (usersignup) { + handleNavigation(r.getSessionToken()); + } + } catch (err) { + alert(err.message); + setState({ loading: false }); + } } } }) .catch(async (err) => { if (err.code === 202) { - const userQuery = new Parse.Query("contracts_Users"); - userQuery.equalTo("Email", email); - const res = await userQuery.first(); + const params = { email: email }; + const res = await Parse.Cloud.run("getUserDetails", params); // console.log("Res ", res); if (res) { alert("User already exists with this username!"); @@ -208,13 +185,6 @@ const Signup = (props) => { "" ); localStorage.setItem("_user_role", _role); - - if (element.enableCart) { - localStorage.setItem("EnableCart", element.enableCart); - props.setEnableCart(element.enableCart); - } else { - localStorage.removeItem("EnableCart"); - } // Get TenentID from Extendend Class localStorage.setItem( "extended_class", @@ -222,15 +192,12 @@ const Signup = (props) => { ); localStorage.setItem("userpointer", element.userpointer); - const extendedClass = Parse.Object.extend( - element.extended_class - ); - let query = new Parse.Query(extendedClass); - query.equalTo("UserId", Parse.User.current()); - query.include("TenantId"); - await query.find().then( - (results) => { + await Parse.Cloud.run("getUserDetails", { + email: email + }).then( + (result) => { let tenentInfo = []; + const results = [result]; if (results) { let extendedInfo_stringify = JSON.stringify(results); @@ -318,7 +285,7 @@ const Signup = (props) => { ); setState({ loading: false }); if (process.env.REACT_APP_ENABLE_SUBSCRIPTION) { - navigate("/subscription"); + navigate(`/subscription`, { replace: true }); } else { alert("Registered user successfully"); navigate( @@ -336,7 +303,7 @@ const Signup = (props) => { localStorage.setItem("pageType", element.pageType); setState({ loading: false }); if (process.env.REACT_APP_ENABLE_SUBSCRIPTION) { - navigate("/subscription"); + navigate(`/subscription`, { replace: true }); } else { navigate( `/${element.pageType}/${element.pageId}` @@ -421,24 +388,14 @@ const Signup = (props) => { } }; useEffect(() => { - window.addEventListener("resize", resize); props.fetchAppInfo( localStorage.getItem("domain"), localStorage.getItem("BaseUrl12"), localStorage.getItem("AppID12") ); - return () => { - window.removeEventListener("resize", resize); - }; // eslint-disable-next-line }, []); - const resize = () => { - let currentHideNav = window.innerWidth <= 760; - if (currentHideNav !== state.hideNav) { - setState({ hideNav: currentHideNav }); - } - }; return ( <div className="bg-white"> {state.loading && ( @@ -472,11 +429,7 @@ const Signup = (props) => { <div> <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="w-[250px] h-[66px] inline-block"> - {state.hideNav ? ( - <img src={image} width="100%" alt="" /> - ) : ( - <img src={image} width="100%" alt="" /> - )} + <img src={image} width="100%" alt="" /> </div> <div className="grid grid-cols-1 md:grid-cols-2 gap-x-2"> <div className=""> @@ -584,14 +537,14 @@ const Signup = (props) => { <NavLink className="rounded-sm cursor-pointer bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] w-full py-3 shadow uppercase" to="/" - style={state.hideNav ? { textAlign: "center" } : {}} + style={width < 768 ? { textAlign: "center" } : {}} > Login </NavLink> </div> </form> </div> - {!state.hideNav && ( + {width >= 768 && ( <div className="self-center"> <div className="mx-auto md:w-[300px] lg:w-[400px] xl:w-[500px]"> <img src={login_img} alt="bisec" width="100%" /> diff --git a/apps/OpenSign/src/routes/UserProfile.js b/apps/OpenSign/src/routes/UserProfile.js index ae86ca1ba..5dc747329 100644 --- a/apps/OpenSign/src/routes/UserProfile.js +++ b/apps/OpenSign/src/routes/UserProfile.js @@ -5,7 +5,7 @@ import { SaveFileSize } from "../constant/saveFileSize"; import dp from "../assets/images/dp.png"; import Title from "../components/Title"; import sanitizeFileName from "../primitives/sanitizeFileName"; - +import axios from "axios"; function UserProfile() { const navigate = useNavigate(); let UserProfile = JSON.parse(localStorage.getItem("UserInformation")); @@ -16,6 +16,8 @@ function UserProfile() { const [Phone, SetPhone] = useState(UserProfile && UserProfile.phone); const [Image, setImage] = useState(localStorage.getItem("profileImg")); const [isLoader, setIsLoader] = useState(false); + const [percentage, setpercentage] = useState(0); + Parse.serverURL = parseBaseUrl; Parse.initialize(parseAppId); const handleSubmit = async (e) => { @@ -44,7 +46,7 @@ function UserProfile() { await updateExtUser({ Name: res.name, Phone: res.phone }); alert("Profile updated successfully."); setEditMode(false); - navigate("/"); + navigate("/dashboard/35KBoSgoAK"); } }, (error) => { @@ -64,18 +66,24 @@ function UserProfile() { const extClass = localStorage.getItem("extended_class"); const extData = JSON.parse(localStorage.getItem("Extand_Class")); const ExtUserId = extData[0].objectId; - // console.log("extData ", extData); // console.log("UserId ", ExtUserId); + const body = { Phone: obj.Phone, Name: obj.Name }; + await axios.put( + parseBaseUrl + "classes/" + extClass + "/" + ExtUserId, + body, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ); + const res = await Parse.Cloud.run("getUserDetails", { + email: extData[0].Email + }); - const extQuery = new Parse.Query(extClass); - const update = await extQuery.get(ExtUserId); - // console.log("update ", update); - - update.set("Phone", obj.Phone); - update.set("Name", obj.Name); - const updateRes = await update.save(); - - const json = JSON.parse(JSON.stringify([updateRes])); + const json = JSON.parse(JSON.stringify([res])); const extRes = JSON.stringify(json); localStorage.setItem("Extand_Class", extRes); @@ -96,7 +104,15 @@ function UserProfile() { const parseFile = new Parse.File(name, pdfFile); try { - const response = await parseFile.save(); + const response = await parseFile.save({ + progress: (progressValue, loaded, total, { type }) => { + if (type === "upload" && progressValue !== null) { + const percentCompleted = Math.round((loaded * 100) / total); + // console.log("percentCompleted ", percentCompleted); + setpercentage(percentCompleted); + } + } + }); // // The response object will contain information about the uploaded file // console.log("File uploaded:", response); @@ -105,6 +121,7 @@ function UserProfile() { if (response.url()) { setImage(response.url()); localStorage.setItem("profileImg", response.url()); + setpercentage(0); SaveFileSize(size, response.url()); return response.url(); } @@ -154,14 +171,25 @@ function UserProfile() { <input type="file" className="max-w-[270px] text-sm py-1 px-2 mt-4 border-[1px] border-[#15b4e9] text-black rounded" + accept="image/png, image/gif, image/jpeg" onChange={(e) => { let files = e.target.files; fileUpload(files[0]); }} /> )} + {percentage !== 0 && ( + <div className="flex items-center gap-x-2"> + <div className="h-2 rounded-full w-[200px] md:w-[400px] bg-gray-200"> + <div + className="h-2 rounded-full bg-blue-500" + style={{ width: `${percentage}%` }} + ></div> + </div> + <span className="text-black text-sm">{percentage}%</span> + </div> + )} <div className="text-base font-semibold pt-4"> - {" "} {localStorage.getItem("_user_role")} </div> </div> @@ -214,26 +242,11 @@ function UserProfile() { </li> </ul> <div className="flex justify-center pb-4"> - <button - type="button" - onClick={() => { - if (editmode) { - setEditMode(false); - } else { - navigate("/changepassword"); - } - }} - className={`rounded shadow text-white bg-[#3598dc] mr-4 ${ - editmode ? "px-4 py-2 " : "p-2" - }`} - > - {editmode ? "Cancel" : "Change Password"} - </button> {editmode ? ( <button type="button" onClick={handleSubmit} - className="rounded bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] px-4 py-2" + className="rounded bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] px-4 py-2 mr-4" > Save </button> @@ -243,11 +256,26 @@ function UserProfile() { onClick={() => { setEditMode(true); }} - className="rounded shadow text-white bg-[#e7505a] px-4 py-2" + className="rounded shadow text-white bg-[#e7505a] px-4 py-2 mr-4" > Edit </button> )} + <button + type="button" + onClick={() => { + if (editmode) { + setEditMode(false); + } else { + navigate("/changepassword"); + } + }} + className={`rounded shadow text-white bg-[#3598dc] ${ + editmode ? "px-4 py-2 " : "p-2" + }`} + > + {editmode ? "Cancel" : "Change Password"} + </button> </div> </div> )} diff --git a/apps/OpenSign/src/styles/pgsignup.css b/apps/OpenSign/src/styles/pgsignup.css index fab477b35..102a878de 100644 --- a/apps/OpenSign/src/styles/pgsignup.css +++ b/apps/OpenSign/src/styles/pgsignup.css @@ -1,12 +1,14 @@ /* Full-width input fields */ .inputt { width: 100%; - padding: 15px; - margin: 5px 0 22px 0; + padding: 8px; + margin-bottom: 10px; + /* margin: 5px 0 14px 0; */ display: inline-block; border: none; background: #f1f1f1; color: black; + font-size: 12px; } /* Add a background color when the inputs get focus */ @@ -18,11 +20,12 @@ .confirmInputt { width: 100%; - padding: 15px; - margin: 5px 0 1px 0; + padding: 8px; + /* margin: 5px 0 14px 0; */ display: inline-block; background: #f1f1f1; color: black; + font-size: 12px; } .inputt::placeholder, @@ -42,11 +45,10 @@ .signupbtn { background-color: #15b4e9; color: white; - padding: 14px 20px; + padding: 12px 12px; margin: 8px 0; border: none; cursor: pointer; - width: 100%; opacity: 0.9; float: left; width: 50%; @@ -87,7 +89,7 @@ margin: 5% auto 15% auto; /* 5% from the top, 15% from the bottom and centered */ border: 1px solid #888; - width: 80%; + width: 50%; /* Could be more or less, depending on screen size */ } @@ -111,8 +113,26 @@ } /* Change styles for cancel button and signup button on extra small screens */ -@media screen and (max-width: 300px) { +@media screen and (max-width: 768px) { + + /* pgsignup Content/Box */ + .pgsignup-content { + background-color: #fefefe; + margin: 5% auto 15% auto; + /* 5% from the top, 15% from the bottom and centered */ + border: 1px solid #888; + width: 90%; + /* Could be more or less, depending on screen size */ + } + .signupbtn { width: 100%; + font-size: 16px; } -} + + /* Style the horizontal ruler */ + .hrt { + border: 1px solid #f1f1f1; + margin-bottom: 16px; + } +} \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 45cc0efae..e42ee38e5 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -13,6 +13,10 @@ import sendMailOTPv1 from './parsefunction/SendMailOTPv1.js'; import SendMailv1 from './parsefunction/SendMailv1.js'; import AuthLoginAsMail from './parsefunction/AuthLoginAsMail.js'; import getUserId from './parsefunction/getUserId.js'; +import getUserDetails from './parsefunction/getUserDetails.js'; +import getDocument from './parsefunction/getDocument.js'; +import getDrive from './parsefunction/getDrive.js'; +import getReport from './parsefunction/getReport.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); @@ -29,3 +33,7 @@ Parse.Cloud.define('SendOTPMailV1', sendMailOTPv1); Parse.Cloud.define('sendmail', SendMailv1); Parse.Cloud.define('AuthLoginAsMail', AuthLoginAsMail); Parse.Cloud.define('getUserId', getUserId); +Parse.Cloud.define('getUserDetails', getUserDetails); +Parse.Cloud.define('getDocument', getDocument); +Parse.Cloud.define('getDrive', getDrive) +Parse.Cloud.define('getReport', getReport) \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js b/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js index f3d14c616..0d9051b09 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js +++ b/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js @@ -46,15 +46,20 @@ export default async function ZohoDetails(request) { (userData.data.data.subscription.customer && userData.data.data.subscription.customer.company_name) || ''; + const jobTitle = + (userData.data.data.subscription.customer && + userData.data.data.subscription.customer.cd_job_title) || + ''; const resData = { phone: userData.data.data.subscription.contactpersons[0].mobile, name: first_name + ' ' + last_name, email: userData.data.data.subscription.contactpersons[0].email, - nextBillingDate: userData.data.expiring_time, + nextBillingDate: userData.data.data.subscription.next_billing_at, company: company_name, plan: userData.data.data.subscription.plan, customer_id: userData.data.data.subscription.customer_id, subscription_id: userData.data.data.subscription.subscription_id, + jobTitle: jobTitle, }; return resData; } diff --git a/apps/OpenSignServer/cloud/parsefunction/getDocument.js b/apps/OpenSignServer/cloud/parsefunction/getDocument.js new file mode 100644 index 000000000..9e4d71ff3 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getDocument.js @@ -0,0 +1,50 @@ +import axios from 'axios'; + +export default async function getDocument(request) { + const serverUrl = process.env.SERVER_URL; + const docId = request.params.docId; + + try { + const userRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': process.env.APP_ID, + 'X-Parse-Session-Token': request.headers['sessiontoken'], + }, + }); + const userId = userRes.data && userRes.data.objectId; + if (docId && userId) { + try { + const query = new Parse.Query('contracts_Document'); + query.equalTo('objectId', docId); + query.include('ExtUserPtr'); + query.include('CreatedBy'); + query.include('Signers'); + query.include('AuditTrail.UserPtr'); + query.include('Placeholders'); + const res = await query.first({ useMasterKey: true }); + if (res) { + const acl = res.getACL(); + if (acl && acl.getReadAccess(userId)) { + return res; + } else { + return { error: "You don't have access of this document!" }; + } + } else { + return { error: "You don't have access of this document!" }; + } + } catch (err) { + console.log('err', err); + return err; + } + } else { + return { error: 'Please pass required parameters!' }; + } + } catch (err) { + console.log('err'); + if (err.code == 209) { + return { error: 'Invalid session token' }; + } else { + return { error: "You don't have access of this document!" }; + } + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/getDrive.js b/apps/OpenSignServer/cloud/parsefunction/getDrive.js new file mode 100644 index 000000000..5c0d31a8e --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getDrive.js @@ -0,0 +1,51 @@ +import axios from 'axios'; +export default async function getDrive(request) { + const serverUrl = process.env.SERVER_URL; + const appId = process.env.APP_ID; + + const classUrl = serverUrl + '/classes/contracts_Document'; + const docId = request.params.docId; + try { + const userRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Session-Token': request.headers['sessiontoken'], + }, + }); + const userId = userRes.data && userRes.data.objectId; + if (userId) { + let url; + if (docId) { + url = `${classUrl}?where={"Folder":{"__type":"Pointer","className":"contracts_Document","objectId":"${docId}"},"$or":[{"CreatedBy":{"$exists":false}},{"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${userId}"}}]}&include=ExtUserPtr,Signers,Folder`; + } else { + url = `${classUrl}?where={"Folder":{"$exists":false},"$or":[{"CreatedBy":{"$exists":false}},{"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${userId}"}}]}&include=ExtUserPtr,Signers`; + } + try { + const res = await axios.get(url, { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Master-key': process.env.MASTER_KEY, + }, + }); + // console.log('res.data.results ', res.data.results); + if (res.data && res.data.results) { + return res.data.results; + } else { + return []; + } + } catch (err) { + console.log('err', err); + return { error: "You don't have access to drive" }; + } + } else { + return { error: 'Please provide required parameter!' }; + } + } catch (err) { + console.log('err', err); + if (err.code == 209) { + return { error: 'Invalid session token' }; + } else { + return { error: "You don't have access!" }; + } + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/getReport.js b/apps/OpenSignServer/cloud/parsefunction/getReport.js new file mode 100644 index 000000000..1f2c6f1f1 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getReport.js @@ -0,0 +1,51 @@ +import reportJson from './reportsJson.js'; +import axios from 'axios' + +export default async function getReport(request) { + const reportId = request.params.reportId; + const limit = request.params.limit; + const skip = request.params.skip; + + const serverUrl = process.env.SERVER_URL; + const appId = process.env.APP_ID; + + try { + const userRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Session-Token': request.headers['sessiontoken'], + }, + }); + const userId = userRes.data && userRes.data.objectId; + if (userId) { + const json = reportId && reportJson(reportId, userId); + if (json) { + const { params, keys } = json; + const orderBy = '-updatedAt'; + const strParams = JSON.stringify(params); + const strKeys = keys.join(); + const headers = { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': appId, + 'X-Parse-Master-Key': process.env.MASTER_KEY, + }; + const url = `${serverUrl}/classes/contracts_Document?where=${strParams}&keys=${strKeys}&order=${orderBy}&skip=${skip}&limit=${limit}&include=AuditTrail.UserPtr`; + const res = await axios.get(url, { headers: headers }); + if (res.data && res.data.results) { + return res.data.results; + } else { + return []; + } + } else { + return { error: 'Report is not available!' }; + } + } + } catch (err) { + console.log('err', err); + if (err.code == 209) { + return { error: 'Invalid session token' }; + } else { + return { error: "You don't have access!" }; + } + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js new file mode 100644 index 000000000..2e50b25a8 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js @@ -0,0 +1,14 @@ +async function getUserDetails(request) { + try { + const userQuery = new Parse.Query('contracts_Users'); + userQuery.equalTo('Email', request.params.email); + userQuery.include('TenantId'); + userQuery.include('UserId') + const res = await userQuery.first({ useMasterKey: true }); + return res; + } catch (err) { + console.log('Err ', err); + return err; + } +} +export default getUserDetails; diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index a7d141891..3bbabdad2 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -79,7 +79,7 @@ async function sendCompletedMail(e) { url: a, from: 'OpenSign™', recipient: e.receiver, - subject: `Document ${s} has beeen signed by all parties`, + subject: `Document ${s} has been signed by all parties`, pdfName: s, html: "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body> <div style='background-color:#f5f5f5;padding:20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background-color:white;'> <div><img src=https://qikinnovation.ams3.digitaloceanspaces.com/logo.png height='50' style='padding:20px'/> </div><div style='padding:2px;font-family:system-ui; background-color: #47a3ad;'> <p style='font-size:20px;font-weight:400;color:white;padding-left:20px',> Document sign successfully</p></div><div><p style='padding:20px;font-family:system-ui;font-size:14px'>All parties have successfully signed the document" + @@ -105,7 +105,7 @@ async function PDF(s, r) { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, - 'X-Parse-Session-Token': s.headers.sessiontoken, + 'X-Parse-Master-Key': masterKEY, }, }), d = await axios.get(serverUrl + '/users/me', { @@ -132,7 +132,7 @@ async function PDF(s, r) { : ((a = await axios.get(serverUrl + '/classes/contracts_Users?where=' + m, { headers: { 'X-Parse-Application-Id': APPID, - 'X-Parse-Session-Token': s.headers.sessiontoken, + 'X-Parse-Master-Key': masterKEY, }, })), 'contracts_Users') @@ -142,7 +142,7 @@ async function PDF(s, r) { (c = await axios.get(serverUrl + '/classes/contracts_Users?where=' + p, { headers: { 'X-Parse-Application-Id': APPID, - 'X-Parse-Session-Token': s.headers.sessiontoken, + 'X-Parse-Master-Key': masterKEY, }, })).data && 0 < c.data.results.length ? ((a = c), 'contracts_Users') diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js new file mode 100644 index 000000000..83c295d74 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -0,0 +1,204 @@ +export default function reportJson(id, userId) { + const currentUserId = userId; + + switch (id) { + // draft documents report + case 'ByHuevtCFY': + return { + reportName: 'Draft Documents', + params: { + Type: null, + $or: [ + { Signers: null, SignedUrl: null }, + { Signers: { $exists: true }, Placeholders: null }, + ], + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // Need your sign report + case '4Hhwbp482K': + return { + reportName: 'Need your sign', + params: { + Type: { $ne: 'Folder' }, + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + ExpiryDate: { + $gt: { __type: 'Date', iso: new Date().toISOString() }, + }, + Placeholders: { $ne: null }, + }, + keys: [ + 'Name', + 'Note', + 'Folder.Name', + 'URL', + 'ExtUserPtr.Name', + 'Signers.Name', + 'Signers.UserId', + 'AuditTrail', + ], + }; + // In progess report + case '1MwEuxLEkF': + return { + reportName: 'In-progress documents', + params: { + Type: { $ne: 'Folder' }, + Signers: { $ne: null }, + Placeholders: { $ne: null }, + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + ExpiryDate: { + $gt: { __type: 'Date', iso: new Date().toISOString() }, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // completed documents report + case 'kQUoW4hUXz': + return { + reportName: 'Completed Documents', + params: { + Type: null, + IsCompleted: true, + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + IsDeclined: { $ne: true }, + }, + keys: [ + 'Name', + 'Note', + 'Folder.Name', + 'URL', + 'ExtUserPtr.Name', + 'Signers.Name', + 'TimeToCompleteDays', + ], + }; + + // declined documents report + case 'UPr2Fm5WY3': + return { + reportName: 'Declined Documents', + params: { + Type: null, + IsDeclined: true, + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + }, + + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // Expired Documents report + case 'zNqBHXHsYH': + return { + reportName: 'Expired Documents', + params: { + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + Type: { $ne: 'Folder' }, + $and: [ + { + $or: [ + { Signers: { $ne: null }, SignedUrl: { $ne: null } }, + { Placeholders: { $ne: null } }, + ], + }, + { + ExpiryDate: { + $lt: { __type: 'Date', iso: new Date().toISOString() }, + }, + }, + ], + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // Recently sent for signatures report show on dashboard + case 'd9k3UfYHBc': + return { + reportName: 'Recently sent for signatures', + params: { + Type: { $ne: 'Folder' }, + Signers: { $ne: null }, + Placeholders: { $ne: null }, + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + ExpiryDate: { + $gt: { __type: 'Date', iso: new Date().toISOString() }, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // Recent signature requests report show on dashboard + case '5Go51Q7T8r': + return { + reportName: 'Recent signature requests', + params: { + Type: { $ne: 'Folder' }, + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + ExpiryDate: { + $gt: { __type: 'Date', iso: new Date().toISOString() }, + }, + Placeholders: { $ne: null }, + }, + keys: [ + 'Name', + 'Note', + 'Folder.Name', + 'URL', + 'ExtUserPtr.Name', + 'Signers.Name', + 'Signers.UserId', + 'AuditTrail', + ], + }; + // Drafts report show on dashboard + case 'kC5mfynCi4': + return { + reportName: 'Drafts', + params: { + Type: null, + $or: [ + { Signers: null, SignedUrl: null }, + { Signers: { $exists: true }, Placeholders: null }, + ], + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + default: + return null; + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/sendMail.js b/apps/OpenSignServer/cloud/parsefunction/sendMail.js index 3465332c1..c607c2822 100644 --- a/apps/OpenSignServer/cloud/parsefunction/sendMail.js +++ b/apps/OpenSignServer/cloud/parsefunction/sendMail.js @@ -6,7 +6,7 @@ import { createTransport } from 'nodemailer'; let transporterSMTP; let mailgunClient; - +let mailgunDomain; if (process.env.SMTP_ENABLE) { transporterSMTP = createTransport({ host: process.env.SMTP_HOST, @@ -23,6 +23,7 @@ if (process.env.SMTP_ENABLE) { username: 'api', key: process.env.MAILGUN_API_KEY, }); + mailgunDomain = process.env.MAILGUN_DOMAIN; } async function sendmail(req) { @@ -54,29 +55,27 @@ async function sendmail(req) { const file = { filename: pdfName || 'exported.pdf', content: process.env.SMTP_ENABLE ? PdfBuffer : undefined, //fs.readFileSync('./exports/exported_file_1223.pdf'), - data: process.env.SMTP_ENABLE ? undefined : PdfBuffer, + data: process.env.SMTP_ENABLE ? undefined : PdfBuffer, }; // const html = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body style='text-align: center;'> <p style='font-weight: bolder; font-size: large;'>Hello!</p> <p>This is a html checking mail</p><p><button style='background-color: lightskyblue; cursor: pointer; border-radius: 5px; padding: 10px; border-style: solid; border-width: 2px; text-decoration: none; font-weight: bolder; color:blue'>Verify email</button></p></body></html>" const from = req.params.from || ''; + const mailsender = process.env.SMTP_ENABLE + ? process.env.SMTP_USER_EMAIL + : process.env.MAILGUN_SENDER; const messageParams = { - from: - from + ' <' + process.env.SMTP_ENABLE - ? process.env.SMTP_USER_EMAIL - : process.env.MAILGUN_SENDER + '>', + from: from + ' <' + mailsender + '>', to: req.params.recipient, subject: req.params.subject, text: req.params.text || 'mail', html: req.params.html || '', - attachments: process.env.SMTP_ENABLE ? [file] : undefined, - attachment: process.env.SMTP_ENABLE ? undefined : file, + attachments: process.env.SMTP_ENABLE ? [file] : undefined, + attachment: process.env.SMTP_ENABLE ? undefined : file, }; - if (transporterSMTP) { const res = await transporterSMTP.sendMail(messageParams); - console.log('Res ', res); if (!res.err) { return { @@ -95,11 +94,12 @@ async function sendmail(req) { } } else { const from = req.params.from || ''; + const mailsender = process.env.SMTP_ENABLE + ? process.env.SMTP_USER_EMAIL + : process.env.MAILGUN_SENDER; + const messageParams = { - from: - from + ' <' + process.env.SMTP_ENABLE - ? process.env.SMTP_USER_EMAIL - : process.env.MAILGUN_SENDER + '>', + from: from + ' <' + mailsender + '>', to: req.params.recipient, subject: req.params.subject, text: req.params.text || 'mail', @@ -108,7 +108,6 @@ async function sendmail(req) { if (transporterSMTP) { const res = await transporterSMTP.sendMail(messageParams); - console.log('Res ', res); if (!res.err) { return { diff --git a/apps/OpenSignServer/databases/migrations/20231110174122-update_setclp.cjs b/apps/OpenSignServer/databases/migrations/20231110174122-update_setclp.cjs new file mode 100644 index 000000000..83f059ef1 --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20231110174122-update_setclp.cjs @@ -0,0 +1,47 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + // TODO: set className here + const className = 'contracts_Users'; + const schema = new Parse.Schema(className); + // schema.addString('Name'); + // schema.addString('Phone'); + // schema.addString('JobTitle'); + // schema.addString('Email'); + // schema.addString('Company'); + // schema.addString('UserRole'); + // schema.addObject('Plan'); + // schema.addString('Customer_id'); + // schema.addString('Subscription_id'); + // schema.addString('Next_billing_date'); + // schema.addBoolean('IsContactEntry'); + // schema.addBoolean('ShareWithTeam'); + // schema.addPointer('TenantId', 'partners_Tenant'); + // schema.addPointer('UserId', '_User'); + // schema.addPointer('CreatedBy', '_User'); + schema.setCLP({ + get: {}, + find: {}, + count: {}, + create: { '*': true }, + update: { '*': true }, + delete: {}, + addField: {}, + }); + + return schema.update(); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + // TODO: set className here + const className = 'contracts_Users'; + const schema = new Parse.Schema(className); + + return schema.purge().then(() => schema.delete()); +}; diff --git a/apps/OpenSignServer/databases/seeders/.gitkeep b/apps/OpenSignServer/databases/seeders/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 13814d3cc..16445d99c 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -17,7 +17,7 @@ import S3Adapter from 'parse-server-s3-adapter'; import FSFilesAdapter from 'parse-server-fs-adapter'; import AWS from 'aws-sdk'; import { app as customRoute } from './cloud/customRoute/customApp.js'; -import { createTransport } from 'nodemailer'; +import { exec } from 'child_process'; const spacesEndpoint = new AWS.Endpoint(process.env.DO_ENDPOINT); // console.log("configuration ", configuration); @@ -84,7 +84,9 @@ export const config = { module: 'parse-server-api-mail-adapter', options: { // The email address from which emails are sent. - sender: process.env.SMTP_ENABLE ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER, + sender: process.env.SMTP_ENABLE + ? process.env.SMTP_USER_EMAIL + : process.env.MAILGUN_SENDER, // The email templates. templates: { // The template used by Parse Server to send an email for password @@ -181,6 +183,20 @@ if (!process.env.TESTING) { httpServer.headersTimeout = 100000; // in milliseconds httpServer.listen(port, function () { console.log('parse-server-example running on port ' + port + '.'); + const migrate = `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=http://localhost:8080/app MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + + exec(migrate, (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error.message}`); + return; + } + + if (stderr) { + console.error(`Error: ${stderr}`); + return; + } + console.log(`Command output: ${stdout}`); + }); }); // This will enable the Live Query real-time server await ParseServer.createLiveQueryServer(httpServer); diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index f7626012e..e57104d95 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -27,6 +27,7 @@ "nodemailer": "^6.9.7", "openai": "^4.8.0", "parse": "4.1.0", + "parse-dbtool": "^1.2.0", "parse-server": "6.3.1", "parse-server-api-mail-adapter": "^3.0.0", "parse-server-fs-adapter": "1.0.1", @@ -2147,7 +2148,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -2796,6 +2796,37 @@ "node": ">=0.10" } }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-fns/node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/date-fns/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3902,6 +3933,32 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4001,7 +4058,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4337,7 +4393,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -5093,7 +5148,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -6089,6 +6143,14 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6097,6 +6159,18 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -7338,6 +7412,234 @@ "crypto-js": "4.1.1" } }, + "node_modules/parse-dbtool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-dbtool/-/parse-dbtool-1.2.0.tgz", + "integrity": "sha512-APRMPdQ2jyJ7SBouPYZsCD4BjB0zIrSEgALgeYZsVSDrrtoqXhUHJHi42tF/0ocTA/nolteUMzlHT+msrqPvjQ==", + "dependencies": { + "chalk": "^4.1.1", + "date-fns": "^2.21.3", + "dotenv": "^10.0.0", + "fast-glob": "^3.2.5", + "parse": "^3.2.0", + "ts-dedent": "^2.1.1", + "yargs": "^17.0.1" + }, + "bin": { + "parse-dbtool": "src/parse-dbtool.js" + } + }, + "node_modules/parse-dbtool/node_modules/@babel/runtime": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", + "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-dbtool/node_modules/@babel/runtime-corejs3": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", + "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", + "dependencies": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-dbtool/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/parse-dbtool/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/parse-dbtool/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/parse-dbtool/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/parse-dbtool/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/parse-dbtool/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/parse-dbtool/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-dbtool/node_modules/idb-keyval": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.0.3.tgz", + "integrity": "sha512-yh8V7CnE6EQMu9YDwQXhRxwZh4nv+8xm/HV4ZqK4IiYFJBWYGjJuykADJbSP+F/GDXUBwCSSNn/14IpGL81TuA==", + "dependencies": { + "safari-14-idb-fix": "^3.0.0" + } + }, + "node_modules/parse-dbtool/node_modules/parse": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/parse/-/parse-3.5.1.tgz", + "integrity": "sha512-uxkLVNfbqgZ/pStg/jIQGh09tOUkPZorzDIqz9vSFjZ3iIZzgvNk6VBbjXjcMWsR8LyFPOR1ROR6/y9Dedn3/w==", + "dependencies": { + "@babel/runtime": "7.18.0", + "@babel/runtime-corejs3": "7.17.8", + "idb-keyval": "6.0.3", + "react-native-crypto-js": "1.0.0", + "uuid": "3.4.0", + "ws": "8.6.0", + "xmlhttprequest": "1.8.0" + }, + "optionalDependencies": { + "crypto-js": "4.1.1" + } + }, + "node_modules/parse-dbtool/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-dbtool/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/parse-dbtool/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/parse-dbtool/node_modules/ws": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", + "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/parse-dbtool/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/parse-dbtool/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/parse-dbtool/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/parse-server": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-6.3.1.tgz", @@ -7897,7 +8199,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -8471,7 +8772,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9237,7 +9537,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -9299,6 +9598,14 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tslib": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 5049e7188..4725d28d5 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -36,6 +36,7 @@ "nodemailer": "^6.9.7", "openai": "^4.8.0", "parse": "4.1.0", + "parse-dbtool": "^1.2.0", "parse-server": "6.3.1", "parse-server-api-mail-adapter": "^3.0.0", "parse-server-fs-adapter": "1.0.1", diff --git a/apps/OpenSignServer/runmigrate.js b/apps/OpenSignServer/runmigrate.js new file mode 100644 index 000000000..1757b0e1b --- /dev/null +++ b/apps/OpenSignServer/runmigrate.js @@ -0,0 +1,37 @@ +// const { exec } = require('child_process'); +import { exec } from 'child_process'; + +const migrate = + 'APPLICATION_ID=legadranaxn SERVER_URL=http://localhost:8080/app MASTER_KEY=XnAwPDRQQyMr npx parse-dbtool migrate'; +// `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + +exec(migrate, (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error.message}`); + return; + } + + if (stderr) { + console.error(`Error: ${stderr}`); + return; + } + + console.log(`Command output: ${stdout}`); +}); + +// const seeder = +// 'APPLICATION_ID=legadranaxn SERVER_URL=http://localhost:8080/app MASTER_KEY=XnAwPDRQQyMr npx parse-dbtool seed'; + +// exec(seeder, (error, stdout, stderr) => { +// if (error) { +// console.error(`Error: ${error.message}`); +// return; +// } + +// if (stderr) { +// console.error(`Error: ${stderr}`); +// return; +// } + +// console.log(`Command output: ${stdout}`); +// }); diff --git a/apps/mongo/default-data/legadraGCva.w_dashboard.json b/apps/mongo/default-data/legadraGCva.w_dashboard.json index 3ca1737a5..3f2c2794f 100644 --- a/apps/mongo/default-data/legadraGCva.w_dashboard.json +++ b/apps/mongo/default-data/legadraGCva.w_dashboard.json @@ -40,7 +40,7 @@ "id": "c1935cc0-28d4-3d73-b72a-8c1e3d18a17f", "queryType": "", "class": "contracts_Document", - "query": "where={\"CreatedBy\":{\"__type\":\"Pointer\",\"className\":\"_User\",\"objectId\":\"#UserId.objectId#\"},\"IsCompleted\":{\"$ne\":true},\"IsDeclined\":{\"$ne\":true},\"Type\":{\"$ne\":\"Folder\"},\"Placeholders\":{\"$ne\":null},\"ExpiryDate\":{\"#*gt\":{\"__type\":\"#Date#\",\"iso\":\"#today#\"}}}&count=1", + "query": "where={\"IsDeclined\":{\"$ne\":true},\"IsCompleted\":{\"$ne\":true},\"Type\":{\"$ne\":\"Folder\"},\"Placeholders\":{\"$ne\":null},\"ExpiryDate\":{\"#*gt\":{\"__type\":\"#Date#\",\"iso\":\"#today#\"}}}&include=Signers,AuditTrail.UserPtr", "key": "count", "Redirect_type": "Report", "Redirect_id": "1MwEuxLEkF", diff --git a/cert/local-dev_base64_pfx b/cert/local-dev_base64_pfx index 85e11a24d..fba113ca1 100644 --- a/cert/local-dev_base64_pfx +++ b/cert/local-dev_base64_pfx @@ -1,55 +1,54 @@ -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 -c6yryFgECIld0S5kDk7JAgIIAA== +MIIKCQIBAzCCCc8GCSqGSIb3DQEHAaCCCcAEggm8MIIJuDCCBG8GCSqGSIb3DQEH +BqCCBGAwggRcAgEAMIIEVQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIpumu +bFabBWACAggAgIIEKDqHS7Icd5MzIBk1dBokGK2s+5a2fA4308WA1QzEWmczqVYI +z6lYmW8qsiZIw4PFkRzdIx1+zCmP8jgWiiqh5RKnbHYmh1JPNyx9SqmUDILDXmjg +KxO9agRw9LXge4hgRL7YW0TxYZYw4EeXV9Yr7kcOq9DoO2MoRikJ+2Tuvvq/hfuV +9zFHsz4jpf7W95k1IeH6bZ92klz5R1e/EK8JuHy592i/u+BxxW1vTkiPpTaHD6s9 +1lDSkT1j0LIDU6l9gVvJvFBV8j88vet/Z4QkTbHPMYvBnKNRstKuOvDasEJE4RkA +PV4TfBwFF6uvREZI1vBboM/18pzeyjoRX+mlJNfcH3kh1tkck+Jg+M2bLXAH1EdD +GRwENvnTNW1CFIn37VVja7SFBQNXA+E6rejmqtUmZ5XktSINDBUyjow9XuYTUtI/ +sgcRSC0aB0EKKpphbFPp1niKCLm1ef33e+bWyWbtR2L2Kc3ETmhjNADpyapAGmzc +LP2BafGaKj18KiLAG4GL6+kXk0GUz7Fw5q8H8RY1T33o+xjWvC0+aJgvr65qWdKw ++ug6wuu4Cr2kFEuXxPKsnYqmE5NT/x+lfunlZ5iEQN3w2XO5J2u2eMXVRUsPH2T6 +0sJKomjY0RB1JsqZBnyleWm+tYo0RpVAyJ3NGBp9dVb7a3Qw6jNZBG/xMW+gvtUJ +q6hfK/cD3cagD0NQFVD5STMOuGOSqq/bbwAKjZ/lrPmCCYATKwkjAFybYfHJVrrW +Y2tQgCQ/zrZLIxQjp7F17hU0+gT54x0MpF6AoqIM/qqNnHrQ0fi50ECmLvx3SqYa +nvjvt/HZhMZfqRXiXjeicIwpnNoG7+uQknySk+7cc9GNhHZR7cfPfkTpgvuuebrQ +l5YW+k9tG+xrX8g72nvtFMnammlBixlFwECJaEszEQk5tc2ti8uG2z+kGnFoDoBV +M6ZVMpKDJzXPxLdzT6ChIPyatjIkqOKe6vDpnmzcoEhbBhmtkVjWFA2dfX846ugV +y1QiecWgk8pMNWhh3IDd05v/wzbFwNcq+Gi+1dZsPmFH+egIcrQKZu2r3jCJtGHh +DNG/nyf/anqvKXF90bi4hRT3vdDXXuWgY7EUwfn9h5jYabCO6HsQxQOBjFYNmBrh +MfaiBZe72E8fzNAfIlwDcJ4AWY1SOM7hi8bqfRWw1NtNxuMUiRFoR31O6XkQauye +9hAmpdlZHZXtJ6LM0QaWkPJmG3058GMtIn/qS60V9nINh+zXhwza/1pnFB+e9MWc +hAPgo0nn55FusM//g1nM31PKe+nOm3Jyp0nEQ4m8aDtJS63o2fvp3e2KJbPWQMHE +a83W975diWg4NTdevV9lFpNllHclVoPoavUHIzHd7HF9TcPpjbXJSUZ7cITHHefr +kQTa/2G9cWuRhN9GKIHBdr13nfEvMIIFQQYJKoZIhvcNAQcBoIIFMgSCBS4wggUq +MIIFJgYLKoZIhvcNAQwKAQKgggTuMIIE6jAcBgoqhkiG9w0BDAEDMA4ECDgnjfOf +AjArAgIIAASCBMgkbVuptroBdyMY5gl/eBQj5+iAV02YSaF969ihStLSWI4x5FAf +HuDgqCyEMSl4RHG8ZvNaO9JoNfIpMK/TPQBoQRCzE2Vjf66VTERaQtU6h7tZrbQt +K96n9eqvohm/vXbXe08fsodYp2s79kAvKgpuGG5iX77qYVzJHBPed87cvczo4ToP +CpurDpByt8fGEmjtcikal8o+H9uoHjcFwqMigX1Q7IEjuKXrb5e6wTvxMRob8yfv +LVl6ahteKSkWCMb6rLZ5f12jDoCGX/YXRrSsU9t/lXe0Nxv5i7c8flb2EsNtwygD +fexVvn5u6ble6RDYNpuQkPgF41HyZh+JvGAF6i1r4tJPL9Pf4HnjEB8Y8IHgon+w +T5I+8LTgcrWyhptzblXMjKySTEp9OEa2cCVwZkl4z43PWJ5oIAQ2IDTOQ603/5o/ +d9KA76/zMPQ5O0gv17OA7kwFv98v6sTcR4vgkQZqnyDpJSEPHyNxhw2MSBqS3jq3 +YPhRz+3Ei1oFp9uYFhzn39f9gzNi++X9pOjSrDb8v3mcDXZKNrxQLuoRMSf0eQNI +dgJRqj/fuqNZ5ac3kd4P5BALCsnA1tM27zYrgUdpOnrc2D9FBthEjpRlQKMMzhQf +cNMFWmoNjakDilvvLcsQeQ3P6cXbN1ODoNnjgK3VzcmeKyzW2PrTXEPHARUM3j4V +sZzGaUOVKLqaaDrXWQKC0vrTvxP2WMfjQ1dTdXQP/kSZTXRC5rtB9tky38flBor0 +N9rhUDIGMs5qBvyrkV2hKXiW39G69p1KWY+Cw28AzY+CNSjePRi60TsnUxgcOS7i +0AT25Gx3A4YqxmTY38MPB4wPcBPcw4hjNoQamaC9mqs+KVHcP5YHUlqykMeH0YVi +J+ehytJE9xuDcfBOjxjadxp3/q/Lku4rky89gdJGFQWuuz75VulDywPRZRwmQTel +sjEGMHR1zTOlPJdTDWhqaKmWvL4GhbCgEPIKwmqd1QKRTl/3Baa1nYllJeYVwiTT +qLCkbA6qXrLGj1ENZxrKn9yqr8HwOoApjwhARu4LF/BRMgdkzelK2kOXHnZ26sZ2 +NY/MMtVmq4c59y6iQwmsbHr9tWGz3ahyXcZZufjNXU/AVnO1c92g7umAWZF4RohL +gMmh57cAhN9PEbEv6j/6BT3XXp8jB0ywcRriYxfxwidviCKH/76Q4sytYJQaDFI1 +fnzmv0aDotbG2BdpWSiYPDOPm+3cmfjlULsn1FYWL4NDCX1f+C4lNtKVX9LU8c5M +m8dA1DUlDfnuNO5/BShuoGXG2z4O/XwxIaRFizMxWS2sWurbAEFJ6oNw3kC7WSah +NIe8aUC1umpc1Gk3X2f4Ytzj9OEqn0y55qoqLINJuejXMffF/gjopxHWadLVaVaj +Q1SewrECuEXdSbBR/a10po24wmRtkmlvRJXJl7sG95xE5ZCqp+m6sRPWGdf1yKbV +vyWNUe4Qvkxe4a0VAJpTyIGr980CKz/jkvtNQMobGl7AfhxKJ450wg454WcexMct +BYXvZMSdUDCgMLlh0nHJHl5btrFWqE0Z/fqWmIknZL2jZ4J+2hdVl/xB/sUt6kcu +txw+RfL+vNE8PxhTNaOdJFwD8yeN1mJ3yMUA8HHYpw9yljgxJTAjBgkqhkiG9w0B +CRUxFgQUDYlgGVxSxuOknhQc256x3++7BDwwMTAhMAkGBSsOAwIaBQAEFFjASdYl +3pXAXxZuvVvv9tsb4bdrBAhyb+KCIjp/gAICCAA= diff --git a/cert/local_dev.crt b/cert/local_dev.crt index b04e8924b..7137d99fc 100644 --- a/cert/local_dev.crt +++ b/cert/local_dev.crt @@ -1,21 +1,23 @@ -----BEGIN CERTIFICATE----- -MIIDXTCCAkWgAwIBAgIUdpdDPiNqilWn26oMvcpT9qmMtoswDQYJKoZIhvcNAQEL -BQAwPjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk5JMQowCAYDVQQHDAFOMQowCAYD -VQQKDAFTMQowCAYDVQQLDAFTMB4XDTIzMTEwNTEzMDg1OFoXDTI0MTEwNDEzMDg1 -OFowPjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk5JMQowCAYDVQQHDAFOMQowCAYD -VQQKDAFTMQowCAYDVQQLDAFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAzT30t7Adb6XdXWywzC4RF03r3piTt5MF4MZClvorsl8bySNKrYkl7i5+igpz -36SfLp090Dal0cUZ7it9QCxaxrWv3m8OFAwfwK5ePuzUryF6/QJcoF560Sq4k3Pb -640PJ5UlFwvUqsXQN8A/pAA6S96MqpwCrPQE0u5OcRQuVIsZxBL2s17lv5eROjX+ -Ufx/6qtmuZscn9xKDP6GNO8aa6X0YZMoVXlll14iEn4bg0yagiY7QhvVCzK8q7nB -9yKCLvw/28eSoD08yJnHnUZnIOoNrn+cZKTkl8VcyKW55IeOiUilb5h3a07JD6bj -Q/VroPQE5UtveajB9CBa3eUCiwIDAQABo1MwUTAdBgNVHQ4EFgQUIQGrIwhvSNkG -L3ATZra96d4cDE4wHwYDVR0jBBgwFoAUIQGrIwhvSNkGL3ATZra96d4cDE4wDwYD -VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAp2mCfhRf6Jft6lSgL4hi -I8xHfqcUjG+XnDM1Pi7gKVxxclwVQ67vVtfO0rU1SBPWUO3nIaaLN9Wyzcx+LXPV -4e3pyHlq2T6Z6ENuozOsMhHeY9+ows6wPBcxq57KLLHnBpx3lJiKHKOp0ueiAbkz -LaI+Mm+VQo0MbzhCw7KXs8VPFt8YO+S3XircVMWaa007VgGY/NjYF62hlG35fD/v -CTHccRj5Y3coQ2MjosTUQTd4u3N5VhgxdRbyMdpjpwDxu0u9BE7ISXKMBhnBLV/w -+/mxoF2bqExBuPiZS8vT6yW9rehdi/KR9c26GUreTsKLtjXyveeP6VLoTJ60T3D9 -Jg== +MIIDxTCCAq2gAwIBAgIUAZQ9QST2eBZz5k9pCa//mHQVm1QwDQYJKoZIhvcNAQEL +BQAwcjELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQKDA1P +cGVuU2lnbiBMYWJzMREwDwYDVQQDDAhPcGVuU2lnbjElMCMGCSqGSIb3DQEJARYW +aGVsbG9Ab3BlbnNpZ25sYWJzLmNvbTAeFw0yMzExMTcxOTQ0MzZaFw0yNDExMTYx +OTQ0MzZaMHIxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEWMBQGA1UE +CgwNT3BlblNpZ24gTGFiczERMA8GA1UEAwwIT3BlblNpZ24xJTAjBgkqhkiG9w0B +CQEWFmhlbGxvQG9wZW5zaWdubGFicy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDLRKLjCSrvV1zAY2leWxCvdKTUaThpQO8nWPE/4v5ilMU2aRON +krAnli0LUfQ/tIRWNurxwVjJ7HrW3ICLn05GBLjm2AUCfuMbJCvOEEdmFJqRY04n +12fBZWz2KtzbZEIBVxLhc4E4g+Rz68hQA2fqwNuFdyGkkIbhVXpZIePEppqRmw+2 +uuDvIzJ77rdDaLqwwPoHWenZ2uZTedKXx7PGYs98psg35GvcpssqAJGAIAi9Rzg/ +ZV4oSpGXCjn/TJy61zTDbmPFCS/rC1XBWzBQfwDeBPDI18W6gPVX6N4dp0Ao+n8Q +txeI6g4FzMH91KPbdbZXxm8rZqXj87VQs9trAgMBAAGjUzBRMB0GA1UdDgQWBBRN +NtRPagnqovdmbrdhSUON9Rwd3TAfBgNVHSMEGDAWgBRNNtRPagnqovdmbrdhSUON +9Rwd3TAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBrcPyA7GHq ++ol9qjy9HijpoU5MaEiV9v9H8/0v7KoXUND3rMl37yFyjxGN8uda8WxpEhE2eFnk +Xjtm2NgPrv8qeYHor/A3y5RfQhnlCY4kE1bREZGhcuKihR4rOtmComwFjx4Ibwwj +4nKsflj6rXcWKSfSNHLkXFXHPYwyqRsKdtClrD/8YJn6LeeMlMjIYGGP4qyi2WwS +Z8hExWGEMaMWiA9rxTMX6iu/parGH/pWU/55Os3WlcHPhlvqchBkQFJ+f8b+NYz0 +vIHQgwn4K5WMsZVLxoiUcU7cSqE/qhnP+pzBf8lRaYwd+zUznDvzpKKz6nFgeHok +s8BK7JAKkIsl -----END CERTIFICATE----- diff --git a/cert/local_dev.key b/cert/local_dev.key index 9b8949775..034959f76 100644 --- a/cert/local_dev.key +++ b/cert/local_dev.key @@ -1,30 +1,30 @@ ------BEGIN ENCRYPTED PRIVATE KEY----- -MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIJvntFBuTIWACAggA -MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECEE+1CDDu5XvBIIEyEwR/61HhjJ0 -P6oGr1E+uDTKVcUqK++fbsrhqxYq+oEoj+w5C1KOgUxQYQTm2he6PhfGkPh56V9w -OaArJ+QrGrSFRUdTtLZG+qBbfyWKQyah9VxwYhmG9Ptf6RyQXDJnup4WtgJWI2sw -fAcJ6QqPQkSFUq/0cn0s/RLNCy6P8qKfUjdVugEv0K9dsc7dFNWZQEQlpyKeZdbY -rJfKjf85qSmDpFfRnP1B0n//vzlPWK03fNH2be4EnBTFW7l1sDnju6iwasLSP7P+ -EuGq8Bw9YGlf3I/STWGgfxWWLZACCjgVDiRjLakstkodLqC1tZAWawOKcDQGPyKG -nRrF/yF4H0ChmcMBA9Ur4zxBd4uayWujwqIPehfWU+ODYYaVDluSVrxiTaSHGAP2 -XnT6vrOnR5sg/uzgsbuApHTbHCW+lplof/R0swvwyt15fKaD8HsngNMN6R75e0ar -6+ltI/BLgcSbu0f7Fe8qMumBNrJiU5j09EdvDKaIEe3+Ko2HWCV/zLgxvL8BwGyB -K9RSMw1YzivO/CahWE3cQcS4GQSX84+y8VXF43CxpmTRf3Hmdpj4JBGB0fOvGHzA -hv+st5E+hhSOOv2ZZ00XtEaUi3d2uQFYApxEoXubz2QG481M7ulNXaVd74DZf/Fr -J+R7BmCa633rEw34sXFKUcfdfVOzUfMnMGvO5danSrov6k/cFfLPH56ORb9Ep30a -U1fXHP+pcFQohR/kjAk5gjDUr8pjkOJ0/JHv106rptT4SNCznvJa8BvWtP9wDXDv -UZDA/UCLlnl20mJUjLtb0iM5vtqhi7XOxDoS8AauOimSEh+M0uLEZ7HOQvtGchLl -tDLd/DVew/WzPBhL4eNTmhwwno9JL21nPBEaFAa58djoiZXgzUdLQbBDbo/7nsRA -UJ9imt0HmhDU+xrimnMZJD051KcbohHjPvTnTb4qvd0Rt7u/dpL9NT07rQlVIe3u -qGl4sEe+1vEueRdHt5QCSGbxnwPPHdE9XMsK8et3M/DOYN+ToB9QmDm72lLsJNkm -0nxdYVpfXHUiPmMorkJgb9YXfY+j0UEWuT0l4bl7a5+mzGm/Zy9FCoLaW7MTWNJd -fyDSYsVotOhRdCBi0Osho21GldKmfX6XoqHYENVqsh7x9bgvjNwvLNgpCWXYh7/Q -K6N3iDQ3G3A6x9nOgeKpXYREd8fx8byM6u7FAttVTtcV71QaWU3TSn7Oice1Bklg -osIhUJydHny856D/WCD6EmnPBuukx9Tht8NKtJVS0XoXqbz69mx4xfq987HGkJJa -nvCgkZOr/LhcVylmRjg9ZVfiUrwim4Gp42gV3JtsZpOGE1m+1twSXShtr/PQ2FdF -jD41LOEG1OGdZ5XIDLxAI4085jwVD/WIRo/AZELENog1XKtjeXSqJ/H7njauB30w -MeNv0VRTIItVA0eXRDwoqjpqyGSdn9YF2SQ/qDR6WU+Y2bVD38m6ZJlsy/zHx9uc -sH1DK7hbbRRSuZ9Sx/TjD19DWJ4qNPTpUZTd0+dxsG/HGQKpkbpXI5f3aQ6nTWWM -MjlWF6mUI06iLIRhLyNwBrtEjJHL1k8fIOvO/MUKtj72VBGt/fnoutS0WifZLvfn -mFXB4iaMX0hGcgzpK4iNcg== ------END ENCRYPTED PRIVATE KEY----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,5932FA9F02938D1B + +6gkkZP80WrVnR3dVwkimtfirSeYNXZlrXXBv+Ddjyq7FScqca7svJFd8ObC0xXjg +nbxChDKS8SXcSjsNCTzixG0QReO5vaqovrpQoYbkSQ9GRMIVV8WuWNzlyMnypNJ4 +Z6hdpd5nkc1hIP8A6WcY3lA8msyHceU9IidEEb75CE743qsvUMko+XvqntZx/LNe +0uK8Bs+cXeDzolpNX8ORKBTAOMii+WPlN2l+9ldsWTECEk4GmWa51QfpKouLxz5E +u7fuGuku/nPKGb4Yj7sCgaD91UabRksDLS9UGDBqeNL+mogG3gY/Iu0/q2cUs6XR +x1W6KW1eJHnOf1pAp7+G/zNqzdsxI3pnoR+nsV6/G0glBLar+Xqc99B568lnUWWv +5NGN3Buz1axx1jPKIknDcT4Skmvt6TcmgrjoCQ9XvmNKVClpExQ+dKPmJI/EVNoU +jjDZyfghcJ6BEMcTgoOBDiUrPM0273sb89u/AzyUA1tTciW2KARz6cOUTPWVRSRn +4yXpkA4BJDpxRmK68BXorZLNxtvHk+on80c9tu5e+IVa3Gu1K7gc269TPmlIolAM +v//i+jpwJ4Pe2IGVYdojMr15useUv7JC6/Kconnkx4q9rkMriguuXoQt8qW3kvEs +Ur8KuibtDqhz2zGbsKboQFMOd6cdd+63dJCGAUqk4hFrSikTw3LhkXNcg9GZHq1z +WFAfaA3x2jd+kJJ5xg8xMVEHax5IAOXDL2ektyPFpI1UZOuTc2i7FK6Y0NnXPkSN +G/+DsKdLWT943mPfZj01mTRi3MgseDXsHMHGmmPxW9J4jv+WW4OdpHvd474QzJ8b +vQmyiKq4XPHsuQUkzHVPbTrGe1B9z4p97YQKdEfXP2ChGFsUHCYQdpHyXwie2+pq +E2rc7Bai0OuL0anYMSIvDrJ0DE8mVVaFur1b2Uz6ieCDlrOXnzD1BrcleiZem7og +on/3oCUK+qxibCCcd5Hg2HtPusa43U0/UbCrqb2sww9iN36DLdtef/jlozKNiBx9 +e8ZztF6GtAKhIdgGW/M9TXMUZOYr7aaXO71MsqhwpVWZ5dNqagOBzhmd7Etokf1H +O0WxJZ5XPDsnlKwYq86ssK+2RCNYAuvZoM3dRCysPvXoBFmsmHDzKdbKcckd8Vxr +6P1yaCkB/iX55dUqwKfIuqxY3m4MA2Us9DD0BRxZOSUqHhzHHSogsLhqLQEQENA4 +U9N/v/za81UaU8nfkAswsGlTdTKjWH6Fzc0NeagbEFtpUaG/WIHPesUzU7ZNvMzR +SQACVWl62Dley2g2eAgcrsIn78MbwNJI2YN5eXIw0K2MiMlGXWOEvkjIIVfjc0/d +QxLFJwqShZBVO+jnAJ8jti7mP6PgskjtfHNAIphRJ4fm9h/Ns1YMpipBRVBDhbwY +AOVT4bRw9Q3O5I0pe10ZdViAhexegQ8yGt3pUlKaUf9GRwIFEknjZ5Pc98V/R/wC +INSIOZzDHj2uyZ3p7ToF1Z6kVVbbyfqDOnxUiV2ykR8ZqQMXNWcEJKH8qRqI+VHf +oszD2BQvXgkWdrJtHuHjJCdDl03Y+daS5yP8IKTDucHvRv4ZSMghZ34SJTw5MaBP +-----END RSA PRIVATE KEY----- diff --git a/cert/local_dev.pfx b/cert/local_dev.pfx index fecfe5531..facc99d5d 100644 Binary files a/cert/local_dev.pfx and b/cert/local_dev.pfx differ diff --git a/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js b/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js index 37eee4fc3..f0ae76b05 100644 --- a/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js +++ b/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js @@ -246,6 +246,12 @@ function Certificate({ pdfData }) { {pdfData[0].ExtUserPtr.Name} </Text> </Text> + <Text style={styles.textStyle}> + Email :   + <Text style={styles.textStyle2}> + {pdfData[0].ExtUserPtr.Email} + </Text> + </Text> <Text style={styles.textStyle}> Accessed from :   <Text style={styles.textStyle2}> diff --git a/microfrontends/SignDocuments/src/Component/DraftDocument.js b/microfrontends/SignDocuments/src/Component/DraftDocument.js index 79806a94e..95ab370b9 100644 --- a/microfrontends/SignDocuments/src/Component/DraftDocument.js +++ b/microfrontends/SignDocuments/src/Component/DraftDocument.js @@ -1,61 +1,47 @@ import React, { useEffect, useState } from "react"; -import axios from "axios"; import { useNavigate } from "react-router-dom"; import Loader from "./component/loader"; -import { getHostUrl } from "../utils/Utils"; +import { contractDocument, getHostUrl } from "../utils/Utils"; function DraftDocument() { const navigate = useNavigate(); const [pdfDetails, setPdfDetails] = useState([]); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time", + message: "This might take some time" }); const rowLevel = localStorage.getItem("rowlevel") && JSON.parse(localStorage.getItem("rowlevel")); - const signObjId = + const docId = rowLevel && rowLevel?.id ? rowLevel.id : rowLevel?.objectId && rowLevel.objectId; + useEffect(() => { - if (signObjId) { + if (docId) { getDocumentDetails(); } }, []); //get document details const getDocumentDetails = async () => { - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${signObjId}"}&include=ExtUserPtr,Signers`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken"), - }, - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; - - if (res[0] && res.length > 0) { - setPdfDetails(res); - const loadObj = { - isLoad: false, - }; - setIsLoading(loadObj); - } else { - alert("No data found!"); - } - }) - .catch((err) => { - console.log("axois err ", err); - }); + //getting document details + const documentData = await contractDocument(docId); + if (documentData && documentData.length > 0) { + setPdfDetails(documentData); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { + alert("Error: Something went wrong!"); + } else { + alert("No data found!"); + } }; //check document type and render on signyour self and placeholder route @@ -63,24 +49,25 @@ function DraftDocument() { const data = pdfDetails[0]; const checkSignerExist = pdfDetails[0] && pdfDetails[0].Signers && pdfDetails[0].Signers; - const isPlaceholder = + const isPlaceholder = pdfDetails[0].Placeholders && pdfDetails[0].Placeholders; const isDecline = data.IsDeclined && data.IsDeclined; const signUrl = data.SignedUrl && data.SignedUrl; - const expireDate = pdfDetails[0] && pdfDetails[0].ExpiryDate.iso && pdfDetails[0].ExpiryDate.iso; + const expireDate = + pdfDetails[0] && + pdfDetails[0].ExpiryDate.iso && + pdfDetails[0].ExpiryDate.iso; const expireUpdateDate = new Date(expireDate).getTime(); const currDate = new Date().getTime(); const hostUrl = getHostUrl(); //checking document is completed and signer exist then navigate to pdfRequestFiles file if (data.IsCompleted && checkSignerExist) { - navigate(`${hostUrl}pdfRequestFiles`); + navigate(`${hostUrl}pdfRequestFiles`); } //checking document is completed and signer does not exist then navigate to recipientSignPdf file else if (data.IsCompleted && !checkSignerExist) { - navigate( - `${hostUrl}signaturePdf` - ); + navigate(`${hostUrl}signaturePdf`); } //checking document is declined by someone then navigate to pdfRequestFiles file else if (isDecline) { diff --git a/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js b/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js index cd004168a..db0c94425 100644 --- a/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js +++ b/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js @@ -6,6 +6,7 @@ import PdfFileComponent from "./FolderDrive/legaDriveComponent"; import Modal from "react-bootstrap/Modal"; import ModalHeader from "react-bootstrap/esm/ModalHeader"; import { themeColor, iconColor } from "../../utils/ThemeColor/backColor"; +import { getDrive } from "../../utils/Utils"; function PdfFile() { const scrollRef = useRef(null); @@ -15,29 +16,18 @@ function PdfFile() { const [pdfData, setPdfData] = useState([]); const [isFolder, setIsFolder] = useState(false); const [newFolderName, setNewFolderName] = useState(); - // const [parentFolderName, setParentFolderName] = useState(); - // const [parentFolder, setParentFolder] = useState([]); const [error, setError] = useState(); const [folderLoader, setIsFolderLoader] = useState(false); const [isShowSort, setIsShowSort] = useState(false); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time", + message: "This might take some time" }); const [docId, setDocId] = useState(); const [handleError, setHandleError] = useState(); const [folderName, setFolderName] = useState([]); - const senderUser = - localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ) && - localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ); - const jsonSender = JSON.parse(senderUser); - useEffect(() => { if (docId) { getPdfFolderDocumentList(); @@ -50,104 +40,59 @@ function PdfFile() { const getPdfDocumentList = async () => { const load = { isLoad: true, - message: "This might take some time", + message: "This might take some time" }; setIsLoading(load); - //?where={"Type":"Folder" }&include=ExtUserPtr,Signers - //?where={"$or":[{"Type":{"$exists":true}},{"Folder":{"$exists":false}}]}&include=ExtUserPtr,Signers - // "CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${jsonSender.objectId}"} - // where={"Folder":{"$exists":false} }&include=ExtUserPtr,Signers`, - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"Folder":{"$exists":false},"$or":[{"CreatedBy":{"$exists":false}},{"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${ - jsonSender.objectId - }"}}]}&include=ExtUserPtr,Signers`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken"), - }, - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; - // console.log("result", res); - if (res[0] && res.length > 0) { - setPdfData(res); - } + const driveDetails = await getDrive(); - const data = [ - { - name: "OpenSignDrive™", - objectId: "", - }, - ]; - setFolderName(data); - const loadObj = { - isLoad: false, - }; - setIsLoading(loadObj); - }) - .catch((err) => { - const loadObj = { - isLoad: false, - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); + if (driveDetails) { + if (driveDetails.length > 0) { + setPdfData(driveDetails); + } + const data = [ + { + name: "OpenSignDrive™", + objectId: "" + } + ]; + setFolderName(data); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if (driveDetails === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } }; //function for get parent folder document list const getPdfFolderDocumentList = async () => { const load = { isLoad: true, - message: "This might take some time", + message: "This might take some time" }; setIsLoading(load); - //{"$inQuery":{"where":{"objectId":"${docId}"},"className":"${appName}_Document"}} - //"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${jsonSender.objectId}"} - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"Folder":{"__type":"Pointer","className":"${localStorage.getItem( - "_appName" - )}_Document","objectId":"${docId}"},"$or":[{"CreatedBy":{"$exists":false}},{"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${ - jsonSender.objectId - }"}}]}&include=ExtUserPtr,Signers,Folder`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken"), - }, - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; - - if (res[0] && res.length > 0) { - setPdfData(res); - } else { - setPdfData([]); - } - - const loadObj = { - isLoad: false, - }; - setIsLoading(loadObj); - }) - .catch((err) => { - const loadObj = { - isLoad: false, - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); + const driveDetails = await getDrive(docId); + if (driveDetails) { + if (driveDetails.length > 0) { + setPdfData(driveDetails); + } else { + setPdfData([]); + } + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if (driveDetails === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } }; //function for get all pdf document list @@ -158,7 +103,7 @@ function PdfFile() { const handleRoute = (data) => { let loadObj = { isLoad: true, - message: "This might take some time", + message: "This might take some time" }; if (data.name === "LegaDrive™") { setIsLoading(loadObj); @@ -167,7 +112,7 @@ function PdfFile() { } else { setTimeout(() => { const loadObj = { - isLoad: false, + isLoad: false }; setIsLoading(loadObj); }, 1000); @@ -176,12 +121,11 @@ function PdfFile() { setIsLoading(loadObj); setTimeout(() => { const loadObj = { - isLoad: false, + isLoad: false }; setIsLoading(loadObj); }, 1000); } else { - // console.log("go here1",data.objectId) const findIndex = folderName.findIndex( (fold) => fold.objectId === data.objectId ); @@ -216,13 +160,13 @@ function PdfFile() { Folder: { __type: "Pointer", className: `${localStorage.getItem("_appName")}_Document`, - objectId: isParentId, - }, + objectId: isParentId + } }; } else { data = { Name: newFolderName, - Type: "Folder", + Type: "Folder" }; } @@ -237,8 +181,8 @@ function PdfFile() { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken"), - }, + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } } ) @@ -388,7 +332,7 @@ function PdfFile() { display: "flex", flexDirection: "column", justifyContent: "center", - alignItems: "center", + alignItems: "center" }} > <img @@ -406,7 +350,7 @@ function PdfFile() { style={{ margin: "10px 0px 10px 0px", fontSize: "15px", - fontWeight: "400", + fontWeight: "400" }} > Name* @@ -428,7 +372,7 @@ function PdfFile() { display: "flex", alignItems: "flex-end", justifyContent: "flex-end", - alignContent: "flex-end", + alignContent: "flex-end" }} > <button @@ -437,7 +381,7 @@ function PdfFile() { borderRadius: "0px", border: "1.5px solid #e3e2e1", fontWeight: "600", - color: "black", + color: "black" }} className="finishBtn" onClick={() => setIsFolder(false)} @@ -448,7 +392,7 @@ function PdfFile() { <button onClick={() => handleAddFolder()} style={{ - background: themeColor(), + background: themeColor() }} type="button" className="finishBtn" @@ -469,7 +413,7 @@ function PdfFile() { alignItems: "center", height: "100vh", width: "100%", - flexDirection: "column", + flexDirection: "column" }} > <img @@ -488,7 +432,7 @@ function PdfFile() { justifyContent: "center", alignItems: "center", height: "100vh", - width: "100%", + width: "100%" }} > <span style={{ fontSize: "20px", color: "gray" }}> @@ -502,7 +446,7 @@ function PdfFile() { onMouseEnter={(e) => handleMouseEnter(e)} ref={scrollRef} style={{ - width: "100%", + width: "100%" }} className="folderPath" > @@ -514,7 +458,7 @@ function PdfFile() { style={{ color: "#a64b4e", fontWeight: "400", - cursor: "pointer", + cursor: "pointer" }} > {data.name} @@ -523,7 +467,7 @@ function PdfFile() { color: "#a64b4e", fontWeight: "200", cursor: "pointer", - margin: "0 4px", + margin: "0 4px" }} > > @@ -545,13 +489,13 @@ function PdfFile() { style={{ marginRight: "5px", fontSize: "14px", - color: `${iconColor()}`, + color: `${iconColor()}` }} ></i> <span style={{ fontSize: "15px", - color: `${iconColor()}`, + color: `${iconColor()}` }} > {selectedSort} @@ -694,7 +638,7 @@ function PdfFile() { justifyContent: "center", alignItems: "center", height: "50vh", - width: "100%", + width: "100%" }} > <span style={{ fontWeight: "bold" }}>No Data Found!</span> diff --git a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js index d741162d5..bfcfd7cb3 100644 --- a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js +++ b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js @@ -11,7 +11,11 @@ import { HTML5Backend } from "react-dnd-html5-backend"; import { useParams } from "react-router-dom"; import SignPad from "./component/signPad"; import RenderAllPdfPage from "./component/renderAllPdfPage"; -import { getBase64FromIMG, getBase64FromUrl } from "../utils/Utils"; +import { + contractDocument, + getBase64FromIMG, + getBase64FromUrl +} from "../utils/Utils"; import Loader from "./component/loader"; import HandleError from "./component/HandleError"; import Nodata from "./component/Nodata"; @@ -106,152 +110,135 @@ function PdfRequestFiles() { //function for get document details for perticular signer with signer'object id const getDocumentDetails = async () => { - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${documentId}"}&include=ExtUserPtr,Signers,UserPtr`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; + //getting document details + const documentData = await contractDocument(documentId); + if (documentData && documentData.length > 0) { + const isCompleted = + documentData[0].IsCompleted && documentData[0].IsCompleted; + const expireDate = documentData[0].ExpiryDate.iso; + const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; + const expireUpdateDate = new Date(expireDate).getTime(); + const currDate = new Date().getTime(); + const getSigners = documentData[0].Signers; + const getCurrentSigner = + getSigners && + getSigners.filter( + (data) => data.UserId.objectId === jsonSender.objectId + ); - if (res[0] && res.length > 0) { - const isCompleted = res[0].IsCompleted && res[0].IsCompleted; - const expireDate = res[0].ExpiryDate.iso; - const declined = res[0].IsDeclined && res[0].IsDeclined; - const expireUpdateDate = new Date(expireDate).getTime(); - const currDate = new Date().getTime(); - const getSigners = res[0].Signers; - const getCurrentSigner = - getSigners && - getSigners.filter( - (data) => data.UserId.objectId === jsonSender.objectId - ); - - const currUserId = getCurrentSigner[0] - ? getCurrentSigner[0].objectId - : ""; - setSignerObjectId(currUserId); - if (res[0].SignedUrl) { - setPdfUrl(res[0].SignedUrl); - } else { - setPdfUrl(res[0].URL); - } - if (isCompleted) { - setIsSigned(true); - const data = { - isCertificate: true, - isModal: true - }; - setAlreadySign(true); - setIsCompleted(data); - } else if (declined) { - const currentDecline = { - currnt: "another", - isDeclined: true - }; - setIsDecline(currentDecline); - } else if (currDate > expireUpdateDate) { - setIsExpired(true); - } - - if (res.length > 0) { - const checkDocIdExist = - json.results[0].AuditTrail && - json.results[0].AuditTrail.length > 0 && - json.results[0].AuditTrail.filter( - (data) => data.Activity === "Signed" - ); - - const checkAlreadySign = - json.results[0].AuditTrail && - json.results[0].AuditTrail.length > 0 && - json.results[0].AuditTrail.filter( - (data) => - data.UserPtr.objectId === currUserId && - data.Activity === "Signed" - ); - if ( - checkAlreadySign && - checkAlreadySign[0] && - checkAlreadySign.length > 0 - ) { - setAlreadySign(true); - } - - let signers = []; - let unSignedSigner = []; - - //check document is signed or not - if (checkDocIdExist && checkDocIdExist.length > 0) { - setIsDocId(true); - const signerRes = res[0].Signers; - //comparison auditTrail user details with signers user details - for (let i = 0; i < signerRes.length; i++) { - const signerId = signerRes[i].objectId; - - let isSigned = 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 - - if (signerId === signedExist) { - signers.push({ ...signerRes[i], ...signerRes[i] }); - isSigned = true; - break; - } - // if does not match then add unsigned data in unSignedSigner array - } - if (!isSigned) { - unSignedSigner.push({ ...signerRes[i], ...signerRes[i] }); - } - } - setSignedSigners(signers); - setUnSignedSigners(unSignedSigner); - - setSignerPos(res[0].Placeholders); - } else { - let unsigned = []; - for (let i = 0; i < res.length; i++) { - unsigned.push(res[i].Signers); - } - setUnSignedSigners(unsigned[0]); - setSignerPos(res[0].Placeholders); - } - - setPdfDetails(res); - - setIsUiLoading(false); - } else { - alert("No data found!"); - } - } else { - setNoData(true); - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - setIsUiLoading(false); - } - }) - .catch((err) => { - console.log("err", err); - const loadObj = { - isLoad: false + const currUserId = getCurrentSigner[0] + ? getCurrentSigner[0].objectId + : ""; + setSignerObjectId(currUserId); + if (documentData[0].SignedUrl) { + setPdfUrl(documentData[0].SignedUrl); + } else { + setPdfUrl(documentData[0].URL); + } + if (isCompleted) { + setIsSigned(true); + const data = { + isCertificate: true, + isModal: true }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); + setAlreadySign(true); + setIsCompleted(data); + } else if (declined) { + const currentDecline = { + currnt: "another", + isDeclined: true + }; + setIsDecline(currentDecline); + } else if (currDate > expireUpdateDate) { + setIsExpired(true); + } + + if (documentData.length > 0) { + const checkDocIdExist = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => data.Activity === "Signed" + ); + + const checkAlreadySign = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => + data.UserPtr.objectId === currUserId && data.Activity === "Signed" + ); + if ( + checkAlreadySign && + checkAlreadySign[0] && + checkAlreadySign.length > 0 + ) { + setAlreadySign(true); + } + + let signers = []; + let unSignedSigner = []; + + //check document is signed or not + if (checkDocIdExist && checkDocIdExist.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; + + let isSigned = 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 + + if (signerId === signedExist) { + signers.push({ ...signerRes[i], ...signerRes[i] }); + isSigned = true; + break; + } + // if does not match then add unsigned data in unSignedSigner array + } + if (!isSigned) { + unSignedSigner.push({ ...signerRes[i], ...signerRes[i] }); + } + } + 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]); + setSignerPos(documentData[0].Placeholders); + } + setPdfDetails(documentData); + setIsUiLoading(false); + } else { + alert("No data found!"); + } + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else { + setNoData(true); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + setIsUiLoading(false); + } await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( @@ -293,7 +280,6 @@ function PdfRequestFiles() { const checkUser = signerPos.filter( (data) => data.signerObjId === signerObjectId ); - if (checkUser && checkUser.length > 0) { let checkSignUrl = []; const checkSign = checkUser[0].placeHolder.filter( @@ -596,12 +582,12 @@ function PdfRequestFiles() { if (isMobile) { //if pos.isMobile false -- placeholder saved from desktop view then handle position in mobile view divided by scale if (pos.isMobile) { - const y = pos.yPosition * (pos.scale / scale); + const y = pos.yBottom * (pos.scale / scale); yPosition = pos.isDrag ? y * scale - height : pos.firstYPos - ? y * scale - height + pos.firstYPos - : y * scale - height; + ? y * scale - height + pos.firstYPos + : y * scale - height; return yPosition; } else { const y = pos.yBottom / scale; @@ -609,8 +595,8 @@ function PdfRequestFiles() { yPosition = pos.isDrag ? y * scale - height : pos.firstYPos - ? y * scale - height + pos.firstYPos - : y * scale - height; + ? y * scale - height + pos.firstYPos + : y * scale - height; return yPosition; } } else { @@ -621,15 +607,15 @@ function PdfRequestFiles() { yPosition = pos.isDrag ? y - height : pos.firstYPos - ? y - height + pos.firstYPos - : y - height; + ? y - height + pos.firstYPos + : y - height; return yPosition; } else { yPosition = pos.isDrag ? pos.yBottom - height : pos.firstYPos - ? pos.yBottom - height + pos.firstYPos - : pos.yBottom - height; + ? pos.yBottom - height + pos.firstYPos + : pos.yBottom - height; return yPosition; } } @@ -1047,7 +1033,7 @@ function PdfRequestFiles() { <Modal.Body> <p className="pTagBody"> - This document has been signed by all Sigers. + This document has been signed by all Signers. </p> </Modal.Body> diff --git a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js index 07b377d1c..5638cfae3 100644 --- a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js +++ b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js @@ -15,7 +15,7 @@ import EmailComponent from "./component/emailComponent"; import FieldsComponent from "./component/fieldsComponent"; import Modal from "react-bootstrap/Modal"; import ModalHeader from "react-bootstrap/esm/ModalHeader"; -import { getBase64FromIMG } from "../utils/Utils"; +import { contractDocument, getBase64FromIMG } from "../utils/Utils"; import { useParams } from "react-router-dom"; import Tour from "reactour"; import { onSaveImage, onSaveSign } from "../utils/Utils"; @@ -175,55 +175,42 @@ function SignYourSelf() { //function for get document details for perticular signer with signer'object id const getDocumentDetails = async () => { - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${documentId}"}&include=ExtUserPtr,Signers`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; + //getting document details + const documentData = await contractDocument(documentId); - if (res[0] && res.length > 0) { - setPdfDetails(res); - const isCompleted = res[0].IsCompleted && res[0].IsCompleted; - if (isCompleted) { - const docStatus = { - isCompleted: isCompleted - }; - - setDocumentStatus(docStatus); - const alreadySign = { - status: true, - mssg: "You have successfully signed the document!" - }; - setShowAlreadySignDoc(alreadySign); - setPdfUrl(res[0].SignedUrl); - } - } else { - setNoData(true); - - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - } - }) - .catch((err) => { - const loadObj = { - isLoad: false + if (documentData && documentData.length > 0) { + setPdfDetails(documentData); + const isCompleted = + documentData[0].IsCompleted && documentData[0].IsCompleted; + if (isCompleted) { + const docStatus = { + isCompleted: isCompleted }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); + + setDocumentStatus(docStatus); + const alreadySign = { + status: true, + mssg: "You have successfully signed the document!" + }; + setShowAlreadySignDoc(alreadySign); + setPdfUrl(documentData[0].SignedUrl); + } + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else { + setNoData(true); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( @@ -254,13 +241,10 @@ function SignYourSelf() { setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); }); - const contractUsersRes = await contractUsers(jsonSender.objectId); - if ( - contractUsersRes !== "Error: Something went wrong!" && - contractUsersRes && - contractUsersRes[0] - ) { + const contractUsersRes = await contractUsers(jsonSender.email); + + if (contractUsersRes[0] && contractUsersRes.length > 0) { setContractName("_Users"); setSignerUserId(contractUsersRes[0].objectId); const tourstatuss = @@ -287,14 +271,12 @@ function SignYourSelf() { setIsLoading(loadObj); } else if (contractUsersRes.length === 0) { const contractContactBook = await contactBook(jsonSender.objectId); - if (contractContactBook && contractContactBook[0]) { + if (contractContactBook && contractContactBook.length > 0) { setContractName("_Contactbook"); - setSignerUserId(contractContactBook[0].objectId); const tourstatuss = contractContactBook[0].TourStatus && contractContactBook[0].TourStatus; - if (tourstatuss && tourstatuss.length > 0) { setTourStatus(tourstatuss); const checkTourRecipients = tourstatuss.filter( @@ -304,6 +286,8 @@ function SignYourSelf() { setCheckTourStatus(checkTourRecipients[0].signyourself); } } + } else { + setNoData(true); } const loadObj = { isLoad: false diff --git a/microfrontends/SignDocuments/src/Component/component/renderPdf.js b/microfrontends/SignDocuments/src/Component/component/renderPdf.js index 07cade06e..58e3670cd 100644 --- a/microfrontends/SignDocuments/src/Component/component/renderPdf.js +++ b/microfrontends/SignDocuments/src/Component/component/renderPdf.js @@ -606,7 +606,7 @@ function RenderPdf({ > {" "} <div - onTouchStart={(e) => { + onTouchEnd ={(e) => { if (!isDragging) { setTimeout(() => { e.stopPropagation(); @@ -640,6 +640,7 @@ function RenderPdf({ alt="signimg" onClick={(e) => { setSignKey(pos.key); + console.log("Drag 2"); setIsSignPad(true); setIsStamp(pos.isStamp); }} @@ -692,11 +693,10 @@ function RenderPdf({ }} > <div - onTouchStart={(e) => { + onTouchEnd ={(e) => { if (!isDragging) { setTimeout(() => { setIsSignPad(true); - setSignKey(pos.key); setIsStamp(pos.isStamp); }, 500); diff --git a/microfrontends/SignDocuments/src/Component/placeHolderSign.js b/microfrontends/SignDocuments/src/Component/placeHolderSign.js index 93be3b571..298ee3633 100644 --- a/microfrontends/SignDocuments/src/Component/placeHolderSign.js +++ b/microfrontends/SignDocuments/src/Component/placeHolderSign.js @@ -17,7 +17,12 @@ import HandleError from "./component/HandleError"; import Nodata from "./component/Nodata"; import SignerListPlace from "./component/signerListPlace"; import Header from "./component/header"; -import { contactBook, contractUsers, getHostUrl } from "../utils/Utils"; +import { + contactBook, + contractDocument, + contractUsers, + getHostUrl +} from "../utils/Utils"; import RenderPdf from "./component/renderPdf"; import ModalComponent from "./component/modalComponent"; import { useNavigate } from "react-router-dom"; @@ -169,56 +174,40 @@ function PlaceHolderSign() { //function for get document details const getDocumentDetails = async () => { - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${documentId}"}&include=ExtUserPtr,Signers`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; + //getting document details + const documentData = await contractDocument(documentId); + if (documentData && documentData.length > 0) { + setPdfDetails(documentData); - if (res[0] && res.length > 0) { - setPdfDetails(res); + const currEmail = documentData[0].ExtUserPtr.Email; + const filterCurrEmail = documentData[0].Signers.filter( + (data) => data.Email === currEmail + ); - const currEmail = res[0].ExtUserPtr.Email; - const filterCurrEmail = res[0].Signers.filter( - (data) => data.Email === currEmail - ); + setCurrentEmail(filterCurrEmail); + setSignersData(documentData[0]); - setCurrentEmail(filterCurrEmail); - setSignersData(res[0]); - - setSignerObjId(res[0].Signers[0].objectId); - setContractName(res[0].Signers[0].className); - setIsSelectId(0); - } else { - setNoData(true); - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - } - }) - .catch((err) => { - console.log("axois err ", err); - const loadObj = { - isLoad: false - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); - - const res = await contractUsers(jsonSender.objectId); + setSignerObjId(documentData[0].Signers[0].objectId); + setContractName(documentData[0].Signers[0].className); + setIsSelectId(0); + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else { + setNoData(true); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } + const res = await contractUsers(jsonSender.email); if (res[0] && res.length) { setSignerUserId(res[0].objectId); const tourstatus = res[0].TourStatus && res[0].TourStatus; @@ -242,24 +231,12 @@ function PlaceHolderSign() { setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); } else if (res.length === 0) { - const res = await contactBook(jsonSender.objectId); - if (res[0] && res.length) { - setSignerUserId(res[0].objectId); - const tourstatus = res[0].TourStatus && res[0].TourStatus; - if (tourstatus && tourstatus.length > 0) { - setTourStatus(tourstatus); - const checkTourRecipients = tourstatus.filter( - (data) => data.placeholder - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].placeholder); - } - } - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - } + setNoData(true); + + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); } }; diff --git a/microfrontends/SignDocuments/src/Component/recipientSignPdf.js b/microfrontends/SignDocuments/src/Component/recipientSignPdf.js index 9a1bbab90..fe43add21 100644 --- a/microfrontends/SignDocuments/src/Component/recipientSignPdf.js +++ b/microfrontends/SignDocuments/src/Component/recipientSignPdf.js @@ -14,7 +14,9 @@ import DefaultSignature from "./component/defaultSignature"; import { getBase64FromUrl, getBase64FromIMG, - contactBookName + contractUsers, + contactBook, + contractDocument } from "../utils/Utils"; import Tour from "reactour"; import Signedby from "./component/signedby"; @@ -75,6 +77,15 @@ function EmbedPdfImage() { return object.pageNumber === pageNumber; }); const divRef = useRef(null); + const senderUser = localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ? localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + : `${localStorage.getItem("UserInformation")}` && + `${localStorage.getItem("UserInformation")}`; + const jsonSender = JSON.parse(senderUser); //check isGuestSigner is present in local if yes than handle login flow header in mobile view const isGuestSigner = localStorage.getItem("isGuestSigner"); useEffect(() => { @@ -97,33 +108,26 @@ function EmbedPdfImage() { //function for get document details for perticular signer with signer'object id const getDocumentDetails = async () => { let currUserId, userObjectId; - const json = await contactBookName(contactBookId, "_Contactbook"); - if (json !== "Error: Something went wrong!" && json && json.results[0]) { + //getting contracts_contactBook details + const json = await contactBook(contactBookId); + if (json && json.length > 0) { setContractName("_Contactbook"); - if (json.results[0]) { - userObjectId = json.results[0].UserId.objectId; - setUserObjectID(userObjectId); - currUserId = json.results[0].objectId; - setSignerUserId(currUserId); - const tourstatus = - json.results[0].TourStatus && json.results[0].TourStatus; + userObjectId = json[0].UserId.objectId; + setUserObjectID(userObjectId); + currUserId = json[0].objectId; - if (tourstatus && tourstatus.length > 0) { - setTourStatus(tourstatus); - const checkTourRecipients = tourstatus.filter( - (data) => data.recipientssign - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].recipientssign); - } + setSignerUserId(currUserId); + const tourstatus = json[0].TourStatus && json[0].TourStatus; + + if (tourstatus && tourstatus.length > 0) { + setTourStatus(tourstatus); + const checkTourRecipients = tourstatus.filter( + (data) => data.recipientssign + ); + if (checkTourRecipients && checkTourRecipients.length > 0) { + setCheckTourStatus(checkTourRecipients[0].recipientssign); } - } else { - setNoData(true); - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); } } else if (json === "Error: Something went wrong!") { const loadObj = { @@ -132,18 +136,16 @@ function EmbedPdfImage() { setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); } else { - const json = await contactBookName(contactBookId, "_Users"); - - if (json !== "Error: Something went wrong!" && json && json.results[0]) { + const json = await contractUsers(jsonSender.email); + if (json && json.length > 0) { setContractName("_Users"); - if (json.results[0]) { - userObjectId = json.results[0].UserId.objectId; + if (json[0]) { + userObjectId = json[0].UserId.objectId; setUserObjectID(userObjectId); - currUserId = json.results[0].objectId; + currUserId = json[0].objectId; setSignerUserId(currUserId); - const tourstatus = - json.results[0].TourStatus && json.results[0].TourStatus; + const tourstatus = json[0].TourStatus && json[0].TourStatus; if (tourstatus && tourstatus.length > 0) { setTourStatus(tourstatus); @@ -167,171 +169,170 @@ function EmbedPdfImage() { }; setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); - } - } + } else { + setNoData(true); - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${docId}"}&include=ExtUserPtr,Signers,AuditTrail - ,`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; - if (res[0] && res.length > 0) { - const declined = res[0].IsDeclined && res[0].IsDeclined; - const isCompleted = res[0].IsCompleted && res[0].IsCompleted; - const expireDate = res[0].ExpiryDate.iso; - - const expireUpdateDate = new Date(expireDate).getTime(); - const currDate = new Date().getTime(); - if (isCompleted) { - //checking document is completed (signed by all requested signers) than isCompleted true - //then show alert with completed message - const alreadySign = { - status: true, - mssg: "This document has been successfully signed!" - }; - setIsAlreadySign(alreadySign); - setPdfUrl(res[0].SignedUrl); - setSignedPdfData(json.results); - setCompletePdfData(res); - } else if (declined) { - const currentDecline = { - currnt: "another", - isDeclined: true - }; - setIsDecline(currentDecline); - - setSignedPdfData(json.results); - } else if (currDate > expireUpdateDate) { - setIsExpired(true); - const checkDocIdExist = - json.results[0].AuditTrail && - json.results[0].AuditTrail.length > 0 && - json.results[0].AuditTrail.filter( - (data) => data.Activity === "Signed" - ); - - //if signed by someone than go to in if condition - // and second signer could not be add documentId - //for that setIsDocId true - if (checkDocIdExist && checkDocIdExist.length > 0) { - setIsDocId(true); - const currUser = - json.results[0].Placeholders && - json.results[0].Placeholders.filter( - (data) => data.signerObjId === currUserId - ); - - setSignedPdfData(json.results); - - setXyPostion(currUser[0].placeHolder); - - const key = currUser[0].placeHolder[0].pos[0].key; - setSignKey(key); - } - //for show current requested signer's placeholder - else { - const currUser = - json.results[0].Placeholders && - json.results[0].Placeholders.filter( - (data) => data.signerObjId === currUserId - ); - - setSignedPdfData(json.results); - - setXyPostion(currUser[0].placeHolder); - - const key = currUser[0].placeHolder[0].pos[0].key; - setSignKey(key); - } - } else { - //checking document has signed by someone or not - - const checkDocIdExist = - json.results[0].AuditTrail && - json.results[0].AuditTrail.length > 0 && - json.results[0].AuditTrail.filter( - (data) => data.Activity === "Signed" - ); - - //if signed by someone than go to in if condition - // and second signer could not be add documentId - //for that setIsDocId true - - if (checkDocIdExist && checkDocIdExist.length > 0) { - setIsDocId(true); - - //condition for checking document signed by current requested user or not - const checkAlreadyBySigner = json.results[0].AuditTrail.filter( - (data) => - data.UserPtr.objectId === currUserId && - data.Activity === "Signed" - ); - - // if checkAlreadyBySigner has some data that current user already sign this document - // then show alert with message - if (checkAlreadyBySigner && checkAlreadyBySigner.length > 0) { - const alreadySign = { - status: true, - mssg: "You have successfully signed the document!" - }; - setIsAlreadySign(alreadySign); - setPdfUrl(res[0].SignedUrl); - setSignedPdfData(json.results); - } - //else show placeholder of current requested signer - else { - const currUser = - json.results[0].Placeholders && - json.results[0].Placeholders.filter( - (data) => data.signerObjId === currUserId - ); - - setSignedPdfData(json.results); - - setXyPostion(currUser[0].placeHolder); - - const key = currUser[0].placeHolder[0].pos[0].key; - setSignKey(key); - } - } - //for show current requested signer's placeholder - else { - const currUser = - json.results[0].Placeholders && - json.results[0].Placeholders.filter( - (data) => data.signerObjId === currUserId - ); - - setSignedPdfData(json.results); - - setXyPostion(currUser[0].placeHolder); - - const key = currUser[0].placeHolder[0].pos[0].key; - setSignKey(key); - } - } - } - }) - .catch((err) => { const loadObj = { isLoad: false }; - setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); - console.log("err", err); - }); + } + } + + //getting document details + const documentData = await contractDocument(docId); + if (documentData && documentData.length > 0) { + const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; + const isCompleted = + documentData[0].IsCompleted && documentData[0].IsCompleted; + const expireDate = documentData[0].ExpiryDate.iso; + + const expireUpdateDate = new Date(expireDate).getTime(); + const currDate = new Date().getTime(); + if (isCompleted) { + //checking document is completed (signed by all requested signers) than isCompleted true + //then show alert with completed message + const alreadySign = { + status: true, + mssg: "This document has been successfully signed!" + }; + setIsAlreadySign(alreadySign); + setPdfUrl(documentData[0].SignedUrl); + setSignedPdfData(documentData); + setCompletePdfData(documentData); + } else if (declined) { + const currentDecline = { + currnt: "another", + isDeclined: true + }; + setIsDecline(currentDecline); + + setSignedPdfData(documentData); + } else if (currDate > expireUpdateDate) { + setIsExpired(true); + const checkDocIdExist = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => data.Activity === "Signed" + ); + + //if signed by someone than go to in if condition + // and second signer could not be add documentId + //for that setIsDocId true + if (checkDocIdExist && checkDocIdExist.length > 0) { + setIsDocId(true); + const currUser = + documentData.Placeholders && + documentData.Placeholders.filter( + (data) => data.signerObjId === currUserId + ); + + setSignedPdfData(documentData); + + setXyPostion(currUser[0].placeHolder); + + const key = currUser[0].placeHolder[0].pos[0].key; + setSignKey(key); + } + //for show current requested signer's placeholder + else { + const currUser = + documentData[0].Placeholders && + documentData[0].Placeholders.filter( + (data) => data.signerObjId === currUserId + ); + + setSignedPdfData(documentData); + + setXyPostion(currUser[0].placeHolder); + + const key = currUser[0].placeHolder[0].pos[0].key; + setSignKey(key); + } + } else { + //checking document has signed by someone or not + + const checkDocIdExist = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => data.Activity === "Signed" + ); + + //if signed by someone than go to in if condition + // and second signer could not be add documentId + //for that setIsDocId true + + if (checkDocIdExist && checkDocIdExist.length > 0) { + setIsDocId(true); + + //condition for checking document signed by current requested user or not + const checkAlreadyBySigner = documentData[0].AuditTrail.filter( + (data) => + data.UserPtr.objectId === currUserId && data.Activity === "Signed" + ); + + // if checkAlreadyBySigner has some data that current user already sign this document + // then show alert with message + if (checkAlreadyBySigner && checkAlreadyBySigner.length > 0) { + const alreadySign = { + status: true, + mssg: "You have successfully signed the document!" + }; + setIsAlreadySign(alreadySign); + setPdfUrl(documentData[0].SignedUrl); + setSignedPdfData(documentData); + } + //else show placeholder of current requested signer + else { + const currUser = + documentData[0].Placeholders && + documentData[0].Placeholders.filter( + (data) => data.signerObjId === currUserId + ); + + setSignedPdfData(documentData); + + setXyPostion(currUser[0].placeHolder); + + const key = currUser[0].placeHolder[0].pos[0].key; + setSignKey(key); + } + } + //for show current requested signer's placeholder + else { + const currUser = + documentData[0].Placeholders && + documentData[0].Placeholders.filter( + (data) => data.signerObjId === currUserId + ); + + setSignedPdfData(documentData); + + setXyPostion(currUser[0].placeHolder); + + const key = currUser[0].placeHolder[0].pos[0].key; + setSignKey(key); + } + } + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else { + setNoData(true); + + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( @@ -663,8 +664,8 @@ function EmbedPdfImage() { yPosition = pos.isDrag ? y * scale - height : pos.firstYPos - ? y * scale - height + pos.firstYPos - : y * scale - height; + ? y * scale - height + pos.firstYPos + : y * scale - height; return yPosition; } else { const y = pos.yBottom / scale; @@ -672,8 +673,8 @@ function EmbedPdfImage() { yPosition = pos.isDrag ? y * scale - height : pos.firstYPos - ? y * scale - height + pos.firstYPos - : y * scale - height; + ? y * scale - height + pos.firstYPos + : y * scale - height; return yPosition; } } else { @@ -684,15 +685,15 @@ function EmbedPdfImage() { yPosition = pos.isDrag ? y - height : pos.firstYPos - ? y - height + pos.firstYPos - : y - height; + ? y - height + pos.firstYPos + : y - height; return yPosition; } else { yPosition = pos.isDrag ? pos.yBottom - height : pos.firstYPos - ? pos.yBottom - height + pos.firstYPos - : pos.yBottom - height; + ? pos.yBottom - height + pos.firstYPos + : pos.yBottom - height; return yPosition; } } @@ -1088,7 +1089,7 @@ function EmbedPdfImage() { isShowHeader={true} currentSigner={true} decline={true} - alreadySign={pdfUrl ? true :false} + alreadySign={pdfUrl ? true : false} /> <RenderPdf @@ -1133,9 +1134,7 @@ function EmbedPdfImage() { )} </div> )} - </DndProvider> ); } - -export default EmbedPdfImage; \ No newline at end of file +export default EmbedPdfImage; diff --git a/microfrontends/SignDocuments/src/utils/Utils.js b/microfrontends/SignDocuments/src/utils/Utils.js index 2c960ceca..a02d3abcd 100644 --- a/microfrontends/SignDocuments/src/utils/Utils.js +++ b/microfrontends/SignDocuments/src/utils/Utils.js @@ -59,7 +59,6 @@ export function onSaveImage(xyPostion, index, signKey, imgWH, image) { data.key === signKey && data.Width && data.Height && data.SignUrl ); - if (updateFilter.length > 0) { let newWidth, newHeight; const aspectRatio = imgWH.width / imgWH.height; @@ -140,7 +139,7 @@ export function onSaveImage(xyPostion, index, signKey, imgWH, image) { ...url, Width: getPosData[0].Width ? getPosData[0].Width : newWidth, Height: getPosData[0].Height ? getPosData[0].Height : newHeight, - SignUrl: image.src, + SignUrl: image.src, ImageType: image.imgType }; } @@ -154,7 +153,6 @@ export function onSaveImage(xyPostion, index, signKey, imgWH, image) { return obj; }); return newUpdateUrl; - // setXyPostion(newUpdateUrl); } } @@ -184,40 +182,105 @@ export function onSaveSign(xyPostion, index, signKey, signatureImg) { return newUpdateUrl; } -//function for getting contract_User details -export const contractUsers = async (objectId) => { - const result = await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Users?where={"UserId": {"__type": "Pointer","className": "_User", "objectId":"${objectId}"}}`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } +//function for getting document details from contract_Documents class +export const contractDocument = async (documentId) => { + const data = { + docId: documentId + }; + const documentDeatils = await axios + .post(`${localStorage.getItem("baseUrl")}functions/getDocument`, data, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") } - ) + }) .then((Listdata) => { const json = Listdata.data; - const res = json.results; - return res; + let data = []; + if (json && json.result.error) { + return json; + } else if (json && json.result) { + data.push(json.result); + return data; + } else { + return []; + } }) .catch((err) => { return "Error: Something went wrong!"; }); - return result; + return documentDeatils; }; -//function for getting contrscts_contactbook details +//function for getting document details for getDrive +export const getDrive = async (documentId) => { + const data = { + docId: documentId && documentId + }; + const driveDeatils = await axios + .post(`${localStorage.getItem("baseUrl")}functions/getDrive`, data, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessiontoken: localStorage.getItem("accesstoken") + } + }) + .then((Listdata) => { + const json = Listdata.data; + + if (json && json.result.error) { + return json; + } else if (json && json.result) { + const data = json.result; + return data; + } else { + return []; + } + }) + .catch((err) => { + return "Error: Something went wrong!"; + }); + + return driveDeatils; +}; +//function for getting contract_User details +export const contractUsers = async (email) => { + const data = { + email: email + }; + const userDetails = await axios + .post(`${localStorage.getItem("baseUrl")}functions/getUserDetails`, data, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } + }) + .then((Listdata) => { + const json = Listdata.data; + let data = []; + + if (json && json.result) { + data.push(json.result); + return data; + } + }) + .catch((err) => { + return "Error: Something went wrong!"; + }); + + return userDetails; +}; + +//function for getting contracts_contactbook details export const contactBook = async (objectId) => { const result = await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( "_appName" - )}_Contactbook?where={"UserId": {"__type": "Pointer","className": "_User", "objectId":"${objectId}"}}`, + )}_Contactbook?where={"objectId":"${objectId}"}`, { headers: { "Content-Type": "application/json", @@ -238,30 +301,6 @@ export const contactBook = async (objectId) => { return result; }; -export const contactBookName = async (objectId, className) => { - const result = await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}${className}?where={"objectId":"${objectId}"}`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - return json; - }) - .catch((err) => { - return "Error: Something went wrong!"; - }); - return result; -}; - export const modalAlign = () => { let modalDialog = $('.modal-dialog').getBoundingClientRect(); let mobileHead = $('.mobileHead').getBoundingClientRect()