Skip to content
Merged

v2.26.0 #1836

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
554 changes: 295 additions & 259 deletions apps/OpenSign/package-lock.json

Large diffs are not rendered by default.

42 changes: 21 additions & 21 deletions apps/OpenSign/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
"dependencies": {
"@formkit/auto-animate": "^0.8.2",
"@imgly/background-removal": "^1.6.0",
"@lottiefiles/dotlottie-react": "^0.14.0",
"@lottiefiles/dotlottie-react": "^0.14.2",
"@pdf-lib/fontkit": "^1.1.1",
"@radix-ui/themes": "^3.2.1",
"@reduxjs/toolkit": "^2.8.2",
"axios": "^1.9.0",
"axios": "^1.10.0",
"date-fns-tz": "^3.2.0",
"file-saver": "^2.0.5",
"i18next": "^23.16.8",
"i18next-browser-languagedetector": "^8.1.0",
"i18next": "^25.3.0",
"i18next-browser-languagedetector": "^8.2.0",
"i18next-http-backend": "^3.0.2",
"jszip": "^3.10.1",
"jwt-decode": "^4.0.0",
Expand All @@ -36,24 +36,24 @@
"react-dom": "^18.3.1",
"react-gtm-module": "^2.0.11",
"react-helmet": "^6.1.0",
"react-i18next": "^15.5.2",
"react-i18next": "^15.5.3",
"react-konva": "^18.2.10",
"react-pdf": "^9.2.1",
"react-quill-new": "^3.4.6",
"react-redux": "^9.2.0",
"react-rnd": "^10.5.2",
"react-router": "^7.6.1",
"react-router": "^7.6.3",
"react-scrollbars-custom": "^4.1.1",
"react-select": "^5.10.1",
"react-signature-canvas": "^1.1.0-alpha.2",
"react-timezone-select": "^3.2.8",
"react-tooltip": "^5.28.1",
"react-tooltip": "^5.29.1",
"reactour": "^1.19.4",
"redux": "^5.0.1",
"regex-parser": "^2.3.1",
"serve": "^14.2.4",
"styled-components": "^5.3.11",
"web-vitals": "^5.0.2",
"web-vitals": "^5.0.3",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
},
"scripts": {
Expand Down Expand Up @@ -94,38 +94,38 @@
}
},
"devDependencies": {
"@babel/core": "^7.27.4",
"@babel/core": "^7.27.7",
"@babel/preset-env": "^7.27.2",
"@babel/preset-react": "^7.27.1",
"@babel/runtime-corejs2": "^7.27.4",
"@babel/runtime-corejs2": "^7.27.6",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/react": "^18.3.23",
"@vitejs/plugin-react": "^4.5.1",
"@vitejs/plugin-react-swc": "^3.10.1",
"@vitest/ui": "^3.2.0",
"@vitejs/plugin-react": "^4.6.0",
"@vitejs/plugin-react-swc": "^3.10.2",
"@vitest/ui": "^3.2.4",
"autoprefixer": "^10.4.21",
"babel-loader": "^10.0.0",
"commitizen": "^4.3.1",
"concurrently": "^9.1.2",
"concurrently": "^9.2.0",
"css-loader": "^7.1.2",
"daisyui": "^4.12.24",
"dotenv": "^16.5.0",
"eslint": "^9.28.0",
"eslint-plugin-prettier": "^5.4.1",
"dotenv": "^16.6.1",
"eslint": "^9.30.0",
"eslint-plugin-prettier": "^5.5.1",
"eslint-plugin-react": "^7.37.5",
"jsdom": "^26.1.0",
"lint-staged": "^16.1.0",
"postcss": "^8.5.4",
"prettier": "^3.5.3",
"lint-staged": "^16.1.2",
"postcss": "^8.5.6",
"prettier": "^3.6.2",
"pretty-quick": "^4.2.2",
"rollup-plugin-node-polyfills": "^0.2.1",
"tailwindcss": "^3.4.17",
"vite": "^6.3.5",
"vite-plugin-svgr": "^4.3.0",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.0"
"vitest": "^3.2.4"
},
"engines": {
"node": "18 || 20 || 22"
Expand Down
10 changes: 9 additions & 1 deletion apps/OpenSign/public/locales/de/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,8 @@
"Rotation-alert": "Seite drehen",
"bulk-import": "Massenimport",
"contacts-file": "Kontaktdatei (xlsx, csv)",
"import-guideline": "Laden Sie eine CSV- oder Excel-Datei mit den Spalten Name, Email und optional Phone hoch. Es werden nur die ersten 100 Kontakte importiert.",
"download-sample": "Beispieldatei herunterladen",
"100-records-only": "Derzeit können Sie nur bis zu 100 Datensätze importieren.",
"csv-excel-support-only": "Laden Sie eine Datei in einem der folgenden Formate hoch: CSV, XLSX oder XLS.",
"contact-imported": "{{imported}} Kontakte wurden importiert. {{failed}} Kontakte konnten nicht importiert werden.",
Expand Down Expand Up @@ -1033,5 +1035,11 @@
"choose-one":"Wählen Sie eine aus",
"search-templates": "Vorlagen durchsuchen…",
"search-documents": "Dokumente suchen…",
"search-contacts": "Kontakte durchsuchen…"
"search-contacts": "Kontakte durchsuchen…",
"invalid-email-found": "Ungültige E-Mail gefunden: {{email}}",
"duplicate-email-found": "Doppelte E-Mail gefunden: {{email}}",
"vertical": "Vertikal",
"horizontal": "Horizontal",
"billing": "Abrechnung",
"console": "Konsole"
}
10 changes: 9 additions & 1 deletion apps/OpenSign/public/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,8 @@
"Rotation-alert": "Rotate page",
"bulk-import": "Bulk import",
"contacts-file": "Contacts file (xlsx, csv)",
"import-guideline": "Upload a CSV or Excel file with columns Name, Email and optional Phone. Only the first 100 records will be imported.",
"download-sample": "Download sample file",
"100-records-only": "Currently you can only import up to 100 records.",
"csv-excel-support-only": "Upload a file in one of the following formats: CSV, XLSX or XLS.",
"contact-imported": "{{imported}} contacts were imported. {{failed}} contacts failed to import.",
Expand Down Expand Up @@ -1033,5 +1035,11 @@
"choose-one":"Choose One",
"search-templates": "Search templates…",
"search-documents": "Search documents…",
"search-contacts": "Search contacts…"
"search-contacts": "Search contacts…",
"invalid-email-found": "Invalid email found: {{email}}",
"duplicate-email-found": "Duplicate email found: {{email}}",
"vertical": "Vertical",
"horizontal": "Horizontal",
"billing": "Billing",
"console": "Console"
}
10 changes: 9 additions & 1 deletion apps/OpenSign/public/locales/es/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,8 @@
"Rotation-alert": "Girar página",
"bulk-import": "Importación masiva",
"contacts-file": "Archivo de contactos (xlsx, csv)",
"import-guideline": "Sube un archivo CSV o Excel con las columnas Name, Email y opcionalmente Phone. Solo se importarán los primeros 100 contactos.",
"download-sample": "Descargar archivo de ejemplo",
"100-records-only": "Currently you can only import up to 100 records.",
"csv-excel-support-only": "Cargue un archivo en uno de los siguientes formatos: CSV, XLSX o XLS.",
"contact-imported": "Se importaron {{imported}} contactos. {{failed}} contactos no pudieron importarse.",
Expand Down Expand Up @@ -1033,5 +1035,11 @@
"choose-one":"Elige uno",
"search-templates": "Buscar plantillas…",
"search-documents": "Buscar documentos…",
"search-contacts": "Buscar contactos…"
"search-contacts": "Buscar contactos…",
"invalid-email-found": "Correo electrónico no válido encontrado: {{email}}",
"duplicate-email-found": "Correo electrónico duplicado encontrado: {{email}}",
"vertical": "Vertical",
"horizontal": "Horizontal",
"billing": "Facturación",
"console": "Consola"
}
10 changes: 9 additions & 1 deletion apps/OpenSign/public/locales/fr/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,8 @@
"Rotation-alert": "Faire pivoter la page",
"bulk-import": "Importation en masse",
"contacts-file": "Fichier de contacts (xlsx, csv)",
"import-guideline": "Téléchargez un fichier CSV ou Excel avec les colonnes Name, Email et éventuellement Phone. Seuls les 100 premiers contacts seront importés.",
"download-sample": "Télécharger un fichier d'exemple",
"100-records-only": "Actuellement, vous ne pouvez importer que 100 enregistrements.",
"csv-excel-support-only": "Veuillez télécharger un fichier dans l'un des formats suivants : CSV, XLSX ou XLS.",
"contact-imported": "{{imported}} contacts ont été importés. {{failed}} contacts n'ont pas pu être importés.",
Expand Down Expand Up @@ -1033,5 +1035,11 @@
"choose-one":"Choisissez-en un",
"search-templates": "Rechercher des modèles…",
"search-documents": "Rechercher des documents…",
"search-contacts": "Rechercher des contacts…"
"search-contacts": "Rechercher des contacts…",
"invalid-email-found": "Adresse e-mail invalide trouvée : {{email}}",
"duplicate-email-found": "Adresse e-mail en double trouvée : {{email}}",
"vertical": "Vertical",
"horizontal": "Horizontal",
"billing": "Facturation",
"console": "Console"
}
14 changes: 11 additions & 3 deletions apps/OpenSign/public/locales/hi/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@
"widgets-name": {
"signature": "हस्ताक्षर",
"stamp": "मोहर",
"initials": "हस्ताक्षर",
"initials": "प्रारंभिक अक्षर",
"name": "नाम",
"job title": "पद",
"company": "कंपनी",
Expand Down Expand Up @@ -389,7 +389,7 @@
"Email-verified-alert-2": "ईमेल पहले से ही सत्यापित है।",
"upload-stamp-image": "मोहर छवि अपलोड करें",
"draw": "आरेखित करें",
"type": "प्रकार",
"type": "टाइप",
"color-type": {
"red": "लाल",
"blue": "नीला",
Expand Down Expand Up @@ -761,6 +761,8 @@
"Rotation-alert": "पृष्ठ घुमाएँ",
"bulk-import": "थोक आयात",
"contacts-file": "संपर्क फ़ाइल (xlsx, csv)",
"import-guideline": "नाम, ईमेल और वैकल्पिक फोन कॉलम वाली CSV या Excel फ़ाइल अपलोड करें। केवल पहले 100 संपर्क आयात किए जाएंगे.",
"download-sample": "उदाहरण फ़ाइल डाउनलोड करें",
"100-records-only": "वर्तमान में आप केवल 100 रिकॉर्ड तक आयात कर सकते हैं।",
"csv-excel-support-only": "निम्नलिखित प्रारूपों में से किसी एक में फ़ाइल अपलोड करें: CSV, XLSX या XLS।",
"contact-imported": "{{imported}} संपर्क आयात किए गए। {{failed}} संपर्क आयात करने में विफल रहे।",
Expand Down Expand Up @@ -1033,5 +1035,11 @@
"choose-one":"एक का चयन",
"search-templates": "टेम्पलेट खोजें…",
"search-documents": "दस्तावेज़ खोजें…",
"search-contacts": "संपर्क खोजें…"
"search-contacts": "संपर्क खोजें…",
"invalid-email-found": "अमान्य ईमेल पाया गया: {{email}}",
"duplicate-email-found": "डुप्लिकेट ईमेल पाया गया: {{email}}",
"vertical": "वर्टिकल",
"horizontal": "हॉरिज़ॉन्टल",
"billing": "बिलिंग",
"console": "कंसोल"
}
10 changes: 9 additions & 1 deletion apps/OpenSign/public/locales/it/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,8 @@
"Rotation-alert": "Ruota pagina",
"bulk-import": "Importazione massiva",
"contacts-file": "File contatti (xlsx, csv)",
"import-guideline": "Carica un file CSV o Excel con le colonne Name, Email e opzionale Phone. Verranno importati solo i primi 100 contatti.",
"download-sample": "Scarica file di esempio",
"100-records-only": "Attualmente puoi importare solo fino a 100 record.",
"csv-excel-support-only": "Carica un file nei seguenti formati: CSV, XLSX o XLS.",
"contact-imported": "{{imported}} contatti importati. {{failed}} contatti non sono stati importati.",
Expand Down Expand Up @@ -1033,5 +1035,11 @@
"choose-one":"Scegline uno",
"search-templates": "Cerca modelli…",
"search-documents": "Cerca documenti…",
"search-contacts": "Cerca contatti…"
"search-contacts": "Cerca contatti…",
"invalid-email-found": "Email non valida trovata: {{email}}",
"duplicate-email-found": "Email duplicata trovata: {{email}}",
"vertical": "Verticale",
"horizontal": "Orizzontale",
"billing": "Fatturazione",
"console": "Console"
}
4 changes: 4 additions & 0 deletions apps/OpenSign/public/sample_contacts.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Name,Email,Phone
John Doe,john@example.com,1234567890
Jane Smith,jane@example.com,9876543210
Foo Bar,foo@example.com,5555555555
27 changes: 22 additions & 5 deletions apps/OpenSign/src/components/BulkSendUi.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ const BulkSendUi = (props) => {
const [isSignatureExist, setIsSignatureExist] = useState();
const [isDisableBulkSend, setIsDisableBulkSend] = useState(false);
const [isLoader, setIsLoader] = useState(false);
const [signers, setSigners] = useState([]);
const [emails, setEmails] = useState([]);
useEffect(() => {
signatureExist();
// eslint-disable-next-line react-hooks/exhaustive-deps
Expand Down Expand Up @@ -47,7 +49,14 @@ const BulkSendUi = (props) => {
(() => {
if (props?.Placeholders?.length > 0) {
let users = [];
let emails = [];
props?.Placeholders?.forEach((element) => {
const signerEmail = element?.email || element?.signerPtr?.Email;

// only add when there's a non-empty signerEmail
if (signerEmail) {
emails = [...emails, signerEmail];
}
if (!element.signerObjId) {
users = [
...users,
Expand All @@ -60,7 +69,10 @@ const BulkSendUi = (props) => {
];
}
});
setEmails(emails);
setForms((prevForms) => [...prevForms, { Id: 1, fields: users }]);
const signer = props.item?.Signers?.filter((x) => x?.objectId);
setSigners(signer);
}
})();
// eslint-disable-next-line
Expand All @@ -82,10 +94,16 @@ const BulkSendUi = (props) => {

function validateEmails(data) {
for (const item of data) {
let email = "";
for (const field of item.fields) {
if (!emailRegex.test(field.email)) {
alert(`Invalid email found: ${field.email}`);
alert(t("invalid-email-found", { email: field.email }));
return false;
} else if (email === field.email || emails?.includes(field.email)) {
alert(t("duplicate-email-found", { email: field.email }));
return false;
} else {
email = field.email;
}
}
}
Expand Down Expand Up @@ -143,15 +161,14 @@ const BulkSendUi = (props) => {
Documents.push({
...props.item,
Placeholders: updatedPlaceholders,
Signers: props.item.Signers
? [...props.item.Signers, ...existSigner]
: [...existSigner]
Signers: signers ? [...signers, ...existSigner] : [...existSigner]
});
} else {
Documents.push({
...props.item,
Placeholders: updatedPlaceholders,
SignatureType: props.signatureType
SignatureType: props.signatureType,
Signers: signers
});
}
});
Expand Down
2 changes: 1 addition & 1 deletion apps/OpenSign/src/components/Header.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => {

return (
<div>
<div className="op-navbar bg-base-100 shadow">
<div className="op-navbar bg-base-100 shadow touch-none">
<div className="flex-none">
<button
className="op-btn op-btn-square op-btn-ghost focus:outline-none hover:bg-transparent op-btn-sm no-animation"
Expand Down
2 changes: 1 addition & 1 deletion apps/OpenSign/src/components/dashboard/DashboardCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ const DashboardCard = (props) => {
);
let arr = [];
for (const obj of listData) {
const isSigner = obj.Signers.some(
const isSigner = obj.Signers?.some(
(item) => item.UserId.objectId === currentUser.id
);
if (isSigner) {
Expand Down
2 changes: 1 addition & 1 deletion apps/OpenSign/src/components/dashboard/DashboardReport.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ function DashboardReport(props) {
const listData = res.data?.result.filter((x) => x.Signers.length > 0);
let arr = [];
for (const obj of listData) {
const isSigner = obj.Signers.some(
const isSigner = obj.Signers?.some(
(item) => item.UserId.objectId === currentUser
);
if (isSigner) {
Expand Down
5 changes: 2 additions & 3 deletions apps/OpenSign/src/components/opensigndrive/DriveBody.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ function DriveBody(props) {
</tr>
)
) : listType === "list" && data.Type === "Folder" ? (
<div key={ind} className="relative w-[100px] h-[100px] mx-2 my-3">
<div className="relative w-[100px] h-[100px] mx-2 my-3">
<ContextMenu.Root>
<ContextMenu.Trigger className="flex flex-col justify-center items-center select-none-cls">
{/* folder */}
Expand Down Expand Up @@ -447,7 +447,6 @@ function DriveBody(props) {
)}
</div>
</ContextMenu.Trigger>

<ContextMenu.Portal>
<ContextMenu.Content
className="ContextMenuContent"
Expand Down Expand Up @@ -641,7 +640,7 @@ function DriveBody(props) {
) : (
<div className="flex flex-row flex-wrap items-center mt-1 pb-[20px] mx-[5px]">
{props.pdfData.map((data, ind) => {
return <div key={ind}>{handleFolderData(data, ind, "list")}</div>;
return <React.Fragment key={ind}>{handleFolderData(data, ind, "list")}</React.Fragment>;
})}
</div>
)}
Expand Down
4 changes: 2 additions & 2 deletions apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -389,8 +389,8 @@ function DropdownWidgetOption(props) {
checked={layout.toLowerCase() === data.toLowerCase()}
onChange={() => setLayout(data.toLowerCase())}
/>
<label className="text-[13px] font-500 mb-0 capitalize">
{data}
<label className="text-[13px] font-500 mb-0">
{t(data)}
</label>
</div>
))}
Expand Down
Loading