Compare commits

..
Author SHA1 Message Date
AndrewandGitHub 350854ab6b Merge pull request #321 from OpenSignLabs/fix_submitbtn_template 2024-01-12 19:53:25 +05:30
prafull-opensignlabsandGitHub cc980758fd Update TemplateForm.js 2024-01-12 19:49:51 +05:30
prafull-opensignlabsandGitHub 0f1ce43cc5 Merge pull request #320 from OpenSignLabs/modal-ui
fix: replace title Role to Roles in template creation flow
2024-01-12 19:24:53 +05:30
RaktimaNXG 5e1a9cdc20 "fix: replace title Role to Roles in template creation flow" 2024-01-12 17:25:11 +05:30
prafull-opensignlabsandGitHub 550ce10c92 Merge pull request #318 from OpenSignLabs/modal-ui
fix: modal-ui,replace loading pdf to loading document, onclick placeholder open user details popup
2024-01-12 15:38:11 +05:30
RaktimaandGitHub 6080c59bd7 fix: clear image after upload image on sign pad 2024-01-12 15:23:30 +05:30
RaktimaNXG 273a35d42f fix:resolved on-drag placeholder user-details popup open in edit template flow 2024-01-12 15:03:09 +05:30
RaktimaNXG 2f195fe02e fix: clear image issue after upload image using sign pad 2024-01-12 14:27:33 +05:30
RaktimaNXG 0715ca9d85 fix: on-drag placeholder user-details popup open issue,close button design, remove unnecessary code & npm package 2024-01-12 14:07:53 +05:30
RaktimaNXG 1ec10fbcfc fix: modal-ui,replace loading pdf to loading document, onclick placeholder open user details popup 2024-01-11 14:53:14 +05:30
AmolandGitHub 274620d17b Merge pull request #314 from OpenSignLabs/fix_draft_report
update draft report query
2024-01-10 21:04:52 +05:30
prafull-opensignlabsandGitHub 06db7d2360 update draft report query 2024-01-10 21:04:20 +05:30
AndrewandGitHub 2b3549e4df Merge pull request #313 from OpenSignLabs/opensign-drive 2024-01-10 20:48:52 +05:30
RaktimaNXG d16478792c fix:document name bold,openSign to OpenSign™ in email login flow 2024-01-10 19:49:17 +05:30
prafull-opensignlabsandGitHub 7ba2ef6420 Merge pull request #311 from OpenSignLabs/opensign-drive
feat: implement of document delete and move to folder in opensigndrive
2024-01-10 18:29:32 +05:30
prafull-opensignlabsandGitHub b5d98796b7 update template details on save 2024-01-10 18:28:38 +05:30
RaktimaNXG 97c17cfe84 fix: table view design opensign-drive 2024-01-10 18:19:11 +05:30
RaktimaNXG 4b4e200090 extend expire date from current date 2024-01-10 16:57:22 +05:30
RaktimaNXG 232d38440d add extend days value from timeToCompleteDays filed for expired document 2024-01-10 16:12:39 +05:30
RaktimaNXG 341bd9bef0 fix: draft document redirect issue 2024-01-10 15:27:35 +05:30
RaktimaNXG 2f4d04c722 fix: draft document redirect issue 2024-01-10 15:23:35 +05:30
RaktimaNXG 148ae40e1a extend expire date of expired draft document 2024-01-10 15:11:26 +05:30
prafull-opensignlabs 9cb0ced4f6 add migration script for update menu & add IsArchive field in document cls 2024-01-10 12:21:00 +05:30
RaktimaNXG 9a3b70de43 fix: expired document redirect wrong route in opensign-drive 2024-01-10 11:19:16 +05:30
RaktimaNXG 742b8f7eae fix: move folder on same folder issue 2024-01-10 10:57:22 +05:30
RaktimaNXG abc58941e3 fix: onclick to open folder issuein opensign-drive 2024-01-10 10:44:33 +05:30
RaktimaNXG aac200bfd3 fix: right click move functionality issue opensign-drive 2024-01-09 20:20:56 +05:30
RaktimaNXG 27d3297d61 fix: decline alert header message, add icon for right click menu on opensign-drive,on enter create folder 2024-01-09 20:02:40 +05:30
RaktimaNXG 72431b2c82 fix: redirect wrong route of draft docment issue in openSign-drive 2024-01-09 17:24:27 +05:30
RaktimaNXG 3ca48e5848 fix: folder list display issue in move folder modal,add alert for delete document, change modal css 2024-01-09 14:35:45 +05:30
prafull-opensignlabsandGitHub 14784ec80f added validation to get non archive document in getdrive cloud function 2024-01-09 11:36:22 +05:30
prafull-opensignlabsandGitHub 127741eb27 remove override box css 2024-01-09 11:08:03 +05:30
RaktimaNXG 2ed987fe10 feat: implement document delete and move funationality in openSign-drive 2024-01-08 22:12:23 +05:30
AndrewandGitHub 7aaa1876c8 Merge pull request #308 from OpenSignLabs/need-your-sign 2024-01-06 19:31:30 +05:30
RaktimaNXG 390ffb83a2 fix: user redirect wrong route after send placeholder to signers 2024-01-06 18:41:53 +05:30
prafull-opensignlabsandGitHub d63e51b8cb Merge pull request #307 from OpenSignLabs/need-your-sign
fix: placeholder display issue of all signers after save placeholder and login flow
2024-01-05 18:38:15 +05:30
RaktimaNXG 7bd8d64649 fix: instance signature flow issue after send placeholder 2024-01-05 17:37:57 +05:30
RaktimaNXG f9e6f49ede fix: placeholder display issue of all signers after save placeholder and login flow 2024-01-05 17:00:41 +05:30
AndrewandGitHub b701d2863f Merge pull request #295 from OpenSignLabs/text-input 2024-01-05 15:58:04 +05:30
RaktimaandGitHub cf47093227 Merge branch 'staging' into text-input 2024-01-05 12:07:14 +05:30
RaktimaNXG 81d0aea66c fix: text-input signatureissue 2024-01-04 16:14:23 +05:30
AndrewandGitHub 506ca35be8 Merge pull request #305 from OpenSignLabs/pdflib-sign 2024-01-03 20:46:41 +05:30
RaktimaNXG 1cd6718489 fix: single signature issue, change react tour message, add icon for create new tamplate 2024-01-03 19:47:22 +05:30
RaktimaNXG 153c5db4b5 fix: input signature image height issue and limit 30 character of input text signature 2024-01-03 16:17:32 +05:30
RaktimaNXG ac9367a715 fix: fontstyle after save text signature issue 2024-01-03 13:46:44 +05:30
RaktimaNXG 081dae0b90 fix: font style for first time on save text signature 2024-01-03 13:07:59 +05:30
RaktimaandGitHub e286390aec Merge branch 'staging' into text-input 2024-01-03 12:44:55 +05:30
RaktimaNXG cf88eb2124 fix: font-style issue after save text signature 2024-01-03 12:43:01 +05:30
prafull-opensignlabsandGitHub 3226e4fd85 Merge pull request #304 from OpenSignLabs/feat_template
add hyperlink in completed mail for any query
2024-01-03 11:55:39 +05:30
prafull-opensignlabs cab94eb63d add hyperlink in completed mail for any query 2024-01-03 11:52:11 +05:30
prafull-opensignlabsandGitHub bbd5d6805e Merge pull request #303 from OpenSignLabs/feat_template
bug fix in template flow as well as placeholder is not working in mobile view
2024-01-03 10:14:09 +05:30
prafull-opensignlabs 2904ba3085 bug fix in template flow as well as placeholder is not working in mobile view 2024-01-03 10:03:12 +05:30
RaktimaNXG ee609061ed fix: text input signature font-family for mobile view 2024-01-02 10:03:06 +05:30
prafull-opensignlabsandGitHub 6c98a4e899 Merge pull request #301 from OpenSignLabs/feat_template
add don't show button for tour and minor bug fix
2024-01-01 11:46:01 +05:30
prafull-opensignlabs eef9ee7f3c remove unncessary navigation 2024-01-01 11:00:04 +05:30
prafull-opensignlabs 2cb4575db1 add dont show button for reactour and minor bug fix in template flow 2024-01-01 10:49:37 +05:30
prafull-opensignlabsandGitHub e7bcad80cc Merge pull request #298 from OpenSignLabs/staging
sync fork
2023-12-31 16:05:11 +05:30
AndrewandGitHub 353839a1dc Merge pull request #297 from OpenSignLabs/fix 2023-12-31 16:02:18 +05:30
prafull-opensignlabsandGitHub e6d30744ba Update Pgsignup.js 2023-12-31 16:01:37 +05:30
prafull-opensignlabsandGitHub b67932f448 Merge pull request #296 from OpenSignLabs/staging
sync fork
2023-12-30 20:02:38 +05:30
prafull-opensignlabs c185c42b80 vertically center button in reports, add title for template route and placeholder route 2023-12-30 19:52:36 +05:30
prafull-opensignlabs 4648ace84e fix : minor bug fix in template 2023-12-29 23:00:37 +05:30
prafull-opensignlabs ccdf50dbe0 add validation for delete contact 2023-12-29 16:50:10 +05:30
RaktimaNXG 852a3dc8bb feat: Enable text input signature feature 2023-12-29 16:36:49 +05:30
prafull-opensignlabs d49b7bd201 change query of progress and recent sent for signtuare reports 2023-12-29 12:59:57 +05:30
prafull-opensignlabs 07f2ceed6e add session validation, updated migration script and minor ui changes 2023-12-29 12:31:36 +05:30
prafull-opensignlabsandGitHub 751c7b5787 Merge pull request #294 from OpenSignLabs/feat_template
fix: minor template issues, resize issue in mobile, change recipient list Ui in mobile
2023-12-28 19:38:11 +05:30
prafull-opensignlabs e82384dff8 fix: signyourself flow, add validtion in template flow, change UI recipientlist in mobile view 2023-12-28 19:36:06 +05:30
RaktimaNXG 92d3a85147 fix: placeholder resize issue in mobile view 2023-12-28 17:30:08 +05:30
prafull-opensignlabsandGitHub c5762a0baf Merge pull request #293 from OpenSignLabs/feat_template
fix: minor bug fix in template component
2023-12-28 14:41:12 +05:30
prafull-opensignlabs dc40b04a18 fix: minor bug fix in template compoent 2023-12-28 14:39:52 +05:30
prafull-opensignlabsandGitHub 1cca5a3085 Merge pull request #292 from OpenSignLabs/feat_template
fix: add recipient required validation and dropbox is not visible
2023-12-28 12:33:02 +05:30
prafull-opensignlabs 4fe4ca638c add receipent required validation 2023-12-28 12:29:05 +05:30
prafull-opensignlabs b8c7110c63 resolve issue of receipent in not selected by default and dropbox upload 2023-12-28 12:15:02 +05:30
prafull-opensignlabsandGitHub 711ab6a556 Merge pull request #290 from OpenSignLabs/feat_template
feat: Introducing Template Creation Functionality: Streamline Document Generation and Sharing
2023-12-27 17:44:07 +05:30
prafull-opensignlabs 7a12f54587 add contactbook form in contactbook report 2023-12-27 17:41:51 +05:30
prafull-opensignlabs 056f4b3e80 remove random words from file upload input to show correct pdf name 2023-12-27 16:31:19 +05:30
prafull-opensignlabs 730a7a4e15 add reactour for template 2023-12-27 16:26:56 +05:30
prafull-opensignlabs a4b4dc885c removed unnecessary assets 2023-12-27 14:17:19 +05:30
prafull-opensignlabs 8562a4bb46 change fetch function 2023-12-27 08:21:49 +05:30
prafull-opensignlabs d3b56432e0 resolve color issue on drag placeholder 2023-12-27 08:11:17 +05:30
prafull-opensignlabs 527c5be42c add attach user icon in mobile view 2023-12-26 23:03:27 +05:30
prafull-opensignlabs 6c1d0c712a resolve delete user not working properly with placholder 2023-12-26 20:04:16 +05:30
prafull-opensignlabs fd0ec5fd31 resolve resize issue for template placeholder 2023-12-26 18:52:53 +05:30
prafull-opensignlabs f5f19c9b52 Merge branch 'staging' of https://github.com/OpenSignLabs/OpenSign into feat_template 2023-12-26 16:50:21 +05:30
prafull-opensignlabsandGitHub 642ef4f5b7 Merge pull request #286 from OpenSignLabs/placeholder
feat: add copy placeholder feature and change in UI of placeholder
2023-12-26 15:33:22 +05:30
prafull-opensignlabs 66b65e600b add validtion for fetch template 2023-12-26 13:53:54 +05:30
prafull-opensignlabs 01a130ef8c add username in placeholder and validtion for fetch template 2023-12-26 13:52:52 +05:30
prafull-opensignlabs c3bccb5412 show role name in placeholder 2023-12-26 09:27:50 +05:30
prafull-opensignlabsandGitHub b32e6e71f8 Merge pull request #288 from OpenSignLabs/staging
sync fork
2023-12-25 19:05:40 +05:30
RaktimaNXG 3b5875e283 fix: size of the placeholder changed after the signature was uploaded in need-your-sign report 2023-12-22 12:44:38 +05:30
prafull-opensignlabs da42fe97ae add/Choose form to link user and ui changes 2023-12-21 21:40:42 +05:30
AmolandGitHub 56bb7d36eb chore: remove mailgun api key value 2023-12-21 16:32:59 +05:30
AmolandGitHub d86b7345d7 chore: set smtp dummy values 2023-12-21 16:25:15 +05:30
AmolandGitHub c1c17160ff chore: set SMTP_ENABLE to true 2023-12-21 16:21:05 +05:30
RaktimaNXG d400c843e4 fix: modified variable name as required and added comment 2023-12-21 15:14:29 +05:30
prafull-opensignlabs 4e67ab50fe resolve minor ui issues 2023-12-20 23:57:50 +05:30
prafull-opensignlabs 74c9e21d55 resolve minor ui issues 2023-12-20 23:57:02 +05:30
RaktimaNXG fefcdf6ffc feat: placeholder copy all pages feature at same location and change placeholder design 2023-12-20 19:31:59 +05:30
prafull-opensignlabs 5170e4eee2 migration script for template class 2023-12-20 17:32:51 +05:30
prafull-opensignlabs 8ebfd781c3 add template report and form , as well as migration code for it 2023-12-20 14:33:41 +05:30
prafull-opensignlabs 4e8988bf57 add template feature 2023-12-19 18:58:28 +05:30
prafull-opensignlabsandGitHub c26734751f Merge pull request #282 from OpenSignLabs/staging
sync fork
2023-12-18 10:57:46 +05:30
prafull-opensignlabs ca6b4e7d82 add createDocument from template functionality 2023-12-16 22:19:12 +05:30
prafull-opensignlabs cb4a94d036 add createDocument from template functionality 2023-12-16 22:19:01 +05:30
prafull-opensignlabsandGitHub 300ddb810f Update LoginFacebook.js 2023-12-16 17:03:35 +05:30
prafull-opensignlabsandGitHub 0b687310fd Update LoginGoogle.js 2023-12-16 17:03:04 +05:30
prafull-opensignlabs 3e741ac2f9 add functionality of add placholder in template 2023-12-15 19:01:05 +05:30
prafull-opensignlabsandGitHub f65b23ca26 Merge pull request #278 from OpenSignLabs/staging
Sync fork
2023-12-15 16:37:32 +05:30
prafull-opensignlabsandGitHub db9b8d2ba1 Merge pull request #261 from OpenSignLabs/staging
sync fork
2023-12-12 19:57:56 +05:30
prafull-opensignlabs 2b345ff840 add new template form 2023-12-12 17:57:11 +05:30
205 changed files with 10172 additions and 36781 deletions
+5 -5
View File
@@ -45,14 +45,14 @@ DO_REGION=us-west
USE_LOCAL=TRUE
# Email mailgun or set SMTP_ENABLE true to use SMTP config (The app will not initialize if any of these 3 variables are not set) *********************************************************************************************************************
MAILGUN_API_KEY=XXXXX
MAILGUN_API_KEY=
MAILGUN_DOMAIN=mail.yourdomain.com
MAILGUN_SENDER=postmaster@mail.yourdomain.com
SMTP_ENABLE=
SMTP_HOST=
SMTP_PORT=
SMTP_USER_EMAIL=
SMTP_PASS=
SMTP_HOST=smtp.yourhost.com
SMTP_PORT=443
SMTP_USER_EMAIL=mailer@yourdomain.com
SMTP_PASS=password
# Base64 encoded PFX or p12 document signing certificate file *********************************************************************************************************************
-50
View File
@@ -1,50 +0,0 @@
name: Deploy to GitHub Pages
on:
push:
branches:
- feat-docs
# Review gh actions docs if you want to further define triggers, paths, etc
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on
permissions:
contents: write
jobs:
deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
cache: npm
- name: Install dependencies
working-directory: ./docs
run: npm ci
- name: Clean api-docs
working-directory: ./docs
run: npm run docusaurus clean-api-docs all
- name: Build api-docs
working-directory: ./docs
run: npm run docusaurus gen-api-docs all
- name: Build website
working-directory: ./docs
run: npm run build
# Popular action to deploy to GitHub Pages:
# Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# Build output to publish to the `gh-pages` branch:
publish_dir: ./docs/build
# The following lines assign commit authorship to the official
# GH-Actions bot for deploys to `gh-pages` branch:
# https://github.com/actions/checkout/issues/13#issuecomment-724415212
# The GH actions bot is used by default if you didn't specify the two fields.
# You can swap them out with your own user credentials.
user_name: github-actions[bot]
user_email: 41898282+github-actions[bot]@users.noreply.github.com
+1 -6
View File
@@ -24,9 +24,4 @@ yarn-debug.log*
yarn-error.log*
apps/OpenSign/public/mfbuild/*
microfrontends/SignDocuments/build/*
apps/OpenSignServer/files/files/*
# ignore generated API documentation
/docs/docs/API-docs/*
!/docs/docs/API-docs/opensign.yaml
!/docs/docs/API-docs/intro.md
/docs/docs/API-docs-1.1/
apps/OpenSignServer/files/files/*
-1
View File
@@ -1 +0,0 @@
v1.0.5-beta
+19 -2
View File
@@ -15,6 +15,7 @@ import ForgetPassword from "./routes/ForgetPassword";
import ChangePassword from "./routes/ChangePassword";
import ReportMicroapp from "./components/ReportMicroapp";
import LoadMf from "./routes/LoadMf";
import ValidateRoute from "./primitives/ValidateRoute";
function App() {
const [isloading, setIsLoading] = useState(true);
@@ -58,8 +59,24 @@ function App() {
) : (
<BrowserRouter>
<Routes>
<Route exact path="/" element={<Login />} />
<Route exact path="/signup" element={<Signup />} />
<Route
exact
path="/"
element={
<ValidateRoute>
<Login />
</ValidateRoute>
}
/>
<Route
exact
path="/signup"
element={
<ValidateRoute>
<Signup />
</ValidateRoute>
}
/>
<Route exact path="/loadmf/:remoteApp/*" element={<LoadMf />} />
<Route exact path="/forgetpassword" element={<ForgetPassword />} />
{process.env.REACT_APP_ENABLE_SUBSCRIPTION && (
@@ -46,6 +46,7 @@ const AppendFormInForm = (props) => {
// Define a function to handle form submission
const handleSubmit = async (e) => {
e.preventDefault();
e.stopPropagation();
setIsLoader(true);
Parse.serverURL = parseBaseUrl;
Parse.initialize(parseAppId);
@@ -105,13 +106,18 @@ const AppendFormInForm = (props) => {
const res = await contactQuery.save();
const parseData = JSON.parse(JSON.stringify(res));
props.details({
value: parseData[props.valueKey],
label: parseData[props.displayKey]
});
if (props.details) {
props.details({
value: parseData[props.valueKey],
label: parseData[props.displayKey]
});
}
if (props.closePopup) {
props.closePopup();
}
if (props.handleUserData) {
props.handleUserData(parseData);
}
setIsLoader(false);
// Reset the form fields
@@ -158,13 +164,18 @@ const AppendFormInForm = (props) => {
const res = await contactQuery.save();
const parseData = JSON.parse(JSON.stringify(res));
props.details({
value: parseData[props.valueKey],
label: parseData[props.displayKey]
});
if (props.details) {
props.details({
value: parseData[props.valueKey],
label: parseData[props.displayKey]
});
}
if (props.closePopup) {
props.closePopup();
}
if (props.handleUserData) {
props.handleUserData(parseData);
}
setIsLoader(false);
// Reset the form fields
setAddYourself(false);
@@ -86,7 +86,7 @@ const LoginFacebook = ({
email: userDetails.Email,
// "passsword":userDetails.Phone,
phone: userDetails.Phone,
role: "contracts_Admin",
role: "contracts_User",
company: userDetails.Company
}
};
+1 -1
View File
@@ -148,7 +148,7 @@ const GoogleSignInBtn = ({
email: userDetails.Email,
// "passsword":userDetails.Phone,
phone: userDetails.Phone,
role: "contracts_Admin",
role: "contracts_User",
company: userDetails.Company,
jobTitle: userDetails.Destination
}
+2 -2
View File
@@ -5,7 +5,7 @@ import Parse from "parse";
import axios from "axios";
import "../styles/spinner.css";
import TreeFormComponent from "./TreeFormComponent";
import TreeEditForm from "./TreeEditForm";
// import TreeEditForm from "./TreeEditForm";
import "../styles/modal.css";
import Modal from "react-modal";
@@ -22,7 +22,7 @@ const TreeWidget = (props) => {
const [schemaState, setSchemaState] = useState({});
const [TabURL, setTabURL] = useState("");
const [editable, setEditable] = useState(false);
const [editId, setEditId] = useState("");
// const [editId, setEditId] = useState("");
const [defaultState, setDefaultState] = useState(false);
const [isShowModal, setIsShowModal] = useState(false);
const selectFolderHandle = async () => {
@@ -0,0 +1,147 @@
import React, { useEffect, useState } from "react";
import Parse from "parse";
import Alert from "../../primitives/Alert";
const CreateFolder = ({ parentFolderId, onSuccess, folderCls }) => {
const folderPtr = {
__type: "Pointer",
className: folderCls,
objectId: parentFolderId
};
const [name, setName] = useState("");
const [folderList, setFolderList] = useState([]);
const [isAlert, setIsAlert] = useState(false);
const [selectedParent, setSelectedParent] = useState();
const [alert, setAlert] = useState({ type: "info", message: "" });
useEffect(() => {
fetchFolder();
// eslint-disable-next-line
}, []);
const fetchFolder = async () => {
try {
const FolderQuery = new Parse.Query(folderCls);
if (parentFolderId) {
FolderQuery.equalTo("Folder", folderPtr);
FolderQuery.equalTo("Type", "Folder");
} else {
FolderQuery.doesNotExist("Folder");
FolderQuery.equalTo("Type", "Folder");
}
const res = await FolderQuery.find();
if (res) {
const result = JSON.parse(JSON.stringify(res));
if (result) {
setFolderList(result);
}
}
} catch (error) {
console.log("Err ", error);
}
};
const handleCreateFolder = async (event) => {
event.preventDefault();
if (name) {
const currentUser = Parse.User.current();
const exsitQuery = new Parse.Query(folderCls);
exsitQuery.equalTo("Name", name);
exsitQuery.equalTo("Type", "Folder");
if (parentFolderId) {
exsitQuery.equalTo("Folder", folderPtr);
}
const templExist = await exsitQuery.first();
if (templExist) {
setAlert({ type: "dange", message: "Folder already exist!" });
setIsAlert(true);
setTimeout(() => {
setIsAlert(false);
}, 1000);
} else {
const template = new Parse.Object(folderCls);
template.set("Name", name);
template.set("Type", "Folder");
if (selectedParent) {
template.set("Folder", {
__type: "Pointer",
className: folderCls,
objectId: selectedParent
});
} else if (parentFolderId) {
template.set("Folder", folderPtr);
}
template.set("CreatedBy", Parse.User.createWithoutData(currentUser.id));
const res = await template.save();
if (res) {
setAlert({
type: "success",
message: "Folder created successfully!"
});
setIsAlert(true);
setTimeout(() => {
setIsAlert(false);
}, 1000);
if (onSuccess) {
onSuccess(res);
}
}
}
} else {
setAlert({ type: "info", message: "Please fill folder name" });
setIsAlert(true);
setTimeout(() => {
setIsAlert(false);
}, 1000);
}
};
const handleOptions = (e) => {
setSelectedParent(e.target.value);
};
return (
<div>
{isAlert && <Alert type={alert.type}>{alert.message}</Alert>}
<div id="createFolder">
<h1 className="text-base font-semibold">Create Folder</h1>
<div className="text-xs mt-2">
<label className="block">
Name<span className="text-red-500 text-[13px]">*</span>
</label>
<input
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
value={name}
onChange={(e) => setName(e.target.value)}
required
/>
</div>
<div className="text-xs mt-2">
<label className="block">Parent Folder</label>
<select
value={selectedParent}
onChange={handleOptions}
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
>
<option>select</option>
{folderList.length > 0 &&
folderList.map((x) => (
<option key={x.objectId} value={x.objectId}>
{x.Name}
</option>
))}
</select>
</div>
<div>
<button
onClick={handleCreateFolder}
className="flex items-center rounded p-2 bg-[#32a3ac] text-white mt-3"
>
<i className="fa-solid fa-plus mr-1"></i>
<span>Create</span>
</button>
</div>
</div>
</div>
);
};
export default CreateFolder;
@@ -41,7 +41,8 @@ export default function DropboxChooser({ children, onSuccess, onCancel }) {
[onSuccess, onCancel]
);
const handleChoose = useCallback(() => {
const handleChoose = useCallback((e) => {
e.preventDefault()
if (window.Dropbox) {
window.Dropbox.choose(options);
}
@@ -258,7 +258,7 @@ const FileUpload = (props) => {
<div className="flex gap-2 justify-center items-center">
<div className="flex justify-between items-center px-2 py-[3px] w-full font-bold rounded border-[1px] border-[#ccc] text-gray-500 bg-white text-[13px]">
<div className="break-all">
file selected : {props.formData.split("/")[3]}
file selected : {props.formData?.split("/")[3]?.split("_")[1]}
</div>
<div
onClick={() => {
@@ -271,10 +271,12 @@ const FileUpload = (props) => {
<i className="fa-solid fa-xmark"></i>
</div>
</div>
<DropboxChooser
onSuccess={dropboxSuccess}
onCancel={dropboxCancel}
/>
{process.env.REACT_APP_DROPBOX_API_KEY && (
<DropboxChooser
onSuccess={dropboxSuccess}
onCancel={dropboxCancel}
/>
)}
</div>
) : (
<div className="flex gap-2 justify-center items-center">
@@ -294,10 +296,12 @@ const FileUpload = (props) => {
accept="application/pdf,application/vnd.ms-excel"
onChange={onChange}
/>
<DropboxChooser
onSuccess={dropboxSuccess}
onCancel={dropboxCancel}
/>
{process.env.REACT_APP_DROPBOX_API_KEY && (
<DropboxChooser
onSuccess={dropboxSuccess}
onCancel={dropboxCancel}
/>
)}
</div>
)}
</>
@@ -0,0 +1,261 @@
import React, { useEffect, useState } from "react";
import Parse from "parse";
import CreateFolder from "./CreateFolder";
import ModalUi from "../../primitives/ModalUi";
const SelectFolder = ({ required, onSuccess, folderCls }) => {
const [isOpen, SetIsOpen] = useState(false);
const [clickFolder, setClickFolder] = useState("");
const [selectFolder, setSelectedFolder] = useState({});
const [folderList, setFolderList] = useState([]);
const [tabList, setTabList] = useState([]);
const [isLoader, setIsLoader] = useState(false);
const [folderPath, setFolderPath] = useState("");
const [isAdd, setIsAdd] = useState(false);
useEffect(() => {
if (isOpen) {
setIsAdd(false);
setClickFolder({});
setFolderList([]);
setTabList([]);
fetchFolder();
}
// eslint-disable-next-line
}, [isOpen]);
const fetchFolder = async (folderPtr) => {
setIsLoader(true);
try {
const FolderQuery = new Parse.Query(folderCls);
if (folderPtr) {
FolderQuery.equalTo("Folder", folderPtr);
FolderQuery.equalTo("Type", "Folder");
} else {
FolderQuery.doesNotExist("Folder");
FolderQuery.equalTo("Type", "Folder");
}
const res = await FolderQuery.find();
if (res) {
const result = JSON.parse(JSON.stringify(res));
if (result) {
setFolderList(result);
setIsLoader(false);
}
setIsLoader(false);
}
} catch (error) {
setIsLoader(false);
}
};
const handleSelect = (item) => {
setFolderList([]);
setClickFolder({ ObjectId: item.objectId, Name: item.Name });
if (tabList.length > 0) {
const tab = tabList.some((x) => x.objectId === item.objectId);
if (!tab) {
setTabList((tabs) => [...tabs, item]);
const folderPtr = {
__type: "Pointer",
className: folderCls,
objectId: item.objectId
};
fetchFolder(folderPtr);
}
} else {
setTabList((tabs) => [...tabs, item]);
const folderPtr = {
__type: "Pointer",
className: folderCls,
objectId: item.objectId
};
fetchFolder(folderPtr);
}
};
const handleSubmit = () => {
let url = "Root";
tabList.forEach((t) => {
url = url + " / " + t.Name;
});
setFolderPath(url);
setSelectedFolder(clickFolder);
if (onSuccess) {
onSuccess(clickFolder);
}
SetIsOpen(false);
};
const handleCancel = () => {
SetIsOpen(false);
setClickFolder({});
setFolderList([]);
setTabList([]);
};
const removeTabListItem = async (e, i) => {
e.preventDefault();
// setEditable(false);
if (!isAdd) {
setIsLoader(true);
let folderPtr;
if (i) {
setFolderList([]);
let list = tabList.filter((itm, j) => {
if (j <= i) {
return itm;
}
});
let _len = list.length - 1;
folderPtr = {
__type: "Pointer",
className: folderCls,
objectId: list[_len].objectId
};
setTabList(list);
} else {
setClickFolder({});
setSelectedFolder({});
setFolderList([]);
setTabList([]);
}
fetchFolder(folderPtr);
}
};
const handleCreate = () => {
setIsAdd(!isAdd);
};
const handleAddFolder = () => {
setFolderList([]);
if (clickFolder && clickFolder.ObjectId) {
fetchFolder({
__type: "Pointer",
className: folderCls,
objectId: clickFolder.ObjectId
});
} else {
fetchFolder();
}
handleCreate();
};
return (
<div className="text-xs mt-2 ">
<div>
<label className="block">
Select Folder
{required && <span className="text-red-500 text-[13px]">*</span>}
</label>
</div>
<div className="rounded px-[20px] py-[20px] bg-white border border-gray-200 shadow flex max-w-sm gap-8 items-center">
<div>
<i
className="far fa-folder-open text-[40px] text-[#33bbff]"
style={{ fontSize: "40px" }}
aria-hidden="true"
></i>
</div>
<div className="font-semibold ">
<div className="flex items-center gap-2">
<p>
{selectFolder && selectFolder.Name ? selectFolder.Name : "Root"}
</p>
<div className="text-black text-sm" onClick={() => SetIsOpen(true)}>
<i
className="fa fa-pencil"
title="Select Folder"
aria-hidden="true"
></i>
</div>
</div>
<p className="text-[10px] text-gray-400">
{selectFolder && selectFolder.Name ? `(${folderPath})` : ""}
</p>
</div>
</div>
<ModalUi
title={"Select Folder"}
isOpen={isOpen}
handleClose={handleCancel}
>
<div className="w-full min-w-[300px] md:min-w-[500px] px-3">
<div className="py-2 text-[#ac4848] text-[14px] font-[500]">
<span
className="cursor-pointer"
title="Root"
onClick={(e) => removeTabListItem(e)}
>
Root /{" "}
</span>
{tabList &&
tabList.map((tab, i) => (
<React.Fragment key={`${tab.objectId}-${i}`}>
<span
className="cursor-pointer"
title={tab.Name}
onClick={(e) => removeTabListItem(e, i)}
>
{tab.Name}
</span>
{" / "}
</React.Fragment>
))}
<hr />
</div>
<div className="mt-2 mb-3">
{!isAdd &&
folderList.length > 0 &&
folderList.map((folder) => (
<div
key={folder.Name}
className="border-[1px] border-[#8a8a8a] px-2 py-2 mb-2 cursor-pointer"
onClick={() => handleSelect(folder)}
>
<div className="flex items-center gap-2">
<i
className="fa fa-folder text-[#33bbff] text-[1.4rem]"
aria-hidden="true"
></i>
<span className="font-semibold">{folder.Name}</span>
</div>
</div>
))}
{isAdd && (
<CreateFolder
parentFolderId={clickFolder && clickFolder.ObjectId}
folderCls={folderCls}
onSuccess={handleAddFolder}
/>
)}
{isLoader && (
<div className="flex justify-center">
<i className="fa-solid fa-spinner fa-spin-pulse text-[30px]"></i>
</div>
)}
</div>
</div>
<hr />
<div className="flex justify-between items-center py-[.75rem] px-[1.25rem]">
<div
className="text-[30px] cursor-pointer text-[#32a3ac]"
title="Save Here"
onClick={handleCreate}
>
{isAdd ? (
<i className="fa-solid fa-arrow-left" aria-hidden="true"></i>
) : (
<i className="fa-solid fa-square-plus" aria-hidden="true"></i>
)}
</div>
<div
className="text-[30px] cursor-pointer"
title="Save Here"
onClick={handleSubmit}
>
<i className="fas fa-save" aria-hidden="true"></i>
</div>
</div>
</ModalUi>
</div>
);
};
export default SelectFolder;
@@ -0,0 +1,190 @@
import React, { useState, useEffect } from "react";
import Select from "react-select";
import AppendFormInForm from "../AppendFormInForm";
import Modal from "react-modal";
import Parse from "parse";
function arrayMove(array, from, to) {
array = array.slice();
array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]);
return array;
}
/**
* react-sortable-hoc is depcreated not usable from react 18.x.x
* need to replace it with @dnd-kit
* code changes required
*/
const SignersInput = (props) => {
Modal.setAppElement("body");
const [state, setState] = useState(undefined);
// const [editFormData, setEditFormData] = useState([]);
const [selected, setSelected] = React.useState([]);
const [isModal, setIsModel] = useState(false);
const onChange = (selectedOptions) => setSelected(selectedOptions);
const [modalIsOpen, setModalIsOpen] = useState(false);
const onSortEnd = ({ oldIndex, newIndex }) => {
const newValue = arrayMove(selected, oldIndex, newIndex);
setSelected(newValue);
};
const GetSelectListData = async () => {
try {
const currentUser = Parse.User.current();
const contactbook = new Parse.Query("contracts_Contactbook");
contactbook.equalTo(
"CreatedBy",
Parse.User.createWithoutData(currentUser.id)
);
contactbook.notEqualTo("IsDeleted", true);
const contactRes = await contactbook.find();
if (contactRes) {
const res = JSON.parse(JSON.stringify(contactRes));
let list = [];
// let _selected = [];
res.forEach((x) => {
let obj = {
label: x.Name,
value: x.objectId,
isChecked: true
};
list.push(obj);
});
setState(list);
}
} catch (error) {
console.log("err", error);
}
};
useEffect(() => {
GetSelectListData();
}, []);
useEffect(() => {
if (selected && selected.length) {
let newData = [];
selected.forEach((x) => {
newData.push(x.value);
});
if (props.onChange) {
props.onChange(newData);
}
}
// eslint-disable-next-line
}, [selected]);
const handleModalCloseClick = () => {
setIsModel(false);
setModalIsOpen(false);
};
const openModal = () => {
setModalIsOpen(true);
};
// `handleNewDetails` is used to set just save from quick form to selected option in dropdown
const handleNewDetails = (data) => {
setState([...state, data]);
if (selected.length > 0) {
setSelected([...selected, data]);
} else {
setSelected([data]);
}
};
return (
<div className="text-xs mt-2 ">
<label className="block">
Signers
{props.required && <span className="text-red-500 text-[13px]">*</span>}
</label>
<div style={{ display: "flex", gap: 5 }}>
<div style={{ flexWrap: "wrap", width: "100%" }}>
<Select
onSortEnd={onSortEnd}
distance={4}
isMulti
options={state || []}
value={selected}
onChange={onChange}
closeMenuOnSelect={false}
/>
</div>
<div
onClick={() => {
setIsModel(true);
openModal();
}}
style={{
cursor: "pointer",
borderRadius: 4,
border: "1px solid #ccc",
minHeight: 38,
minWidth: 48,
display: "flex",
justifyContent: "center",
alignItems: "center"
}}
>
<i className="fas fa-plus"></i>
</div>
<Modal
isOpen={modalIsOpen}
onRequestClose={handleModalCloseClick}
shouldCloseOnOverlayClick={false}
id="modal1"
contentLabel="Modal"
style={{
content: {
top: "50%",
left: "50%",
right: "auto",
bottom: "auto",
transform: "translate(-50%, -50%)",
padding: 0
},
overlay: {
width: "100%",
backgroundColor: "rgba(0, 0, 0, 0.75)",
zIndex: 50
}
}}
>
<div className="min-w-full md:min-w-[500px]">
<div
type="button"
className="flex justify-between items-center p-3 border-b-[1px] border-gray-300"
>
<div className=" text-black text-xl font-semibold pl-3">
Add Signer
</div>
<button onClick={handleModalCloseClick}>
<i
style={{ fontSize: 25 }}
className="fa fa-times-circle"
aria-hidden="true"
></i>
</button>
</div>
{isModal && (
<AppendFormInForm
valueKey={"objectId"}
displayKey={"Name"}
details={handleNewDetails}
closePopup={handleModalCloseClick}
/>
)}
</div>
</Modal>
</div>
</div>
);
};
export default SignersInput;
+2
View File
@@ -0,0 +1,2 @@
export const contactCls = "contracts_Contactbook";
export const templateCls = "contracts_Template";
+12 -1
View File
@@ -4,4 +4,15 @@
body{
background-color: white;
}
}
/* Custom CSS to hide scrollbar */
.hide-scrollbar::-webkit-scrollbar {
display: none;
}
.hide-scrollbar {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
+1 -1
View File
@@ -113,7 +113,7 @@ export const formJson = (id) => {
});
formData = {
jsonSchema: {
title: "New Document",
title: "Request signatures",
description: "",
type: "object",
required: ["URL", "Name", "Note", "TimeToCompleteDays", "Signers"],
+32 -5
View File
@@ -1,7 +1,9 @@
export default function reportJson(id) {
// console.log("json ", json);
const head = ["Sr.No", "Name", "Note", "Folder", "File", "Owner", "Signers"];
const contactbook = ["Sr.No", "Name", "Email", "Phone"];
const head = ["Sr.No", "Title", "Note", "Folder", "File", "Owner", "Signers"];
const contactbook = ["Sr.No", "Title", "Email", "Phone"];
const dashboardReportHead = ["Title", "File", "Owner", "Signers"];
switch (id) {
// draft documents report
case "ByHuevtCFY":
@@ -103,7 +105,7 @@ export default function reportJson(id) {
case "d9k3UfYHBc":
return {
reportName: "Recently sent for signatures",
heading: head,
heading: dashboardReportHead,
actions: [
{
btnLabel: "View",
@@ -119,7 +121,7 @@ export default function reportJson(id) {
case "5Go51Q7T8r":
return {
reportName: "Recent signature requests",
heading: head,
heading: dashboardReportHead,
actions: [
{
btnLabel: "Sign",
@@ -135,7 +137,7 @@ export default function reportJson(id) {
case "kC5mfynCi4":
return {
reportName: "Drafts",
heading: head,
heading: ["Title", "Note", "Folder", "File", "Owner", "Signers"],
actions: [
{
btnLabel: "sign",
@@ -159,6 +161,31 @@ export default function reportJson(id) {
textColor: "white",
btnIcon: "fa-solid fa-trash"
}
],
form: "ContactBook"
};
// template report
case "6TeaPr321t":
return {
reportName: "Templates",
heading: head,
actions: [
{
btnLabel: "Use",
btnColor: "#4bd396",
textColor: "white",
btnIcon: "fa fa-plus",
redirectUrl:
"remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/placeHolderSign"
},
{
btnLabel: "Edit",
btnColor: "#00c9d5",
textColor: "white",
btnIcon: "fa fa-plus",
redirectUrl:
"remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/template"
}
]
};
default:
+73 -23
View File
@@ -7,10 +7,35 @@ import Tour from "reactour";
import axios from "axios";
import { useSelector } from "react-redux";
import Parse from "parse";
import ModalUi from "../primitives/ModalUi";
import { useNavigate } from "react-router-dom";
const HomeLayout = ({ children }) => {
const navigate = useNavigate();
const { width } = useWindowSize();
const [isOpen, setIsOpen] = useState(true);
const arr = useSelector((state) => state.TourSteps);
const [isUserValid, setIsUserValid] = useState(true);
useEffect(() => {
(async () => {
try {
// Use the session token to validate the user
const userQuery = new Parse.Query(Parse.User);
const user = await userQuery.get(Parse.User.current().id, {
sessionToken: localStorage.getItem("accesstoken")
});
if (user) {
setIsUserValid(true);
} else {
setIsUserValid(false);
}
} catch (error) {
// Session token is invalid or there was an error
setIsUserValid(false);
}
})();
}, []);
// reactour state
const [isCloseBtn, setIsCloseBtn] = useState(true);
@@ -19,7 +44,7 @@ const HomeLayout = ({ children }) => {
const [tourConfigs, setTourConfigs] = useState([]);
const showSidebar = () => {
setIsOpen(value => !value);
setIsOpen((value) => !value);
};
useEffect(() => {
if (width && width <= 768) {
@@ -28,9 +53,7 @@ const HomeLayout = ({ children }) => {
}, [width]);
useEffect(() => {
if (localStorage.getItem("domain") === "sign" && arr && arr.length > 0) {
handleDynamicSteps();
} else if (
if (
localStorage.getItem("domain") === "contracts" &&
arr &&
arr.length > 0
@@ -153,32 +176,59 @@ const HomeLayout = ({ children }) => {
setIsOpen(false);
}
};
const handleLoginBtn = () => {
try {
Parse.User.logOut();
} catch (err) {
console.log("err ", err);
} finally {
localStorage.removeItem("accesstoken");
navigate("/", { replace: true });
}
};
return (
<div>
<div className="sticky top-0 z-50">
<Header showSidebar={showSidebar} />
</div>
<div className="flex md:flex-row flex-col z-50">
<Sidebar isOpen={isOpen} closeSidebar={closeSidebar} />
{isUserValid ? (
<>
<div className="flex md:flex-row flex-col z-50">
<Sidebar isOpen={isOpen} closeSidebar={closeSidebar} />
<div className="relative h-screen flex flex-col justify-between w-full overflow-y-auto">
<div className="bg-[#eef1f5] p-3">{children}</div>
<div className="z-30">
<Footer />
<div className="relative h-screen flex flex-col justify-between w-full overflow-y-auto">
<div className="bg-[#eef1f5] p-3">{children}</div>
<div className="z-30">
<Footer />
</div>
</div>
</div>
</div>
</div>
<Tour
onRequestClose={closeTour}
steps={tourConfigs}
isOpen={isTour}
closeWithMask={false}
disableKeyboardNavigation={["esc"]}
// disableInteraction={true}
scrollOffset={-100}
rounded={5}
showCloseButton={isCloseBtn}
/>
<Tour
onRequestClose={closeTour}
steps={tourConfigs}
isOpen={isTour}
closeWithMask={false}
disableKeyboardNavigation={["esc"]}
// disableInteraction={true}
scrollOffset={-100}
rounded={5}
showCloseButton={isCloseBtn}
/>
</>
) : (
<ModalUi title={"Session Expired"} isOpen={true} showClose={false}>
<div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5">
<p className="text-xl font-normal">Your session has expired.</p>
<button
onClick={handleLoginBtn}
className="text-base px-3 py-1.5 rounded shadow-md text-white bg-[#1ab6ce]"
>
Login
</button>
</div>
</ModalUi>
)}
</div>
);
};
+30
View File
@@ -0,0 +1,30 @@
import React from "react";
const Alert = ({ children, type }) => {
const textcolor = type ? theme(type) : theme();
function theme(color) {
switch (color) {
case "success":
return "border-[#c3e6cb] bg-[#d4edda] text-[#155724]";
case "info":
return "border-[#adcdeb] bg-[#c1daf0] text-[#153756]";
case "danger":
return "border-[#f0a8a8] bg-[#f4bebe] text-[#c42121]";
default:
return "border-[#d6d6d6] bg-[#d9d9d9] text-[#575757]";
}
}
return (
<>
{children && (
<div
className={`z-40 fixed top-20 left-1/2 transform -translate-x-1/2 border-[1px] text-sm ${textcolor} rounded py-[.75rem] px-[1.25rem] `}
>
{children}
</div>
)}
</>
);
};
export default Alert;
+258 -44
View File
@@ -3,6 +3,8 @@ import pad from "../assets/images/pad.svg";
import { useNavigate } from "react-router-dom";
import axios from "axios";
import "../styles/report.css";
import ModalUi from "./ModalUi";
import AppendFormInForm from "../components/AppendFormInForm";
const ReportTable = ({
ReportName,
List,
@@ -11,13 +13,19 @@ const ReportTable = ({
heading,
setIsNextRecord,
isMoreDocs,
docPerPage
docPerPage,
form
}) => {
const navigate = useNavigate();
const [currentPage, setCurrentPage] = useState(1);
const [actLoader, setActLoader] = useState({});
const [isAlert, setIsAlert] = useState(false);
const [isErr, setIsErr] = useState(false);
const [isDocErr, setIsDocErr] = useState(false);
const [isContactform, setIsContactform] = useState(false);
const [isDeleteModal, setIsDeleteModal] = useState({});
const startIndex = (currentPage - 1) * docPerPage;
// For loop is used to calculate page numbers visible below table
// Initialize pageNumbers using useMemo to avoid unnecessary re-creation
const pageNumbers = useMemo(() => {
@@ -55,39 +63,128 @@ const ReportTable = ({
}, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]);
// `handlemicroapp` is used to open microapp
const handlemicroapp = (item, url) => {
localStorage.removeItem("rowlevel");
navigate("/rpmf/" + url);
localStorage.setItem("rowlevel", JSON.stringify(item));
const handlemicroapp = async (item, url, btnLabel) => {
if (ReportName === "Templates") {
if (btnLabel === "Edit") {
navigate(`/asmf/${url}/${item.objectId}`);
} else {
setActLoader({ [`${item.objectId}_${btnLabel}`]: true });
try {
const params = {
templateId: item.objectId
};
const templateDeatils = await axios.post(
`${localStorage.getItem("baseUrl")}functions/getTemplate`,
params,
{
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
sessionToken: localStorage.getItem("accesstoken")
}
}
);
// console.log("templateDeatils.data ", templateDeatils.data);
const templateData =
templateDeatils.data && templateDeatils.data.result;
if (!templateData.error) {
const Doc = templateData;
let signers = [];
if (Doc.Signers?.length > 0) {
Doc.Signers?.forEach((x) => {
if (x.objectId) {
const obj = {
__type: "Pointer",
className: "contracts_Contactbook",
objectId: x.objectId
};
signers.push(obj);
}
});
}
let placeholdersArr = [];
if (Doc.Placeholders?.length > 0) {
placeholdersArr = Doc.Placeholders;
const data = {
Name: Doc.Name,
URL: Doc.URL,
SignedUrl: Doc.SignedUrl,
Description: Doc.Description,
Note: Doc.Note,
Placeholders: placeholdersArr,
ExtUserPtr: {
__type: "Pointer",
className: "contracts_Users",
objectId: Doc.ExtUserPtr.objectId
},
CreatedBy: {
__type: "Pointer",
className: "_User",
objectId: Doc.CreatedBy.objectId
},
Signers: signers
};
try {
const res = await axios.post(
`${localStorage.getItem(
"baseUrl"
)}classes/${localStorage.getItem("_appName")}_Document`,
data,
{
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id":
localStorage.getItem("parseAppId"),
"X-Parse-Session-Token":
localStorage.getItem("accesstoken")
}
}
);
// console.log("Res ", res.data);
if (res.data && res.data.objectId) {
setActLoader({});
setIsAlert(true);
navigate(`/asmf/${url}/${res.data.objectId}`, {
state: { title: "Use Template" }
});
}
} catch (err) {
console.log("Err", err);
setIsAlert(true);
setIsErr(true);
setActLoader({});
}
} else {
setIsDocErr(true);
setActLoader({});
}
} else {
setIsAlert(true);
setIsErr(true);
setActLoader({});
}
} catch (err) {
console.log("err", err);
setIsAlert(true);
setIsErr(true);
setActLoader({});
}
}
} else {
localStorage.removeItem("rowlevel");
navigate("/rpmf/" + url);
localStorage.setItem("rowlevel", JSON.stringify(item));
}
// localStorage.setItem("rowlevelMicro");
};
const handlebtn = async (item) => {
if (ReportName === "Contactbook") {
setActLoader({ [item.objectId]: true });
try {
const url =
process.env.REACT_APP_SERVERURL + "/classes/contracts_Contactbook/";
const body = { IsDeleted: true };
const res = await axios.put(url + item.objectId, body, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("AppID12"),
"X-Parse-Session-Token": localStorage.getItem("accesstoken")
}
});
// console.log("Res ", res.data);
if (res.data && res.data.updatedAt) {
setActLoader({});
setIsAlert(true);
const upldatedList = List.filter((x) => x.objectId !== item.objectId);
setList(upldatedList);
}
} catch (err) {
console.log("err", err);
setIsAlert(true);
setIsErr(true);
setActLoader({});
}
setIsDeleteModal({ [item.objectId]: true });
}
};
@@ -101,6 +198,44 @@ const ReportTable = ({
const paginateFront = () => setCurrentPage(currentPage + 1);
const paginateBack = () => setCurrentPage(currentPage - 1);
const handleContactFormModal = () => {
setIsContactform(!isContactform);
};
const handleUserData = (data) => {
setList((prevData) => [data, ...prevData]);
};
const handleDelete = async (item) => {
setIsDeleteModal({});
setActLoader({ [item.objectId]: true });
try {
const url =
process.env.REACT_APP_SERVERURL + "/classes/contracts_Contactbook/";
const body = { IsDeleted: true };
const res = await axios.put(url + item.objectId, body, {
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("AppID12"),
"X-Parse-Session-Token": localStorage.getItem("accesstoken")
}
});
// console.log("Res ", res.data);
if (res.data && res.data.updatedAt) {
setActLoader({});
setIsAlert(true);
const upldatedList = List.filter((x) => x.objectId !== item.objectId);
setList(upldatedList);
}
} catch (err) {
console.log("err", err);
setIsAlert(true);
setIsErr(true);
setActLoader({});
}
};
const handleCloseDeleteModal = () => setIsDeleteModal({});
return (
<div className="p-2 overflow-x-scroll w-full bg-white rounded-md">
{isAlert && (
@@ -115,7 +250,23 @@ const ReportTable = ({
</div>
)}
<h2 className="text-[23px] font-light my-2">{ReportName}</h2>
<div className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]">
<div className="font-light">{ReportName}</div>
{ReportName === "Templates" && (
<i
onClick={() => navigate("/form/template")}
className="fa-solid fa-square-plus text-sky-400 text-[25px]"
></i>
)}
{form && (
<div
className="cursor-pointer"
onClick={() => handleContactFormModal()}
>
<i className="fa-solid fa-square-plus text-sky-400 text-[25px]"></i>
</div>
)}
</div>
<table className="table-auto w-full border-collapse">
<thead className="text-[14px]">
<tr className="border-y-[1px]">
@@ -135,11 +286,13 @@ const ReportTable = ({
{currentLists.map((item, index) =>
ReportName === "Contactbook" ? (
<tr className="border-y-[1px]" key={index}>
<td className="px-4 py-2">{index + 1}</td>
{heading.includes("Sr.No") && (
<td className="px-4 py-2">{startIndex + index + 1}</td>
)}
<td className="px-4 py-2 font-semibold">{item?.Name} </td>
<td className="px-4 py-2">{item?.Email || "-"}</td>
<td className="px-4 py-2">{item?.Phone || "-"}</td>
<td className="px-4 py-2 flex flex-col justify-center items-center gap-2 text-white">
<td className="px-3 py-2 text-white">
{actions?.length > 0 &&
actions.map((act, index) => (
<button
@@ -149,7 +302,7 @@ const ReportTable = ({
? handlemicroapp(item, act.redirectUrl)
: handlebtn(item)
}
className={`flex justify-center items-center gap-1 px-2 py-1 rounded shadow`}
className={`mb-1 flex justify-center items-center gap-1 px-2 py-1 rounded shadow`}
style={{
backgroundColor: act.btnColor
? act.btnColor
@@ -175,16 +328,52 @@ const ReportTable = ({
)}
</button>
))}
{isDeleteModal[item.objectId] && (
<ModalUi
isOpen
title={"Delete Contact"}
handleClose={handleCloseDeleteModal}
>
<div className="m-[20px]">
<div className="text-lg font-normal text-black">
Are you sure you want to delete this contact?
</div>
<hr className="bg-[#ccc] mt-4 " />
<div className="flex items-center mt-3 gap-2 text-white">
<button
onClick={() => handleDelete(item)}
className="bg-[#1ab6ce] rounded-sm shadow-md text-[12px] font-semibold uppercase text-white py-1.5 px-3 focus:outline-none"
>
Yes
</button>
<button
onClick={handleCloseDeleteModal}
className="bg-[#188ae2] rounded-sm shadow-md text-[12px] font-semibold uppercase text-white py-1.5 px-3 text-center ml-[2px] focus:outline-none"
>
No
</button>
</div>
</div>
</ModalUi>
)}
</td>
</tr>
) : (
<tr className="border-y-[1px]" key={index}>
<td className="px-4 py-2">{index + 1}</td>
<td className="px-4 py-2 font-semibold">{item?.Name} </td>
<td className="px-4 py-2">{item?.Note || "-"}</td>
<td className="px-4 py-2">
{item?.Folder?.Name || "OpenSignDrive"}
{heading.includes("Sr.No") && (
<td className="px-4 py-2">{startIndex + index + 1}</td>
)}
<td className="px-4 py-2 font-semibold w-56">
{item?.Name}{" "}
</td>
{heading.includes("Note") && (
<td className="px-4 py-2">{item?.Note || "-"}</td>
)}
{heading.includes("Folder") && (
<td className="px-4 py-2">
{item?.Folder?.Name || "OpenSignDrive"}
</td>
)}
<td className="px-4 py-2">
<a
target="_blank"
@@ -202,17 +391,21 @@ const ReportTable = ({
<td className="px-4 py-2">
{item?.Signers ? formatRow(item?.Signers) : "-"}
</td>
<td className="px-4 py-2 flex flex-col justify-center items-center gap-2 text-white">
<td className="px-3 py-2 text-white">
{actions?.length > 0 &&
actions.map((act, index) => (
<button
key={index}
onClick={() =>
act?.redirectUrl
? handlemicroapp(item, act.redirectUrl)
? handlemicroapp(
item,
act.redirectUrl,
act.btnLabel
)
: handlebtn(item)
}
className={`flex justify-center items-center w-full gap-1 px-2 py-1 rounded shadow`}
className={`mb-1 flex justify-center items-center gap-1 px-2 py-1 rounded shadow`}
style={{
backgroundColor: act.btnColor
? act.btnColor
@@ -224,7 +417,9 @@ const ReportTable = ({
{act?.btnIcon && (
<i
className={
actLoader[item.objectId]
actLoader[
`${item.objectId}_${act.btnLabel}`
]
? "fa-solid fa-spinner fa-spin-pulse"
: act.btnIcon
}
@@ -235,7 +430,6 @@ const ReportTable = ({
{act?.btnLabel ? act.btnLabel : "view"}
</span>
</button>
// )
))}
</td>
</tr>
@@ -293,6 +487,26 @@ const ReportTable = ({
<div className="text-sm font-semibold">No Data Available</div>
</div>
)}
<ModalUi
title={"Add Contact"}
isOpen={isContactform}
handleClose={handleContactFormModal}
>
<AppendFormInForm
handleUserData={handleUserData}
closePopup={handleContactFormModal}
/>
</ModalUi>
<ModalUi
headColor={"#dc3545"}
isOpen={isDocErr}
title={"Receipent required"}
handleClose={() => setIsDocErr(false)}
>
<div style={{ height: "100%", padding: 20 }}>
<p>Please add receipent in template!</p>
</div>
</ModalUi>
</div>
);
};
+28
View File
@@ -0,0 +1,28 @@
import React, { useState } from "react";
const Modal = ({ children, Title }) => {
const [isOpen, SetIsOpen] = useState(false);
return (
<>
{children && (
<div
className={`fixed top-20 left-1/2 transform -translate-x-1/2 border-[1px] text-sm bg-white rounded `}
>
<div className="flex justify-between items-center py-[.75rem] px-[1.25rem] ">
<div className="font-semibold text-xl text-black">{Title}</div>
<div
onClick={() => SetIsOpen()}
className="px-2 py-1 bg-gray-400 rounded cursor-pointer"
>
<i className="fa-solid fa-xmark"></i>
</div>
</div>
<hr />
{isOpen && <div>{children}</div>}
</div>
)}
</>
);
};
export default Modal;
+40
View File
@@ -0,0 +1,40 @@
import React from "react";
const ModalUi = ({
children,
title,
isOpen,
headColor,
handleClose,
showHeader = true,
showClose = true
}) => {
return (
<>
{isOpen && (
<div className="fixed z-[999] top-0 left-0 w-[100%] h-[100%] bg-black bg-opacity-[75%]">
<div className="fixed z-[1000] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-sm bg-white rounded shadow-md max-h-90 min-w-[90%] md:min-w-[500px] overflow-y-auto hide-scrollbar">
{showHeader && (
<div
className="flex justify-between rounded-t items-center py-[15px] px-[20px] text-white"
style={{ background: headColor ? headColor : "#32a3ac" }}
>
<div className="text-[1.2rem] font-normal">{title}</div>
{showClose && (
<div
className="text-[1.5rem] cursor-pointer"
onClick={() => handleClose && handleClose()}
>
&times;
</div>
)}
</div>
)}
<div>{children}</div>
</div>
</div>
)}
</>
);
};
export default ModalUi;
@@ -0,0 +1,336 @@
import React, { useState } from "react";
import sanitizeFileName from "./sanitizeFileName";
import Parse from "parse";
import DropboxChooser from "../components/fields/DropboxChoose";
import Alert from "./Alert";
import SelectFolder from "../components/fields/SelectFolder";
// import SignersInput from "../components/fields/SignersInput";
import Title from "../components/Title";
import { useNavigate } from "react-router-dom";
import { templateCls } from "../constant/const";
const TemplateForm = () => {
const navigate = useNavigate();
const [signers, setSigners] = useState([]);
const [folder, setFolder] = useState({ ObjectId: "", Name: "" });
const [formData, setFormData] = useState({
Name: "",
Description: "",
Note: "Please review and sign this document"
});
const [fileupload, setFileUpload] = useState([]);
const [fileload, setfileload] = useState(false);
const [percentage, setpercentage] = useState(0);
const [isAlert, setIsAlert] = useState(false);
const [isSubmit, setIsSubmit] = useState(false);
const [isErr, setIsErr] = useState("");
const handleStrInput = (e) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};
const handleFileInput = (e) => {
setpercentage(0);
try {
let files = e.target.files;
if (typeof files[0] !== "undefined") {
const mb = Math.round(files[0].bytes / Math.pow(1024, 2));
if (mb > 10) {
alert(
`The selected file size is too large. Please select a file less than ${Math.round(
10
)} MB`
);
return;
}
handleFileUpload(files[0]);
} else {
alert("Please select file.");
return false;
}
} catch (error) {
alert(error.message);
return false;
}
};
const handleFileUpload = async (file) => {
Parse.serverURL = process.env.REACT_APP_SERVERURL;
Parse.initialize(process.env.REACT_APP_APPID);
setfileload(true);
const fileName = file.name;
const name = sanitizeFileName(fileName);
const pdfFile = file;
const parseFile = new Parse.File(name, pdfFile);
try {
const response = await parseFile.save({
progress: (progressValue, loaded, total, { type }) => {
if (type === "upload" && progressValue !== null) {
const percentCompleted = Math.round((loaded * 100) / total);
setpercentage(percentCompleted);
}
}
});
// The response object will contain information about the uploaded file
// You can access the URL of the uploaded file using response.url()
setFileUpload(response.url());
setfileload(false);
if (response.url()) {
return response.url();
}
} catch (error) {
setfileload(false);
setpercentage(0);
console.error("Error uploading file:", error);
}
};
const dropboxSuccess = async (files) => {
setfileload(true);
const file = files[0];
const url = file.link;
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);
setpercentage(percentCompleted);
}
}
});
setFileUpload(response.url());
setfileload(false);
if (response.url()) {
return response.url();
}
} catch (error) {
setfileload(false);
setpercentage(0);
console.error("Error uploading file:", error);
}
}
};
const dropboxCancel = async () => {};
const handleSubmit = async (e) => {
e.preventDefault();
setIsSubmit(true);
try {
const currentUser = Parse.User.current();
const template = new Parse.Object(templateCls);
Object.entries(formData).forEach((item) =>
template.set(item[0], item[1])
);
template.set("URL", fileupload);
template.set("CreatedBy", Parse.User.createWithoutData(currentUser.id));
if (folder && folder.ObjectId) {
template.set("Folder", {
__type: "Pointer",
className: templateCls,
objectId: folder.ObjectId
});
}
if (signers && signers.length > 0) {
template.set("Signers", signers);
}
const ExtCls = JSON.parse(localStorage.getItem("Extand_Class"));
template.set("ExtUserPtr", {
__type: "Pointer",
className: "contracts_Users",
objectId: ExtCls[0].objectId
});
const res = await template.save();
if (res) {
setSigners([]);
setFolder({ ObjectId: "", Name: "" });
setFormData({
Name: "",
Description: "",
Note: ""
});
setFileUpload([]);
setpercentage(0);
navigate(
"/asmf/remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/template/" +
res.id
);
}
} catch (err) {
console.log("err ", err);
setIsErr(true);
} finally {
setIsAlert(true);
setTimeout(() => {
setIsAlert(false);
}, 1000);
setIsSubmit(false);
}
};
const handleFolder = (data) => {
setFolder(data);
};
// const handleSigners = (data) => {
// if (data && data.length > 0) {
// const updateSigners = data.map((x) => ({
// __type: "Pointer",
// className: "contracts_Contactbook",
// objectId: x
// }));
// setSigners(updateSigners);
// }
// };
const handleReset = () => {
setSigners([]);
setFolder({ ObjectId: "", Name: "" });
setFormData({
Name: "",
Description: "",
Note: ""
});
setFileUpload([]);
setpercentage(0);
};
return (
<div className="shadow-md rounded my-2 p-3 bg-[#ffffff] md:border-[1px] md:border-gray-600/50">
<Title title="New Template" />
{isAlert && (
<Alert type={isErr ? "danger" : "success"}>
{isErr
? "Something went wrong please try again!"
: "Template created successfully!"}
</Alert>
)}
<form onSubmit={handleSubmit}>
<h1 className="text-[20px] font-semibold mb-4">New Template</h1>
{fileload && (
<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-xs">
<label className="block">
File<span className="text-red-500 text-[13px]">*</span>
</label>
{fileupload.length > 0 ? (
<div className="flex gap-2 justify-center items-center">
<div className="flex justify-between items-center px-2 py-2 w-full font-bold rounded border-[1px] border-[#ccc] text-gray-500 bg-white text-[13px]">
<div className="break-all">
file selected : {fileupload?.split("/")[3]?.split("_")[1]}
</div>
<div
onClick={() => {
setFileUpload([]);
}}
className="cursor-pointer px-[10px] text-[20px] font-bold bg-white text-red-500"
>
<i className="fa-solid fa-xmark"></i>
</div>
</div>
{process.env.REACT_APP_DROPBOX_API_KEY && (
<DropboxChooser
onSuccess={dropboxSuccess}
onCancel={dropboxCancel}
/>
)}
</div>
) : (
<div className="flex gap-2 justify-center items-center">
<input
type="file"
className="bg-white px-2 py-1.5 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
onChange={(e) => handleFileInput(e)}
accept="application/pdf,application/vnd.ms-excel"
required
/>
{process.env.REACT_APP_DROPBOX_API_KEY && (
<DropboxChooser
onSuccess={dropboxSuccess}
onCancel={dropboxCancel}
/>
)}
</div>
)}
</div>
<div className="text-xs mt-2">
<label className="block">
Title<span className="text-red-500 text-[13px]">*</span>
</label>
<input
name="Name"
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
value={formData.Name}
onChange={(e) => handleStrInput(e)}
required
/>
</div>
<div className="text-xs mt-2">
<label className="block">
Note<span className="text-red-500 text-[13px]">*</span>
</label>
<input
name="Note"
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
value={formData.Note}
onChange={(e) => handleStrInput(e)}
required
/>
</div>
<div className="text-xs mt-2">
<label className="block">Description</label>
<input
name="Description"
className="px-3 py-2 w-full border-[1px] border-gray-300 rounded focus:outline-none text-xs"
value={formData.Description}
onChange={(e) => handleStrInput(e)}
/>
</div>
{/* <SignersInput onChange={handleSigners} /> */}
<SelectFolder onSuccess={handleFolder} folderCls={templateCls} />
<div className="flex items-center mt-3 gap-2 text-white">
<button
className={`${
isSubmit && "cursor-progress"
} bg-[#1ab6ce] rounded-sm shadow-md text-[14px] font-semibold uppercase text-white py-1.5 px-2.5 focus:outline-none`}
type="submit"
disabled={isSubmit}
>
Submit
</button>
<div
className="bg-[#188ae2] rounded-sm shadow-md text-[14px] font-semibold uppercase text-white py-1.5 px-2.5 text-center ml-[2px] focus:outline-none"
onClick={() => handleReset()}
>
Reset
</div>
</div>
</form>
</div>
);
};
export default TemplateForm;
@@ -0,0 +1,34 @@
import React, { useEffect } from "react";
import Parse from "parse";
const ValidateRoute = ({ children }) => {
useEffect(() => {
(async () => {
try {
// Use the session token to validate the user
const userQuery = new Parse.Query(Parse.User);
const user = await userQuery.get(Parse.User.current().id, {
sessionToken: localStorage.getItem("accesstoken")
});
if (!user) {
handlelogout();
}
} catch (error) {
handlelogout();
}
})();
}, []);
const handlelogout = async () => {
try {
Parse.User.logOut();
localStorage.removeItem("accesstoken");
} catch (err) {
console.log("err ", err);
} finally {
localStorage.removeItem("accesstoken");
}
};
return <div>{children}</div>;
};
export default ValidateRoute;
+14 -9
View File
@@ -25,6 +25,7 @@ import TreeWidget from "../components/TreeWidget";
import parse from "html-react-parser";
import Title from "../components/Title";
import { formJson } from "../json/FormJson";
import TemplateForm from "../primitives/TemplateForm";
const widget = {
TimeWidget: TimeWidget
};
@@ -41,15 +42,19 @@ const fields = () => {
function FormBuilderFn(props) {
const { id } = useParams();
const navigate = useNavigate();
return (
<FormBuilder
removeState={props.removeState}
removeLevel2State={props.removeLevel2State}
removeLevel3State={props.removeLevel3State}
id={id}
navigate={navigate}
/>
);
if (id === "template") {
return <TemplateForm />;
} else {
return (
<FormBuilder
removeState={props.removeState}
removeLevel2State={props.removeLevel2State}
removeLevel3State={props.removeLevel3State}
id={id}
navigate={navigate}
/>
);
}
}
class FormBuilder extends Component {
state = {
+2 -2
View File
@@ -74,8 +74,8 @@ const PgSignUp = (props) => {
const res = await Parse.Cloud.run("getUserDetails", params);
// console.log("res", res);
if (res) {
const checkUser = new Parse.Query(extClass);
const updateQuery = await checkUser.get(res.id);
const updateQuery = new Parse.Object(extClass);
updateQuery.id = res.id;
updateQuery.set(
"Next_billing_date",
new Date(zohoRes.data.result.nextBillingDate)
+3
View File
@@ -15,6 +15,7 @@ const Report = () => {
const [heading, setHeading] = useState([]);
const [isNextRecord, setIsNextRecord] = useState(false);
const [isMoreDocs, setIsMoreDocs] = useState(true);
const [form, setForm]= useState("")
const abortController = new AbortController();
const docPerPage = 10;
@@ -50,6 +51,7 @@ const Report = () => {
setActions(json.actions);
setHeading(json.heading);
setReportName(json.reportName);
setForm(json.form)
Parse.serverURL = localStorage.getItem("BaseUrl12");
Parse.initialize(localStorage.getItem("AppID12"));
const currentUser = Parse.User.current().id;
@@ -154,6 +156,7 @@ const Report = () => {
setIsNextRecord={setIsNextRecord}
isMoreDocs={isMoreDocs}
docPerPage={docPerPage}
form={form}
/>
) : (
<div className="flex items-center justify-center h-screen w-full bg-white rounded">
+2 -4
View File
@@ -2211,7 +2211,5 @@
background-position: -2em 0;
}
}
.box:nth-of-type(n + 43) {
display: none;
}
+8 -4
View File
@@ -17,6 +17,8 @@ import getUserDetails from './parsefunction/getUserDetails.js';
import getDocument from './parsefunction/getDocument.js';
import getDrive from './parsefunction/getDrive.js';
import getReport from './parsefunction/getReport.js';
import TemplateAfterSave from './parsefunction/TemplateAfterSave.js';
import GetTemplate from './parsefunction/GetTemplate.js';
Parse.Cloud.define('AddUserToRole', addUserToGroups);
Parse.Cloud.define('UserGroups', getUserGroups);
@@ -26,9 +28,6 @@ Parse.Cloud.define('googlesign', GoogleSign);
Parse.Cloud.define('zohodetails', ZohoDetails);
Parse.Cloud.define('usersignup', usersignup);
Parse.Cloud.define('facebooksign', FacebookSign);
Parse.Cloud.afterSave('contracts_Document', DocumentAftersave);
Parse.Cloud.afterSave('contracts_Contactbook', ContactbookAftersave);
Parse.Cloud.afterSave('contracts_Users', ContractUsersAftersave);
Parse.Cloud.define('SendOTPMailV1', sendMailOTPv1);
Parse.Cloud.define('sendmail', SendMailv1);
Parse.Cloud.define('AuthLoginAsMail', AuthLoginAsMail);
@@ -36,4 +35,9 @@ 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)
Parse.Cloud.define('getReport', getReport)
Parse.Cloud.define("getTemplate", GetTemplate)
Parse.Cloud.afterSave('contracts_Document', DocumentAftersave);
Parse.Cloud.afterSave('contracts_Contactbook', ContactbookAftersave);
Parse.Cloud.afterSave('contracts_Users', ContractUsersAftersave);
Parse.Cloud.afterSave("contracts_Template", TemplateAfterSave)
@@ -0,0 +1,53 @@
import axios from 'axios';
export default async function GetTemplate(request) {
const serverUrl = process.env.SERVER_URL;
const templateId = request.params.templateId;
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;
// console.log("templateId ", templateId)
// console.log("userId ",userId)
if (templateId && userId) {
try {
const template = new Parse.Query('contracts_Template');
template.equalTo('objectId', templateId);
template.include('ExtUserPtr');
template.include('Signers');
template.include('CreateBy');
const res = await template.first({ useMasterKey: true });
// console.log("res ", res)
if (res) {
// console.log("res ",res)
const acl = res.getACL();
console.log("acl", acl.getReadAccess(userId))
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', err);
if (err.code == 209) {
return { error: 'Invalid session token' };
} else {
return { error: "You don't have access of this document!" };
}
}
}
@@ -0,0 +1,83 @@
export default async function TemplateAfterSave(request) {
try {
if (!request.original) {
console.log('new entry is insert in contracts_Template');
// update acl of New Document If There are signers present in array
const signers = request.object.get('Signers');
if (signers && signers.length > 0) {
await updateAclDoc(request.object.id);
} else {
await updateSelfDoc(request.object.id);
}
} else {
if (request.user) {
const signers = request.object.get('Signers');
if (signers && signers.length > 0) {
await updateAclDoc(request.object.id);
} else {
await updateSelfDoc(request.object.id);
}
}
}
} catch (err) {
console.log('err in aftersave of contracts_Template');
console.log(err);
}
async function updateAclDoc(objId) {
// console.log("In side updateAclDoc func")
// console.log(objId)
const Query = new Parse.Query('contracts_Template');
Query.include('Signers');
const updateACL = await Query.get(objId, { useMasterKey: true });
const res = JSON.parse(JSON.stringify(updateACL));
// console.log("res");
// console.log(JSON.stringify(res));
const UsersPtr = res.Signers.map(item => item.UserId);
if (res.Signers[0].ExtUserPtr) {
const ExtUserSigners = res.Signers.map(item => {
return {
__type: 'Pointer',
className: 'contracts_Users',
objectId: item.ExtUserPtr.objectId,
};
});
updateACL.set('Signers', ExtUserSigners);
}
// console.log("UsersPtr")
// console.log(JSON.stringify(UsersPtr))
const newACL = new Parse.ACL();
newACL.setPublicReadAccess(false);
newACL.setPublicWriteAccess(false);
newACL.setReadAccess(request.user, true);
newACL.setWriteAccess(request.user, true);
UsersPtr.forEach(x => {
newACL.setReadAccess(x.objectId, true);
newACL.setWriteAccess(x.objectId, true);
});
updateACL.setACL(newACL);
updateACL.save(null, { useMasterKey: true });
}
async function updateSelfDoc(objId) {
// console.log("Inside updateSelfDoc func")
const Query = new Parse.Query('contracts_Template');
const updateACL = await Query.get(objId, { useMasterKey: true });
// const res = JSON.parse(JSON.stringify(updateACL));
// console.log("res");
// console.log(JSON.stringify(res));
const newACL = new Parse.ACL();
newACL.setPublicReadAccess(false);
newACL.setPublicWriteAccess(false);
newACL.setReadAccess(request.user, true);
newACL.setWriteAccess(request.user, true);
updateACL.setACL(newACL);
updateACL.save(null, { useMasterKey: true });
}
}
@@ -21,6 +21,7 @@ export default async function getDocument(request) {
query.include('Signers');
query.include('AuditTrail.UserPtr');
query.include('Placeholders');
query.notEqualTo('IsArchive', true)
const res = await query.first({ useMasterKey: true });
if (res) {
const acl = res.getACL();
@@ -40,7 +41,7 @@ export default async function getDocument(request) {
return { error: 'Please pass required parameters!' };
}
} catch (err) {
console.log('err');
console.log('err', err);
if (err.code == 209) {
return { error: 'Invalid session token' };
} else {
@@ -16,9 +16,9 @@ export default async function getDrive(request) {
if (userId) {
let url;
if (docId) {
url = `${classUrl}?where={"Folder":{"__type":"Pointer","className":"contracts_Document","objectId":"${docId}"},"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${userId}"}}&include=ExtUserPtr,Signers,Folder`;
url = `${classUrl}?where={"Folder":{"__type":"Pointer","className":"contracts_Document","objectId":"${docId}"},"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${userId}"},"IsArchive":{"$ne":true}}&include=ExtUserPtr,Signers,Folder`;
} else {
url = `${classUrl}?where={"Folder":{"$exists":false},"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${userId}"}}&include=ExtUserPtr,Signers`;
url = `${classUrl}?where={"Folder":{"$exists":false},"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${userId}"},"IsArchive":{"$ne":true}}&include=ExtUserPtr,Signers`;
}
try {
const res = await axios.get(url, {
@@ -19,7 +19,7 @@ export default async function getReport(request) {
const userId = userRes.data && userRes.data.objectId;
if (userId) {
const json = reportId && reportJson(reportId, userId);
const clsName = reportId === '5KhaPr482K' ? 'contracts_Contactbook' : 'contracts_Document';
const clsName = json?.reportClass ? json.reportClass : 'contracts_Document';
if (json) {
const { params, keys } = json;
const orderBy = '-updatedAt';
+110 -90
View File
@@ -2,7 +2,7 @@ import SignPDF from './SignPDF.min.cjs';
import fs from 'node:fs';
import axios from 'axios';
import FormData from 'form-data';
import plainplaceholder from './customSignPdf/plainplaceholder.min.js';
// import plainplaceholder from './customSignPdf/plainplaceholder.min.js';
import { plainAddPlaceholder } from 'node-signpdf/dist/helpers/index.js';
const serverUrl = process.env.SERVER_URL,
APPID = process.env.APP_ID,
@@ -19,20 +19,20 @@ async function uploadFile(a) {
console.log('err ', e), fs.unlinkSync(a);
}
}
async function updateDoc(t, s, r, i, o, n) {
async function updateDoc(t, s, r, i, n, o) {
try {
var d = {
UserPtr: { __type: 'Pointer', className: n, objectId: r },
UserPtr: { __type: 'Pointer', className: o, objectId: r },
SignedUrl: s,
Activity: 'Signed',
ipAddress: i,
};
let e;
var l = (e = o.AuditTrail && 0 < o.AuditTrail.length ? [...o.AuditTrail, d] : [d]).filter(
var l = (e = n.AuditTrail && 0 < n.AuditTrail.length ? [...n.AuditTrail, d] : [d]).filter(
e => 'Signed' === e.Activity
);
let a = !1;
!((o.Signers && 0 < o.Signers.length && l.length !== o.Signers.length) || !(a = !0));
!((n.Signers && 0 < n.Signers.length && l.length !== n.Signers.length) || !(a = !0));
var p = { SignedUrl: s, AuditTrail: e, IsCompleted: a };
await axios.put(serverUrl + '/classes/contracts_Document/' + t, p, {
headers: {
@@ -61,7 +61,7 @@ async function sendMail(e) {
s +
' Standard is attached to this email. Kindly download the document from the attachment.</p></div> </div><div><p>This is an automated email from Open Sign. For any queries regarding this email, please contact the sender ' +
t.Mail +
' directly. If you think this email is inappropriate or spam, you may file a complaint with Open Sign here.</p></div></div></body></html>',
' directly. If you think this email is inappropriate or spam, you may file a complaint with Open Sign <a href=www.opensignlabs.com target=_blank>here</a>.</p></div></div></body></html>'
};
await axios.post(serverUrl + '/functions/sendmailv3', a, {
headers: {
@@ -86,7 +86,7 @@ async function sendCompletedMail(e) {
s +
'. Kindly download the document from the attachment.</p></div> </div><div><p>This is an automated email from Open Sign. For any queries regarding this email, please contact the sender ' +
t.Mail +
' directly. If you think this email is inappropriate or spam, you may file a complaint with Open Sign here.</p></div></div></body></html>',
' directly. If you think this email is inappropriate or spam, you may file a complaint with Open Sign <a href=www.opensignlabs.com target=_blank>here</a>.</p></div></div></body></html>',
};
await axios.post(serverUrl + '/functions/sendmailv3', a, {
headers: {
@@ -96,115 +96,135 @@ async function sendCompletedMail(e) {
},
});
}
async function PDF(s, r) {
async function PDF(i, n) {
try {
var i = s.params.sign,
e = s.params.docId,
o = s.params.userId,
n = await axios.get(serverUrl + '/classes/contracts_Document/' + e + '?include=ExtUserPtr', {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APPID,
'X-Parse-Master-Key': masterKEY,
},
}),
d = await axios.get(serverUrl + '/users/me', {
i.params.sign;
var e = i.params.docId,
a = i.params.userId,
o = await axios.get(
serverUrl + '/classes/contracts_Document/' + e + '?include=ExtUserPtr,Signers',
{
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APPID,
'X-Parse-Master-Key': masterKEY,
},
}
),
t = await axios.get(serverUrl + '/users/me', {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': s.headers.sessiontoken,
'X-Parse-Session-Token': i.headers.sessiontoken,
},
});
if (!d.data || !d.data.objectId) return { status: 'error', message: 'this user not allowed!' };
if (!t.data || !t.data.objectId) return { status: 'error', message: 'this user not allowed!' };
{
var l,
var d,
l,
p,
c,
m = JSON.stringify({ objectId: o });
let a, t;
t = o
? (l = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + m, {
c = JSON.stringify({ objectId: a });
let s, r;
r = a
? (d = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + c, {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': s.headers.sessiontoken,
'X-Parse-Session-Token': i.headers.sessiontoken,
},
})).data && 0 < l.data.results.length
? ((a = l), 'contracts_Contactbook')
: ((a = await axios.get(serverUrl + '/classes/contracts_Users?where=' + m, {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Master-Key': masterKEY,
},
})).data && 0 < d.data.results.length
? ((s = d), 'contracts_Contactbook')
: ((s = await axios.get(serverUrl + '/classes/contracts_Users?where=' + c, {
headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY },
})),
'contracts_Users')
: ((p = JSON.stringify({
UserId: { __type: 'Pointer', className: '_User', objectId: d.data.objectId },
: ((l = JSON.stringify({
UserId: { __type: 'Pointer', className: '_User', objectId: t.data.objectId },
})),
(c = await axios.get(serverUrl + '/classes/contracts_Users?where=' + p, {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Master-Key': masterKEY,
},
})).data && 0 < c.data.results.length
? ((a = c), 'contracts_Users')
: ((a = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + p, {
(p = await axios.get(serverUrl + '/classes/contracts_Users?where=' + l, {
headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY },
})).data && 0 < p.data.results.length
? ((s = p), 'contracts_Users')
: ((s = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + l, {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': s.headers.sessiontoken,
'X-Parse-Session-Token': i.headers.sessiontoken,
},
})),
'contracts_Contactbook'));
var g = a.data.results[0].Name,
h = a.data.results[0].Email;
if (!s.params.pdfFile) return { status: 'error', message: 'pdf file not present!' };
var m = s.data.results[0].Name,
g = s.data.results[0].Email;
if (!i.params.pdfFile) return { status: 'error', message: 'pdf file not present!' };
{
let e = Buffer.from(s.params.pdfFile, 'base64');
let e = Buffer.from(i.params.pdfFile, 'base64');
var u = process.env.PFX_BASE64,
f = Buffer.from(u, 'base64');
e = i
? plainplaceholder({
pdfBuffer: e,
reason: 'Digitally signed by Open sign for ' + g + ' <' + h + '>',
location: 'test location',
signatureLength: 1e4,
sign: i,
})
: plainAddPlaceholder({
pdfBuffer: e,
reason: 'Digitally signed by Open sign for ' + g + ' <' + h + '>',
location: 'test location',
signatureLength: 1e4,
});
var y = await new SignPDF(e, f).signPDF(),
v = `./exports/exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
P = (fs.writeFileSync(v, y), await uploadFile(v));
if (P && P.imageUrl) {
const r = await updateDoc(
s.params.docId,
P.imageUrl,
a.data.results[0].objectId,
s.headers['x-real-ip'],
n.data,
t
h = Buffer.from(u, 'base64'),
f = {
UserPtr: { __type: 'Pointer', className: r, objectId: s.data.results[0].objectId },
SignedUrl: '',
Activity: 'Signed',
ipAddress: i.headers['x-real-ip'],
};
let a;
var y = (a =
o.data.AuditTrail && 0 < o.data.AuditTrail.length
? [...o.data.AuditTrail, f]
: [f]).filter(e => 'Signed' === e.Activity);
let t = !1;
!(
(o.data.Signers && 0 < o.data.Signers.length && y.length !== o.data.Signers.length) ||
!(t = !0)
);
var v,
P,
x = `./exports/exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
A =
(t
? ((v = o.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
(e =
v && 0 < v.length
? plainAddPlaceholder({
pdfBuffer: e,
reason: 'Digitally signed by Open sign for ' + v?.join(', '),
location: 'location',
signatureLength: 1e4,
})
: plainAddPlaceholder({
pdfBuffer: e,
reason: 'Digitally signed by Open sign for ' + m + ' <' + g + '>',
location: 'location',
signatureLength: 1e4,
})),
(P = await new SignPDF(e, h).signPDF()),
fs.writeFileSync(x, P))
: fs.writeFileSync(x, e),
await uploadFile(x));
if (A && A.imageUrl) {
const n = await updateDoc(
i.params.docId,
A.imageUrl,
s.data.results[0].objectId,
i.headers['x-real-ip'],
o.data,
r
);
return (
sendMail({
url: P.imageUrl,
sender: { Mail: n.data.ExtUserPtr.Email, Name: n.data.ExtUserPtr.Name },
pdfName: n.data.Name,
receiver: h,
url: A.imageUrl,
sender: { Mail: o.data.ExtUserPtr.Email, Name: o.data.ExtUserPtr.Name },
pdfName: o.data.Name,
receiver: g,
}),
r &&
r.isCompleted &&
n &&
n.isCompleted &&
sendCompletedMail({
url: P.imageUrl,
sender: { Mail: n.data.ExtUserPtr.Email, Name: 'Open sign' },
pdfName: n.data.Name,
receiver: n.data.ExtUserPtr.Email,
url: A.imageUrl,
sender: { Mail: o.data.ExtUserPtr.Email, Name: 'Open sign' },
pdfName: o.data.Name,
receiver: o.data.ExtUserPtr.Email,
}),
fs.unlinkSync(v),
console.log('New Signed PDF created called: ' + v),
'success' === r.message
? { status: 'success', data: P.imageUrl }
fs.unlinkSync(x),
console.log('New Signed PDF created called: ' + x),
'success' === n.message
? { status: 'success', data: A.imageUrl }
: { status: 'error', message: 'please provide required parameters!' }
);
}
@@ -7,11 +7,11 @@ export default function reportJson(id, userId) {
return {
reportName: 'Draft Documents',
params: {
Type: null,
$or: [
{ Signers: null, SignedUrl: null },
{ Signers: { $exists: true }, Placeholders: null },
],
Type: { $ne: 'Folder' },
IsCompleted: { $ne: true },
IsDeclined: { $ne: true },
IsArchive: { $ne: true },
$or: [{Signers:{$eq:[]}}, { Signers: null }, { Signers: { $exists: true }, Placeholders: null }],
CreatedBy: {
__type: 'Pointer',
className: '_User',
@@ -28,10 +28,23 @@ export default function reportJson(id, userId) {
Type: { $ne: 'Folder' },
IsCompleted: { $ne: true },
IsDeclined: { $ne: true },
IsArchive: { $ne: true },
ExpiryDate: {
$gt: { __type: 'Date', iso: new Date().toISOString() },
},
Placeholders: { $ne: null },
Signers: {
$inQuery: {
where: {
UserId: {
__type: 'Pointer',
className: '_User',
objectId: currentUserId,
},
},
className: 'contracts_Contactbook',
},
},
},
keys: [
'Name',
@@ -50,10 +63,11 @@ export default function reportJson(id, userId) {
reportName: 'In-progress documents',
params: {
Type: { $ne: 'Folder' },
Signers: { $ne: null },
Signers: { $exists: true, $ne: [] },
Placeholders: { $ne: null },
IsCompleted: { $ne: true },
IsDeclined: { $ne: true },
IsArchive: { $ne: true },
CreatedBy: {
__type: 'Pointer',
className: '_User',
@@ -70,7 +84,7 @@ export default function reportJson(id, userId) {
return {
reportName: 'Completed Documents',
params: {
Type: null,
Type: { $ne: 'Folder' },
IsCompleted: true,
CreatedBy: {
__type: 'Pointer',
@@ -78,6 +92,7 @@ export default function reportJson(id, userId) {
objectId: currentUserId,
},
IsDeclined: { $ne: true },
IsArchive: { $ne: true },
},
keys: [
'Name',
@@ -96,6 +111,7 @@ export default function reportJson(id, userId) {
reportName: 'Declined Documents',
params: {
Type: null,
IsArchive: { $ne: true },
IsDeclined: true,
CreatedBy: {
__type: 'Pointer',
@@ -113,6 +129,7 @@ export default function reportJson(id, userId) {
params: {
IsCompleted: { $ne: true },
IsDeclined: { $ne: true },
IsArchive: { $ne: true },
Type: { $ne: 'Folder' },
$and: [
{
@@ -141,10 +158,11 @@ export default function reportJson(id, userId) {
reportName: 'Recently sent for signatures',
params: {
Type: { $ne: 'Folder' },
Signers: { $ne: null },
Signers: { $exists: true, $ne: [] },
Placeholders: { $ne: null },
IsCompleted: { $ne: true },
IsDeclined: { $ne: true },
IsArchive: { $ne: true },
CreatedBy: {
__type: 'Pointer',
className: '_User',
@@ -154,7 +172,7 @@ export default function reportJson(id, userId) {
$gt: { __type: 'Date', iso: new Date().toISOString() },
},
},
keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'],
keys: ['Name', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'],
};
// Recent signature requests report show on dashboard
case '5Go51Q7T8r':
@@ -164,32 +182,36 @@ export default function reportJson(id, userId) {
Type: { $ne: 'Folder' },
IsCompleted: { $ne: true },
IsDeclined: { $ne: true },
IsArchive: { $ne: true },
ExpiryDate: {
$gt: { __type: 'Date', iso: new Date().toISOString() },
},
Placeholders: { $ne: null },
Signers: {
$inQuery: {
where: {
UserId: {
__type: 'Pointer',
className: '_User',
objectId: currentUserId,
},
},
className: 'contracts_Contactbook',
},
},
},
keys: [
'Name',
'Note',
'Folder.Name',
'URL',
'ExtUserPtr.Name',
'Signers.Name',
'Signers.UserId',
'AuditTrail',
],
keys: ['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 },
],
Type: { $ne: 'Folder' },
IsCompleted: { $ne: true },
IsDeclined: { $ne: true },
IsArchive: { $ne: true },
$or: [{Signers:{$eq:[]}}, { Signers: null }, { Signers: { $exists: true }, Placeholders: null }],
CreatedBy: {
__type: 'Pointer',
className: '_User',
@@ -202,6 +224,7 @@ export default function reportJson(id, userId) {
case '5KhaPr482K':
return {
reportName: 'Contactbook',
reportClass: 'contracts_Contactbook',
params: {
CreatedBy: {
__type: 'Pointer',
@@ -212,6 +235,22 @@ export default function reportJson(id, userId) {
},
keys: ['Name', 'Email', 'Phone'],
};
// Templates report
case '6TeaPr321t':
return {
reportName: 'Templates',
reportClass: 'contracts_Template',
params: {
Type: { $ne: 'Folder' },
IsArchive: { $ne: true },
CreatedBy: {
__type: 'Pointer',
className: '_User',
objectId: currentUserId,
},
},
keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'],
};
default:
return null;
}
@@ -38,7 +38,7 @@ exports.up = async Parse => {
pageType: 'form',
description: '',
objectId: '8mZzFxbG1z',
},
}
],
},
{
@@ -0,0 +1,588 @@
/**
*
* @param {Parse} Parse
*/
exports.up = async Parse => {
const className = 'w_menu';
const userMenu = new Parse.Query(className);
const updateUserMenu = await userMenu.get('H9vRfEYKhT');
updateUserMenu.set('menuItems', [
{
icon: 'fas fa-tachometer-alt',
title: 'Dashboard',
target: '',
pageType: 'dashboard',
description: '',
objectId: '35KBoSgoAK',
},
{
icon: 'far fa-newspaper',
title: 'New Document',
target: '_self',
pageType: null,
description: null,
objectId: null,
children: [
{
icon: 'fas fa-pen-nib',
title: 'Sign yourself',
target: '_self',
pageType: 'form',
description: '',
objectId: 'sHAnZphf69',
},
{
icon: 'fa-solid fa-paper-plane',
title: 'Request signatures',
target: '_self',
pageType: 'form',
description: '',
objectId: '8mZzFxbG1z',
},
{
icon: 'fas fa-file-signature',
title: 'New template',
target: '_self',
pageType: 'form',
description: '',
objectId: 'template',
},
],
},
{
icon: 'fa-solid fa-file-contract',
title: 'Templates',
target: '_self',
pageType: 'report',
description: '',
objectId: '6TeaPr321t',
},
{
icon: 'fas fa-folder',
title: 'OpenSign™ Drive',
target: '_self',
pageType: 'mf',
description: '',
objectId:
'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/legadrive',
},
{
icon: 'fas fa-address-card',
title: 'Reports',
target: '_self',
pageType: null,
description: '',
objectId: null,
children: [
{
icon: 'fas fa-signature',
title: 'Need your sign',
target: '_self',
pageType: 'report',
description: '',
objectId: '4Hhwbp482K',
},
{
icon: 'fas fa-tasks',
title: 'In Progress',
target: '_self',
pageType: 'report',
description: '',
objectId: '1MwEuxLEkF',
},
{
icon: 'fas fa-check-circle',
title: 'Completed',
target: '_self',
pageType: 'report',
description: '',
objectId: 'kQUoW4hUXz',
},
{
icon: 'fas fa-edit',
title: 'Drafts',
target: '_self',
pageType: 'report',
description: '',
objectId: 'ByHuevtCFY',
},
{
icon: 'fas fa-times-circle',
title: 'Declined',
target: '_self',
pageType: 'report',
description: '',
objectId: 'UPr2Fm5WY3',
},
{
icon: 'fas fa-hourglass-end',
title: 'Expired',
target: '_self',
pageType: 'report',
description: '',
objectId: 'zNqBHXHsYH',
},
{
icon: 'fa-solid fa-address-book',
title: 'Contactbook',
target: '_self',
pageType: 'report',
description: '',
objectId: '5KhaPr482K',
},
],
},
{
icon: 'fas fa-cog',
title: 'Settings',
target: '_self',
pageType: null,
description: '',
objectId: null,
children: [
{
icon: 'fas fa-pen-fancy',
title: 'My Signature',
target: '_self',
pageType: 'mf',
description: '',
objectId:
'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/managesign',
},
],
},
]);
const AdminMenu = new Parse.Query(className);
const updateAdminMenu = await AdminMenu.get('VPh91h0ZHk');
updateAdminMenu.set('menuItems', [
{
icon: 'fas fa-tachometer-alt',
title: 'Dashboard',
target: '',
pageType: 'dashboard',
description: '',
objectId: '35KBoSgoAK',
},
{
icon: 'far fa-newspaper',
title: 'New Document',
target: '_self',
pageType: null,
description: null,
objectId: null,
children: [
{
icon: 'fas fa-pen-nib',
title: 'Sign yourself',
target: '_self',
pageType: 'form',
description: '',
objectId: 'sHAnZphf69',
},
{
icon: 'fa-solid fa-paper-plane',
title: 'Request signatures',
target: '_self',
pageType: 'form',
description: '',
objectId: '8mZzFxbG1z',
},
{
icon: 'fas fa-file-signature',
title: 'New template',
target: '_self',
pageType: 'form',
description: '',
objectId: 'template',
},
],
},
{
icon: 'fa-solid fa-file-contract',
title: 'Templates',
target: '_self',
pageType: 'report',
description: '',
objectId: '6TeaPr321t',
},
{
icon: 'fas fa-folder',
title: 'OpenSign™ Drive',
target: '_self',
pageType: 'mf',
description: '',
objectId:
'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/legadrive',
},
{
icon: 'fas fa-address-card',
title: 'Reports',
target: '_self',
pageType: null,
description: '',
objectId: null,
children: [
{
icon: 'fas fa-signature',
title: 'Need your sign',
target: '_self',
pageType: 'report',
description: '',
objectId: '4Hhwbp482K',
},
{
icon: 'fas fa-tasks',
title: 'In Progress',
target: '_self',
pageType: 'report',
description: '',
objectId: '1MwEuxLEkF',
},
{
icon: 'fas fa-check-circle',
title: 'Completed',
target: '_self',
pageType: 'report',
description: '',
objectId: 'kQUoW4hUXz',
},
{
icon: 'fas fa-edit',
title: 'Drafts',
target: '_self',
pageType: 'report',
description: '',
objectId: 'ByHuevtCFY',
},
{
icon: 'fas fa-times-circle',
title: 'Declined',
target: '_self',
pageType: 'report',
description: '',
objectId: 'UPr2Fm5WY3',
},
{
icon: 'fas fa-hourglass-end',
title: 'Expired',
target: '_self',
pageType: 'report',
description: '',
objectId: 'zNqBHXHsYH',
},
{
icon: 'fa-solid fa-address-book',
title: 'Contactbook',
target: '_self',
pageType: 'report',
description: '',
objectId: '5KhaPr482K',
},
],
},
{
icon: 'fas fa-cog',
title: 'Settings',
target: '_self',
pageType: null,
description: '',
objectId: null,
children: [
{
icon: 'fas fa-pen-fancy',
title: 'My Signature',
target: '_self',
pageType: 'mf',
description: '',
objectId:
'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/managesign',
},
{
icon: 'far fa-user',
title: 'Add User',
target: '_self',
pageType: 'form',
description: '',
objectId: 'lM0xRnM3iE',
},
],
},
]);
// TODO: Set the schema here
// Example:
// schema.addString('name').addNumber('cash');
const batch = [updateUserMenu, updateAdminMenu];
return Parse.Object.saveAll(batch, { useMasterKey: true });
};
/**
*
* @param {Parse} Parse
*/
exports.down = async Parse => {
// TODO: set className here
const className = 'w_menu';
const userMenu = new Parse.Query(className);
const revertUserMenu = await userMenu.get('H9vRfEYKhT');
revertUserMenu.set('menuItems', [
{
icon: 'fas fa-tachometer-alt',
title: 'Dashboard',
target: '',
pageType: 'dashboard',
description: '',
objectId: '35KBoSgoAK',
},
{
icon: 'far fa-newspaper',
title: 'New Document',
target: '_self',
pageType: null,
description: null,
objectId: null,
children: [
{
icon: 'fas fa-pen-nib',
title: 'Sign yourself',
target: '_self',
pageType: 'form',
description: '',
objectId: 'sHAnZphf69',
},
{
icon: 'fas fa-file-signature',
title: 'Request signatures',
target: '_self',
pageType: 'form',
description: '',
objectId: '8mZzFxbG1z',
},
],
},
{
icon: 'fas fa-folder',
title: 'OpenSignDrive™',
target: '_self',
pageType: 'mf',
description: '',
objectId:
'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/legadrive',
},
{
icon: 'fas fa-address-card',
title: 'Reports',
target: '_self',
pageType: null,
description: '',
objectId: null,
children: [
{
icon: 'fas fa-signature',
title: 'Need your sign',
target: '_self',
pageType: 'report',
description: '',
objectId: '4Hhwbp482K',
},
{
icon: 'fas fa-tasks',
title: 'In Progress',
target: '_self',
pageType: 'report',
description: '',
objectId: '1MwEuxLEkF',
},
{
icon: 'fas fa-check-circle',
title: 'Completed',
target: '_self',
pageType: 'report',
description: '',
objectId: 'kQUoW4hUXz',
},
{
icon: 'fas fa-edit',
title: 'Drafts',
target: '_self',
pageType: 'report',
description: '',
objectId: 'ByHuevtCFY',
},
{
icon: 'fas fa-times-circle',
title: 'Declined',
target: '_self',
pageType: 'report',
description: '',
objectId: 'UPr2Fm5WY3',
},
{
icon: 'fas fa-hourglass-end',
title: 'Expired',
target: '_self',
pageType: 'report',
description: '',
objectId: 'zNqBHXHsYH',
},
],
},
{
icon: 'fas fa-cog',
title: 'Settings',
target: '_self',
pageType: null,
description: '',
objectId: null,
children: [
{
icon: 'fas fa-pen-fancy',
title: 'My Signature',
target: '_self',
pageType: 'mf',
description: '',
objectId:
'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/managesign',
},
],
},
]);
const adminMenu = new Parse.Query(className);
const revertAdminMenu = await adminMenu.get('VPh91h0ZHk');
revertAdminMenu.set('menuItems', [
{
icon: 'fas fa-tachometer-alt',
title: 'Dashboard',
target: '',
pageType: 'dashboard',
description: '',
objectId: '35KBoSgoAK',
},
{
icon: 'far fa-newspaper',
title: 'New Document',
target: '_self',
pageType: null,
description: null,
objectId: null,
children: [
{
icon: 'fas fa-pen-nib',
title: 'Sign yourself',
target: '_self',
pageType: 'form',
description: '',
objectId: 'sHAnZphf69',
},
{
icon: 'fas fa-file-signature',
title: 'Request signatures',
target: '_self',
pageType: 'form',
description: '',
objectId: '8mZzFxbG1z',
},
],
},
{
icon: 'fas fa-folder',
title: 'OpenSignDrive™',
target: '_self',
pageType: 'mf',
description: '',
objectId:
'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/legadrive',
},
{
icon: 'fas fa-address-card',
title: 'Reports',
target: '_self',
pageType: null,
description: '',
objectId: null,
children: [
{
icon: 'fas fa-signature',
title: 'Need your sign',
target: '_self',
pageType: 'report',
description: '',
objectId: '4Hhwbp482K',
},
{
icon: 'fas fa-tasks',
title: 'In Progress',
target: '_self',
pageType: 'report',
description: '',
objectId: '1MwEuxLEkF',
},
{
icon: 'fas fa-check-circle',
title: 'Completed',
target: '_self',
pageType: 'report',
description: '',
objectId: 'kQUoW4hUXz',
},
{
icon: 'fas fa-edit',
title: 'Drafts',
target: '_self',
pageType: 'report',
description: '',
objectId: 'ByHuevtCFY',
},
{
icon: 'fas fa-times-circle',
title: 'Declined',
target: '_self',
pageType: 'report',
description: '',
objectId: 'UPr2Fm5WY3',
},
{
icon: 'fas fa-hourglass-end',
title: 'Expired',
target: '_self',
pageType: 'report',
description: '',
objectId: 'zNqBHXHsYH',
},
],
},
{
icon: 'fas fa-cog',
title: 'Settings',
target: '_self',
pageType: null,
description: '',
objectId: null,
children: [
{
icon: 'fas fa-pen-fancy',
title: 'My Signature',
target: '_self',
pageType: 'mf',
description: '',
objectId:
'remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9TaWduLU1pY3JvYXBwVjIvcmVtb3RlRW50cnkuanM=&moduleToLoad=AppRoutes&remoteName=signmicroapp/managesign',
},
{
icon: 'far fa-user',
title: 'Add User',
target: '_self',
pageType: 'form',
description: '',
objectId: 'lM0xRnM3iE',
},
],
},
]);
// TODO: Set the schema here
// Example:
// schema.addString('name').addNumber('cash');
const batch = [revertUserMenu, revertAdminMenu];
return Parse.Object.saveAll(batch, { useMasterKey: true });
};
@@ -0,0 +1,40 @@
/**
*
* @param {Parse} Parse
*/
exports.up = async Parse => {
const className = 'contracts_Template';
const schema = new Parse.Schema(className);
schema.addString('Name');
schema.addString('URL');
schema.addString('Note');
schema.addString('Description');
schema.addArray('Signers');
schema.addBoolean('IsArchive');
schema.addArray('Placeholders');
schema.addPointer('Folder', 'contracts_Template');
schema.addString('Type');
schema.addPointer('CreatedBy', '_User');
schema.addPointer('ExtUserPtr', 'contracts_Users');
schema.addBoolean('EnablePhoneOTP')
schema.addBoolean('EnableEmailOTP')
schema.addBoolean('SendinOrder')
schema.addBoolean('SentToOthers')
schema.addBoolean('AutomaticReminders')
return schema.save();
};
/**
*
* @param {Parse} Parse
*/
exports.down = async Parse => {
const className = 'contracts_Template';
const schema = new Parse.Schema(className);
return schema.purge().then(() => schema.delete());
};
@@ -0,0 +1,23 @@
/**
*
* @param {Parse} Parse
*/
exports.up = async Parse => {
// TODO: set className here
const className = 'contracts_Document';
const schema = new Parse.Schema(className);
schema.addBoolean('IsArchive');
return schema.update();
};
/**
*
* @param {Parse} Parse
*/
exports.down = async Parse => {
// TODO: set className here
const className = 'contracts_Document';
const schema = new Parse.Schema(className);
schema.deleteField('IsArchive');
return schema.update();
};
Binary file not shown.
+3 -1
View File
@@ -69,7 +69,9 @@ if (process.env.SMTP_ENABLE) {
export const config = {
databaseURI:
process.env.DATABASE_URI || process.env.MONGODB_URI || 'mongodb://localhost:27017/dev',
cloud: process.env.CLOUD || __dirname + '/cloud/main.js',
cloud: function () {
import('./cloud/main.js');
},
appId: process.env.APP_ID || 'myAppId',
masterKey: process.env.MASTER_KEY || '', //Add your master key here. Keep it secret!
masterKeyIps: ['0.0.0.0/0', '::1'], // '::1'
-20
View File
@@ -1,20 +0,0 @@
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
-41
View File
@@ -1,41 +0,0 @@
# Website
This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
### Installation
```
$ yarn
```
### Local Development
```
$ yarn start
```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
### Build
```
$ yarn build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
### Deployment
Using SSH:
```
$ USE_SSH=true yarn deploy
```
Not using SSH:
```
$ GIT_USER=<Your GitHub username> yarn deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};
-12
View File
@@ -1,12 +0,0 @@
---
slug: first-blog-post
title: First Blog Post
authors:
name: Gao Wei
title: Docusaurus Core Team
url: https://github.com/wgao19
image_url: https://github.com/wgao19.png
tags: [hola, docusaurus]
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
-44
View File
@@ -1,44 +0,0 @@
---
slug: long-blog-post
title: Long Blog Post
authors: endi
tags: [hello, docusaurus]
---
This is the summary of a very long blog post,
Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
<!--truncate-->
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
-20
View File
@@ -1,20 +0,0 @@
---
slug: mdx-blog-post
title: MDX Blog Post
authors: [slorber]
tags: [docusaurus]
---
Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).
:::tip
Use the power of React to create interactive blog posts.
```js
<button onClick={() => alert('button clicked!')}>Click me!</button>
```
<button onClick={() => alert('button clicked!')}>Click me!</button>
:::
Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

-25
View File
@@ -1,25 +0,0 @@
---
slug: welcome
title: Welcome
authors: [slorber, yangshun]
tags: [facebook, hello, docusaurus]
---
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
Simply add Markdown files (or folders) to the `blog` directory.
Regular blog authors can be added to `authors.yml`.
The blog post date can be extracted from filenames, such as:
- `2019-05-30-welcome.md`
- `2019-05-30-welcome/index.md`
A blog post folder can be convenient to co-locate blog post images:
![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg)
The blog supports tags as well!
**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.
-17
View File
@@ -1,17 +0,0 @@
endi:
name: Endilie Yacop Sucipto
title: Maintainer of Docusaurus
url: https://github.com/endiliey
image_url: https://github.com/endiliey.png
yangshun:
name: Yangshun Tay
title: Front End Engineer @ Facebook
url: https://github.com/yangshun
image_url: https://github.com/yangshun.png
slorber:
name: Sébastien Lorber
title: Docusaurus maintainer
url: https://sebastienlorber.com
image_url: https://github.com/slorber.png
-26
View File
@@ -1,26 +0,0 @@
# Overview
OpenSign™ API offers a robust suite of functionalities for digital document management and electronic signatures. Designed to cater to a wide array of business needs, the API facilitates the creation, signing, and management of digital documents. It ensures secure and efficient processes, complying with international legal standards for electronic signatures.
# Key Features
- **Document Creation**: Allows for the generation of digital documents directly through the API.
- **Template Creation**: Supports the creation and management of document templates for consistent use across various applications.
- **Electronic Signature Integration**: Provides capabilities for incorporating electronic signatures into documents.
- **User Management**: Facilitates the management of user accounts, permissions, and roles within an application.
- **Contacts Management**: Enables efficient handling of contact information and integration with document processes.
- **Compliance and Security**: Ensures all operations adhere to global legal standards for electronic signatures and data security.
- **Customization and Flexibility**: Offers highly customizable workflows, tailored to meet diverse organizational requirements.
- **Cross-Platform Compatibility**: Assures seamless functionality across various platforms and devices.
# Target Audience
- **Developers and IT Professionals**: Implementing digital document management and electronic signature solutions.
- **Businesses and Enterprises**: Seeking efficient and secure digital document workflows.
- **Legal and Compliance Teams**: Requiring digital solutions compliant with legal standards for signatures and document management.
# Usage Scenarios
- Streamlining contract creation and signing processes in corporate environments.
- Managing user permissions and contacts for large-scale document workflows.
- Utilizing templates for standardized document processes in legal, financial, and governmental sectors.
File diff suppressed because it is too large Load Diff
-71
View File
@@ -1,71 +0,0 @@
---
sidebar_position: 1
title: Code of conduct
---
# Code of Conduct for OpenSign
## 1. Introduction
A primary goal of OpenSign is to be inclusive to the largest number of contributors, with the most varied and diverse backgrounds possible. As such, we are committed to providing a friendly, safe, and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof).
This code of conduct outlines our expectations for all those who participate in our community, as well as the consequences for unacceptable behavior.
We invite all those who participate in OpenSign to help us create safe and positive experiences for everyone.
## 2. Open Source Citizenship
A supplemental goal of this Code of Conduct is to increase open source citizenship by encouraging participants to recognize and strengthen the relationships between our actions and their effects on our community.
Communities mirror the societies in which they exist and positive action is essential to counteract the many forms of inequality and abuses of power that exist in society.
## 3. Expected Behavior
The following behaviors are expected and requested of all community members:
- Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community.
- Exercise consideration and respect in your speech and actions.
- Attempt collaboration before conflict.
- Refrain from demeaning, discriminatory, or harassing behavior and speech.
- Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential.
## 4. Unacceptable Behavior
The following behaviors are considered harassment and are unacceptable within our community:
- Violence, threats of violence, or violent language directed against another person.
- Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language.
- Posting or displaying sexually explicit or violent material.
- Posting or threatening to post other peoples personally identifying information ("doxing").
- Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability.
- Inappropriate photography or recording.
- Inappropriate physical contact. You should have someones consent before touching them.
- Unwelcome sexual attention. This includes sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances.
- Deliberate intimidation, stalking or following (online or in person).
- Advocating for, or encouraging, any of the above behavior.
## 5. Consequences of Unacceptable Behavior
Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated.
Anyone asked to stop unacceptable behavior is expected to comply immediately.
If a community member engages in unacceptable behavior, the community organizers may take any action they deem appropriate, up to and including a temporary ban or permanent expulsion from the community without warning (and without refund in the case of a paid event).
## 6. Reporting Guidelines
If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible by emailing [contact@opensignlabs.com](mailto:contact@opensignlabs.com).
[Reporting guidelines](REPORTING_GUIDELINES.md)
## 7. Addressing Grievances
If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify the OpenSign administration with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies.
## 8. Scope
We expect all community participants (contributors, paid or otherwise; sponsors; and other guests) to abide by this Code of Conduct in all community venues—online and in-person—as well as in all one-on-one communications pertaining to community business.
## 9. Contact info
[contact@opensignlabs.com](mailto:contact@opensignlabs.com)
-8
View File
@@ -1,8 +0,0 @@
# Community at OpenSign™
Welcome to the OpenSign™ Community page! OpenSign™ is dedicated to fostering a vibrant and engaging community where members can connect, share ideas and collaborate on the OpenSign™ project. This page provides links to our active social media platforms and community channels, offering various ways for you to join and participate in the OpenSign™ community. Whether you're looking for support, eager to contribute or just want to stay updated, you'll find a platform that suits your preference. Connect with us on Discord for real-time discussions, follow us on Twitter for the latest updates, engage with our professional network on LinkedIn or join our Facebook group for a broader community experience. Join us in our mission to develop OpenSign™ as the premier open-source [alternative to DocuSign](https://www.opensignlabs.com).
- [Discord](https://discord.com/invite/xe9TDuyAyj)
- [Twitter](https://www.twitter.com/opensignhq)
- [LinkedIn](https://www.linkedin.com/company/opensign™/)
- [Facebook](https://www.facebook.com/profile.php?id=61551030403669)
-50
View File
@@ -1,50 +0,0 @@
---
sidebar_position: 4
title: Installation instructions
---
# INSTALLATION INSTRUCTIONS
You can use our app as a cloud version from [OpenSignLabs](https://www.opensignlabs.com)
or follow below instructions to install it on your own infrastructure.
- Localhost(Frontend only)
- Localhost(Docker)
## Localhost(Frontend only)
This is the easiest way to run the frontend application for development or testing purpose without the hassle of installing backend & DB. All the features including document upload, signing, email notifications will work seamlessly from staging backend.
**Warning:** All data, including user accounts and documents, is stored in the staging backend. This data will be erased every time there is a merge to the main branch. As a result, you may need to recreate user accounts repeatedly. If you find that login attempts are failing, it is likely because the data has been cleared due to a recent merge.
Below are the steps to follow -
- [Clone the repository](https://help.github.com/articles/cloning-a-repository/) to your local machine using below command -
```
git clone https://github.com/OpenSignLabs/OpenSign.git
```
- Switch to the newly created OpenSign directory.
```
cd OpenSign
```
- Copy the .env.frontend_dev file to apps/OpenSign/.env using below command(on mac & linux). For windows use COPY command instead.
```
cp .env.frontend_dev apps/OpenSign/.env
```
- Switch to apps/OpenSign directory.
```
cd apps/OpenSign
```
- Install NPM packages using
```
npm install
```
- Run the project locally using
```
npm run start-dev
```
You should be able to access the application from http://localhost:3000 after this.
Create an account by signing-up and start contributing.
## Localhost(Docker)
- Please refer this documentation => [click here](https://docs.opensignlabs.com/docs/self-host/docker/run-locally)
@@ -1,59 +0,0 @@
# OpenSign™ Reporting Guidelines
This document provides guidelines for reporting issues, suggesting enhancements, and submitting pull requests to the [OpenSign™ GitHub repository](https://github.com/OpenSignLabs/OpenSign). Adhering to these guidelines helps maintain the project's quality and efficiency.
## Issues
When creating an issue, include the following:
### Bug Reports
- **Title**: Concise and informative.
- **Description**: Detailed description of the issue.
- **Steps to Reproduce**: Clear steps to reproduce the bug.
- **Expected Behavior**: Describe what you expected to happen.
- **Actual Behavior**: Describe what actually happened.
- **Screenshots**: If applicable, add screenshots to help explain your issue.
- **Environment**: Include details like OS, browser version, and OpenSign™ version.
- **Logs**: Attach relevant logs or error messages.
### Feature Requests
- **Title**: Short and descriptive.
- **Description**: Detailed explanation of the feature and its benefits.
- **Use Case**: Describe a specific use case or problem this feature addresses.
- **Proposed Solution**: If possible, suggest an implementation idea.
- **Additional Context**: Any other information or screenshots.
## Pull Requests
For submitting pull requests, follow these steps:
- **Branch Naming**: Use a short, descriptive name for your branch.
- **Commit Messages**: Write clear, concise commit messages.
- **Description**: Provide a detailed description of changes.
- **Testing**: Describe testing done to validate the changes.
- **Documentation**: Update relevant documentation.
- **Screenshots**: Include before and after screenshots for UI changes.
## Code of Conduct
All contributors are expected to follow the project's [Code of Conduct](https://docs.opensignlabs.com/docs/contribute/CODE_OF_CONDUCT).
## Getting Help
If you need help or have questions:
- Visit our [GitHub Discussions](https://github.com/OpenSignLabs/OpenSign/discussions) page.
- Contact us through our [Discord community](https://discord.com/invite/xe9TDuyAyj).
## Stay Connected
- [Twitter](https://twitter.com/OpenSignHQ)
- [Facebook](https://www.facebook.com/profile.php?id=61551030403669)
- [LinkedIn](https://www.linkedin.com/company/opensign%E2%84%A2/)
- [YouTube](https://www.youtube.com/@opensignhq)
- [Website](http://www.opensignlabs.com)
Thank you for contributing to OpenSign™!
-74
View File
@@ -1,74 +0,0 @@
---
sidebar_position: 1
---
# Contributing to OpenSign
Hello there! Thank you for considering contributing to OpenSign, the open-source alternative to DocuSign. OpenSign is not just a project, but a community endeavor that aims to create a robust, user-friendly, and secure electronic signature solution. Your contributions, irrespective of their size, are valuable in making this vision a reality.
## Table of Contents
1. [Getting Started](#getting-started)
2. [Code of Conduct](#code-of-conduct)
3. [How Can I Contribute?](#how-can-i-contribute)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Enhancements](#suggesting-enhancements)
- [Pull Requests](#pull-requests)
4. [Style Guidelines](#style-guidelines)
- [Git Commit Messages](#git-commit-messages)
- [JavaScript Style Guide](#javascript-style-guide)
5. [Community](#community)
6. [License](#license)
## Getting Started
- Fork the [OpenSign repository](https://github.com/OpenSignLabs/OpenSign) to your GitHub account.
- Clone your fork locally: `git clone https://github.com/your-username/OpenSign.git`
- Create a new branch for your contribution: `git checkout -b feature/your-feature-name`
- Make your contributions.
- Push your branch to your fork: `git push origin feature/your-feature-name`
- Create a Pull Request from your fork to the OpenSign repository.
## Code of Conduct
We expect all our contributors to adhere to the [Code of Conduct](CODE_OF_CONDUCT.md). Please read it thoroughly before contributing.
## How Can I Contribute?
### Reporting Bugs
- Check the [Issues](https://github.com/OpenSignLabs/OpenSign/issues) to see if the bug has already been reported. If it has, add any additional information in the comments.
- If the bug hasnt been reported, create a new issue. Please provide as much information as possible to help maintainers reproduce the bug.
### Suggesting Enhancements
- Use the [Issues](https://github.com/OpenSignLabs/OpenSign/issues) section to suggest any enhancements or new features.
- Clearly describe your suggestion, explaining the problem it solves or the functionality it adds.
### Pull Requests
- Ensure any install or build dependencies are removed before the end of the layer when doing a build.
- Update the README.md with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations, and container parameters.
- You may merge the Pull Request in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you.
## Style Guidelines
### Git Commit Messages
- Use the present tense ("Add feature" not "Added feature")
- Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
- Limit the first line to 72 characters or less
### JavaScript Style Guide
Adhere to the [Standard JavaScript Style Guide](https://standardjs.com).
## Community
Engage with the community on our [Gitter Channel](https://gitter.im/OpenSignLabs/community) or join our monthly community calls. Details can be found on our [Community Page](COMMUNITY.md).
## License
By contributing, you agree that your contributions will be licensed under its [AGPL v3 License](https://github.com/OpenSignLabs/OpenSign/LICENSE).
---
@@ -1,10 +0,0 @@
---
sidebar_position: 2
title: Why am I getting 'Ensure this field is accurately filled and meets all requirements'?
---
# Why am I getting 'Ensure this field is accurately filled and meets all requirements'?
This happens when you leave a field blank or when you dont enter correct values in the field, for example not entering email address in correct format.
At OpenSign we constantly try to improve the user experience our platform offers, in the latest version of OpenSign the field for which the validation has failed is automatically highlighted making it easy to identify & fix the incorrect values being entered.
You can check the bookmark icons on the page previews on the left hand side to quickly find all the pages that have fields meant to be filled by you.
<img width="362" alt="image" src="https://github.com/OpenSignLabs/OpenSign/assets/5486116/0e9458d1-3013-4af8-a98f-c7ff01d5d4f2" />
-7
View File
@@ -1,7 +0,0 @@
---
sidebar_position: 1
title: Why is there no dropdown list when I sign a document myself?
---
# Why is there no dropdown list when I sign a document myself?
The dropdown list field is available only when you request a signature from others or when you create a template. This is because dropdown lists function as temporary widgets, allowing the user to select one of multiple values. Once a signer selects a value from the dropdown, it is embedded into the document as text. When you sign a document yourself, OpenSign digitally signs it immediately upon clicking the finish button. Therefore, you can use the text widget to add the necessary text to the document.
-8
View File
@@ -1,8 +0,0 @@
{
"label": "FAQs",
"position": 6,
"link": {
"type": "generated-index",
"description": "FAQs on Utilizing Various Features of OpenSign™ - The World's Leading Free & Open Source Document Signing Platform."
}
}
@@ -1,8 +0,0 @@
{
"label": "Create New OpenSign Document",
"position": 2,
"link": {
"type": "generated-index",
"description": "5 minutes to learn how to create Document in OpenSign."
}
}
@@ -1,27 +0,0 @@
---
sidebar_position: 4
title: Editing Your Document Before Sending
---
# How to edit a document before sending in OpenSign™?
OpenSign™ lets you polish your PDF before you send it out—whether youre signing it yourself, requesting signatures, or saving it as a template. You get three core editing controls right in the preview:
1. **Add Pages**
* Click the **“+”** icon.
* Upload one or more PDF files.
* New pages are appended to the end of your current document.
2. **Rotate Pages**
* Use the **left-rotate** or **right-rotate** icons on any page.
* See the orientation update instantly in the real-time preview.
3. **Delete Pages**
* Click the **trash bin** icon on the page you want to remove.
* Confirm the deletion when prompted.
* **Warning:** This action is permanent and cannot be undone.
![image](https://github.com/user-attachments/assets/1fd6aad2-3749-4148-ba01-eae8e5cc6a94)
@@ -1,87 +0,0 @@
---
sidebar_position: 4
title: Enforce email OTP verification
---
# How to Use the "Enable OTP Verification" Feature in OpenSign
The "Enable OTP Verification" feature in OpenSign is designed to add an extra layer of security to the document-signing process by verifying the signers email address. Heres an in-depth look at how it works, when to use it, and its impact on the signing process.
## What is OTP Verification?
**OTP (One-Time Password) Verification** is a security feature that requires each signer to enter a unique code sent to their email address before they can sign the document. This ensures that only individuals with access to the specified email address can complete the signing process, adding an extra level of authenticity to each signature.
## How to Enable OTP Verification
1. **Prepare the Document**:
- Navigate to "Main Menu" -> "Request Signatures" & start by uploading the document you want to send for signatures in OpenSign.
2. **Add Signers**:
- Specify the individuals who need to sign the document by entering their email addresses.
3. **Configure Security Settings**:
- Click the "Advanced Options"
- <img width="499" alt="image" src="https://github.com/user-attachments/assets/2f099abb-9421-49fb-b53a-7d9a610a8cfe"/>
- Under **Security Settings**, find the option labeled "Enable OTP Verification."
- Select **Yes** to activate OTP verification for this document.
- <img width="1125" alt="image" src="https://github.com/user-attachments/assets/48d15c53-5eba-407c-8f81-1b17a47f32cb"/>
4. **Send the Document**:
- Once all settings are configured, proceed to send the document to the signers.
## How OTP Verification Works for Signers
When OTP verification is enabled, heres what the signing experience looks like for recipients:
1. **Email Notification**:
- The signer receives an email notification prompting them to review and sign the document.
2. **OTP Verification Prompt**:
- When the signer clicks the link to sign the document, they are required to enter a one-time password (OTP).
- An OTP is sent to the signers email address. They must enter this code on the signing page to proceed.
3. **Document Signing**:
- After entering the correct OTP, the signer gains access to the document and can proceed with adding their signature.
## Benefits of Using OTP Verification
- **Enhanced Security**: Only users with access to the designated email account can sign, reducing the risk of unauthorized access.
- **Reliable Authentication**: Verifying the signers email adds an additional level of validation, helping to ensure the authenticity of each signature.
## Impact on the Completion Certificate
Once the document is fully signed by all parties, OpenSign generates a **Completion Certificate**. This certificate contains detailed information about the signing process, including:
- **Signers Identity**: Each signers name and email address.
- **OTP Verification Status**: If OTP verification was enabled for the document, this is noted in the completion certificate. This notation serves as proof that the signers email address was verified before the document was signed.
This feature makes it clear that the signing process involved OTP verification, adding credibility to the documents legal standing.
## When to Use OTP Verification
Consider enabling OTP verification in scenarios where:
- **Confidentiality** is critical: You want to ensure that only authorized individuals with access to the signers email can view and sign the document.
- **Authentication** is a priority: OTP adds an extra layer of verification, enhancing the documents validity and security.
- **Compliance** is required: Certain regulations or standards may necessitate an additional verification step for document signing.
## Disabling OTP Verification
If OTP verification is unnecessary for a particular document:
1. Under the **Security Settings**, select **No** for the "Enable OTP Verification" option.
2. By disabling OTP verification, recipients can directly access and sign the document without needing to enter an OTP.
## Summary
The "Enable OTP Verification" feature in OpenSign is a powerful tool for ensuring that only verified individuals can sign documents. By sending a unique code to each signers email and requiring it before signing, this feature strengthens security and authenticity. The use of OTP verification is also recorded in the completion certificate, providing a clear record of email verification.
Use OTP verification whenever you need an added layer of email-based security and authenticity in your document signing workflows.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
@@ -1,9 +0,0 @@
---
sidebar_position: 3
title: Navigate between pages of a document
---
# How to navigate between pages of a document in OpenSign™?
To navigate between pages of a document that you have uploaded either click on the previous page `<<` & next page `>>` buttons at the top or click on any of the page previews loaded on the left side -
![image](https://github.com/user-attachments/assets/4d4d8dc1-1197-4b29-90ea-3537389bd1d8)
@@ -1,166 +0,0 @@
---
sidebar_position: 2
title: Request signatures
---
# Request signatures using OpenSign™
## Interface Overview
The OpenSign™ Request signatures interface is designed to streamline the process of creating, preparing, and sending documents for electronic signature.
# How to Create and Send a Document for Signature with OpenSign™
### Step 1: Begin New Document Creation
- **Navigate to Request Signatures form**: Start by navigating to 'Request Signatures' from the main menu to initiate the creation of a document for signatures.
<img width="800" alt="request signatures" src="https://github.com/user-attachments/assets/94112aec-4581-46a5-8e09-b6fc42e9e72a" />
### Step 2: Uploading Your Document
- **[2] Choose File**: Once the "Request signature" form opens, click "Choose file" button to select and upload the document file from your computer that needs to be signed. Currently you can upload only 1 file at a time but you can add additional documents by clicking "Add pages" in the next step.
- **[3] Choose File from Dropbox**: Click the dropbox icon to select the document file from your dropbox account.
### Step 3: Entering Document Details And Signers
- **[4] Title** *(Required)*: Input the title of your document. This identifier will be visible to signers and in your document management.
- **[5] Signers**: Use the dropdown to select existing signers or use the addition button to add a new signer who needs to sign the document. (Here, add the signer's details such as name, email, and phone number).
- **[6] Note**: Optionally add a note to give context or instructions regarding the document.
### Step 4: Organizing Your Document
- **[7] Folder**: Select a folder where you want the document to be stored, or leave it to default to the 'Root' folder. You can browse your documents in a beautiful explorer view by navigating to "OpenSign™ Drive".
### Step 5: Setting the Time Frame
- **[8] Time To Complete (Days)** *(Required)*: Specify the number of days the signers have to complete the signatures. After that, the document will no longer be available for signing.
### Step 6: Set the sending order
- **[9] Send in Order**
- **If you choose:**
- **Yes**: Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.
- **No**: Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.
Select the option that best suits the needs of your document processing.
### Step 7: Auto reminder (feature only available for the subscribed user)
- **[10]** Once you enable the auto reminder, a text field will appear allowing you to set the reminder for a specific number of days.
- **Remind once in every (Days)**: Here, you can set the number of days for the reminder.
### Step 8: Proceed to Document Creation Panel
- **Next**: Once all the necessary fields are filled, click this button to proceed to create the document for signing.
- **Cancel**: If you need to start over or make changes, click this button to clear the form.
### Step 9: Document creation
<img width="800" alt="request signatures" src="https://github.com/user-attachments/assets/b4e6f257-e362-46a7-b809-546f0e5999fc" />
- **[1] Add signature widget**: Once your document is loaded in the document creation panel, you'll need to add a signature widget for each signer. OpenSign provides an intuitive interface for this task. Select the signer from the right side panel, click on the signature widget, and position it where the signature is required.
Use the option on the right side to add recipients if you need to include additional signers. You can place multiple signature widgets for each signer, as required.
After placing the Signature widget, you will see the options on the widget such as:
- **Add Signer/Change Signer**: Clicking the first icon on the signature widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- **Copy Signature**: Clicking on this option reveals the following choices.
- All pages: It will copy the signature widget to all pages.
- All pages but last: It will copy the signature widget to all pages except the last page.
- All pages but first: It will copy the signature widget to all pages except the first page.
- **[2] Add other widgets**: Depending on your needs, you can include additional widgets such as:
- **Stamp**: After placing the Stamp widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can specify whether this widget is mandatory or optional during the document signing.
- Add Signer/Change Signer: Clicking the second option on the stamp widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy Stamp: Clicking on this option reveals the following choices.
- All pages : It will copy the stamp widget to all pages.
- All pages but last: It will copy the stamp widget to all pages except the last page.
- All pages but first: It will copy the stamp widget to all pages except the first page.
- **Initials**: After placing the Initials widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can specify whether this widget is mandatory or optional during the document signing.
- Add Signer/Change Signer: Clicking the first icon on the Initials widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy Initials: Clicking on this option reveals the following choices.
- All pages : It will copy the stamp widget to all pages.
- All pages but last: It will copy the stamp widget to all pages except the last page.
- All pages but first: It will copy the stamp widget to all pages except the first page.
- **Name**: After placing the name widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Name widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the name widget.
- **Job title**: After placing the job title widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Job title widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the job title widget.
- **Company**: After placing the company widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Company widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the Company widget.
- **Date**: After placing the date widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can choose from various date formats.
- Add Signer/Change Signer: Clicking the first icon on the Date widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the date widget.
- **Text**: After placing the Text widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Copy : Clicking on this you can duplicate the Text widget.
- **Text Input**: After placing the Text Input widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Text Input widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the Text Input widget.
- **Checkbox**: Once you drop the checkbox widget, a popup will open where you can set the checkbox name and options. Additionally, there are a few options available such as setting the minimum and maximum checks, making the checkbox read-only, and hiding the label.
- Add Signer/Change Signer: Clicking the first icon on the CheckBox widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the image widget.
- **Dropdown**: Once you drop the dropdown widget, a popup will open where you can set the dropdown name and options. Additionally, there are a few options available such as setting a default value and marking the dropdown as required or optional.
- Add Signer/Change Signer: Clicking the first icon on the Dropdown widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the image widget.
- **Radio button**: Once you drop the radio button widget, a popup will open where you can set the radio button name and options. Additionally, there are a few options available such as setting a default value, making the radio button read-only, and hiding the label.
- Add Signer/Change Signer: Clicking the first icon on the Radio button widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the image widget.
- **Image**: After placing the Image widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can specify whether this widget is mandatory or optional during the document signing.
- Add Signer/Change Signer: Clicking the first icon on the Image widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the image widget.
- **Email**: After placing the email widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Email widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the email widget.
### Step 10: Next:
- **Next**: After adding the widgets and signatures, click the 'Next' button. The document will then be created.
### Step 11: Send Mail
After finishing the document creation, a 'Send Mail' popup will appear, offering options to Send Email, Customize Email, Copy Link, or Share the document.
- Send Email: Click the 'Send' button to send the document for signing to all signers. If the sending order is set to 'Yes', it will send the document to the first signer.
- Customize Email: Click the 'Customize Email' button to open the email editor. Here, you can set variables and customize the content. After clicking 'Send', the document will be sent for signing to all signers, or if the sending order is set to 'Yes', it will be sent to the first signer with the customized email.
- Copy Link: You can copy the link to sign the document.
- Share: Use this option to share the document via email, WhatsApp and other Windows apps
<img width="800" alt="request signatures" src="https://github.com/user-attachments/assets/e2344479-daae-43ff-a61a-14ea98b237d6" />
## Signers Signing Process
### Step 12: Email OTP verification
Once the email is received, the signer can click the 'Sign Here' button. This will open the email verification page. After clicking the 'Get Verification Code' button, an OTP (one-time password) will be sent to the signers email address. Enter the received OTP into the verification textbox and click the 'Verify' button.
<div>
<img width="800" alt="OpenSign send OTP" src="https://github.com/user-attachments/assets/b82c796a-98e3-4296-bde1-fe86b1b993ad" />
</div>
<div>
<img width="800" alt="OpenSign verify otp" src="https://github.com/user-attachments/assets/63cf4b75-9d47-4630-a83c-e916a5c13b3c" />
</div>
### Step 13: Finalizing the Process:
After verification, the signer will be redirected to the document signing page, where he can view the document received for signing. To sign, the signer simply clicks on the signature widget, which allows them to draw, upload a digitally scanned signature, or type the signature.
After filling out all assigned widgets, click the 'Finish' button. Once the document is finished,.
- The signer has the option of downloading or printing the signed document. He will also obtain the completion certificate if he is the final signer.
- If there are more than one signer, the document will be immediately sent to the next signer. Once all signers have finished their signatures, they can download and print the signed document as well as the completion certificate.
<img width="800" alt="OpenSignFinalStep" src="https://github.com/user-attachments/assets/f4783aa0-2879-4ec2-9ddc-16d59f3a1fc0" />
## Additional Information
- All fields marked with an asterisk (*) must be completed before the document can be submitted.
- Ensure that the document format is supported by OpenSign before uploading.
- Signed documents can be accessed in the designated 'Root' folder or the one you have specified.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
@@ -1,86 +0,0 @@
---
sidebar_position: 1
title: Sign your-self
---
# Sign your-self using OpenSign™
## Interface Overview
# How to digitally sign a document using OpenSign™ for free?
OpenSign lets you digitally sign documents that don't need to be sent to anybody with ease. This feature is available in all the plans including **OpenSign free**.
After login, you will be directed to the OpenSign dashboard. From the left-side menu, click on "Sign yourself" or by clicking the button on the Dashboard.
### Step 1: Uploading Your Document
- **[1] Choose File**: Once the "Sign Yourself" page opens, click here to upload the document you want to sign from your computer.
- **[2] Upload from Dropbox**: To upload a document directly from your Dropbox account, click the Dropbox icon. You may need to provide permissions to access the file when you do it for the first time.
```The maximum document size allowed is 10MB.```
### Step 2: Document Information
- **[1] Title** *(Required)*: Enter a title for your document. This will help you identify it later in OpenSign™.
- **[2] Note**: Provide an optional note for further context about the document.
<img width="918" alt="OpenSign_Signyourself" src="https://github.com/user-attachments/assets/41c0f460-23b6-4ab0-befd-7fba8e845c23" />
### Step 3: Document Organization
- **[1] Folder**: Select a folder where you want the document to be stored, or leave it to default to the 'Root' folder. You can browse your documents in a beautiful explorer view by navigating to "OpenSign™ Drive".
- **[2] Root**: This is your default directory. Click the pencil icon to create or choose a different folder.
- **[3] Next**: After filling in all the required fields, click the "Next" button to proceed to the document creation panel.
### Step 4: Document creation and Signing
- **[1] Add signature widget**: Once your document is loaded in the document creation panel, you will need to add a signature widget. OpenSign provides an intuitive interface for this task. Click on the signature widget and position it where the signature is required. You can add multiple signature widgets if needed.
After placing the Signature widget, a popup will appear for drawing the signature.
In the "Draw Signature" popup, you have three options available:
- Draw the signature using your mouse cursor.
- Upload a digitally scanned signature.
- Type the signature using text input.
- Select your signature from "My Signature." (This option is available only if you have uploaded a signature under "My Signature" in Settings.)
- **[2] Add other widgets**: Depending on your needs, you can include additional widgets such as:
- **Stamp**: After dragging and dropping the stamp widget, the "Upload Stamp Image" popup will appear, allowing you to upload an image from your file explorer. Once the stamp is uploaded, you will see the stamp image on the document. Additionally, alongside your stamp image, there is an option to copy the image. Clicking on the copy option presents three choices:
- All pages : It will copy the stamp to all pages.
- All pages but last: It will copy the stamp to all pages except the last page.
- All pages but first: It will copy the stamp to all pages except the first page.
- **Initials**: Click on the initials widget and position it where the initials are required. After placing the Initials widget, a popup will appear for drawing the initials. In the "Draw Initials" popup, you have three options available:
- Draw the initials using your mouse cursor.
- Upload the digitally scanned initials.
- Type the initials using text input.
- **Name**: Once you drop the name widget, you can edit the name. We also provide customization options such as setting the color or font. Additionally, there is a copy option available to duplicate the widget.
- **Job Title**: Once you drop the job title widget, you can edit the job title. Customization options such as setting the color or font are also provided. Additionally, there is a copy option available to copy the widget.
- **Company**: Once you drop the company widget, you can edit the company name. Customization options such as setting the color or font are also provided. Additionally, there is a copy option available to duplicate the widget.
- **Date** : Once you drop the date widget, you can choose from various date formats.
- **Text**: Once you drop the text widget, you can write the text. Customization options such as setting the color or font are also provided. Additionally, there is a copy option available to duplicate the widget.
- **Checkbox**: After dropping the checkbox widget, a popup will open allowing you to set the checkbox name and options. Once you click save, the checkbox will be created on the document. Additionally, a copy option will be available to duplicate the widget.
- **Image** : After dragging and dropping the image widget, the "Upload Image" popup will appear, allowing you to upload an image from your file explorer. Once the image is uploaded, it will be displayed on the document. Additionally, there is an option to duplicate the image.
- **Email**: Once you drop the email widget, you can edit the email. Customization options such as setting the color or font are also provided. Additionally, there is a copy option available to duplicate the widget.
<img width="918" alt="OpenSign_Widgets" src="https://github.com/user-attachments/assets/b73ef535-245c-43c8-98eb-cb43e4720bc5" />
### Step 5: Finalizing the Process:
- **Finish**: After adding the widgets and signatures, click the "Finish" button. This will create a digitally signed document.
### Step 6: Print, download or send the document copy via email
After finishing the document, a "Successfully Signed!" popup will appear, offering options to print, download, or send the document via email.
In the "Add Email Address" text field, enter the email address you want to send the document to, then click the "Send" button to receive a copy of the signed document.
<img width="918" alt="OpenSign_sendEmail" src="https://github.com/user-attachments/assets/7ec61f70-3ffe-4c7e-b911-843919c6d25d" />
## Additional Information
- The fields with an asterisk (*) are mandatory.
- Make sure your document is in PDF, PNG, JPG, JPEG, or DOCX format.
- You can access your signed documents in the folder you've selected by visiting OpenSign™ Drive anytime. You can also access the documents from reports section.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
@@ -1,8 +0,0 @@
{
"label": "Manage Docs using OpenSign™ Drive",
"position": 2,
"link": {
"type": "generated-index",
"description": "5 minutes to learn everything about OpenSign™ Drive."
}
}
@@ -1,92 +0,0 @@
---
sidebar_position: 2
title: Create Docs & Folders
---
# Organize Documents using OpenSign™ Drive
OpenSign Drive offers a streamlined way to manage, sign, and request signatures on your important documents. Whether you're drafting an offer letter or storing signed agreements, organizing your documents effectively is crucial. Heres a step-by-step guide on how to create documents and folders in OpenSign Drive.
### 1. Accessing OpenSign Drive
After logging into OpenSign, navigate to the left-hand sidebar and click on "OpenSign Drive." This will open the OpenSign Drive page where you can see all your stored files.
<img width="828" alt="OpenSign drive" src="https://github.com/user-attachments/assets/1159afaa-e7e4-4f6d-9087-e22ea7a0c840" />
### 2. Creating a New Folder
Organizing your documents into folders helps you keep track of different categories of files.
**Step 1:** In the OpenSign Drive window, look for the "+" icon at the top-right of the screen.
**Step 2:** Click the "+" icon and select "Create Folder" from the dropdown menu.
**Step 3:** A dialog box will prompt you to name your new folder. Enter a descriptive name and hit "Add."
**Step 4:** Your new folder will appear in the main area of OpenSign Drive, ready to store your documents.
<img width="828" alt="Create new folder" src="https://github.com/user-attachments/assets/f0260329-d3b0-4c03-af1b-7231b4f2c6a4" />
### 3. Creating a New Document
To create a document for self-signing or by requesting a signature, you can do so by selecting the appropriate option from OpenSign Drive.
**Step 1:** Click the "+" icon in the top-right corner of OpenSign Drive.
**Step 2:** This time, choose "Sign Yourself" or "Request Signatures" depending on whether you want to sign the document yourself or send it to others for their signatures.
**Step 3:** When you select the "Sign Yourself" or "Request Signature" option, the document creation page will open, allowing you to enter details such as the document title, description, notes, and other necessary information. You can also choose an OpenSign Drive folder to store your document. Once youve selected the folder and created the document, it will be saved in that folder, making it easily accessible from your OpenSign Drive.
<img width="828" alt="Create new document" src="https://github.com/user-attachments/assets/97bd75ec-ea9d-4f1d-b514-b9e04ce856aa" />
### 4. Organizing Documents
After creating or uploading documents, it's crucial to organize them effectively. Here are some options available in OpenSign Drive for managing your documents:
<img width="828" alt="OpenSign Drive Options" src="https://github.com/user-attachments/assets/350c7f0b-7751-419d-85bd-3d4ca68c1485" />
- **Download:** To download a document, right-click on it and select the "Download" option. This will save a copy of the document to your device.
- **Rename:** If you need to rename a document, right-click on it and choose the "Rename" option. This will allow you to edit the document's name.
- **Move:** To move a document to a different folder, right-click on the document and select the "Move" option. You'll see a list of existing folders, along with the option to create a new folder. Select the desired folder or create a new one, then move the document to that location.
- **Delete:** If you wish to delete a document, simply right-click on it and choose the "Delete" option. This will remove the document from your OpenSign Drive.
Organizing your documents properly ensures that you can easily find and manage them whenever needed.
### 5. Managing Documents
OpenSign Drive offers a variety of tools to help you manage your documents efficiently, one of the most useful being the Status Indicators system.
**Status Indicators**
These indicators are represented by different icons on your documents, allowing you to instantly recognize their current status:
- **Signed (Green Check Mark):** This icon signifies that the document has been fully signed and is complete.
- **Pending Signature (Yellow Paper Airplane):** Documents with this icon are awaiting signatures from one or more parties.
- **Draft (Blue Paper Clip):** A Blue Paper Clip indicates that the document is in draft form and has not yet been sent out for signatures.
- **Declined document (Red Exclamation Mark):** This icon highlights documents that require immediate action, indicating that the document has been declined.
- **Expired (Gray Hourglass):** A gray hourglass indicates that the document is expired.
<img width="828" alt="Create new folder" src="https://github.com/user-attachments/assets/b488ef24-3db5-4323-a3b3-ed3c12a04291" />
### 6. Filter and Sort Documents in OpenSign Drive
OpenSign Drive provides a powerful and easy-to-use interface for managing your documents. To help you quickly find and organize your files, OpenSign Drive offers several sorting and filtering options, allowing you to arrange your documents by name or date, in either ascending or descending order.
<img width="861" alt="OpenSign filters" src="https://github.com/user-attachments/assets/af51e68a-730c-4203-8015-54b30da572f6" />
- **Sorting Documents by Name:**
To sort your documents alphabetically:
1. Click on the Sort dropdown menu in the upper right corner of the OpenSign Drive interface.
2. Select "Name" from the dropdown list. This will arrange your documents alphabetically by their titles.
3. You can then choose to order them in ascending (A-Z) or descending (Z-A) order by toggling the "Ascending" or "Descending" option.
- **Sorting Documents by Date:**
If you prefer to sort your documents based on when they were created or modified:
1. Click the Sort dropdown menu in the top right corner.
2. Ensure that "Date" is selected. This will organize your documents based on their creation or modification date.
3. Select "Ascending" to arrange documents from the oldest to the newest, or choose "Descending" to list them from the newest to the oldest.
- **Ascending vs. Descending Order**
- **Ascending Order:** Whether sorting by name or date, selecting "Ascending" will arrange your documents from A to Z (if sorting by name) or from oldest to newest (if sorting by date).
- **Descending Order:** Choosing "Descending" will reverse the order, arranging documents from Z to A (by name) or from newest to oldest (by date).
These sorting features help you keep your documents organized, making it easier to locate specific files quickly, especially when you have a large number of documents stored in your OpenSign Drive.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
@@ -1,18 +0,0 @@
---
sidebar_position: 3
title: Grid vs List view
---
# How to switch between grid view and list view in OpenSign drive
- Navigate to OpenSign drive using the main menu or clicking [this](https://app.opensignlabs.com/opensigndrive) link.
- Click the list view icon on the upper right corner of the screen(marked in green) to switch to list view from gride view -
<img width="1159" alt="OpenSign gridview icon" src="https://github.com/user-attachments/assets/0c03980e-6c28-4ac4-ace2-214d66858d84"></img>
- In case you are already in list view, you will find a button to swith to grid view at the same location(marked in green)
<img width="1164" alt="image" src="https://github.com/user-attachments/assets/566845ac-de2e-4f0a-b758-77833fb6e829"></img>
@@ -1,49 +0,0 @@
# OpenSign™ Drive Interface Documentation
## Overview
This documentation provides an overview of the OpenSign™ Drive interface, detailing its key features, user interface elements and functionality.
![OSD](https://github.com/OpenSignLabs/OpenSign/assets/5486116/e11c7060-15ab-4062-915e-2f47e832f023)
### Interface Elements
- **Navigation Bar**: At the top, displaying the current directory ("OpenSign™ Drive >").
- **Toolbar**:
- `+`: Button to add new documents.
- `Sort Options`: Dropdown to sort files by criteria such as date.
- `View Options`: Toggle between list and grid views.
### File Organization
- **Documents**: Represented by icons with a red PDF symbol.
- `Status Indicator`: Colored dots on the PDF icons represent the document status (e.g., green for 'complete').
- **Folders**: Represented by yellow folder icons.
### Document Information Popup
- Activated by hovering on a document, displaying the following details:
- **Title**: The name of the document.
- **Status**: Current status of the document (e.g., "Draft", "In-progress", "Completed", "Rejected" & "Expired").
- **Created Date**: The date the document was created or uploaded.
- **Additional Notes**: Any pertinent notes or descriptions.
### File and Folder Labels
- **Labels**: Below each icon, providing the name of the file or folder.
- **Status Labels**: Next to file labels, indicating additional status information.
## Interaction Patterns
- **Click**: Select files or folders.
- **Right-click**: Access context-specific actions.
## Accessibility Features
- **Status Colors**: Visually distinct colors for quick status recognition.
- **File Icons**: Large and clear with significant visual cues (PDF symbol).
### Version Information
This interface is current as of 15/01/2024. It is subject to change with future updates to the OpenSign™ Drive.
For further assistance or to report issues, please contact us on hello@opensignlabs.com
@@ -1,21 +0,0 @@
# Rename documents from OpenSign™ Drive
The OpenSign™ Drive interface allows users to rename their documents efficiently.
![rename](https://github.com/OpenSignLabs/OpenSign/assets/5486116/ea3df671-07a8-423d-916b-eb22aa4a1f50)
## Overview of User Interface
- **Toolbar at the top**: Includes options to add a new document (`+` icon), sort documents by date, and change the view layout (grid or list view).
- **Document and Folder Grid**: Displays documents and folders as icons with titles. PDF documents are clearly indicated with a red PDF logo.
- **Status Indicators**: Some documents have colored status labels such as blue (with a lock icon) indicating a secure document, and green (with a checkmark) suggesting completed or signed documents.
- **Selected Document Preview**: When a document is selected, a preview pane appears at the bottom, showing details like Title, Status, Created Date, and Signers involved.
## Renaming a Document
To rename a document in OpenSign™ Drive, follow these steps:
1. **Select the Document**: Hover on the document you wish to rename. The document will be highlighted and its details will be displayed in the preview pane.
2. **Access Rename Option**: Right-click on the selected document to open the context menu and select the 'Rename' option.
3. **Edit the Title**: Enter the new name for the document in the provided field.
4. **Save Changes**: Press 'Enter' to apply the new name to the document.
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Documents",
"position": 2,
"link": {
"type": "generated-index",
"description": "Navigate seamlessly through OpenSign™ reports."
}
}
-48
View File
@@ -1,48 +0,0 @@
---
sidebar_position: 3
title: Completed
---
# Completed documents report
---
The "Completed documents" report within OpenSign serves as a vital tool for managing and reviewing all finalized documents that have been processed through the platform. This guide will walk you through the key features and functionalities of the "Completed documents" report, enabling you to efficiently navigate and manage your signed documents.
```note: In this report, you can only see documents that you own.```
### Navigating to the Completed documents report
1. Once logged into OpenSign, you'll see a navigation panel on the left side of your screen.
2. Click on **"Documents"** to expand the available options.
3. Select **"Completed"** to view the list of documents that have been fully signed and processed.
### Understanding the Completed documents report
The "Completed documents" report is displayed in a tabular format, presenting key information about each finalized document. Below is a breakdown of each column and its purpose:
<img width="816" alt="OpenSign_Signyourself" src="https://github.com/user-attachments/assets/4694c9b3-ca2c-4f27-a9d9-8dca220a4124" />
- **Sr.No:** This column displays the serial number for each document in the list, helping you quickly identify and reference documents.
- **Title:** The "Title" column displays the name of the document.
- **Note:** This section contains any notes that were added during the document's creation process.
- **Folder:** The "Folder" column indicates the location where the document is stored within OpenSign Drive, ensuring you can easily locate the document later.
- **File:** Here, you will find a **"Download"** link that allows you to directly download the completed document to your local device for review or archiving.
- **Owner:** This column shows the name of the person who created the document.
- **Signers:** The "Signers" column displays the names and email addresses of the signers assigned to that document for signature. Click the "View" button to see the signers.
### Action buttons
The "Completed documents" report also includes several actions icons for each document:
- **View Document:** The eye icon allows you to preview the document directly within OpenSign without needing to download it.
- **Delete Document:** The trash bin icon enables you to permanently delete a document from your completed list. Be cautious, as this action cannot be undone.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
-38
View File
@@ -1,38 +0,0 @@
---
sidebar_position: 7
title: Contactbook
---
# Contactbook
The **Contactbook** report in OpenSign enables you to add and manage contacts.
## Accessing Contactbook
To view your Contactbook:
1. Log in to your OpenSign account.
2. Navigate to the left sidebar.
3. Click on the `Contactbook` link under the Documents section.
<img width="828" alt="Add contact" src="https://github.com/user-attachments/assets/80308df4-33a8-41ee-a240-801f775dcec0" />
## Understanding the Contactbook report
### Adding a New Contact:
To add a new contact, click the red plus (+) button located at the top-right corner of the Contactbook page.
This will open a pop-up where you can enter the contacts name, email, and phone number.
The Contactbook page displays a list of contacts with the following columns:
- **Sr.No**: A sequential number for each contact.
- **Name**: The contact's name.
- **Email**: The contacts email address.
- **Phone**: The contacts phone number (if available).
<img width="828" alt="contactbook" src="https://github.com/user-attachments/assets/524a7aa7-594e-412a-ad50-caebc125c1db" />
### Action buttons
- **Delete**: To delete a contact, click on the trash icon located next to the contacts details. This will remove the contact from your Contactbook. A confirmation prompt may appear to prevent accidental deletions.
-44
View File
@@ -1,44 +0,0 @@
---
sidebar_position: 5
title: Declined
---
# The Declined documents report
The "Declined documents" report within OpenSign serves as a vital tool for managing and reviewing all declined documents that have been processed through the platform. This guide will walk you through the key features and functionalities of the "Declined documents" report, enabling you to efficiently navigate and manage your signed documents.
### Navigating to the Declined documents report
1. Once logged into OpenSign, you'll see a navigation panel on the left side of your screen.
2. Click on **"Documents"** to expand the available options.
3. Select **"Declined"** to view the list of documents that have been fully signed and processed.
### Understanding the Declined documents report
The "Declined documents" report is displayed in a tabular format, presenting key information about each finalized document. Below is a breakdown of each column and its purpose:
<img width="816" alt="OpenSign_Signyourself" src="https://github.com/user-attachments/assets/dc55e678-52c0-4e75-a1d5-b5a94690bc33" />
- **Sr.No:** This column displays the serial number for each document in the list, helping you quickly identify and reference documents.
- **Title:** The "Title" column displays the name of the document.
- **Reason:** This section contains the reasons for declining the document.
- **Folder:** The "Folder" column indicates the location where the document is stored within OpenSign Drive, ensuring you can easily locate the document later.
- **File:** Here, you will find a **"Download"** link that allows you to directly download the completed document to your local device for review or archiving.
- **Owner:** This column shows the name of the person who created the document.
- **Signers:** The "Signers" column displays the names and email addresses of the signers assigned to that document for signature. Click the "View" button to see the signers
### Action buttons
The "Declined documents" report also includes several action icons for each document:
- **View Document:** The eye icon allows you to preview the document directly within OpenSign without needing to download it.
- **Delete Document:** The trash bin icon enables you to permanently delete a document from your declined list. Be cautious, as this action cannot be undone.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
-45
View File
@@ -1,45 +0,0 @@
---
sidebar_position: 4
title: Drafts
---
# The Draft documents report
The Draft documents section in OpenSign helps you manage all your in-progress documents easily. This feature allows you to save, review, and edit documents before sending them for signature. Here's a detailed overview of how to navigate and use the Draft Documents report effectively.
### Navigating to the Draft documents report
1. Once logged into OpenSign, you'll see a navigation panel on the left side of your screen.
2. Click on **"Documents"** to expand the available options.
3. Select **"Drafts"** under the Reports section. This will display all your saved draft documents.
### Understanding the Draft documents report
The Draft documents section provides an organized list of all documents that are saved as drafts. Each draft entry contains key details that help you quickly identify and manage your documents. Heres a breakdown of the information available:
<img width="816" alt="Draft documents" src="https://github.com/user-attachments/assets/6f743287-6459-4e93-ad7d-064c1ed68da0" />
- **Sr.No:** This column displays the serial number for each document in the list, helping you quickly identify and reference documents.
- **Title:** The "Title" column displays the name of the document.
- **Note:** This section contains any notes that were added during the document's creation.
- **Folder:** The "Folder" column indicates the location where the document is stored within OpenSign Drive, ensuring you can easily locate the document later.
- **File:** Here, you will find a **"Download"** link that allows you to directly download the drafted document to your local device for review or archiving.
- **Owner:** This column shows the name of the person who created the document.
- **Signers:** The "Signers" column displays the names and email addresses of the signers assigned to that document for signature. Click the "View" button to see the signers.
### Action buttons
The "Draft documents" report also includes several actions icons for each document:
- **Edit:** If you need to make changes to your draft, click the edit (pencil) icon. This will open the document for you to make the necessary modifications before sending it for signatures.
- **Delete:** If a draft is no longer needed, click the trash icon to delete it. Be cautious when using this action as deleted drafts cannot be recovered.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
-46
View File
@@ -1,46 +0,0 @@
---
sidebar_position: 6
title: Expired
---
# Expired documents report
The **Expired documents** report in OpenSign allows you to manage and review documents that have reached their expiration date without being signed. This feature is essential for maintaining an organized record of inactive documents that may require follow-up or archival.
## Accessing Expired documents
To view your expired documents:
1. Log in to your OpenSign account.
2. Navigate to the left sidebar.
3. Click on the `Expired` link under the **Documents** section.
<img width="828" alt="Expired document" src="https://github.com/user-attachments/assets/01f3626f-d694-4d3b-82da-2f2b77693b76" />
## Understanding the Expired documents report
The Expired documents report displays a list of documents that have not been signed by all parties before the designated expiration date. Each entry in the report includes the following information:
- **Title**: The name of the document.
- **Note**: A brief note associated with the document at the time of creation.
- **Folder**: The folder in which the document is stored, helping you organize and locate documents efficiently in OpenSign drive.
- **File**: Link to download the document for offline storage.
- **Owner**: The user who uploaded or owns the document.
- **Signers**: Lists the parties required to sign the document.
### Action buttons
For each expired document, you can perform several actions:
- **Delete**: Deletes the document from your OpenSign account.
- **View**: Opens the document in a viewer within OpenSign, allowing you to review the details and contents of the document.
## Managing Expired documents
Managing your expired documents effectively can help ensure that no important document is overlooked. Consider the following tips:
- **Review Regularly**: Check the Expired documents report periodically to manage documents that require attention.
- **Follow Up**: Contact the signers who have not completed their signatures informing them about the expired documents and resend the documents if necessary.
- **Archive**: Move documents that are no longer active or needed to an archive folder to keep your workspace organized.
By keeping track of your expired documents, you can maintain a clear overview of your document workflows & ensure that all the necessary actions are taken on time.
-70
View File
@@ -1,70 +0,0 @@
---
sidebar_position: 2
title: In Progress
---
# In-Progress documents report
The In-Progress documents report in OpenSign helps you monitor and manage documents that are currently in the signing process. This report enables you to monitor the status of your documents, manually share the document URL, track document progress, resend reminders, revoke access, or delete documents that are no longer required. Heres a detailed guide on how to use the In-Progress documents report effectively.
### Navigating to the In-Progress documents report
1. Once logged into OpenSign, you'll see a navigation panel on the left side of your screen.
2. Click on **"Documents"** to expand the available options.
3. Select **"In progress"** This will display all documents that are currently awaiting signatures or are otherwise in the signing process.
### Understanding the In-Progress documents report
The "In progress documents" report is displayed in a tabular format, presenting key information about each finalized document. Below is a breakdown of each column and its purpose:
<img width="816" alt="Inprogress documents" src="https://github.com/user-attachments/assets/60100998-1412-4331-8842-55fd9dd10307" />
- **Sr.No:** This column displays the serial number for each document in the list, helping you quickly identify and reference documents.
- **Title:** The "Title" column displays the name of the document.
- **Note:** This section contains any notes that were added during the document's creation process.
- **Folder:** The "Folder" column indicates the location where the document is stored within OpenSign Drive, ensuring you can easily locate the document later.
- **File:** Here, you will find a **"Download"** link that allows you to directly download the In-progress document to your local device for review.
- **Status:** This column displays the current status of the document, indicating whether it has been viewed or signed by the signer. Once the signer has viewed or signed the document, the Owner of the document can click "View" to see the activity logs.
<img width="816" alt="Inprogress documents" src="https://github.com/user-attachments/assets/4eb43321-5eec-48ec-a3b6-75e932d31c6c" />
- **Signers:** The "Signers" column displays the names and email addresses of the signers assigned to that document for signature. Click the "View" button to see the signers.
### Action buttons
The "In progress documents" report also includes several actions icons for each document:
- **Share Document:** The "Share" option in the In-Progress Documents report allows you to manually share the signing link of a document with signers or other recipients directly via email. This feature ensures that the signers can easily access the document, even if they have missed the initial notification.
<img width="816" alt="Inprogress documents" src="https://github.com/user-attachments/assets/7c632c2d-c784-4b51-9517-5c6817abd16f" />
Upon clicking the Share icon, a pop-up window titled Copy link will appear. This window provides multiple options to share the document link with designated recipients.
**Heres how to use the options within this pop-up:**
The pop-up will display a list of email addresses of the intended recipients or signers of the document. Each email corresponds to a person who needs access to the document.
-
- **Share Button:** Click the Share button next to the recipients email address to resend the document link directly to that individual. This action provides multiple sharing options, such as copying the link, or sharing it via Outlook, WhatsApp, Messenger, and more.
- **Copy Button:** Click the Copy button next to the email address to copy the unique signing link to your clipboard. You can then paste this link manually into an email, chat, or any other preferred method of communication to share with the recipient.
- **View Document:** The eye icon lets you preview the document directly within OpenSign without downloading it. Here, you can view the document's exact status, including who has signed and how many signers are still pending.
- **Resend:** If a signer has not responded or needs a reminder, use the resend option to send another notification. This ensures that the signing process continues without delay.
<img width="816" alt="resend document" src="https://github.com/user-attachments/assets/c0cb3348-47ca-4d2e-a2d7-81cb3b18a0c6" />
- **Revoke:** If theres a mistake or you need to cancel the document, revoking stops all signing actions immediately. This is useful when changes are needed before re-sending the document.
<img width="816" alt="resend document" src="https://github.com/user-attachments/assets/b2273768-ef81-44cd-95ea-92babee429b6" />
- **Delete :** If the document is outdated or was sent by mistake, you can permanently remove it from the list. Use this action cautiously, as deleted documents cannot be recovered.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
-51
View File
@@ -1,51 +0,0 @@
---
sidebar_position: 1
title: Need your sign
---
# Need your sign report
The "Need your sign" feature in OpenSign is designed to simplify the process of managing documents that require your signature. This guide will walk you through the various elements of the "Need your sign" report, helping you to efficiently navigate and complete your pending signing tasks.
## Accessing the "Need your sign" report
- **Login to OpenSign**: Start by logging into your OpenSign account.
- **Navigate to "Need your sign"**: Once logged in, you will find a navigation panel on the left side of your screen. Under the "Documents" section, click on "Need your sign" to view all documents that require your signature.
## Understanding the "Need your sign" report
Upon clicking "Need your sign," you will be presented with a list of documents awaiting your signature. Here's a breakdown of the key elements within this interface:
- **Sr.No**: This column provides a serial number for each document in the list, allowing for easy identification and reference.
- **Title**: The "Title" column displays the name of the document.
- **Note**: This section includes any notes or instructions related to the document.
- **Folder**: The folder column shows where the document is stored within OpenSign Drive. This helps in organizing and finding documents later on.
- **File**: In this column, a "Download" link is provided, allowing you to download the document directly to your device for offline review or record-keeping.
- **Owner**: The owner column indicates who owns or initiated the document.
- **Signers**: The "Signers" column displays the names and email addresses of the signers assigned to that document for signature. Click the "View" button to see the signers
- **Sign**: The "SIGN" button is prominently displayed next to each document. Clicking this button will open the document in the signing interface, allowing you to review and apply your signature.
### Action buttons
- **View Document**: By clicking "View" under the "Signers" column, you can get more details about the document, including the list of individuals who have already signed or are expected to sign it.
- **Download Document**: The "Download" link in the "File" column provides a quick way to save the document to your local device, ensuring you have a copy for your records.
## Signing a Document
To sign a document:
1. Click the **SIGN** button next to the document you wish to sign.
2. Review the document carefully within the OpenSign interface.
3. Apply your signature following the prompts.
4. Once signed, the document will move from the "Need your sign" section to the "Completed" section, indicating that the signing process is finished.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
-62
View File
@@ -1,62 +0,0 @@
---
sidebar_position: 2
title: API Token
---
# 🔐 API Authentication Setting Up Your `x-api-token`
To authenticate and use OpenSign API endpoints, youll need a valid API token (`x-api-token`).
Follow the steps below to generate one.
> **Note:** You can generate both **Live** and **Sandbox** API tokens from your OpenSign account.
---
## 🧭 Step-by-Step Guide to Generate Your API Token
**Step 1:** Log in to your OpenSign account using valid credentials.
**Step 2:** Navigate to the **Settings** section and click on **API Token**.
<img width="436" alt="Navigate-to-Api-token" src="https://github.com/user-attachments/assets/8079ecb5-ad5b-4ce6-8d6c-14395130a654" />
**Step 3:** On the API Token page, click the **Generate Live API Token** button.
> **Note:** To generate a **Live API Token**, you must upgrade to a **paid plan** — either the **Professional** or **Teams** plan.
<img width="436" alt="Generate token" src="https://github.com/user-attachments/assets/6188ae46-0f40-4de6-9903-33ae0aa4e63f" />
- Your `x-api-token` will now be generated and displayed.
- **Copy this token** — youll need it to authenticate your OpenSign API requests.
---
### 🧪 Sandbox API Token
Youll also find the option to generate a **Sandbox API Token** on the same page.
- **Sandbox API tokens** are available on all plans, including the **free plan**, and are intended for development and testing.
- **Do not upload confidential data** to the Sandbox environment.
---
## 🧠 Frequently Asked Questions
**1. What is the OpenSign Sandbox environment?**
The Sandbox is a testing environment designed for developers to safely experiment with OpenSign APIs and workflows. It mirrors the live environment but with certain limitations.
**2. Can I upload large documents to the Sandbox?**
No. Please avoid uploading documents larger than **5MB** in the Sandbox. It is optimized for lightweight testing only.
**3. Can I use my Live API Token in the Sandbox?**
No. **Live API Tokens do not work** in the Sandbox environment. Youll need to generate a separate token specifically for Sandbox testing.
**4. Why cant I use a live template in the Sandbox?**
Live and Sandbox environments are **separate**. Templates created in the Live environment cannot be used in the Sandbox, and vice versa.
**5. Can I use the API in the free self-hosted environment?**
No. The **free self-hosted version** does not support API token generation.
To use OpenSign APIs in a self-hosted setup, you must upgrade to a **paid self-hosted plan**.
If you need additional assistance setting up OpenSign APIs, feel free to contact our support team at support@opensignlabs.com.
@@ -1,49 +0,0 @@
---
sidebar_position: 8
title: Custom email templates
---
# 📧 Email Templates
## 🚀 Steps to Set Up Custom Email Templates
**Step 1:** Log in to your OpenSign account using valid credentials.
**Step 2:** Navigate to the **Settings** section and click on **Preferences**.
**Step 3:** Click on the **Email** tab. Here, users can configure and edit custom email templates for different stages of the document lifecycle.
<img width="800" alt="add team" src="https://github.com/user-attachments/assets/dc1efaab-c7f9-4f82-abc4-1cafd587f7ce"></img>
---
## ✉️ Request Signature Email
This email is automatically sent to all signers when a document is shared with them for signing.
- Customize the subject line, greeting, message body, and footer to match your tone and branding.
- Use dynamic placeholders like `{{document_title}}`, `{{receiver_name}}`, and `{{signing_url}}` to personalize each message.
- Personalized messages improve open rates and help recipients understand the context of the request.
## 📩 Document Completion Email
This email is sent to all signers and the document owner once the signing process is complete.
- Includes a summary message along with the signed document and completion certificate as attachments.
- Template customization allows teams to reinforce brand messaging post-signature.
- Ideal for legal confirmations, audit trails, and archival communication.
### 🔄 Reset Template Text
Click the **Reset** button to restore the template content to its default version.
Dont forget to click **Save** afterward to apply the changes.
---
## 🛠️ Additional Notes
- All custom email templates support **rich text formatting** and **variables** for dynamic content.
- Changes to templates take immediate effect and apply to all new documents created after the update.
- Organizations can define a consistent template style across all teams to ensure compliance and branding.
> 💡 **Tip:** Preview your templates before saving to ensure correct formatting and placeholder usage.
For more assistance with OpenSign™ features or APIs, contact our support team at **[support@opensignlabs.com](mailto:support@opensignlabs.com)**.
-191
View File
@@ -1,191 +0,0 @@
---
sidebar_position: 4
title: Preferences
---
# 🔧 Preferences
The **Preferences** page in **OpenSign™** allows users and administrators to tailor the signing experience to suit individual, team, or organizational needs. Below is a breakdown of all configurable options and what they control.
---
## 🚀 Steps to Navigate to Preferences
**Step 1:** Log in to your OpenSign account using valid credentials.
**Step 2:** Navigate to the **Settings** section and click on **Preferences**.
---
## 📌 Signature Types Control
The **Allowed Signature Types** section defines which signature methods are available to signers:
- ✅ **Draw**: Create a handwritten signature using a mouse, stylus, or finger.
- ✅ **Type**: Type your name and apply it using pre-set font styles.
- ✅ **Upload**: Upload a scanned or saved image of your signature.
- ✅ **Default**: Use the default signature stored under *My Signature* in settings.
⚙️ The options selected here determine what appears in the signature widget during document creation and signing. You can also change these preferences while creating a document.
---
## 🔄 Multi-Level Signature Type Control
**OpenSign™** introduces flexible control over signature options at three levels:
### 🏢 Organization-Level
Admins can enforce company-wide signing policies by restricting available signature methods platform-wide.
**Step 1:** Open the profile menu and select **Console Application** to launch the console.
**Step 2:** Once the Console Application loads, navigate to the **General** menu. Here, admins can configure the allowed signature types at the organization level.
All users created under your account will only see the signing methods you enable here in their **Preferences**. They will be restricted from using any methods you don't select.
**Example:**
Adam, the administrator of your company account, disables the **Typed** signature option in the **Manage Signature Types** settings. As a result, Ursula, a team member, will no longer see the **Typed** signature option in her preferences.
Ursula can enable or disable any of the remaining three signature methods for each document she creates.
When she sends a document to Sofia, a signer, Sofia will only see the signature methods that Ursula selected during the document creation process.
**Note:** Managing **Signature Types** at the organization level is only available on the **Teams** plan. This feature is not included in the **Professional** or **Free** plans.
![Signature type setup console](https://github.com/user-attachments/assets/c8c3de19-e82e-464a-977b-cdf3fd12aed7)
### 👤 User-Level
Navigate to **Settings > Preferences** to configure user-level signature types.
If a user sets preferred types here, only those will appear when adding signature or initial widgets during document creation.
![Signature type setup preferences](https://github.com/user-attachments/assets/ae413b24-fe53-4aa9-9242-624574f1d7b3)
### 📄 Document-Level
While creating a document, users can specify allowed signature types.
Only these will be available to the signer—useful for legal or regulatory requirements.
![Signature type setup signature widget](https://github.com/user-attachments/assets/d64510e1-df14-44fe-8020-45b17c612238)
---
## 🔔 Notify on Signatures
The document owner can choose to receive email notifications when a document is signed.
- **Yes** Get notified each time a signer completes their part.
- **No** Turn off real-time signature notifications.
This setting can be adjusted while creating a document or template.
Regardless of this preference, a **final completion email**—including the signed document and completion certificate—is **always sent** to both the document owner and all signers.
**Note:** Notify on Signatures feature is only available on the **Professional** and higher plans—it is not included in the **Free** plan.
![Preferences setup](https://github.com/user-attachments/assets/5adad567-6c01-4766-9b10-db3f95ad65d3)
---
## 📬 Send in Order
Decide whether the document should be signed **sequentially** or **simultaneously** by multiple signers.
- **Yes** Signers receive the document in a set order. The next signer gains access only after the previous one completes signing.
- **No** All signers receive the document at once and can sign independently.
> Users can change this option while creating the document or a template.
---
## 🚫 Enable Tour
The tour feature provides guidance for first-time users. You can turn this off for a cleaner, uninterrupted experience:
- **Yes** Show onboarding tips. Enables guided tooltips for the signer during the signing process.
- **No** Disable tour prompts *(recommended for experienced users)*. Speeds up the signing experience.
> Users can change this option while creating the document or a template.
💡 **Tip**: Disable if your users are already familiar with OpenSign™.
---
## 🧭 Timezone & Date Format
Customize the **Timezone** and **Date Format** according to your regional preferences.
These settings are reflected in:
- Document Completion Certificates
- Signing Logs
- Webhooks
### 📅 Date Format
- The selected date format will be applied by default to the date widget if no specific format is chosen during document creation.
- This default format also applies in all API flows.
### 🕒 Time Format
- Supports **12-hour** and **24-hour** formats.
- Affects timestamps in certificates, logs, and webhooks.
![Preferences setup](https://github.com/user-attachments/assets/5bb9ad1a-f3c7-4b6e-9469-1bb003e1eec0)
---
## 🧪 LTV-Enabled Signatures
**LTV (Long-Term Validation)** ensures that signatures remain valid and verifiable even after certificates expire or are revoked.
### 🔐 Key Features:
- Embeds certificate chain
- Includes CRLs and OCSP responses
- Enables offline verification
- Complies with PDF standards like **PAdES**
### 📌 Why It Matters:
Even if a certificate becomes invalid in the future, the LTV-enabled signature remains verifiable.
### ✅ Use Cases:
- Legal Contracts
- Financial or Medical Records
- Long-term archiving requirements
---
## 📧 Email Templates
In the **Preferences > Email** tab, users can customize email templates to personalize communication with signers and stakeholders.
This feature helps maintain brand consistency and enhances engagement throughout the signing workflow.
👉 [📄 Step-by-step guide to setting up custom email templates](https://docs.opensignlabs.com/docs/help/Settings/Custom-email-templates)
**Note:** The custom email templates feature is only available on the **Professional** and higher plans—it is not included in the **Free** plan.
---
## 🔒 Security
The **Security** tab in OpenSign (found under **Settings > Preferences > Security**) allows users to manage key authentication methods to protect their account access.
### 🧩 Features Available:
#### ✅ Two-Factor Authentication (2FA)
Enhance your account security by enabling 2FA. Once activated, you'll enter a time-based code from an authenticator app each time you log in.
#### 🛡️ Passkey Authentication
Passkeys offer a **passwordless**, **phishing-resistant** login experience using your devices built-in security features such as fingerprint, Face ID, or PIN.
👉 For full details on setting up **Two-Factor Authentication (2FA)** and **Passkey Authentication**:
[🔒 View Security Setup Guide](https://docs.opensignlabs.com/docs/help/Settings/SecurityManagement)
For more assistance with OpenSign™ features or APIs, contact our support team at **[support@opensignlabs.com](mailto:support@opensignlabs.com)**.
@@ -1,87 +0,0 @@
---
sidebar_position: 9
title: Security
---
import ReactPlayer from 'react-player';
### ✅ Two-Factor Authentication (2FA)
Two-Factor Authentication (2FA) adds a second layer of security to your account by requiring **not just your password, but also a time-sensitive code** from a trusted device.
#### 🔐 What is 2FA?
2FA combines **something you know** (your password) with **something you have** (like a smartphone or hardware token). This significantly reduces the risk of unauthorized access—even if someone has your password.
#### 🛡️ Benefits:
- Enhances account protection against phishing and brute-force attacks
- Reduces the risk of unauthorized access from compromised credentials
- Helps meet compliance requirements for security-conscious organizations
- Only the account owner with access to the authenticator app can log in
#### 📲 How to Enable:
1. Go to **Settings > Preferences > Security**
2. Click "Setup 2FA" button and scan the displayed QR code with an app like Google Authenticator, Authy, or Microsoft Authenticator.
3. Save the recovery codes in a secure location (they allow access if you lose your phone)
4. Enter the 6-digit verification code shown in your app to complete setup
> 🔁 The verification code refreshes every 30 seconds and is unique to your device.
> 🔐 If 2FA is enabled, you will be prompted for a verification code every time you log in.
#### 📹 Watch the Setup Tutorial:
<div>
<ReactPlayer playing controls url='https://www.youtube.com/watch?v=cgVBBetnbO8' />
</div>
### 🛡️ Passkey Authentication
Passkeys offer **passwordless**, **phishing-resistant**, and **device-bound** sign-in using modern authentication standards.
#### 🔐 What Are Passkeys?
Passkeys are cryptographic credentials tied to your device and identity, replacing traditional passwords. Theyre based on **FIDO2/WebAuthn** standards and work using **public-private key encryption**, making them highly secure.
- Instead of typing passwords, you authenticate using biometrics (like Face ID or fingerprint) or a device PIN.
- A passkey is stored securely on your device and never shared—so even if attackers phish you, they cant steal your login info.
#### 💡 Key Features:
- Use **fingerprint**, **Face ID**, or **device PIN**
- **Passwordless** and **secure** authentication
- Resistant to **phishing** and **credential stuffing**
- Syncs across devices (when using platforms like iCloud Keychain or Google Password Manager)
- Fast, one-tap login experience
#### 🛠 How to Register a Passkey:
1. Go to **Settings > Preferences > Security**
2. Click **Register passkey**
3. Your device prompts biometric or PIN-based authentication
4. On success, the passkey is saved and listed under **Your Passkeys**
> 📌 A passkey is unique to each device/browser combination. You can register multiple passkeys for different environments.
#### 📹 Watch the Setup Tutorial:
<div>
<ReactPlayer playing controls url='https://www.youtube.com/watch?v=lLfcu9oSbew' />
</div>
#### 🧾 Managing Your Passkeys
##### ✏️ Rename:
Click the **pencil icon** to rename a passkey for easy identification.
##### 🗑 Delete:
Click the **trash icon** to remove a passkey.
⚠️ This revokes access via that method and may require alternate login or re-registration.
> 🔐 Tip: Register multiple passkeys on different devices for redundancy and ease of access.
---
For more assistance with OpenSign™ features or APIs, contact our support team at **[support@opensignlabs.com](mailto:support@opensignlabs.com)**.
-102
View File
@@ -1,102 +0,0 @@
---
sidebar_position: 5
title: Manage Teams
---
# 👥 Teams Management in OpenSign
The **Teams** feature in OpenSign allows you to organize your users into structured groups for easier management, permissions control, and streamlined workflow configuration.
---
## 🧭 How to Access the Teams Page
1. Log in to your OpenSign account.
2. In the left-hand sidebar, navigate to **Settings → Teams**.
<img width="436" alt="Navigate-to-Teams" src="https://github.com/user-attachments/assets/2e292fc2-83b9-41b4-b133-451286744547"></img>
---
## 📋 Teams Overview
On the Teams page, you'll see a list of all existing teams. Each row includes:
| Column | Description |
|----------------|------------------------------------------------------------------------------|
| **Sr. No** | Serial number of the team in the list. |
| **Name** | The name of the team. |
| **Parent Team**| The parent team this team belongs to (useful for hierarchical grouping). |
| **Active** | Toggle to activate or deactivate the team. |
| **Edit** | Click the pencil icon to edit the team name or parent team. |
- 🟢 **Active** teams are currently usable across OpenSign modules.
- ⚪ **Inactive** teams are hidden from functional views but not deleted.
---
## Adding a New Team
To create a new team:
1. Click the ** Add Team** button at the top-right of the page.
2. A modal will appear titled **Add Team**.
**Fill in the following details:**
- **Name** (Required): Enter a name for the new team.
- **Parent Team**: Choose a parent group (default is **All Users**).
<img width="436" alt="add team" src="https://github.com/user-attachments/assets/74c042b1-2c31-4d00-81f4-0abeaf0c985c"></img>
3. Click **Submit** to create the team or **Reset** to clear the form.
> 📝 **Tip:** Use parent teams to build a team hierarchy — for example, placing _Marketing_ under _HR_.
<img width="436" alt="New team" src="https://github.com/user-attachments/assets/7f69afeb-c96e-46d4-b5ee-5af9dd656d2a"></img>
---
## 🖊️ Editing an Existing Team
To edit a team:
1. Click the **pencil icon** next to the team name.
2. Modify the team name or parent group.
3. Save the changes.
---
## 🌐 Where You Can Use the Teams
1. **Active teams** are available when creating new users — you can select a team from the dropdown and add multiple users under one team.
<img width="436" alt="create new user" src="https://github.com/user-attachments/assets/3aea0ff3-5aa2-416c-b6cc-7148e7d694e6"></img>
2. You can also **share templates** with teams. Once a template is shared with a team, **all users in that team can access the template**.
<img width="436" alt="Share template" src="https://github.com/user-attachments/assets/22ddde66-7cd9-4e4b-a012-8e1e72043d20"></img>
<img width="436" alt="Share template with team" src="https://github.com/user-attachments/assets/534556ce-1641-44c1-a794-54033ca01376"></img>
---
## 🚫 Deactivating a Team
To deactivate a team, toggle the **Active** switch off. This will:
- Prevent users in this team from logging into their OpenSign accounts.
- Hide the team from the **Teams dropdown** when adding new users.
- Prevent template sharing with deactivated teams.
- Preserve team data for future reactivation and audit purposes.
---
## ️ Notes
- The **All Users** team is the default root and **cannot be deleted**.
- **Deactivated teams** can be re-enabled anytime using the toggle.
- Only users with **administrative privileges** can access and manage the Teams page.
If you require more help, feel free to reach out to our customer support at **support@opensignlabs.com**.
**Happy signing with OpenSign™!**
-216
View File
@@ -1,216 +0,0 @@
---
sidebar_position: 3
title: Webhook
---
# 🔁 Webhook
## 🔔 What is a Webhook?
A **webhook** allows one system (like OpenSign) to automatically send real-time data or notifications to another system (like your server) when a specific event occurs.
Think of it as a **push notification for your backend** — instead of continuously checking for updates (polling), a webhook pushes data to your endpoint **as soon as an event happens**.
---
## 🧠 Simple Example
Suppose you're using OpenSign to collect eSignatures:
- When someone **signs a document**, OpenSign triggers a **POST request** to your server.
- The request includes data such as the document ID, signer email, and signature status.
- Your server can then process this information — for example, update your CRM, trigger a workflow, or send a confirmation email.
---
## 🧭 How to Add a Webhook in OpenSign
**Step 1:** Log in to your OpenSign account using your credentials.
**Step 2:** Navigate to **Settings → Webhook**.
![Navigate to Add Webhook](https://github.com/user-attachments/assets/6b069b6c-d2b7-408b-b7c9-7fbeb55d6c98)
**Step 3:** Click **Add Webhook**.
- A popup will appear. Enter your **Webhook URL** and click **Yes** to save it.
> **Note:** To enable **Live Webhook** support, you must upgrade to a **paid plan** — either the **Professional** or **Teams** plan.
![Add Webhook](https://github.com/user-attachments/assets/ff68b255-a6e6-4a7d-9cef-6dd9e3b6d4e4)
---
## 🧪 Sandbox Webhook
- You can also add webhook for the **Sandbox** environment on the same page.
- **Sandbox webhook** are available on all plans, including the **Free** plan, and are ideal for development and testing.
> **Caution:** Avoid sending sensitive or confidential data to the Sandbox environment.
📘 **API Reference:**
You can also manage your webhooks via our API.
See the API documentation here: [Save/Update Webhook API](https://docs.opensignlabs.com/docs/API-docs/save-update-webhook)
---
## 📋 Supported Webhook Events
OpenSign sends event notifications to your configured webhook URL when any of the following actions occur:
- **Document Created** A document is created.
- **Document Viewed** A signer viewed the document.
- **Document Signed** A signer signed the document.
- **Document Completed** All required signatures are completed.
- **Document Revoked or Declined** The document was revoked or declined.
Each notification is sent as a **POST request** with a **JSON payload** containing relevant event data.
---
### 🔍 Example Payload: `Document Created`
```json
{
"event": "created",
"type": "request-sign",
"objectId": "kpeg6Q2rO7",
"file": "https://legadratw3d.ams3.digitaloceanspaces.com/851de61f62b60a1f62e03232464fa4bf_81wV17MTebsrRoov.pdf?...",
"name": "Sample Test Doc",
"note": "Please review and sign this document",
"description": "",
"signers": [
{
"name": "Peter Mark",
"email": "peter.mark1093@gmail.com",
"phone": "3556567789"
}
],
"createdAt": "Fri, 16 May 2025 15:02:42 IST"
}
```
### 🔍 Example Payload: `Document Viewed`
```json
{
"event": "viewed",
"type": "request-sign",
"objectId": "kpeg6Q2rO7",
"file": "https://legadratw3d.ams3.digitaloceanspaces.com/851de61f62b60a1f62e03232464fa4bf_81wV17MTebsrRoov.pdf?...",
"name": "Sample Test Doc",
"note": "Please review and sign this document",
"description": "",
"signers": [
{
"name": "Peter Mark",
"email": "peter.mark1093@gmail.com",
"phone": "3556567789"
}
],
"viewedBy": "peter.mark1093@gmail.com",
"viewedAt": "Fri, 16 May 2025 16:18:16 IST",
"createdAt": "Fri, 16 May 2025 15:02:28 IST"
}
```
---
### 🔍 Example Payload: `Document Signed`
```json
{
"event": "signed",
"type": "request-sign",
"objectId": "kpeg6Q2rO7",
"file": "https://legadratw3d.ams3.digitaloceanspaces.com/bc2eb56cc9d29a5f222e4a4b5dbbcfbf_signed_sample_test_doc_4858.pdf?...",
"name": "Sample Test Doc",
"note": "Please review and sign this document",
"description": "",
"signer": {
"name": "Peter Mark",
"email": "peter.mark1093@gmail.com",
"phone": "3556567789"
},
"signedAt": "Fri, 16 May 2025 16:18:34 GMT+5:30",
"createdAt": "Fri, 16 May 2025 15:02:28 GMT+5:30"
}
```
---
### 🔍 Example Payload: `Document Completed`
```json
{
"event": "completed",
"type": "request-sign",
"objectId": "kpeg6Q2rO7",
"file": "https://legadratw3d.ams3.digitaloceanspaces.com/bc2eb56cc9d29a5f222e4a4b5dbbcfbf_signed_sample_test_doc_4858.pdf?...",
"certificate": "https://legadratw3d.ams3.digitaloceanspaces.com/9c954912f529acb7e4d065ec0521a63b_certificate.pdf?...",
"name": "Sample Test Doc",
"note": "Please review and sign this document",
"description": "",
"signers": [
{
"name": "Peter Mark",
"email": "peter.mark1093@gmail.com",
"phone": "3556567789"
}
],
"completedAt": "Fri, 16 May 2025 16:18:35 GMT+5:30",
"createdAt": "Fri, 16 May 2025 15:02:28 GMT+5:30"
}
```
---
### 🔍 Example Payload: `Document Declined`
```json
{
"event": "declined",
"type": "request-sign",
"objectId": "1gtDMBHpEY",
"file": "https://legadratw3d.ams3.digitaloceanspaces.com/e90c32a45351eb52eb00e0054ae50566_581ZmOn4CwAqnxSF.pdf?...",
"name": "Sample Test Doc ",
"note": "Please review and sign this document",
"description": "",
"signers": [
{
"name": "Peter Mark",
"email": "peter.mark1093@gmail.com",
"phone": "9283784545554"
}
],
"declinedBy": "peter.mark1093@gmail.com",
"declinedReason": "Invalid date format used.",
"declinedAt": "Fri, 16 May 2025 16:25:38 IST",
"createdAt": "Fri, 16 May 2025 16:24:28 IST"
}
```
---
## ❓ Frequently Asked Questions
### 1. What is the OpenSign Sandbox environment?
The Sandbox is a testing environment designed for developers to safely experiment with OpenSign APIs and workflows. It mirrors the live environment but with testing limitations.
---
### 2. Can I use my Live Webhook in the Sandbox?
No. **Live Webhooks do not work** in the Sandbox environment. You must configure a separate webhook specifically for Sandbox testing.
---
### 3. Can I test all webhook events in the Sandbox?
Yes. The Sandbox environment supports all event types, including `created`, `viewed`, `signed`, `completed`, and `revoked/declined`.
However, some behaviors may be simulated for testing purposes.
---
## 💬 Need Help?
If you need help testing your webhook or integrating it into your application, feel free to reach out to our support team at [support@opensignlabs.com](mailto:support@opensignlabs.com).
**Happy signing with OpenSign™!**
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Settings",
"position": 5,
"link": {
"type": "generated-index",
"description": "5 minutes to learn everything about OpenSign™ configuration."
}
}
@@ -1,19 +0,0 @@
---
sidebar_position: 7
title: Disable DocumentId
---
# How to disable adding the OpenSign™ documentId to signed documents
Whenever a document is signed by all parties, OpenSign™ adds a DocumentId at the top left corner of the digitally signed document.
Using this id you can verify the authenticity of the document at a later date, hence we strongly recommend that you keep this id.
In case you want to disable adding this to your signed documents, turn the 'Disable DocumentId' switch on.
- Click the '⌄' symbol just beside your name on the top right corner
- Click profile
- Click the 'edit' button
- Turn the 'Disable DocumentId' switch to on
- Click 'save'
<img width="436" alt="image" src="https://github.com/OpenSignLabs/OpenSign/assets/5486116/ee4433c7-1af7-4b74-800d-500060c0642d"></img>
Note that this feature will be available only to enterprise plan customers.
-137
View File
@@ -1,137 +0,0 @@
---
sidebar_position: 6
title: Manage users
---
# 👤 User Management
The **User Management** feature in OpenSign allows administrators to add, edit, and manage users within the platform. This functionality is available on **Self-Hosted**, **Teams**, and **Enterprise** plans.
> ✅ Only users with the roles **Admin** or **OrgAdmin** have permission to access and manage users.
---
## 🧭 Accessing User Management
To access the user management panel:
1. Log in to your OpenSign account.
2. In the left-hand sidebar, navigate to **Settings → Users**.
<img width="436" alt="Navigate-to-users" src="https://github.com/user-attachments/assets/9f34201c-fda7-406b-9a78-49a5459269cd"></img>
A list of existing users will be displayed.
---
## Adding a New User
To add a new user:
1. **Click the Add User Button**
2. **Fill in the User Information**
| Field | Required | Description |
|--------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Name** | ✅ Yes | Enter the user's full name. |
| **Email** | ✅ Yes | Enter a valid email address. |
| **Password** | ✅ Yes | The system auto-generates a password. **Copy it immediately** as it will be shown only once. |
| **Phone** | ❌ No | (Optional) Enter the users phone number. |
| **Team** | ✅ Yes | Select the team the user belongs to from the dropdown.<br />_Note: Teams must be created beforehand under **Settings → Teams** (available in Teams & Enterprise plans)._ |
| **Role** | ✅ Yes | Choose one of the following roles: |
| | | - **OrgAdmin**: Full access, including user and team management. |
| | | - **Editor**: Can create and share templates but **cannot manage users**. |
| | | - **User**: Can use templates for signing but **cannot share** them or manage users. |
<img width="436" alt="Add-user-form" src="https://github.com/user-attachments/assets/c176dd4f-257d-42e2-be7f-a05a1f7e4094"></img>
3. **Submit or Cancel**
- Click **Submit** to create the user.
- Click **Cancel** to exit without saving.
> 🔒 **Note:** Once a user is created, the password will not be visible again. If needed, you can use the **"Forgot Password"** option on the login page to reset it.
<img width="436" alt="new user" src="https://github.com/user-attachments/assets/647c40d8-061d-4e0a-b62c-302296e83493"></img>
---
## 🔁 Managing User Status
- **Activate/Deactivate Users**
- Use the toggle in the **Active** column to enable or disable a users account.
- **Deactivated users** will not be able to log in to OpenSign until reactivated.
---
## 🔐 Permissions by Role
| Role | Manage Users | Create Templates | Share Templates with Teams | Use Templates |
|-------------|---------------|------------------|-----------------------------|---------------|
| **OrgAdmin** | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
| **Editor** | ❌ No | ✅ Yes | ✅ Yes | ✅ Yes |
| **User** | ❌ No | ✅ Yes | ❌ No | ✅ Yes |
---
## 👥 Buy More Users (Buy Additional Seats)
OpenSign allows you to create users based on the number of seats included in your selected plan. For example, if your current plan includes **2 users**, you can only create **2 users** by default. To add a **third user**, you must **purchase additional seats**.
### Steps to Buy More Users
1. **Click "Buy more users"**
2. A popup titled **Add Seats** will appear.
3. **Enter Quantity** specify how many additional users (seats) you want to purchase.
4. The **cost** will be calculated automatically based on your plan rate (e.g., USD 100 per user).
5. Click the **Proceed** button to finalize the purchase.
6. The seats will be **immediately added** to your account.
<img width="436" alt="buy-more-seats" src="https://github.com/user-attachments/assets/2e093a64-1b75-4543-b4c4-1186d4c02b09"></img>
7. Once youve purchased additional seats, click the **"+" Add User** button to create the new user.
> 💡 **Tip:** You can also purchase additional seats in advance to avoid interruptions during user onboarding.
---
### 🔢 Understanding "Available Seats"
At the bottom-right of the **Users** page, youll see the **Available seats** status.
<img width="436" alt="seat-availability" src="https://github.com/user-attachments/assets/37c2a5c7-0d4b-4bd2-8fb1-11def9e65b42"></img>
**Example:**
`Available seats: 2/3`
This means:
- **2 seats** are currently available for creating new users.
- **3** is the **total number of user seats** your organization has purchased.
If the available seats count is **0**, you must **buy more seats** before adding new users.
---
## 📌 Frequently Asked Questions (FAQ)
**Q: How do I pay for purchased add-on users?**
**A:** After purchasing additional users (seats), your saved card will be charged automatically, and an invoice will be emailed to your registered address.
If no card is on saved, a payment link will be sent to your email to complete the transaction.
---
## 📣 Need Help?
If you need further assistance, feel free to reach out to our customer support at **support@opensignlabs.com**.
For more support and updates, follow us on:
- 🌐 [Website](http://www.opensignlabs.com)
- 🐦 [Twitter](https://twitter.com/OpenSignHQ)
- 📘 [Facebook](https://www.facebook.com/profile.php?id=61551030403669)
- 💼 [LinkedIn](https://www.linkedin.com/company/opensignhq/)
- 📺 [YouTube](https://www.youtube.com/@opensignhq)
---
Happy signing with **OpenSign™**!
-37
View File
@@ -1,37 +0,0 @@
---
sidebar_position: 1
title: My Signature
---
# Setup "My Signature" in OpenSign
This guide provides instructions on how to save your signature and initials using the OpenSign application. Once saved, you can use them with one click when signing documents. To create your signature, start by clicking the "My Signature" link under "settings" menu.
## Creating and Saving Your Signature
The drawing box on the left is dedicated to this purpose. If you make a mistake or wish to redo your signature, simply click the Clear button below the drawing box to erase it and start over.
## Uploading a Signature Image
Alternatively, if you prefer to use a pre-existing image of your signature, click the "Upload Image" button next to the Signature button. This will prompt you to select an image file from your device. Once uploaded, the image will be displayed in the drawing box, ready to be saved.
<img width="820" alt="create signature and initials" src="https://github.com/user-attachments/assets/6e86e3ed-48e2-47d1-a9b6-f964b13986c5"></img>
## Creating and Saving Your Initials
For creating your initials, use your mouse or a stylus to draw your initials on the drawing box on the right. As with the signature, there is a Clear button available to erase and redo the initials if necessary.
## Saving Your Signature and Initials
After you have drawn your signature and initials or uploaded your signature image, the next step is to save them. Click the Save button located below the drawing areas. This will store your signature and initials in the system, making them readily available for future use.
<img width="820" alt="create signature" src="https://github.com/user-attachments/assets/f999f256-038f-4e91-be7d-e1dceb0cfdec"></img>
Once saved, these can be applied with a single click whenever you need to sign a document within the OpenSign application, streamlining your workflow and ensuring consistency in your document signing process.
## Getting Started
**try OpenSign on cloud** at **[OpenSignLabs](https://app.opensignlabs.com)**.
Or
Get started by deploying a new instance of **OpenSign** by following these [instructions](https://docs.opensignlabs.com/docs/self-host/intro).
-8
View File
@@ -1,8 +0,0 @@
{
"label": "Templates",
"position": 2,
"link": {
"type": "generated-index",
"description": "5 minutes to learn everything about OpenSign™ Templates feature."
}
}
-179
View File
@@ -1,179 +0,0 @@
---
sidebar_position: 1
title: Create Templates
---
## Getting Started
Creating a template in OpenSign is straightforward and can significantly enhance your document workflow. Follow these steps to create a custom template:
# How to Create a Template in OpenSign™
## Step 1:
### Begin New Template Creation
- **Navigate to New template form**: On the left sidebar, click on "Templates" to expand the menu. and Click on the "Create template" option.
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/1cb7610f-c144-4774-85c2-ed7d70e0a73c" />
### Uploading Your Document
- **[1] Choose File**: Once the "New template" page opens, click here to select and upload the document file from your computer that needs to be signed. Supported formats include PDF, PNG, JPG, JPEG, and DOCX.
- **[2] Choose File from Dropbox**: Click the dropbox icon to select the document file from your dropbox account.
### Entering Template Details
- **[3] Title** *(Required)*: Provide a title for your template. For example, "Demo Custom Template."
- **[4] Description**: Optionally add a description to give context or instructions regarding the template.
- **[5] Note**: Optionally add a note to give context or instructions regarding the document.
### Set the sending order
- **[6] Send in Order**
- **If you choose:**
- **Yes**: Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.
- **No**: Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.
Select the option that best suits the needs of your document processing.
### Auto reminder (feature only available for the subscribed user)
- **[7]** Once you enable the auto reminder, a text field will appear allowing you to set the reminder for a specific number of days.
- **Remind once in every (Days)**: Here, you can set the number of days for the reminder.
### Security Setting
- **[8] Enable OTP Verification** :
If set to "Yes," the signer will be required to complete email OTP verification before viewing and signing the document. If "Enable OTP Verification" is set to "No," the signer will not be prompted for OTP verification during the signing process.
- **[9] Enable tour**:
If set to "Yes," the signer will see the tour guide while signing the document. If your signer is familiar with OpenSign and you prefer not to display the tour guide, you can select "No," and the tour guide will not be shown to your signers.
### Proceed to Template Creation Panel
- **Next**: Click the "Next" button to proceed to the next stage of template creation, where you can add widgets and finalize the template.
- **Cancel**: If you need to start over or make changes, click Cancel button to clear the form.
## Step 2:
### Template creation
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/986a0068-e711-4367-91b6-349dc1db8c43" />
- **[1] Define Roles**:
- **Add Roles**: In the roles section on the right, click "+ Add role" to specify the roles involved in the document, such as Candidate, HR, and Manager.
- **[2] Assign Widgets to Roles**: Click on each role to highlight it, then drag and drop the widget to assign it to that role.
- **[1] Assign signature widget**: Select the Role from the right side panel, click on the signature widget, and position it where the signature is required. You can place multiple signature widgets for each Role, as required.
After placing the Signature widget, you will see the options on the widget such as:
- **Add Signer/Change Signer**: Clicking the first icon on the signature widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- **Copy Signature**: Clicking on this option reveals the following choices.
- All pages: It will copy the signature widget to all pages.
- All pages but last: It will copy the signature widget to all pages except the last page.
- All pages but first: It will copy the signature widget to all pages except the first page.
- **[2] Add other widgets**: Depending on your needs, you can include additional widgets such as:
- **Stamp**: After placing the Stamp widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can specify whether this widget is mandatory or optional during the document signing.
- Add Signer/Change Signer: Clicking the second option on the stamp widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy Stamp: Clicking on this option reveals the following choices.
- All pages : It will copy the stamp widget to all pages.
- All pages but last: It will copy the stamp widget to all pages except the last page.
- All pages but first: It will copy the stamp widget to all pages except the first page.
- **Initials**: After placing the Initials widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can specify whether this widget is mandatory or optional during the document signing.
- Add Signer/Change Signer: Clicking the first icon on the Initials widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy Initials: Clicking on this option reveals the following choices.
- All pages : It will copy the stamp widget to all pages.
- All pages but last: It will copy the stamp widget to all pages except the last page.
- All pages but first: It will copy the stamp widget to all pages except the first page.
- **Name**: After placing the name widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Name widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the name widget.
- **Job title**: After placing the job title widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Job title widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the job title widget.
- **Company**: After placing the company widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Company widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the Company widget.
- **Date**: After placing the date widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can choose from various date formats.
- Add Signer/Change Signer: Clicking the first icon on the Date widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the date widget.
- **Text**: After placing the Text widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Copy : Clicking on this you can duplicate the Text widget.
- **Text Input**: After placing the Text Input widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Text Input widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the Text Input widget.
- **Checkbox**: Once you drop the checkbox widget, a popup will open where you can set the checkbox name and options. Additionally, there are a few options available such as setting the minimum and maximum checks, making the checkbox read-only, and hiding the label.
- Add Signer/Change Signer: Clicking the first icon on the CheckBox widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the image widget.
- **Dropdown**: Once you drop the dropdown widget, a popup will open where you can set the dropdown name and options. Additionally, there are a few options available such as setting a default value and marking the dropdown as required or optional.
- Add Signer/Change Signer: Clicking the first icon on the Dropdown widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the image widget.
- **Radio button**: Once you drop the radio button widget, a popup will open where you can set the radio button name and options. Additionally, there are a few options available such as setting a default value, making the radio button read-only, and hiding the label.
- Add Signer/Change Signer: Clicking the first icon on the Radio button widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the image widget.
- **Image**: After placing the Image widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can specify whether this widget is mandatory or optional during the document signing.
- Add Signer/Change Signer: Clicking the first icon on the Image widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the image widget.
- **Email**: After placing the email widget, you will see the options on the widget such as:
- Setting icon: By clicking on the option, you can set the color and font.
- Add Signer/Change Signer: Clicking the first icon on the Email widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- Copy : Clicking on this you can duplicate the email widget.
### Save Template
**Next button**: Once youve organized your widgets and set their properties, simply click the “Next” button to save your template.
After doing so, a “Create document” popup will appear, prompting you with the question: “Do you want to create a document using the template you just created?” Youll have the option to choose either “Yes” or “No.”
**If you select "Yes"**: It will create a document using the template you just created.
**If you select "No"**: You will be redirected to the Manage templates form.
## Step 3:
### Viewing and Managing Templates
<img width="828" alt="Manage Template" src="https://github.com/user-attachments/assets/06b80221-5c42-451c-af03-44cc12e6aa2d" />
On the Manage templates page you will see a list of templates you have created or have access to. The list includes details such as the template title, file, owner, signers, and whether the template is public.
**Download Template**: If you need to download the template file, click on the "Download" link under the "File" column next to the respective template.
**View Signers**: This will display the roles or the list of signers along with their assigned roles, if assigned during template creation.
**Public/Private Toggle**: You can set your template to public or private by toggling the switch under the "Public" column. Public templates can be accessed by anyone via the public URL, allowing them to open and sign the document after registering.
**Use Template**: To use a template, click the "+ USE" button next to the desired template. This will open the template, enabling you to create a document for a signature request. Simply assign the signers and send it for signatures.
**Quick Send**: For faster processing, the Quick Send feature allows you to swiftly create and send a document to a signer using the selected template.
**Edit**: The "Edit" feature is crucial for keeping your document templates up-to-date and relevant. Whether you need to make minor tweaks or major changes, OpenSign's editing capabilities are user-friendly and efficient.
Click on the three dots next to the template you want to edit.
Select "Edit." Make the necessary changes and save them.
**Share With Team**: Collaboration is essential for any successful team, and OpenSign simplifies sharing document templates with your team. Here's how you can utilize the "Share With Team" feature:
Click on the three dots next to the template you want to share.
Select "Share With Team."
**Embed**: The "Embed" option provides you with a code to embed the template into a website or other platforms, allowing users to interact with it directly from the external site.
Click "Embed" to generate the code that can be copied and pasted into your desired web location. We currently support React, HTML/JavaScript and Angular-based websites.
<img width="828" alt="Embed" src="https://github.com/user-attachments/assets/05dcaf5d-07b0-4069-bcd5-83e2daf71e29" />
**Copy template id**: This action copies the unique ID associated with the template, which is useful for embedding or sharing with public users when your template is set to public.
**Copy public URL**: This generates a public link for the template, allowing external users to access it without logging into OpenSign.
Click "Copy Public URL" to generate the link, then share it as needed.
**Delete**: Sometimes, it's necessary to clean up your templates to keep your workspace organized. The "Delete" feature allows you to remove outdated or unnecessary templates with ease.
Click on the three dots next to the template you want to delete.
Select "Delete." Confirm the deletion.
## Additional Information
- The fields with an asterisk (*) are mandatory.
- Make sure your document is in PDF, PNG, JPG, JPEG, or DOCX format.
- You can access your signed documents in the folder you've selected by visiting OpenSign™ Drive anytime. You can also access the documents from reports section.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
-138
View File
@@ -1,138 +0,0 @@
---
sidebar_position: 5
title: Embedding OpenSign templates
---
import ReactPlayer from 'react-player';
# What is OpenSign Template Embedding?
OpenSign Template Embedding allows users to seamlessly integrate public document templates into their websites or applications. By embedding templates, you can provide a direct and interactive signing experience for your users without requiring them to leave your platform. This feature supports various technologies like React, Next.js, HTML, JavaScript, and Angular, making it easy to add signing capabilities to different web projects.
With OpenSign Template Embedding, businesses can offer a streamlined and professional document signing process, enhancing user experience and workflow efficiency.
## How to set up a Public profile, Design templates, and Embed a template?
### Step 1: Set up your Public profile (Username & Tagline)
- **Navigate to your profile**: On the top right, click your profile icon, select "Edit profile," and enter a public username (e.g., "OpenSignPublicProfile").
- **Add a tagline**(Optional): Enter a custom tagline (e.g., "Seal the deal openly") and save the changes.
<img width="828" alt="Set up Public Profile" src="https://github.com/user-attachments/assets/6c9cbd4b-eb1a-4a5b-bb0a-21777621555c" />
### Step 2: Create a new template
- **Navigate to Templates**: On the left sidebar, click "Templates" and select "Create template."
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/95ee5c26-4284-46aa-9de7-3f492ad34feb" />
### Upload your document and fill in the template details:
- **[1] Choose file**: Select the document to upload (supported formats: PDF, PNG, JPG, JPEG, DOCX).
- **[2] Choose file from Dropbox**: Click the dropbox icon to select the document file from your dropbox account.
- **[3] Title** *(Required)*: Provide a title for your template.
- **[4] Description**: Optionally add a description to give context or instructions regarding the template.
- **[5] Note**: Add additional notes or instructions.
- **[6] Send in Order**: Choose "Yes" or "No" for sending in a specific order.
- **[7] Auto reminder**: Set up automatic email reminders for signers.
- **[8] Enable OTP verification** : Choose "Yes" or "No" for requiring email verification via OTP.
- **[9] Enable tour**: Select "Yes" or "No" for enabling the tour feature.
### Proceed to template creation panel
- **Next**: Click the "Next" button to proceed to the next stage of template creation, where you can add widgets and finalize the template.
- **Cancel**: If you need to start over or make changes, click Cancel button to clear the form.
### Step 3: Template creation
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/36a269fb-179b-462e-abc0-f436ec195a4a" />
- **[1] Define roles**:
- **Add Roles**: In the roles section on the right, click "+ Add role" to specify the roles involved in the document, such as Candidate, HR, and Manager.
**Note**: Make sure the public role is positioned at the top if 'Send in Order' is set to Yes; Otherwise, you will not be able to make the template public.
- **[2] Assign widgets to roles**: Click on each role to highlight it, then drag and drop the widget to assign it to that role. The widgets will appear in the same colour as the role name once you drop it on the document.
- **[1] Assign signature widget**: Select the Role from the right side panel, click on the signature widget, and position it where the signature is required. You can place multiple signature widgets for each Role, as required.
- **[2] Add other widgets**: Depending on your needs, you can include additional widgets such as:
Stamps, Initials, Name, Date, Text, Checkbox, and more.
**Important**: Before proceeding, ensure that all roles have assigned signers, except for the public role, since we are making this template public.
### Save template
- **Next button**: Once youve organized your widgets and set their properties, simply click the “Next” button to save your template.
- After doing so, a “Create document” popup will appear, prompting you with the question: “Do you want to create a document using the template you just created?” Youll have the option to choose either “Yes” or “No.”
- Choose "No" you will be redirected to the Manage templates screen.
### Step 4: Managing and Embedding the template
<img width="828" alt="Manage Template" src="https://github.com/user-attachments/assets/4fd68285-d489-4998-bcf1-1cf40eada723" />
On the Manage templates page, you'll see a list of templates you've created or have access to. This list provides details such as the template title, file, owner, signers, and whether the template is public.
- To embed a template, you first need to make it public by clicking the toggle button in the public column of the template.
- A confirmation popup will appear with the message, 'Are you sure you want to make this template public?' You can choose either Yes or No. Select Yes to make the template public.
- A public profile popup will appear, displaying the code to embed the template.
- We support embedding the template in React/Next.js, HTML/JavaScript, and Angular application.
After making the template public, youll have an additional option to view the template embedding code.
To access it:
- Click on the three dots (options menu) next to the template.
- Select the Embed option from the dropdown menu.
**Embed the template in a React or Next.js application**
- Copy the code and paste it into your React or Next.js application.
- Install the required OpenSign dependencies and run your project.
Watch the video below to see how to embed the template in a React or Next.js application.
<div>
<ReactPlayer playing={false} controls url='https://youtu.be/W5tCPVNVNvg?si=IE0k33Gwzt3pwdxF' />
</div>
**Embed the template in an HTML or JavaScript project**
- Copy the code and paste it into your HTML or JavaScript application.
Watch the video below to see how to embed the template in HTML or JavaScript application.
<div>
<ReactPlayer playing={false} controls url='https://youtu.be/0CXZGRiGIjw?si=MqGkTZ1uz-2F-5Qn' />
</div>
**Embed the template in an Angular project**
- Copy the code and paste it into your an Angular application.
- Install the required OpenSign dependencies and run your project.
Watch the video below to see how to embed the template in an Angular application.
<div>
<ReactPlayer playing={false} controls url='https://youtu.be/3zz5flzql8M?si=2TgnLgjd0laCX3fu' />
</div>
### Step 5: Sign the document through the Embed public template.
- Once the document loads, click Sign Now in the top right corner. A popup will appear asking for signer details such as Name, Email, and Phone Number.
- Enter the required details and click Submit.
- You can now fill in the necessary fields within the document's widgets and sign it.
- After you finish signing, the document will be completed and automatically sent to the next signer for their signature.
### Step 6: Print document, Download completion certificate, and Download Document
Youll see options to Print or Download the signed document for your records.
If you are the only signer, the signing process is finished, and you will have the options to Print document, Download completion certificate, and Download document.
## Additional Information
- All fields marked with an asterisk (*) must be completed before the document can be submitted.
- Ensure that the document format is supported by OpenSign before uploading.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!write
-104
View File
@@ -1,104 +0,0 @@
---
sidebar_position: 4
title: Setting up an OpenSign template for public signing
---
# What is the OpenSign Public profile?
The OpenSign Public profile feature offers the ultimate public document signing solution without any need for integrations. With this feature, users can share document templates publicly, allowing anyone to access and sign the documents directly through the shared templates. This streamlines the signing process by providing a seamless, accessible way for public signers to complete documents without additional steps or integrations.
## How to setup Public profile, Design templates, and Enable public signing?
### Step 1: Set up your Public profile (Username & Tagline)
- **Navigate to your profile**: On the top right, click your profile icon, select "Edit profile," and enter a public username (e.g., "OpenSignPublicProfile").
- **Add a tagline**(Optional): Enter a custom tagline (e.g., "Seal the deal openly") and save the changes.
<img width="828" alt="Set up Public Profile" src="https://github.com/user-attachments/assets/6c9cbd4b-eb1a-4a5b-bb0a-21777621555c" />
### Step 2: Create a new template
- **Navigate to Templates**: On the left sidebar, click "Templates" and select "Create template."
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/95ee5c26-4284-46aa-9de7-3f492ad34feb" />
### Upload your document and fill in the template details:
- **[1] Choose file**: Select the document to upload (supported formats: PDF, PNG, JPG, JPEG, DOCX).
- **[2] Choose file from Dropbox**: Click the dropbox icon to select the document file from your dropbox account.
- **[3] Title** *(Required)*: Provide a title for your template.
- **[4] Description**: Optionally add a description to give context or instructions regarding the template.
- **[5] Note**: Add additional notes or instructions.
- **[6] Send in Order**: Choose "Yes" or "No" for sending in a specific order.
- **[7] Auto reminder**: Set up automatic email reminders for signers.
- **[8] Enable OTP verification** : Choose "Yes" or "No" for requiring email verification via OTP.
- **[9] Enable tour**: Select "Yes" or "No" for enabling the tour feature.
### Proceed to template creation panel
- **Next**: Click the "Next" button to proceed to the next stage of template creation, where you can add widgets and finalize the template.
- **Cancel**: If you need to start over or make changes, click Cancel button to clear the form.
### Step 3: Template creation
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/36a269fb-179b-462e-abc0-f436ec195a4a" />
- **[1] Define roles**:
- **Add Roles**: In the roles section on the right, click "+ Add role" to specify the roles involved in the document, such as Candidate, HR, and Manager.
**Note**: Make sure the public role is positioned at the top if 'Send in Order' is set to Yes; Otherwise, you will not be able to make the template public.
- **[2] Assign widgets to roles**: Click on each role to highlight it, then drag and drop the widget to assign it to that role. The widgets will appear in the same colour as the role name once you drop it on the document.
- **[1] Assign signature widget**: Select the Role from the right side panel, click on the signature widget, and position it where the signature is required. You can place multiple signature widgets for each Role, as required.
- **[2] Add other widgets**: Depending on your needs, you can include additional widgets such as:
Stamps, Initials, Name, Date, Text, Checkbox, and more.
**Important**: Before proceeding, ensure that all roles have assigned signers, except for the public role, since we are making this template public.
### Save template
- **Next button**: Once youve organized your widgets and set their properties, simply click the “Next” button to save your template.
- After doing so, a “Create document” popup will appear, prompting you with the question: “Do you want to create a document using the template you just created?” Youll have the option to choose either “Yes” or “No.”
- Choose "No" you will be redirected to the Manage templates screen.
### Step 4: Managing and making template public
<img width="828" alt="Manage Template" src="https://github.com/user-attachments/assets/4fd68285-d489-4998-bcf1-1cf40eada723" />
On the Manage templates page, you'll see a list of templates you've created or have access to. This list provides details such as the template title, file, owner, signers, and whether the template is public.
- To make a template public, click the toggle button in the public column on the template.
- A confirmation popup will appear with the message, 'Are you sure you want to make this template public?' You can choose either Yes or No. Select Yes to make the template public.
- A public profile popup will appear, where you can copy the public URL.
- Copy and share this link, and anyone with it can view your publicly available templates by pasting the URL into their browser.
<img width="828" alt="Manage Template" src="https://github.com/user-attachments/assets/99977728-86de-4913-8d2e-f54ab0b18033" />
### Step 5: Sign the document through the public template.
- Click the Sign now button next to the template you want to sign. Once the document loads, click Sign Now in the top right corner. A popup will appear asking for signer details such as Name, Email, and Phone Number.
- Enter the required details and click Submit.
- You can now fill in the necessary fields within the document's widgets and sign it.
- After you finish signing, the document will be completed and automatically sent to the next signer for their signature.
<img width="828" alt="Signed the template" src="https://github.com/user-attachments/assets/0c667098-1c79-4c6a-b59f-03d20ac85552" />
### Step 6: Print document, Download completion certificate, and Download Document
Youll see options to Print or Download the signed document for your records.
If you are the only signer, the signing process is finished, and you will have the options to Print document, Download completion certificate, and Download document.
## Additional Information
- All fields marked with an asterisk (*) must be completed before the document can be submitted.
- This feature is available on all paid plans.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!write
-111
View File
@@ -1,111 +0,0 @@
---
sidebar_position: 3
title: Quickly Send the Document for Signature Using Template
---
# How to use the OpenSign Quick Send feature to send a document for signature using a template
### Step 1: Begin New Template Creation
- **Navigate to New template form**: On the left sidebar, click on "Templates" to expand the menu. and Click on the "Create template" option.
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/fe7b0bd0-bb45-4f64-8450-83ffb5c3d7fc" />
### Step 2: Uploading Your Document
- **[1] Choose File**: Once the "New template" page opens, click here to select and upload the document file from your computer that needs to be signed. Supported formats include PDF, PNG, JPG, JPEG, and DOCX.
- **[2] Choose File from Dropbox**: Click the dropbox icon to select the document file from your dropbox account.
### Step 3: Entering Template Details
- **[3] Title** *(Required)*: Provide a title for your template. For example, "Demo Custom Template."
- **[4] Description**: Optionally add a description to give context or instructions regarding the template.
- **[5] Note**: Optionally add a note to give context or instructions regarding the document.
### Step 4: Set the sending order
- **[6] Send in Order**
- **If you choose:**
- **Yes**: Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.
- **No**: Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.
Select the option that best suits the needs of your document processing.
### Step 5: Auto reminder (feature only available for the subscribed user)
- **[7]** Once you enable the auto reminder, a text field will appear allowing you to set the reminder for a specific number of days.
- **Remind once in every (Days)**: Here, you can set the number of days for the reminder.
### Step 6: Proceed to Template Creation Panel
- **Next**: Click the "Next" button to proceed to the next stage of template creation, where you can add widgets and finalize the template.
- **Cancel**: If you need to start over or make changes, click Cancel button to clear the form.
### Step 7: Template creation
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/986a0068-e711-4367-91b6-349dc1db8c43" />
- **[1] Define Roles**:
- **Add Roles**: In the roles section on the right, click "+ Add role" to specify the roles involved in the document, such as Candidate, HR, and Manager.
- **[2] Assign Widgets to Roles**: Click on each role to highlight it, then drag and drop the widget to assign it to that role.
- **[1] Assign signature widget**: Select the Role from the right side panel, click on the signature widget, and position it where the signature is required. You can place multiple signature widgets for each Role, as required.
After placing the Signature widget, you will see the options on the widget such as:
- **Add Signer/Change Signer**: Clicking the first icon on the signature widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- **Copy Signature**: Clicking on this option reveals the following choices.
- All pages: It will copy the signature widget to all pages.
- All pages but last: It will copy the signature widget to all pages except the last page.
- All pages but first: It will copy the signature widget to all pages except the first page.
- **[2] Add other widgets**: Depending on your needs, you can include additional widgets such as:
Stamps, Initials, Name, Date, Text, Checkbox, and more.
### Step 8: Save Template
**Next button**: Once youve organized your widgets and set their properties, simply click the “Next” button to save your template.
After doing so, a “Create Document” popup will appear, prompting you with the question: “Do you want to create a document using the template you just created?” Youll have the option to choose either “Yes” or “No.”
**If you select "Yes"**: It will create a document using the template you just created.
**If you select "No"**: You will be redirected to the Manage templates form.
### Step 9: Viewing and Managing Templates
<img width="828" alt="Manage Template" src="https://github.com/user-attachments/assets/86bf3628-987d-4ae2-89c3-b24ec1f6bdc2" />
On the Manage Templates page, you'll see a list of templates you've created or have access to. This list provides details such as the template title, file, owner, signers, and whether the template is public. Youll also find actions like "Use Template," "Quick Send," "Edit," "Delete," and more.
### Step 10: Quick Send
For faster processing, the Quick Send feature allows you to swiftly create and send a document to a signer using the selected template.
<img width="828" alt="Manage Template" src="https://github.com/user-attachments/assets/02334ff3-eab6-4a11-aba2-d95a5cba2935" />
How to Send the Document:
- Click the Quick Send button next to the template in the list.
- A popup will open where you can assign signers to each role by simply adding their email addresses.
- If you need to create multiple documents, click the Add New button.
After adding the signers, click the Send button. This will generate the document and send an email to the signers with a signature request.
## Signers Signing Process
### Step 11: Email OTP verification
Once the email is received, the signer can click the 'Sign Here' button. This will open the email verification page. After clicking the 'Get Verification Code' button, an OTP (one-time password) will be sent to the signers email address. Enter the received OTP into the verification textbox and click the 'Verify' button.
<div>
<img width="800" alt="OpenSign send OTP" src="https://github.com/user-attachments/assets/b82c796a-98e3-4296-bde1-fe86b1b993ad" />
</div>
<div>
<img width="800" alt="OpenSign verify otp" src="https://github.com/user-attachments/assets/63cf4b75-9d47-4630-a83c-e916a5c13b3c" />
</div>
### Step 12: Finalizing the Process:
After verification, the signer will be redirected to the document signing page, where he can view the document received for signing. To sign, the signer simply clicks on the signature widget, which allows them to draw, upload a digitally scanned signature, or type the signature.
After filling out all assigned widgets, click the 'Finish' button. Once the document is finished,.
- The signer has the option of downloading or printing the signed document. He will also obtain the completion certificate if he is the final signer.
- If there are more than one signer, the document will be immediately sent to the next signer. Once all signers have finished their signatures, they can download and print the signed document as well as the completion certificate.
<img width="800" alt="OpenSignFinalStep" src="https://github.com/user-attachments/assets/f4783aa0-2879-4ec2-9ddc-16d59f3a1fc0" />
## Additional Information
- All fields marked with an asterisk (*) must be completed before the document can be submitted.
- Ensure that the document format is supported by OpenSign before uploading.
- Signed documents can be accessed in the designated 'Root' folder or the one you have specified.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!write
-126
View File
@@ -1,126 +0,0 @@
---
sidebar_position: 2
title: Use template to create documents
---
# How to use template to create documents in OpenSign™
### Step 1: Begin New Template Creation
- **Navigate to New template form**: On the left sidebar, click on "Templates" to expand the menu. and Click on the "Create template" option.
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/fe7b0bd0-bb45-4f64-8450-83ffb5c3d7fc" />
### Step 2: Uploading Your Document
- **[1] Choose File**: Once the "New template" page opens, click here to select and upload the document file from your computer that needs to be signed. Supported formats include PDF, PNG, JPG, JPEG, and DOCX.
- **[2] Choose File from Dropbox**: Click the dropbox icon to select the document file from your dropbox account.
### Step 3: Entering Template Details
- **[3] Title** *(Required)*: Provide a title for your template. For example, "Demo Custom Template."
- **[4] Description**: Optionally add a description to give context or instructions regarding the template.
- **[5] Note**: Optionally add a note to give context or instructions regarding the document.
### Step 4: Set the sending order
- **[6] Send in Order**
- **If you choose:**
- **Yes**: Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.
- **No**: Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.
Select the option that best suits the needs of your document processing.
### Step 5: Auto reminder (feature only available for the subscribed user)
- **[7]** Once you enable the auto reminder, a text field will appear allowing you to set the reminder for a specific number of days.
- **Remind once in every (Days)**: Here, you can set the number of days for the reminder.
### Step 6: Proceed to Template Creation Panel
- **Next**: Click the "Next" button to proceed to the next stage of template creation, where you can add widgets and finalize the template.
- **Cancel**: If you need to start over or make changes, click Cancel button to clear the form.
### Step 7: Template creation
<img width="828" alt="Create Template" src="https://github.com/user-attachments/assets/986a0068-e711-4367-91b6-349dc1db8c43" />
- **[1] Define Roles**:
- **Add Roles**: In the roles section on the right, click "+ Add role" to specify the roles involved in the document, such as Candidate, HR, and Manager.
- **[2] Assign Widgets to Roles**: Click on each role to highlight it, then drag and drop the widget to assign it to that role.
- **[1] Assign signature widget**: Select the Role from the right side panel, click on the signature widget, and position it where the signature is required. You can place multiple signature widgets for each Role, as required.
After placing the Signature widget, you will see the options on the widget such as:
- **Add Signer/Change Signer**: Clicking the first icon on the signature widget allows you to change the signer. You can choose from existing signers in the dropdown or add a new signer.
- **Copy Signature**: Clicking on this option reveals the following choices.
- All pages: It will copy the signature widget to all pages.
- All pages but last: It will copy the signature widget to all pages except the last page.
- All pages but first: It will copy the signature widget to all pages except the first page.
- **[2] Add other widgets**: Depending on your needs, you can include additional widgets such as:
Stamps, Initials, Name, Date, Text, Checkbox, and more.
### Step 8: Save Template
**Next button**: Once youve organized your widgets and set their properties, simply click the “Next” button to save your template.
After doing so, a “Create Document” popup will appear, prompting you with the question: “Do you want to create a document using the template you just created?” Youll have the option to choose either “Yes” or “No.”
- **If you select "Yes"**: It will create a document using the template you just created.
- **If you select "No"**: You will be redirected to the Manage templates form.
### Step 9:
**You now have two options to create a document from a template**:
- **1) Instant Document Creation with 'Yes' Option**:
Select the "Yes" option from the popup. This will open the template, enabling you to create a document for a signature request.
<img width="800" alt="request signatures" src="https://github.com/user-attachments/assets/d9b80b9e-390f-4382-9b81-8b91ec2efeba" />
- **2) Create Documents via 'Use Template' in Manage Templates**:
Select the "No" option from the popup, and you'll be redirected to the Manage Templates form. To use a template, click the "+ USE" button next to the desired template. This will open the template and allow you to create a document for a signature request. displaying all the widgets that were set up during template creation.
<img width="800" alt="request signatures" src="https://github.com/user-attachments/assets/e33f63b4-5b1a-430d-9fae-44a6ea316ba2" />
You can view all the widgets configured during template creation and also add, remove, or adjust them as needed. Before sending the document for signatures, it's essential to assign signers to each role.
**Option1**: To assign a signer, simply double-click on any widget corresponding to that role. A popup will appear, allowing you to either select an existing signer or add a new one.
**Option2**: Every widget includes an option to assign a signer. Clicking the second option on the widget allows you to assign the signer, either by selecting from existing signers in the dropdown or by adding a new signer.
### Step 10: Next:
- **Next**: Once the signers are assigned to all the roles, click the "Next" button. The document will then be created.
### Step 11: Send Mail
After finishing the document creation, a 'Send Mail' popup will appear, offering options to Send Email, Customize Email, Copy Link, or Share the document.
- Send Email: Click the 'Send' button to send the document for signing to all signers. If the sending order is set to 'Yes', it will send the document to the first signer.
- Customize Email: Click the 'Customize Email' button to open the email editor. Here, you can set variables and customize the content. After clicking 'Send', the document will be sent for signing to all signers, or if the sending order is set to 'Yes', it will be sent to the first signer with the customized email.
- Copy Link: You can copy the link to sign the document.
- Share: Use this option to share the document via email, WhatsApp and other Windows apps
<img width="800" alt="request signatures" src="https://github.com/user-attachments/assets/e2344479-daae-43ff-a61a-14ea98b237d6" />
## Signers Signing Process
### Step 12: Email OTP verification
Once the email is received, the signer can click the 'Sign Here' button. This will open the email verification page. After clicking the 'Get Verification Code' button, an OTP (one-time password) will be sent to the signers email address. Enter the received OTP into the verification textbox and click the 'Verify' button.
<div>
<img width="800" alt="OpenSign send OTP" src="https://github.com/user-attachments/assets/b82c796a-98e3-4296-bde1-fe86b1b993ad" />
</div>
<div>
<img width="800" alt="OpenSign verify otp" src="https://github.com/user-attachments/assets/63cf4b75-9d47-4630-a83c-e916a5c13b3c" />
</div>
### Step 13: Finalizing the Process:
After verification, the signer will be redirected to the document signing page, where he can view the document received for signing. To sign, the signer simply clicks on the signature widget, which allows them to draw, upload a digitally scanned signature, or type the signature.
After filling out all assigned widgets, click the 'Finish' button. Once the document is finished,.
- The signer has the option of downloading or printing the signed document. He will also obtain the completion certificate if he is the final signer.
- If there are more than one signer, the document will be immediately sent to the next signer. Once all signers have finished their signatures, they can download and print the signed document as well as the completion certificate.
<img width="800" alt="OpenSignFinalStep" src="https://github.com/user-attachments/assets/f4783aa0-2879-4ec2-9ddc-16d59f3a1fc0" />
## Additional Information
- All fields marked with an asterisk (*) must be completed before the document can be submitted.
- Ensure that the document format is supported by OpenSign before uploading.
- Signed documents can be accessed in the designated 'Root' folder or the one you have specified.
If you require more help, feel free to reach out to our customer support on support@opensignlabs.com.
Happy signing with OpenSign™!
-18
View File
@@ -1,18 +0,0 @@
---
sidebar_position: 1
---
import ReactPlayer from 'react-player';
# Intro
🌟Get ready for an electrifying journey at [OpenSign™](https://app.opensignlabs.com), the most incredibly documented open source document signing solution! 🚀 This is your go-to spot for diving deep into everything OpenSign™ has to offer. Whether youre just starting out or youre a seasoned pro eager to uncover even more cool features, weve got you covered with the most awesome, top-notch guides and resources around. Get ready to make the most out of OpenSign™ 🎉📚🔍 Your adventure in excellence starts here! 🌈✨🌟
<div>
<ReactPlayer playing controls url='https://www.youtube.com/watch?v=GY_OP697EiU' />
</div>
## Getting Started
Try OpenSign on cloud at **[OpenSignLabs](https://app.opensignlabs.com)**.
Or
Get started by deploying a new instance of **OpenSign** by following the **[installation guide](https://docs.opensignlabs.com/docs/self-host/intro).**
-47
View File
@@ -1,47 +0,0 @@
---
sidebar_position: 1
---
# Tutorial Intro
Let's discover **Docusaurus in less than 5 minutes**.
## Getting Started
Get started by **creating a new site**.
Or **try Docusaurus immediately** with **[docusaurus.new](https://docusaurus.new)**.
### What you'll need
- [Node.js](https://nodejs.org/en/download/) version 18.0 or above:
- When installing Node.js, you are recommended to check all checkboxes related to dependencies.
## Generate a new site
Generate a new Docusaurus site using the **classic template**.
The classic template will automatically be added to your project after you run the command:
```bash
npm init docusaurus@latest my-website classic
```
You can type this command into Command Prompt, Powershell, Terminal, or any other integrated terminal of your code editor.
The command also installs all necessary dependencies you need to run Docusaurus.
## Start your site
Run the development server:
```bash
cd my-website
npm run start
```
The `cd` command changes the directory you're working with. In order to work with your newly created Docusaurus site, you'll need to navigate the terminal there.
The `npm run start` command builds your website locally and serves it through a development server, ready for you to view at http://localhost:3000/.
Open `docs/intro.md` (this page) and edit some lines: the site **reloads automatically** and displays your changes.
@@ -1,15 +0,0 @@
---
title: Digital Ocean
---
# Digital Ocean
OpenSign application consists of 3 components -
- ReactJS frontend
- NodeJS API
- MongoDB database
You can install all 3 components on digital ocean using the button below -
[![Deploy on DigitalOcean](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/OpenSignLabs/Deploy-OpenSign-to-Digital-Ocean/tree/main&refcode=30db1c901ab0)
**Note:** This button is not intended for production installations because it sets up the OpenSign database within an app platform container that lacks persistent storage. Instead, in the next step, replace the MongoDB connection string with one from a managed MongoDB instance, which you should set up on DigitalOcean.

Some files were not shown because too many files have changed in this diff Show More