diff --git a/apps/OpenSign/public/index.html b/apps/OpenSign/public/index.html index 83788c7ff..c12d8c701 100644 --- a/apps/OpenSign/public/index.html +++ b/apps/OpenSign/public/index.html @@ -31,7 +31,7 @@ - Open sign + OpenSign™ @@ -50,4 +50,4 @@ --> - \ No newline at end of file + diff --git a/apps/OpenSign/src/components/AppendFormInForm.js b/apps/OpenSign/src/components/AppendFormInForm.js index 2d61d4597..22017e423 100644 --- a/apps/OpenSign/src/components/AppendFormInForm.js +++ b/apps/OpenSign/src/components/AppendFormInForm.js @@ -32,6 +32,7 @@ const AppendFormInForm = (props) => { try { const query = new Parse.Query("contracts_Contactbook"); query.equalTo("CreatedBy", user); + query.notEqualTo("IsDeleted", true); query.equalTo("Email", user.getEmail()); const res = await query.first(); // console.log(res); diff --git a/apps/OpenSign/src/components/TreeWidget.js b/apps/OpenSign/src/components/TreeWidget.js index 16326293f..ecbce7af4 100644 --- a/apps/OpenSign/src/components/TreeWidget.js +++ b/apps/OpenSign/src/components/TreeWidget.js @@ -700,7 +700,7 @@ const TreeWidget = (props) => { ))}
- {editable && ( + {/* {editable && ( { selectFolderHandle(); }} /> - )} + )} */} {isAddField && !loader && !editable && ( { - {fldr[props.schema.data.FolderTypeField] === + {/* {fldr[props.schema.data.FolderTypeField] === props.schema.data.FolderTypeValue && ( { aria-hidden="true" > - )} + )} */} ) )} diff --git a/apps/OpenSign/src/components/fields/DropboxChoose.js b/apps/OpenSign/src/components/fields/DropboxChoose.js new file mode 100644 index 000000000..9ed1bb3f8 --- /dev/null +++ b/apps/OpenSign/src/components/fields/DropboxChoose.js @@ -0,0 +1,59 @@ +import React, { useCallback, useMemo } from "react"; +import { useDropScript } from "../../hook/useScript"; + +const DROPBOX_APP_KEY = process.env.REACT_APP_DROPBOX_API_KEY; // App key +const DROPBOX_SDK_URL = "https://www.dropbox.com/static/api/2/dropins.js"; +const DROPBOX_SCRIPT_ID = "dropboxjs"; + +export default function DropboxChooser({ children, onSuccess, onCancel }) { + useDropScript(DROPBOX_SDK_URL, { + attrs: { + id: DROPBOX_SCRIPT_ID, + "data-app-key": DROPBOX_APP_KEY + } + }); + + const options = useMemo( + () => ({ + // Required. Called when a user selects an item in the Chooser. + success: (files) => { + // console.log("success", files); + onSuccess && onSuccess(files); + }, + // Optional. Called when the user closes the dialog without selecting a file + // and does not include any parameters. + cancel: () => { + console.log("cancel"); + onCancel && onCancel(); + }, + + // Optional. "preview" (default) is a preview link to the document for sharing, + // "direct" is an expiring link to download the contents of the file. For more + linkType: "direct", // or "preview" + multiselect: false, // 是否支持多选 + extensions: [".pdf"], + + // Optional. A value of false (default) limits selection to files, + // while true allows the user to select both folders and files. + // You cannot specify `linkType: "direct"` when using `folderselect: true`. + folderselect: false // or true + }), + [onSuccess, onCancel] + ); + + const handleChoose = useCallback(() => { + if (window.Dropbox) { + window.Dropbox.choose(options); + } + }, [options]); + + return ( +
+ {children || ( + + )} +
+ ); +} diff --git a/apps/OpenSign/src/components/fields/FileUpload.js b/apps/OpenSign/src/components/fields/FileUpload.js index 226640d44..09a11e8d2 100644 --- a/apps/OpenSign/src/components/fields/FileUpload.js +++ b/apps/OpenSign/src/components/fields/FileUpload.js @@ -2,14 +2,12 @@ import React, { useState, useEffect } from "react"; import { SaveFileSize } from "../../constant/saveFileSize"; import Parse from "parse"; import sanitizeFileName from "../../primitives/sanitizeFileName"; - +import DropboxChooser from "./DropboxChoose"; const FileUpload = (props) => { const [parseBaseUrl] = useState(localStorage.getItem("baseUrl")); const [parseAppId] = useState(localStorage.getItem("parseAppId")); const [_fileupload, setFileUpload] = useState(""); const [fileload, setfileload] = useState(false); - - const [localValue, setLocalValue] = useState(""); const [Message] = useState(false); const [percentage, setpercentage] = useState(0); @@ -25,7 +23,6 @@ const FileUpload = (props) => { const onChange = (e) => { try { let files = e.target.files; - setLocalValue(e.target.files); if (typeof files[0] !== "undefined") { if (props.schema.filetypes && props.schema.filetypes.length > 0) { var fileName = files[0].name; @@ -106,6 +103,56 @@ const FileUpload = (props) => { console.error("Error uploading file:", error); } }; + + const dropboxSuccess = async (files) => { + // console.log("file ", files); + setfileload(true); + const file = files[0]; + const url = file.link; + const size = file.bytes; + const mb = Math.round(file.bytes / Math.pow(1024, 2)); + + if (mb > 10) { + setTimeout(() => { + alert( + `The selected file size is too large. Please select a file less than 10 MB` + ); + }, 500); + return; + } else { + const name = sanitizeFileName(file.name); + + const parseFile = new Parse.File(name, { uri: url }); + + try { + 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); + } + } + }); + // console.log("response.url() ", response.url()); + setFileUpload(response.url()); + props.onChange(response.url()); + setfileload(false); + + if (response.url()) { + SaveFileSize(size, response.url()); + return response.url(); + } + } catch (error) { + setfileload(false); + setpercentage(0); + console.error("Error uploading file:", error); + } + } + }; + const dropboxCancel = async () => { + console.log("cancel clicked "); + }; let fileView = props.formData && props.schema.uploadtype === "s3viajw" ? null : props.formData && @@ -207,55 +254,51 @@ const FileUpload = (props) => { <> - {localValue ? ( - - ) : props.formData ? ( -
- file selected : {props.formData.split("/")[3]} + {props.formData ? ( +
+
+
+ file selected : {props.formData.split("/")[3]} +
+
{ + console.log("clicked"); + setFileUpload([]); + props.onChange(undefined); + }} + className="cursor-pointer px-[10px] text-[20px] font-bold bg-white text-red-500" + > + +
+
+
) : ( - +
+ + +
)} diff --git a/apps/OpenSign/src/hook/useScript.js b/apps/OpenSign/src/hook/useScript.js index cb39649f7..354ad1fe1 100644 --- a/apps/OpenSign/src/hook/useScript.js +++ b/apps/OpenSign/src/hook/useScript.js @@ -15,3 +15,20 @@ export const useScript = (url, onload) => { }; }, [url, onload]); }; + +/**`useScript` hook is generated scripte for google sign in button */ +export const useDropScript = (url, onload) => { + useEffect(() => { + const script = document.createElement("script"); + //add url parameter to the script src, for load and it will remove after load in return + script.src = url; + script.async = true; + script.defer = true; + script.id = "dropboxjs"; + script.setAttribute("data-app-key", "8k0thg9r1t7asqg"); + document.head.appendChild(script); + return () => { + document.head.removeChild(script); + }; + }, [url, onload]); +}; diff --git a/apps/OpenSign/src/json/FormJson.js b/apps/OpenSign/src/json/FormJson.js index bf67053a9..8ea3b7195 100644 --- a/apps/OpenSign/src/json/FormJson.js +++ b/apps/OpenSign/src/json/FormJson.js @@ -14,7 +14,7 @@ export const formJson = (id) => { type: "string", title: "Select Document", filetypes: [], - maxfilesizeKB: "5000", + maxfilesizeKB: "10000", uploadtype: "regular", helpbody: "", helplink: "" @@ -147,7 +147,7 @@ export const formJson = (id) => { class: "contracts_Contactbook", displayKey: "Name", valueKey: "objectId", - query: `where={"CreatedBy":${userPtr}}&keys=Name`, + query: `where={"CreatedBy":${userPtr},"IsDeleted":{"$ne":true}}&keys=Name`, isPointer: true, helpbody: "", helplink: "", @@ -582,4 +582,3 @@ export const formJson = (id) => { return formData; } }; - diff --git a/apps/OpenSign/src/json/plansArr.json b/apps/OpenSign/src/json/plansArr.json index 4a5d51837..d4ae65baa 100644 --- a/apps/OpenSign/src/json/plansArr.json +++ b/apps/OpenSign/src/json/plansArr.json @@ -52,7 +52,7 @@ "subtitle": "Customization available Priority support.", "btnText": "Contact us", "url": "https://www.opensignlabs.com/contact-us", - "target": "_self", + "target": "_blank", "benefits": [ "All features", "Custom domain", diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 0be8d98ca..22be8a6c0 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -224,7 +224,7 @@ const ReportTable = ({ {act?.btnIcon && ( {

{item.subtitle}

+ diff --git a/apps/OpenSign/src/routes/UserProfile.js b/apps/OpenSign/src/routes/UserProfile.js index 5dc747329..5a2120375 100644 --- a/apps/OpenSign/src/routes/UserProfile.js +++ b/apps/OpenSign/src/routes/UserProfile.js @@ -158,124 +158,126 @@ function UserProfile() { > ) : ( -
-
-
- dp -
- {editmode && ( - { - let files = e.target.files; - fileUpload(files[0]); - }} - /> - )} - {percentage !== 0 && ( -
-
-
-
- {percentage}% +
+
+
+
+ dp +
+ {editmode && ( + { + let files = e.target.files; + fileUpload(files[0]); + }} + /> + )} + {percentage !== 0 && ( +
+
+
+
+ {percentage}% +
+ )} +
+ {localStorage.getItem("_user_role")}
- )} -
- {localStorage.getItem("_user_role")}
-
-
    -
  • - Name:{" "} - {editmode ? ( - SetName(e.target.value)} - /> - ) : ( - {localStorage.getItem("username")} - )} -
  • -
  • - Phone:{" "} - {editmode ? ( - SetPhone(e.target.value)} - value={Phone} - /> - ) : ( - {UserProfile && UserProfile.phone} - )} -
  • -
  • - Email:{" "} - {UserProfile && UserProfile.email} -
  • -
  • - Is Email verified:{" "} - - {UserProfile && UserProfile.emailVerified - ? "Verified" - : "Not verified"} - -
  • -
-
- {editmode ? ( - - ) : ( + Name:{" "} + {editmode ? ( + SetName(e.target.value)} + /> + ) : ( + {localStorage.getItem("username")} + )} + +
  • + Phone:{" "} + {editmode ? ( + SetPhone(e.target.value)} + value={Phone} + /> + ) : ( + {UserProfile && UserProfile.phone} + )} +
  • +
  • + Email:{" "} + {UserProfile && UserProfile.email} +
  • +
  • + Is Email verified:{" "} + + {UserProfile && UserProfile.emailVerified + ? "Verified" + : "Not verified"} + +
  • + +
    + {editmode ? ( + + ) : ( + + )} - )} - +
    )} diff --git a/apps/OpenSignServer/cloud/parsefunction/ContactBookAftersave.js b/apps/OpenSignServer/cloud/parsefunction/ContactBookAftersave.js index d49794c0e..644a2a763 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ContactBookAftersave.js +++ b/apps/OpenSignServer/cloud/parsefunction/ContactBookAftersave.js @@ -16,6 +16,7 @@ async function ContactbookAftersave(request) { acl.setWriteAccess(object.get('UserId'), true); object.setACL(acl); + object.set('IsDeleted', false) // Continue saving the object return object.save(null, { useMasterKey: true }); } diff --git a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js index 1d1eaf6d3..9f51801f3 100644 --- a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js +++ b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js @@ -937,6 +937,7 @@ function SignYourSelf() { currentSigner={true} alreadySign={pdfUrl ? true : false} isSignYourself={true} + setIsEmail={setIsEmail} />
    diff --git a/microfrontends/SignDocuments/src/Component/component/emailComponent.js b/microfrontends/SignDocuments/src/Component/component/emailComponent.js index cb67fd0b3..5854c8749 100644 --- a/microfrontends/SignDocuments/src/Component/component/emailComponent.js +++ b/microfrontends/SignDocuments/src/Component/component/emailComponent.js @@ -20,14 +20,14 @@ function EmailComponent({ pdfName, sender }) { - const [emailCount, setEmailCount] = useState([]); + const [emailList, setEmailList] = useState([]); const [emailValue, setEmailValue] = useState(); const [isLoading, setIsLoading] = useState(false); //function for send email const sendEmail = async () => { setIsLoading(true); let sendMail; - for (let i = 0; i < emailCount.length; i++) { + for (let i = 0; i < emailList.length; i++) { try { const imgPng = "https://qikinnovation.ams3.digitaloceanspaces.com/logo.png"; @@ -44,7 +44,7 @@ function EmailComponent({ let params = { pdfName: pdfName, url: pdfUrl, - recipient: emailCount[i], + recipient: emailList[i], subject: `${sender.name} has signed the doc - ${pdfName}`, from: sender.email, html: @@ -67,11 +67,14 @@ function EmailComponent({ } if (sendMail.data.result.status === "success") { - setIsEmail(false); setSuccessEmail(true); setTimeout(() => { setSuccessEmail(false); - }, 3000); + setIsEmail(false); + setEmailValue(""); + setEmailList([]); + }, 1500); + setIsLoading(false); } else if (sendMail.data.result.status === "error") { setIsLoading(false); @@ -81,10 +84,11 @@ function EmailComponent({ alert("Something went wrong!"); } }; + //function for remove email const removeChip = (index) => { - const updateEmailCount = emailCount.filter((data, key) => key !== index); - setEmailCount(updateEmailCount); + const updateEmailCount = emailList.filter((data, key) => key !== index); + setEmailList(updateEmailCount); }; //function for get email value const handleEmailValue = (e) => { @@ -95,10 +99,10 @@ function EmailComponent({ //function for save email in array after press enter const handleEnterPress = (e) => { if (e.key === "Enter" && emailValue) { - setEmailCount((prev) => [...prev, emailValue]); + setEmailList((prev) => [...prev, emailValue]); setEmailValue(""); } else if (e === "add" && emailValue) { - setEmailCount((prev) => [...prev, emailValue]); + setEmailList((prev) => [...prev, emailValue]); setEmailValue(""); } }; @@ -249,7 +253,7 @@ function EmailComponent({ > Recipients added here will get a copy of the signed document.

    - {emailCount.length > 0 ? ( + {emailList.length > 0 ? ( <>
    - {emailCount.map((data, ind) => { + {emailList.map((data, ind) => { return (
    - {emailCount.length <= 9 && ( + {emailList.length <= 9 && ( setIsEmail(false)} + onClick={() => { + setIsEmail(false); + setEmailValue(""); + setEmailList([]); + }} > Close +
    ) : (
    diff --git a/microfrontends/SignDocuments/src/Component/component/renderPdf.js b/microfrontends/SignDocuments/src/Component/component/renderPdf.js index 35bf1c1d2..47940c850 100644 --- a/microfrontends/SignDocuments/src/Component/component/renderPdf.js +++ b/microfrontends/SignDocuments/src/Component/component/renderPdf.js @@ -1,6 +1,5 @@ import React from "react"; import RSC from "react-scrollbars-custom"; -import Toast from "react-bootstrap/Toast"; import { Rnd } from "react-rnd"; import { themeColor } from "../../utils/ThemeColor/backColor"; import { Document, Page, pdfjs } from "react-pdf"; @@ -9,6 +8,8 @@ import { handleImageResize, handleSignYourselfImageResize } from "../../utils/Utils"; +import EmailToast from "./emailToast"; + pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`; @@ -272,20 +273,7 @@ function RenderPdf({ ref={drop} id="container" > -
    - - - Email sent successful! - - -
    + {pdfLoadFail.status && (recipient ? !pdfUrl && @@ -693,20 +681,7 @@ function RenderPdf({ ref={drop} id="container" > -
    - - - Email sent successful! - - -
    + {pdfLoadFail.status && (recipient ? !pdfUrl && diff --git a/microfrontends/SignDocuments/src/css/signature.css b/microfrontends/SignDocuments/src/css/signature.css index afe4ae895..477159b03 100644 --- a/microfrontends/SignDocuments/src/css/signature.css +++ b/microfrontends/SignDocuments/src/css/signature.css @@ -8,7 +8,6 @@ .penContainer { width: 460px; } - .borderResize { position: absolute; display: inline-block; @@ -16,7 +15,26 @@ height: 14px; } +.mailBtn{ + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.18); + padding: 3px 15px !important; + background-color: rgb(79 190 241); + border: none !important; + color: white !important; +} +.mailBtn:hover { + box-shadow: 0 2px 4px rgba(154, 36, 36, 0.1), 0 2px 4px rgba(0, 0, 0, 0.18); +} +.emailToast{ + position: absolute; + z-index: 10; + background: #aeedae; + padding: 0 3px 3px 3px; + margin: 2px; + border-radius: 2px; +} + .signatureBtn { border: 1.5px solid #47a3ad; margin-bottom: 10px;