From 7930a8f439e80f56e749b07b25447588eee1c1ac Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Mon, 30 Jun 2025 07:37:32 +0000 Subject: [PATCH 1/4] Merge pull request #917 from nxglabs/handle_appid fix: handle undefine appId --- apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx | 7 +++++-- apps/OpenSignServer/Utils.js | 1 + apps/OpenSignServer/cloud/customRoute/docxtopdf.js | 4 ++-- apps/OpenSignServer/cloud/customRoute/uploadFile.js | 4 ++-- apps/OpenSignServer/cloud/parsefunction/AddAdmin.js | 4 ++-- .../OpenSignServer/cloud/parsefunction/AuthLoginAsMail.js | 4 ++-- apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js | 4 ++-- apps/OpenSignServer/cloud/parsefunction/GetTemplate.js | 4 ++-- .../cloud/parsefunction/createBatchContact.js | 4 ++-- .../OpenSignServer/cloud/parsefunction/createBatchDocs.js | 4 ++-- apps/OpenSignServer/cloud/parsefunction/getDocument.js | 4 ++-- apps/OpenSignServer/cloud/parsefunction/getDrive.js | 4 ++-- apps/OpenSignServer/cloud/parsefunction/getReport.js | 4 ++-- apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js | 3 ++- apps/OpenSignServer/cloud/parsefunction/usersignup.js | 4 ++-- apps/OpenSignServer/index.js | 8 ++++---- 16 files changed, 36 insertions(+), 31 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx b/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx index 89240dbe7d..88e69f8522 100644 --- a/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx +++ b/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx @@ -694,17 +694,20 @@ function WidgetsValueModal(props) { } } if (isTab === "type") { + //trim user name or typed name value to show in initial signature const trimmedName = typedSignature ? typedSignature?.trim() : currentUserName?.trim(); + //get full name of user + const fullUserName = typedSignature || currentUserName const firstCharacter = trimmedName?.charAt(0); const userName = currWidgetsDetails?.type === "initials" ? firstCharacter - : typedSignature; + : fullUserName; const signatureValue = currWidgetsDetails?.typeSignature; setTypedSignature(signatureValue || userName || ""); - convertToImg(fontSelect, userName); + convertToImg(fontSelect, signatureValue || userName || ""); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [isTab]); diff --git a/apps/OpenSignServer/Utils.js b/apps/OpenSignServer/Utils.js index b774f06567..0d2cd51023 100644 --- a/apps/OpenSignServer/Utils.js +++ b/apps/OpenSignServer/Utils.js @@ -7,6 +7,7 @@ import axios from 'axios'; dotenv.config(); export const cloudServerUrl = 'http://localhost:8080/app'; +export const serverAppId = process.env.APP_ID || 'opensign'; export const appName = 'OpenSign™'; export const MAX_NAME_LENGTH = 250; diff --git a/apps/OpenSignServer/cloud/customRoute/docxtopdf.js b/apps/OpenSignServer/cloud/customRoute/docxtopdf.js index 76f8f3567f..0476d83d3d 100644 --- a/apps/OpenSignServer/cloud/customRoute/docxtopdf.js +++ b/apps/OpenSignServer/cloud/customRoute/docxtopdf.js @@ -3,7 +3,7 @@ import axios from 'axios'; import multer from 'multer'; import libre from 'libreoffice-convert'; import util from 'node:util'; -import { cloudServerUrl, getSecureUrl } from '../../Utils.js'; +import { cloudServerUrl, getSecureUrl, serverAppId } from '../../Utils.js'; libre.convertAsync = util.promisify(libre.convert); @@ -29,7 +29,7 @@ function generatePdfName(length) { export default async function docxtopdf(req, res) { const serverUrl = cloudServerUrl; - const appId = process.env.APP_ID; + const appId = serverAppId; const masterKey = process.env.MASTER_KEY; const inputPath = req.file.path; const name = generatePdfName(16); diff --git a/apps/OpenSignServer/cloud/customRoute/uploadFile.js b/apps/OpenSignServer/cloud/customRoute/uploadFile.js index 73389319fb..5eee3a4b67 100644 --- a/apps/OpenSignServer/cloud/customRoute/uploadFile.js +++ b/apps/OpenSignServer/cloud/customRoute/uploadFile.js @@ -3,7 +3,7 @@ import multer from 'multer'; import multerS3 from 'multer-s3'; import aws from 'aws-sdk'; import dotenv from 'dotenv'; -import { cloudServerUrl, useLocal } from '../../Utils.js'; +import { cloudServerUrl, serverAppId, useLocal } from '../../Utils.js'; dotenv.config(); function sanitizeFileName(fileName) { @@ -50,7 +50,7 @@ async function uploadFile(req, res) { const DO_SPACE = process.env.DO_SPACE; const parseBaseUrl = cloudServerUrl; //process.env.SERVER_URL; - const parseAppId = process.env.APP_ID; + const parseAppId = serverAppId; let fileStorage; if (useLocal === 'true') { fileStorage = multer.diskStorage({ diff --git a/apps/OpenSignServer/cloud/parsefunction/AddAdmin.js b/apps/OpenSignServer/cloud/parsefunction/AddAdmin.js index a9e77dbdb4..53dfa82561 100644 --- a/apps/OpenSignServer/cloud/parsefunction/AddAdmin.js +++ b/apps/OpenSignServer/cloud/parsefunction/AddAdmin.js @@ -1,7 +1,7 @@ import axios from 'axios'; -import { cloudServerUrl } from '../../Utils.js'; +import { cloudServerUrl, serverAppId } from '../../Utils.js'; const serverUrl = cloudServerUrl; //process.env.SERVER_URL; -const APPID = process.env.APP_ID; +const APPID = serverAppId; const masterKEY = process.env.MASTER_KEY; async function addTeamAndOrg(extUser) { try { diff --git a/apps/OpenSignServer/cloud/parsefunction/AuthLoginAsMail.js b/apps/OpenSignServer/cloud/parsefunction/AuthLoginAsMail.js index 2eeb63d544..a716b3d2f9 100644 --- a/apps/OpenSignServer/cloud/parsefunction/AuthLoginAsMail.js +++ b/apps/OpenSignServer/cloud/parsefunction/AuthLoginAsMail.js @@ -1,10 +1,10 @@ import axios from 'axios'; -import { cloudServerUrl } from '../../Utils.js'; +import { cloudServerUrl, serverAppId } from '../../Utils.js'; async function AuthLoginAsMail(request) { try { //function for login user using user objectId without touching user's password const serverUrl = cloudServerUrl; //process.env.SERVER_URL; - const APPID = process.env.APP_ID; + const APPID = serverAppId; const masterKEY = process.env.MASTER_KEY; let otpN = request.params.otp; diff --git a/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js b/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js index 226aeec0f9..24d95a39f6 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js +++ b/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js @@ -1,5 +1,5 @@ import axios from 'axios'; -import { appName, cloudServerUrl } from '../../Utils.js'; +import { appName, cloudServerUrl, serverAppId } from '../../Utils.js'; export default async function forwardDoc(request) { try { @@ -58,7 +58,7 @@ export default async function forwardDoc(request) { mailRes = await axios.post(`${cloudServerUrl}/functions/sendmailv3`, params, { headers: { 'Content-Type': 'application/json', - 'X-Parse-Application-Id': process.env.APP_ID, + 'X-Parse-Application-Id': serverAppId, 'X-Parse-Master-Key': process.env.MASTER_KEY, }, }); diff --git a/apps/OpenSignServer/cloud/parsefunction/GetTemplate.js b/apps/OpenSignServer/cloud/parsefunction/GetTemplate.js index 1aefc2d66c..83f67bddec 100644 --- a/apps/OpenSignServer/cloud/parsefunction/GetTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/GetTemplate.js @@ -1,5 +1,5 @@ import axios from 'axios'; -import { cloudServerUrl } from '../../Utils.js'; +import { cloudServerUrl, serverAppId } from '../../Utils.js'; export default async function GetTemplate(request) { const serverUrl = cloudServerUrl; //process.env.SERVER_URL; @@ -10,7 +10,7 @@ export default async function GetTemplate(request) { if (sessiontoken) { const userRes = await axios.get(serverUrl + '/users/me', { headers: { - 'X-Parse-Application-Id': process.env.APP_ID, + 'X-Parse-Application-Id': serverAppId, 'X-Parse-Session-Token': sessiontoken, }, }); diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js b/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js index 51ce40a620..fa4e14536a 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js @@ -1,6 +1,6 @@ import axios from 'axios'; -import { cloudServerUrl } from '../../Utils.js'; -const appId = process.env.APP_ID; +import { cloudServerUrl, serverAppId } from '../../Utils.js'; +const appId = serverAppId; const masterkey = process.env.MASTER_KEY; export default async function createBatchContact(req) { if (!req?.user) { diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js index 0ac40523f4..90d469d55e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchDocs.js @@ -1,7 +1,7 @@ import axios from 'axios'; -import { cloudServerUrl, mailTemplate, replaceMailVaribles } from '../../Utils.js'; +import { cloudServerUrl, mailTemplate, replaceMailVaribles, serverAppId } from '../../Utils.js'; const serverUrl = cloudServerUrl; //process.env.SERVER_URL; -const appId = process.env.APP_ID; +const appId = serverAppId; async function deductcount(docsCount, extUserId) { try { const extCls = new Parse.Object('contracts_Users'); diff --git a/apps/OpenSignServer/cloud/parsefunction/getDocument.js b/apps/OpenSignServer/cloud/parsefunction/getDocument.js index 0d71bdbdba..d64ffbecca 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDocument.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDocument.js @@ -1,5 +1,5 @@ import axios from 'axios'; -import { cloudServerUrl } from '../../Utils.js'; +import { cloudServerUrl, serverAppId } from '../../Utils.js'; export default async function getDocument(request) { const serverUrl = cloudServerUrl; //process.env.SERVER_URL; const docId = request.params.docId; @@ -30,7 +30,7 @@ export default async function getDocument(request) { try { const userRes = await axios.get(serverUrl + '/users/me', { headers: { - 'X-Parse-Application-Id': process.env.APP_ID, + 'X-Parse-Application-Id': serverAppId, 'X-Parse-Session-Token': sessiontoken, }, }); diff --git a/apps/OpenSignServer/cloud/parsefunction/getDrive.js b/apps/OpenSignServer/cloud/parsefunction/getDrive.js index 346a5f6bf3..562f7c6763 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDrive.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDrive.js @@ -1,8 +1,8 @@ import axios from 'axios'; -import { cloudServerUrl } from '../../Utils.js'; +import { cloudServerUrl, serverAppId } from '../../Utils.js'; export default async function getDrive(request) { const serverUrl = cloudServerUrl; //process.env.SERVER_URL; - const appId = process.env.APP_ID; + const appId = serverAppId; const limit = request.params.limit; const skip = request.params.skip; const docId = request.params.docId; diff --git a/apps/OpenSignServer/cloud/parsefunction/getReport.js b/apps/OpenSignServer/cloud/parsefunction/getReport.js index 85eb6f6622..f1ed47cc02 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getReport.js +++ b/apps/OpenSignServer/cloud/parsefunction/getReport.js @@ -1,4 +1,4 @@ -import { cloudServerUrl } from '../../Utils.js'; +import { cloudServerUrl, serverAppId } from '../../Utils.js'; import reportJson from './reportsJson.js'; import axios from 'axios'; @@ -14,7 +14,7 @@ export default async function getReport(request) { const searchTerm = request.params.searchTerm || ''; const serverUrl = cloudServerUrl; //process.env.SERVER_URL; - const appId = process.env.APP_ID; + const appId = serverAppId; const masterKey = process.env.MASTER_KEY; const sessionToken = request.headers['sessiontoken'] || request.headers['x-parse-session-token']; try { diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js index 63bac492e4..c8f5436caf 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js @@ -7,6 +7,7 @@ import { saveFileUsage, getSecureUrl, appName, + serverAppId, } from '../../../Utils.js'; import GenerateCertificate from './GenerateCertificate.js'; import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib'; @@ -15,7 +16,7 @@ import { SignPdf } from '@signpdf/signpdf'; import { P12Signer } from '@signpdf/signer-p12'; const serverUrl = cloudServerUrl; // process.env.SERVER_URL; -const APPID = process.env.APP_ID; +const APPID = serverAppId; const masterKEY = process.env.MASTER_KEY; const eSignName = 'OpenSign'; const eSigncontact = 'hello@opensignlabs.com'; diff --git a/apps/OpenSignServer/cloud/parsefunction/usersignup.js b/apps/OpenSignServer/cloud/parsefunction/usersignup.js index 506051fa49..118f76ef37 100644 --- a/apps/OpenSignServer/cloud/parsefunction/usersignup.js +++ b/apps/OpenSignServer/cloud/parsefunction/usersignup.js @@ -1,7 +1,7 @@ import axios from 'axios'; -import { cloudServerUrl } from '../../Utils.js'; +import { cloudServerUrl, serverAppId } from '../../Utils.js'; const serverUrl = cloudServerUrl; //process.env.SERVER_URL; -const APPID = process.env.APP_ID; +const APPID = serverAppId; const masterKEY = process.env.MASTER_KEY; async function saveUser(userDetails) { diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 209d07d67f..16fb02b2c8 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -15,7 +15,7 @@ import AWS from 'aws-sdk'; import { app as customRoute } from './cloud/customRoute/customApp.js'; import { exec } from 'child_process'; import { createTransport } from 'nodemailer'; -import { appName, cloudServerUrl, smtpenable, smtpsecure, useLocal } from './Utils.js'; +import { appName, cloudServerUrl, serverAppId, smtpenable, smtpsecure, useLocal } from './Utils.js'; import { SSOAuth } from './auth/authadapter.js'; import createContactIndex from './migrationdb/createContactIndex.js'; import { validateSignedLocalUrl } from './cloud/parsefunction/getSignedUrl.js'; @@ -97,7 +97,7 @@ export const config = { cloud: function () { import('./cloud/main.js'); }, - appId: process.env.APP_ID || 'opensign', + appId: serverAppId, logLevel: ['error'], maxLimit: 500, maxUploadSize: '30mb', @@ -234,8 +234,8 @@ if (!process.env.TESTING) { createContactIndex(); const migrate = isWindows - ? `set APPLICATION_ID=${process.env.APP_ID}&& set SERVER_URL=${cloudServerUrl}&& set MASTER_KEY=${process.env.MASTER_KEY}&& npx parse-dbtool migrate` - : `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${cloudServerUrl} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + ? `set APPLICATION_ID=${serverAppId}&& set SERVER_URL=${cloudServerUrl}&& set MASTER_KEY=${process.env.MASTER_KEY}&& npx parse-dbtool migrate` + : `APPLICATION_ID=${serverAppId} SERVER_URL=${cloudServerUrl} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; exec(migrate, (error, stdout, stderr) => { if (error) { console.error(`Error: ${error.message}`); From 71b9bd63670ccc49e3ceca4f150eef2914773fc2 Mon Sep 17 00:00:00 2001 From: nxglabs Date: Thu, 3 Jul 2025 16:04:35 +0000 Subject: [PATCH 2/4] Merge pull request #937 from nxglabs/tenant_mailtemplate fix: if user not provide default value use it from template in createdocument from template API --- apps/OpenSign/package-lock.json | 554 +++---- apps/OpenSign/package.json | 42 +- .../public/locales/de/translation.json | 10 +- .../public/locales/en/translation.json | 10 +- .../public/locales/es/translation.json | 10 +- .../public/locales/fr/translation.json | 10 +- .../public/locales/hi/translation.json | 14 +- .../public/locales/it/translation.json | 10 +- apps/OpenSign/public/sample_contacts.csv | 4 + apps/OpenSign/src/components/BulkSendUi.jsx | 26 +- apps/OpenSign/src/components/Header.jsx | 2 +- .../components/dashboard/DashboardCard.jsx | 2 +- .../components/dashboard/DashboardReport.jsx | 2 +- .../components/opensigndrive/DriveBody.jsx | 9 +- .../components/pdf/DropdownWidgetOption.jsx | 4 +- .../OpenSign/src/components/pdf/PdfHeader.jsx | 2 +- .../src/components/pdf/Placeholder.jsx | 89 +- .../src/components/pdf/PlaceholderType.jsx | 12 +- .../src/components/pdf/RecipientList.jsx | 2 +- .../src/components/pdf/RenderAllPdfPage.jsx | 4 +- .../OpenSign/src/components/pdf/RenderPdf.jsx | 70 +- .../src/components/pdf/WidgetsValueModal.jsx | 295 ++-- apps/OpenSign/src/components/sidebar/Menu.jsx | 6 +- .../src/components/sidebar/SubMenu.jsx | 14 +- apps/OpenSign/src/constant/Utils.jsx | 304 +++- apps/OpenSign/src/hook/usePdfPinchZoom.js | 110 ++ apps/OpenSign/src/pages/PdfRequestFiles.jsx | 1 - apps/OpenSign/src/pages/PlaceHolderSign.jsx | 13 +- apps/OpenSign/src/pages/Preferences.jsx | 73 +- apps/OpenSign/src/pages/Report.jsx | 2 +- apps/OpenSign/src/pages/SignyourselfPdf.jsx | 1 - .../src/pages/TemplatePlaceholder.jsx | 1 - .../src/primitives/GetReportDisplay.jsx | 56 +- apps/OpenSign/vite.config.js | 5 +- apps/OpenSignServer/Utils.js | 2 + .../cloud/parsefunction/AuthLoginAsMail.js | 2 +- .../cloud/parsefunction/createBatchDocs.js | 2 +- .../cloud/parsefunction/linkContactToDoc.js | 20 - .../cloud/parsefunction/saveAsTemplate.js | 27 +- .../parsefunction/sendMailGmailProvider.js | 1 - .../cloud/parsefunction/updateTenant.js | 5 +- ...50621215000-add_creditalertlevel_field.cjs | 19 + apps/OpenSignServer/index.js | 1 - apps/OpenSignServer/package-lock.json | 1360 ++++++++++++----- apps/OpenSignServer/package.json | 18 +- 45 files changed, 2153 insertions(+), 1073 deletions(-) create mode 100644 apps/OpenSign/public/sample_contacts.csv create mode 100644 apps/OpenSign/src/hook/usePdfPinchZoom.js create mode 100644 apps/OpenSignServer/databases/migrations/20250621215000-add_creditalertlevel_field.cjs diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 3d4d02e6a0..7c375a0aae 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -10,15 +10,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", @@ -41,59 +41,59 @@ "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" }, "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" @@ -177,21 +177,21 @@ } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", + "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", + "@babel/generator": "^7.27.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -466,25 +466,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz", - "integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3" + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", + "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.27.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1713,18 +1713,18 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs2": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.27.4.tgz", - "integrity": "sha512-EVEiTwEdxk2fxCBfhZubE75AjmKshdbmBTcbPwyTa4Gc6NbJhePVr4bC5iosW5WnNQ0SJAeD31QaCG+n5Q6s3w==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.27.6.tgz", + "integrity": "sha512-WgvlQpGnm1rmvgrm+H+cVcAckEPlwURUCvv1ZVSFr9J9yixgFbNlu7+CjVKKAd4xQtMijPwxwcSi5SFFHKlmDw==", "dev": true, "license": "MIT", "dependencies": { @@ -1762,16 +1762,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", + "@babel/types": "^7.27.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1780,9 +1780,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", - "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", + "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2608,9 +2608,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2623,9 +2623,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", - "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2707,9 +2707,9 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", - "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.0.tgz", + "integrity": "sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==", "dev": true, "license": "MIT", "engines": { @@ -3045,21 +3045,21 @@ } }, "node_modules/@lottiefiles/dotlottie-react": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.0.tgz", - "integrity": "sha512-81wz6Wg/+0kEgcGgWyzQJB9ssZyC7U74bGH6LfbA39lIekAo5vs8RwZa6PMe2n3zBYLvrhvc2Ii+4MRMW7sDZg==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.2.tgz", + "integrity": "sha512-RR4r0HrKQbOAw6iS6C3mRARS2iu+yI+G1vICoUsRMHzlUUk1/26l3WyAjhcG+KoaGoKmORx8FgHjTNr4Sr/2Ug==", "license": "MIT", "dependencies": { - "@lottiefiles/dotlottie-web": "0.45.0" + "@lottiefiles/dotlottie-web": "0.47.0" }, "peerDependencies": { "react": "^17 || ^18 || ^19" } }, "node_modules/@lottiefiles/dotlottie-web": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.45.0.tgz", - "integrity": "sha512-MAgb6ea2JK80X8hNQruUOMAkA1G5dFcC9ZEgylvazuUwr/KbQuvoRS7WFI6Z/0dFPyxoj9wEaZ8i2Q9aZlrLzg==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.47.0.tgz", + "integrity": "sha512-YN6wSB4iYZBYEAFKEs/taufrPH3rfNlUA632Ib61WoR58TALAJ1ZX8yDIGUBT28byMJhZR4+xdpRX4v7X8OeBQ==", "license": "MIT" }, "node_modules/@noble/hashes": { @@ -3658,9 +3658,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.9", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz", - "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==", + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", + "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", "dev": true, "license": "MIT" }, @@ -4274,15 +4274,15 @@ } }, "node_modules/@swc/core": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.24.tgz", - "integrity": "sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.7.tgz", + "integrity": "sha512-bcpllEihyUSnqp0UtXTvXc19CT4wp3tGWLENhWnjr4B5iEOkzqMu+xHGz1FI5IBatjfqOQb29tgIfv6IL05QaA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.21" + "@swc/types": "^0.1.23" }, "engines": { "node": ">=10" @@ -4292,16 +4292,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.11.24", - "@swc/core-darwin-x64": "1.11.24", - "@swc/core-linux-arm-gnueabihf": "1.11.24", - "@swc/core-linux-arm64-gnu": "1.11.24", - "@swc/core-linux-arm64-musl": "1.11.24", - "@swc/core-linux-x64-gnu": "1.11.24", - "@swc/core-linux-x64-musl": "1.11.24", - "@swc/core-win32-arm64-msvc": "1.11.24", - "@swc/core-win32-ia32-msvc": "1.11.24", - "@swc/core-win32-x64-msvc": "1.11.24" + "@swc/core-darwin-arm64": "1.12.7", + "@swc/core-darwin-x64": "1.12.7", + "@swc/core-linux-arm-gnueabihf": "1.12.7", + "@swc/core-linux-arm64-gnu": "1.12.7", + "@swc/core-linux-arm64-musl": "1.12.7", + "@swc/core-linux-x64-gnu": "1.12.7", + "@swc/core-linux-x64-musl": "1.12.7", + "@swc/core-win32-arm64-msvc": "1.12.7", + "@swc/core-win32-ia32-msvc": "1.12.7", + "@swc/core-win32-x64-msvc": "1.12.7" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -4313,9 +4313,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.24.tgz", - "integrity": "sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.7.tgz", + "integrity": "sha512-w6BBT0hBRS56yS+LbReVym0h+iB7/PpCddqrn1ha94ra4rZ4R/A91A/rkv+LnQlPqU/+fhqdlXtCJU9mrhCBtA==", "cpu": [ "arm64" ], @@ -4330,9 +4330,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.24.tgz", - "integrity": "sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.7.tgz", + "integrity": "sha512-jN6LhFfGOpm4DY2mXPgwH4aa9GLOwublwMVFFZ/bGnHYYCRitLZs9+JWBbyWs7MyGcA246Ew+EREx36KVEAxjA==", "cpu": [ "x64" ], @@ -4347,9 +4347,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.24.tgz", - "integrity": "sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.7.tgz", + "integrity": "sha512-rHn8XXi7G2StEtZRAeJ6c7nhJPDnqsHXmeNrAaYwk8Tvpa6ZYG2nT9E1OQNXj1/dfbSFTjdiA8M8ZvGYBlpBoA==", "cpu": [ "arm" ], @@ -4364,9 +4364,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.24.tgz", - "integrity": "sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.7.tgz", + "integrity": "sha512-N15hKizSSh+hkZ2x3TDVrxq0TDcbvDbkQJi2ZrLb9fK+NdFUV/x+XF16ZDPlbxtrGXl1CT7VD439SNaMN9F7qw==", "cpu": [ "arm64" ], @@ -4381,9 +4381,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.24.tgz", - "integrity": "sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.7.tgz", + "integrity": "sha512-jxyINtBezpxd3eIUDiDXv7UQ87YWlPsM9KumOwJk09FkFSO4oYxV2RT+Wu+Nt5tVWue4N0MdXT/p7SQsDEk4YA==", "cpu": [ "arm64" ], @@ -4398,9 +4398,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.24.tgz", - "integrity": "sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.7.tgz", + "integrity": "sha512-PR4tPVwU1BQBfFDk2XfzXxsEIjF3x/bOV1BzZpYvrlkU0TKUDbR4t2wzvsYwD/coW7/yoQmlL70/qnuPtTp1Zw==", "cpu": [ "x64" ], @@ -4415,9 +4415,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.24.tgz", - "integrity": "sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.7.tgz", + "integrity": "sha512-zy7JWfQtQItgMfUjSbbcS3DZqQUn2d9VuV0LSGpJxtTXwgzhRpF1S2Sj7cU9hGpbM27Y8RJ4DeFb3qbAufjbrw==", "cpu": [ "x64" ], @@ -4432,9 +4432,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.24.tgz", - "integrity": "sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.7.tgz", + "integrity": "sha512-52PeF0tyX04ZFD8nibNhy/GjMFOZWTEWPmIB3wpD1vIJ1po+smtBnEdRRll5WIXITKoiND8AeHlBNBPqcsdcwA==", "cpu": [ "arm64" ], @@ -4449,9 +4449,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.24.tgz", - "integrity": "sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.7.tgz", + "integrity": "sha512-WzQwkNMuhB1qQShT9uUgz/mX2j7NIEPExEtzvGsBT7TlZ9j1kGZ8NJcZH/fwOFcSJL4W7DnkL7nAhx6DBlSPaA==", "cpu": [ "ia32" ], @@ -4466,9 +4466,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.11.24", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.24.tgz", - "integrity": "sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==", + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.7.tgz", + "integrity": "sha512-R52ivBi2lgjl+Bd3XCPum0YfgbZq/W1AUExITysddP9ErsNSwnreYyNB3exEijiazWGcqHEas2ChiuMOP7NYrA==", "cpu": [ "x64" ], @@ -4505,9 +4505,9 @@ "license": "0BSD" }, "node_modules/@swc/types": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", - "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", + "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4806,16 +4806,16 @@ "license": "MIT" }, "node_modules/@vitejs/plugin-react": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.1.tgz", - "integrity": "sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", + "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@rolldown/pluginutils": "1.0.0-beta.9", + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.19", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, @@ -4823,33 +4823,40 @@ "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.10.1.tgz", - "integrity": "sha512-FmQvN3yZGyD9XW6IyxE86Kaa/DnxSsrDQX1xCR1qojNpBLaUop+nLYFvhCkJsq8zOupNjCRA9jyhPGOJsSkutA==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.10.2.tgz", + "integrity": "sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.9", - "@swc/core": "^1.11.22" + "@rolldown/pluginutils": "1.0.0-beta.11", + "@swc/core": "^1.11.31" }, "peerDependencies": { - "vite": "^4 || ^5 || ^6" + "vite": "^4 || ^5 || ^6 || ^7.0.0-beta.0" } }, + "node_modules/@vitejs/plugin-react-swc/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", + "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==", + "dev": true, + "license": "MIT" + }, "node_modules/@vitest/expect": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.1.tgz", - "integrity": "sha512-FqS/BnDOzV6+IpxrTg5GQRyLOCtcJqkwMwcS8qGCI2IyRVDwPAtutztaf1CjtPHlZlWtl1yUPCd7HM0cNiDOYw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.1", - "@vitest/utils": "3.2.1", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -4858,13 +4865,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.1.tgz", - "integrity": "sha512-OXxMJnx1lkB+Vl65Re5BrsZEHc90s5NMjD23ZQ9NlU7f7nZiETGoX4NeKZSmsKjseuMq2uOYXdLOeoM0pJU+qw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.1", + "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -4905,9 +4912,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.1.tgz", - "integrity": "sha512-xBh1X2GPlOGBupp6E1RcUQWIxw0w/hRLd3XyBS6H+dMdKTAqHDNsIR2AnJwPA3yYe9DFy3VUKTe3VRTrAiQ01g==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -4918,27 +4925,28 @@ } }, "node_modules/@vitest/runner": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.1.tgz", - "integrity": "sha512-kygXhNTu/wkMYbwYpS3z/9tBe0O8qpdBuC3dD/AW9sWa0LE/DAZEjnHtWA9sIad7lpD4nFW1yQ+zN7mEKNH3yA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.1", - "pathe": "^2.0.3" + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.1.tgz", - "integrity": "sha512-5xko/ZpW2Yc65NVK9Gpfg2y4BFvcF+At7yRT5AHUpTg9JvZ4xZoyuRY4ASlmNcBZjMslV08VRLDrBOmUe2YX3g==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.1", + "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -4957,9 +4965,9 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.1.tgz", - "integrity": "sha512-Nbfib34Z2rfcJGSetMxjDCznn4pCYPZOtQYox2kzebIJcgH75yheIKd5QYSFmR8DIZf2M8fwOm66qSDIfRFFfQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { @@ -4970,13 +4978,13 @@ } }, "node_modules/@vitest/ui": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.1.tgz", - "integrity": "sha512-xT93aOcPn2wn8vvw4T6rZAK9WjGEHdYrEjN3OJ1zcDpl2UInxvcD9fYI10nmPAERNEK6jUVcSCIPAIfNuaRX6Q==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz", + "integrity": "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.1", + "@vitest/utils": "3.2.4", "fflate": "^0.8.2", "flatted": "^3.3.3", "pathe": "^2.0.3", @@ -4988,18 +4996,18 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "3.2.1" + "vitest": "3.2.4" } }, "node_modules/@vitest/utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.1.tgz", - "integrity": "sha512-KkHlGhePEKZSub5ViknBcN5KEF+u7dSUr9NW8QsVICusUojrgrOnnY3DEWWO877ax2Pyopuk2qHmt+gkNKnBVw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.1", - "loupe": "^3.1.3", + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" }, "funding": { @@ -5218,9 +5226,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -5678,9 +5686,9 @@ } }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -6789,9 +6797,9 @@ "license": "MIT" }, "node_modules/concurrently": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", - "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", + "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7611,9 +7619,9 @@ "license": "0BSD" }, "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7966,19 +7974,19 @@ } }, "node_modules/eslint": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", - "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz", + "integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.30.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -7990,9 +7998,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -8027,9 +8035,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", - "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz", + "integrity": "sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==", "dev": true, "license": "MIT", "dependencies": { @@ -8122,9 +8130,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8169,9 +8177,9 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -8189,15 +8197,15 @@ "license": "MIT" }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8207,9 +8215,9 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -9202,9 +9210,9 @@ } }, "node_modules/i18next": { - "version": "23.16.8", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", - "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.3.0.tgz", + "integrity": "sha512-ZSQIiNGfqSG6yoLHaCvrkPp16UejHI8PCDxFYaNG/1qxtmqNmqEg4JlWKlxkrUmrin2sEjsy+Mjy1TRozBhOgw==", "funding": [ { "type": "individual", @@ -9221,13 +9229,21 @@ ], "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2" + "@babel/runtime": "^7.27.6" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/i18next-browser-languagedetector": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.1.0.tgz", - "integrity": "sha512-mHZxNx1Lq09xt5kCauZ/4bsXOEA2pfpwSoU11/QTJB+pD94iONFwp+ohqi///PwiFvjFOxe1akYCdHyFo1ng5Q==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", + "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" @@ -10335,9 +10351,9 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.0.tgz", - "integrity": "sha512-HkpQh69XHxgCjObjejBT3s2ILwNjFx8M3nw+tJ/ssBauDlIpkx2RpqWSi1fBgkXLSSXnbR3iEq1NkVtpvV+FLQ==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.2.tgz", + "integrity": "sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10823,9 +10839,9 @@ } }, "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", "dev": true, "license": "MIT" }, @@ -11770,9 +11786,9 @@ "license": "MIT" }, "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", "engines": { @@ -11895,9 +11911,9 @@ } }, "node_modules/postcss": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", - "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -12158,9 +12174,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "bin": { @@ -14094,12 +14110,12 @@ } }, "node_modules/react-i18next": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.2.tgz", - "integrity": "sha512-ePODyXgmZQAOYTbZXQn5rRsSBu3Gszo69jxW6aKmlSgxKAI1fOhDwSu6bT4EKHciWPKQ7v7lPrjeiadR6Gi+1A==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.3.tgz", + "integrity": "sha512-ypYmOKOnjqPEJZO4m1BI0kS8kWqkBNsKYyhVUfij0gvjy9xJNoG/VcGkxq5dRlVwzmrmY1BQMAmpbbUBLwC4Kw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.0", + "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { @@ -14343,9 +14359,9 @@ "license": "0BSD" }, "node_modules/react-router": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.2.tgz", - "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz", + "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -14486,9 +14502,9 @@ } }, "node_modules/react-tooltip": { - "version": "5.28.1", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.28.1.tgz", - "integrity": "sha512-ZA4oHwoIIK09TS7PvSLFcRlje1wGZaxw6xHvfrzn6T82UcMEfEmHVCad16Gnr4NDNDh93HyN037VK4HDi5odfQ==", + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.29.1.tgz", + "integrity": "sha512-rmJmEb/p99xWhwmVT7F7riLG08wwKykjHiMGbDPloNJk3tdI73oHsVOwzZ4SRjqMdd5/xwb/4nmz0RcoMfY7Bw==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.6.1", @@ -15899,6 +15915,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/styled-components": { "version": "5.3.11", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", @@ -16386,9 +16422,9 @@ } }, "node_modules/tinypool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz", - "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -17003,9 +17039,9 @@ } }, "node_modules/vite-node": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.1.tgz", - "integrity": "sha512-V4EyKQPxquurNJPtQJRZo8hKOoKNBRIhxcDbQFPFig0JdoWcUhwRgK8yoCXXrfYVPKS6XwirGHPszLnR8FbjCA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { @@ -17089,20 +17125,20 @@ } }, "node_modules/vitest": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.1.tgz", - "integrity": "sha512-VZ40MBnlE1/V5uTgdqY3DmjUgZtIzsYq758JGlyQrv5syIsaYcabkfPkEuWML49Ph0D/SoqpVFd0dyVTr551oA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.1", - "@vitest/mocker": "3.2.1", - "@vitest/pretty-format": "^3.2.1", - "@vitest/runner": "3.2.1", - "@vitest/snapshot": "3.2.1", - "@vitest/spy": "3.2.1", - "@vitest/utils": "3.2.1", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", @@ -17113,10 +17149,10 @@ "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", - "tinypool": "^1.1.0", + "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.1", + "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "bin": { @@ -17132,8 +17168,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.1", - "@vitest/ui": "3.2.1", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, @@ -17241,9 +17277,9 @@ } }, "node_modules/web-vitals": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.0.2.tgz", - "integrity": "sha512-nhl+fujoz9Io6MdDSyGSiiUSR1DLMvD3Mde1sNaRKrNwsEFYQICripmEIyUvE2DPKDkW1BbHa4saEDo1U/2D/Q==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.0.3.tgz", + "integrity": "sha512-4KmOFYxj7qT6RAdCH0SWwq8eKeXNhAFXR4PmgF6nrWFmrJ41n7lq3UCA6UK0GebQ4uu+XP8e8zGjaDO3wZlqTg==", "license": "Apache-2.0" }, "node_modules/webidl-conversions": { diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index bfd9af1e0d..a9a8943b12 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -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", @@ -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": { @@ -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" diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index 6b3b1b3875..6752f2a1eb 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -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.", @@ -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" } diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 6bc3784150..631c208151 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -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.", @@ -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" } \ No newline at end of file diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index f4825aab35..4107b314ae 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -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.", @@ -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" } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index 3880369a6b..47880ca684 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -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.", @@ -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" } diff --git a/apps/OpenSign/public/locales/hi/translation.json b/apps/OpenSign/public/locales/hi/translation.json index cd399fbf48..ce5dcf1278 100644 --- a/apps/OpenSign/public/locales/hi/translation.json +++ b/apps/OpenSign/public/locales/hi/translation.json @@ -355,7 +355,7 @@ "widgets-name": { "signature": "हस्ताक्षर", "stamp": "मोहर", - "initials": "हस्ताक्षर", + "initials": "प्रारंभिक अक्षर", "name": "नाम", "job title": "पद", "company": "कंपनी", @@ -389,7 +389,7 @@ "Email-verified-alert-2": "ईमेल पहले से ही सत्यापित है।", "upload-stamp-image": "मोहर छवि अपलोड करें", "draw": "आरेखित करें", - "type": "प्रकार", + "type": "टाइप", "color-type": { "red": "लाल", "blue": "नीला", @@ -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}} संपर्क आयात करने में विफल रहे।", @@ -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": "कंसोल" } diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index f2b52e6676..660ddeeb47 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -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.", @@ -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" } diff --git a/apps/OpenSign/public/sample_contacts.csv b/apps/OpenSign/public/sample_contacts.csv new file mode 100644 index 0000000000..a4ffda392f --- /dev/null +++ b/apps/OpenSign/public/sample_contacts.csv @@ -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 diff --git a/apps/OpenSign/src/components/BulkSendUi.jsx b/apps/OpenSign/src/components/BulkSendUi.jsx index a0408905e4..e3d2624248 100644 --- a/apps/OpenSign/src/components/BulkSendUi.jsx +++ b/apps/OpenSign/src/components/BulkSendUi.jsx @@ -15,6 +15,7 @@ const BulkSendUi = (props) => { const [isSignatureExist, setIsSignatureExist] = useState(); const [isDisableBulkSend, setIsDisableBulkSend] = useState(false); const [isLoader, setIsLoader] = useState(false); + const [signers, setSigners] = useState([]); useEffect(() => { signatureExist(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -47,7 +48,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, @@ -60,7 +68,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 @@ -82,10 +93,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; } } } @@ -143,15 +160,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 }); } }); diff --git a/apps/OpenSign/src/components/Header.jsx b/apps/OpenSign/src/components/Header.jsx index 7fee264bea..bad3eef04f 100644 --- a/apps/OpenSign/src/components/Header.jsx +++ b/apps/OpenSign/src/components/Header.jsx @@ -116,7 +116,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { return (
-
+