diff --git a/.gitignore b/.gitignore index 3e33d8a2b..590787f08 100644 --- a/.gitignore +++ b/.gitignore @@ -114,7 +114,7 @@ firebase/.env !.elasticbeanstalk/*.cfg.yml !.elasticbeanstalk/*.global.yml logs/oAuthClient-log.log - +logs/* .node-persist/** diff --git a/Fortellis Notes.md b/Fortellis Notes.md new file mode 100644 index 000000000..fbeb2b670 --- /dev/null +++ b/Fortellis Notes.md @@ -0,0 +1,346 @@ +Fortellis Notes + +Subscription ID + +- Appears to give us a list of all dealerships we have access to, and `apiDmsInfo` contains the integrations that are enabled for that dealership. +- Will likely need to filter based on the DMS ID or something? +- Should store the whole subscription object. Contains department information needed in subsequent calls. + +Department ID + +- May have multiple departments. Appears that financial stuff goes to Accounting, History will go to Service. +- TODO: How do we handle the multiple departments that may come up. + +###Internal Questions + +* Overview of the redis storing mechanism to cache this data. +* + +# GL Wip Posting + +## Org Helper Return Data + +```json +[ + { + "acctgLgnID": "DEVWB-A", + "applCode": "V", + "coID": "77", + "companyName": "TEST SYS C187092 DEVWB", + "lgnDesc": "DEV WRITE BACK VMS", + "logon": "DEVWB-V" + }, + { + "acctgLgnID": "DEVWB-A", + "applCode": "F", + "coID": "77", + "companyName": "TEST SYS C187092 DEVWB", + "lgnDesc": "DEV WRITE BACK F&I SALES", + "logon": "DEVWB-FI" + }, + { + "acctgLgnID": "DEVWB-A", + "applCode": "CS", + "coID": "77", + "companyName": "TEST SYS C187092 DEVWB", + "lgnDesc": "DEV WRITE BACK SERVICE", + "logon": "DEVWB-S" + }, + { + "acctgLgnID": "DEVWB-A", + "applCode": "A", + "coID": "77", + "companyName": "TEST SYS C187092 DEVWB", + "lgnDesc": "DEV WRITE BACK ACCTG", + "logon": "DEVWB-A" + }, + { + "acctgLgnID": "DEVWB-A", + "applCode": "SL", + "coID": "77", + "companyName": "TEST SYS C187092 DEVWB", + "lgnDesc": "DEV WRTIE BACK SLS MGMT", + "logon": "DEVWB-SL" + }, + { + "acctgLgnID": "DEVWB-A", + "applCode": "O", + "coID": "77", + "companyName": "TEST SYS C187092 DEVWB", + "lgnDesc": "DEV WRITE BACK PARTS", + "logon": "DEVWB-I" + } +] +``` + +## Journal Helper Return Data + +```json +[ + { + "companyNo": "77", + "jrnlID": "32", + "jrnlName": "PARTS SALES", + "jrnlType": "S", + "intercoFlag": "0", + "defaultDocType": "4", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "92", + "jrnlName": "YTD ADJUSTMENTS", + "jrnlType": "Y", + "intercoFlag": "0", + "defaultDocType": "3", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "12", + "jrnlName": "FLEET SALES", + "jrnlType": "S", + "intercoFlag": "0", + "defaultDocType": "9", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "57", + "jrnlName": "CASH RECEIPTS (OPEN-ITEM)", + "jrnlType": "R", + "intercoFlag": "0", + "defaultDocType": "1", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "93", + "jrnlName": "SET UP HISTORY", + "jrnlType": "H", + "intercoFlag": "0", + "defaultDocType": "10", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "88", + "jrnlName": "F/S STATISCAL DATA", + "jrnlType": "F", + "intercoFlag": "0", + "defaultDocType": "10", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "58", + "jrnlName": "WARRANTY CREDITS", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "3", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "FC", + "jrnlName": "FINANCE CHARGE", + "jrnlType": "A", + "intercoFlag": "0", + "defaultDocType": "12", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "94", + "jrnlName": "SET UP SCHEDULES", + "jrnlType": "C", + "intercoFlag": "0", + "defaultDocType": "3", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "95", + "jrnlName": "SET UP GENERAL LEDGER", + "jrnlType": "B", + "intercoFlag": "0", + "defaultDocType": "3", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "20", + "jrnlName": "USED VEHICLE SALES", + "jrnlType": "S", + "intercoFlag": "0", + "defaultDocType": "9", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "60", + "jrnlName": "CASH DISBURSEMENTS", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "2", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "30", + "jrnlName": "SERVICE SALES", + "jrnlType": "S", + "intercoFlag": "0", + "defaultDocType": "7", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "40", + "jrnlName": "PAYROLL", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "11", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "15", + "jrnlName": "DEALER TRADES", + "jrnlType": "S", + "intercoFlag": "0", + "defaultDocType": "9", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "70", + "jrnlName": "NEW VEHICLE PURCHASES", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "8", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "25", + "jrnlName": "USED WHOLESALE", + "jrnlType": "S", + "intercoFlag": "0", + "defaultDocType": "9", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "75", + "jrnlName": "GENERAL PURCHASES", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "5", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "10", + "jrnlName": "NEW VEHICLE SALES", + "jrnlType": "S", + "intercoFlag": "0", + "defaultDocType": "9", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "80", + "jrnlName": "GENERAL JOURNAL", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "3", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "11", + "jrnlName": "WORK IN PROGRESS", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "10", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "56", + "jrnlName": "CASH RECEIPTS (BALANCE FWD)", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "1", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "81", + "jrnlName": "STANDARD ENTRIES", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "6", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "51", + "jrnlName": "CASH RECEIPTS JOURNAL - EFT", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "10", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "61", + "jrnlName": "CASH DISBURSMENTS -EFT", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "10", + "errCode": "", + "errMsg": "" + }, + { + "companyNo": "77", + "jrnlID": "71", + "jrnlName": "USED VEHICLE PURCHASES", + "jrnlType": "G", + "intercoFlag": "0", + "defaultDocType": "8", + "errCode": "", + "errMsg": "" + } +] +``` + +# Feedback + +- Receiving bad request errors, with no details. API errors page doesn't indicate what's wrong for certain types of error codes. +- API Error page works on a several minute delay. diff --git a/_reference/partsManagement/PATCH_parts-management-provision.md b/_reference/partsManagement/PATCH_parts-management-provision.md index 50c90b7e5..59d932e28 100644 --- a/_reference/partsManagement/PATCH_parts-management-provision.md +++ b/_reference/partsManagement/PATCH_parts-management-provision.md @@ -30,7 +30,7 @@ Send a JSON object with one or more of the following fields to update: - `email` (string, shop's email, not user email) - `timezone` (string) - `phone` (string) -- `logo_img_path` (object, e.g. `{ src, width, height, headerMargin }`) +- `logo_img_path` (string) Any fields not included in the request body will remain unchanged. @@ -50,12 +50,7 @@ Content-Type: application/json "email": "shop@example.com", "timezone": "America/Chicago", "phone": "555-123-4567", - "logo_img_path": { - "src": "https://example.com/logo.png", - "width": "200", - "height": "100", - "headerMargin": 10 - } + "logo_img_path": "https://example.com/logo.png" } ``` diff --git a/client/package-lock.json b/client/package-lock.json index 81cafe7e5..142de0300 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -9,49 +9,49 @@ "version": "0.2.1", "hasInstallScript": true, "dependencies": { - "@amplitude/analytics-browser": "^2.25.2", + "@amplitude/analytics-browser": "^2.33.1", "@ant-design/pro-layout": "^7.22.6", "@apollo/client": "^3.13.9", "@emotion/is-prop-valid": "^1.4.0", "@fingerprintjs/fingerprintjs": "^4.6.1", - "@firebase/analytics": "^0.10.17", - "@firebase/app": "^0.14.3", - "@firebase/auth": "^1.10.8", - "@firebase/firestore": "^4.9.2", + "@firebase/analytics": "^0.10.19", + "@firebase/app": "^0.14.6", + "@firebase/auth": "^1.12.0", + "@firebase/firestore": "^4.9.3", "@firebase/messaging": "^0.12.22", "@jsreport/browser-client": "^3.1.0", - "@reduxjs/toolkit": "^2.9.0", - "@sentry/cli": "^2.56.0", + "@reduxjs/toolkit": "^2.11.2", + "@sentry/cli": "^2.58.2", "@sentry/react": "^9.43.0", - "@sentry/vite-plugin": "^4.3.0", - "@splitsoftware/splitio-react": "^2.5.0", - "@tanem/react-nprogress": "^5.0.53", - "antd": "^5.27.4", + "@sentry/vite-plugin": "^4.6.1", + "@splitsoftware/splitio-react": "^2.6.1", + "@tanem/react-nprogress": "^5.0.56", + "antd": "^5.28.1", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^4.4.0", "autosize": "^6.0.1", - "axios": "^1.12.2", + "axios": "^1.13.2", "classnames": "^2.5.1", "css-box-model": "^1.2.1", - "dayjs": "^1.11.18", - "dayjs-business-days2": "^1.3.0", + "dayjs": "^1.11.19", + "dayjs-business-days2": "^1.3.2", "dinero.js": "^1.9.1", "dotenv": "^17.2.3", "env-cmd": "^10.1.0", "exifr": "^7.1.3", - "graphql": "^16.11.0", - "i18next": "^25.5.3", + "graphql": "^16.12.0", + "i18next": "^25.7.4", "i18next-browser-languagedetector": "^8.2.0", "immutability-helper": "^3.1.1", - "libphonenumber-js": "^1.12.23", + "libphonenumber-js": "^1.12.33", "lightningcss": "^1.30.2", "logrocket": "^9.0.2", "markerjs2": "^2.32.7", "memoize-one": "^6.0.0", - "normalize-url": "^8.1.0", + "normalize-url": "^8.1.1", "object-hash": "^3.0.0", - "phone": "^3.1.67", - "posthog-js": "^1.271.0", + "phone": "^3.1.69", + "posthog-js": "^1.315.1", "prop-types": "^15.8.1", "query-string": "^9.3.1", "raf-schd": "^4.0.3", @@ -69,22 +69,22 @@ "react-markdown": "^10.1.0", "react-number-format": "^5.4.3", "react-popopo": "^2.1.9", - "react-product-fruits": "^2.2.61", + "react-product-fruits": "^2.2.62", "react-redux": "^9.2.0", - "react-resizable": "^3.0.5", + "react-resizable": "^3.1.3", "react-router-dom": "^6.30.0", "react-sticky": "^6.0.3", - "react-virtuoso": "^4.14.1", + "react-virtuoso": "^4.18.1", "recharts": "^2.15.2", "redux": "^5.0.1", "redux-actions": "^3.0.3", "redux-persist": "^6.0.0", - "redux-saga": "^1.3.0", + "redux-saga": "^1.4.2", "redux-state-sync": "^3.1.4", "reselect": "^5.1.1", - "sass": "^1.93.2", - "socket.io-client": "^4.8.1", - "styled-components": "^6.1.19", + "sass": "^1.97.2", + "socket.io-client": "^4.8.3", + "styled-components": "^6.2.0", "subscriptions-transport-ws": "^0.11.0", "use-memo-one": "^1.1.3", "vite-plugin-ejs": "^1.7.0", @@ -93,38 +93,38 @@ "devDependencies": { "@ant-design/icons": "^6.1.0", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/preset-react": "^7.27.1", - "@dotenvx/dotenvx": "^1.51.0", + "@babel/preset-react": "^7.28.5", + "@dotenvx/dotenvx": "^1.51.4", "@emotion/babel-plugin": "^11.13.5", "@emotion/react": "^11.14.0", - "@eslint/js": "^9.37.0", - "@playwright/test": "^1.56.0", - "@sentry/webpack-plugin": "^4.3.0", + "@eslint/js": "^9.39.2", + "@playwright/test": "^1.57.0", + "@sentry/webpack-plugin": "^4.6.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.0", + "@testing-library/react": "^16.3.1", "@vitejs/plugin-react": "^4.6.0", - "browserslist": "^4.26.3", + "browserslist": "^4.28.1", "browserslist-to-esbuild": "^2.1.1", "chalk": "^5.6.2", - "eslint": "^9.37.0", + "eslint": "^9.39.2", "eslint-plugin-react": "^7.37.5", "globals": "^15.15.0", "jsdom": "^26.0.0", - "memfs": "^4.48.1", + "memfs": "^4.51.1", "os-browserify": "^0.3.0", - "playwright": "^1.56.0", + "playwright": "^1.57.0", "react-error-overlay": "^6.1.0", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", - "vite": "^7.1.9", + "vite": "^7.3.1", "vite-plugin-babel": "^1.3.2", "vite-plugin-eslint": "^1.8.1", "vite-plugin-node-polyfills": "^0.24.0", - "vite-plugin-pwa": "^1.0.3", + "vite-plugin-pwa": "^1.2.0", "vite-plugin-style-import": "^2.0.0", "vitest": "^3.2.4", - "workbox-window": "^7.3.0" + "workbox-window": "^7.4.0" }, "engines": { "node": ">=22.0.0" @@ -141,29 +141,17 @@ "license": "MIT" }, "node_modules/@amplitude/analytics-browser": { - "version": "2.25.2", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-browser/-/analytics-browser-2.25.2.tgz", - "integrity": "sha512-9CXKoB1oip+fcYTrDVt/WcYXPugazsEjfZxzyS2P7A7tHD6icPnY1C1o4ziqBvkHn7mnhF//UG7OB7EphQg/nA==", + "version": "2.33.1", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-browser/-/analytics-browser-2.33.1.tgz", + "integrity": "sha512-93wZjuAFJ7QdyptF82i1pezm5jKuBWITHI++XshDgpks1RstJvJ9n11Ak8MnE4L2BGQ93XDN2aVEHfmQkt0/Pw==", "license": "MIT", "dependencies": { - "@amplitude/analytics-core": "^2.26.2", - "@amplitude/analytics-remote-config": "^0.4.0", - "@amplitude/plugin-autocapture-browser": "^1.14.3", - "@amplitude/plugin-network-capture-browser": "^1.6.5", - "@amplitude/plugin-page-view-tracking-browser": "^2.4.3", - "@amplitude/plugin-web-vitals-browser": "^0.1.0-beta.27", - "tslib": "^2.4.1" - } - }, - "node_modules/@amplitude/analytics-client-common": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-client-common/-/analytics-client-common-2.4.3.tgz", - "integrity": "sha512-B3PistL7I8TzC2FEP7BO8KBxIYzwCPiagrG3H7petZvp9y3LvNQwtviKF5JxGslDM7DDUQMVLVKcKKxhIMBPiw==", - "license": "MIT", - "dependencies": { - "@amplitude/analytics-connector": "^1.4.8", - "@amplitude/analytics-core": "^2.26.2", - "@amplitude/analytics-types": "^2.10.0", + "@amplitude/analytics-core": "2.35.0", + "@amplitude/plugin-autocapture-browser": "1.18.3", + "@amplitude/plugin-network-capture-browser": "1.7.3", + "@amplitude/plugin-page-url-enrichment-browser": "0.5.9", + "@amplitude/plugin-page-view-tracking-browser": "2.6.6", + "@amplitude/plugin-web-vitals-browser": "1.1.4", "tslib": "^2.4.1" } }, @@ -174,76 +162,66 @@ "license": "MIT" }, "node_modules/@amplitude/analytics-core": { - "version": "2.26.2", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-core/-/analytics-core-2.26.2.tgz", - "integrity": "sha512-XIOzNiUCxzJwKuoK+N8rVjl0OlrfTszM+C9GyFxOYwn1zgZZEYCq0AqX1OIpy+vl+Bx3mLKZbRzxTl3eX46hLQ==", + "version": "2.35.0", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-core/-/analytics-core-2.35.0.tgz", + "integrity": "sha512-7RmHYELXCGu8yuO9D6lEXiqkMtiC5sePNhCWmwuP30dneDYHtH06gaYvAFH/YqOFuE6enwEEJfFYtcaPhyiqtA==", "license": "MIT", "dependencies": { "@amplitude/analytics-connector": "^1.6.4", - "tslib": "^2.4.1" + "tslib": "^2.4.1", + "zen-observable-ts": "^1.1.0" } }, - "node_modules/@amplitude/analytics-remote-config": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-remote-config/-/analytics-remote-config-0.4.1.tgz", - "integrity": "sha512-BYl6kQ9qjztrCACsugpxO+foLaQIC0aSEzoXEAb/gwOzInmqkyyI+Ub+aWTBih4xgB/lhWlOcidWHAmNiTJTNw==", - "license": "MIT", - "dependencies": { - "@amplitude/analytics-client-common": ">=1 <3", - "@amplitude/analytics-core": ">=1 <3", - "@amplitude/analytics-types": ">=1 <3", - "tslib": "^2.4.1" - } - }, - "node_modules/@amplitude/analytics-types": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@amplitude/analytics-types/-/analytics-types-2.10.0.tgz", - "integrity": "sha512-WP8eEbJh10MmFVnxkHjg92i5DBxBFsRvSZxjDQPXEGL8ZP+i7rSsleiH2K3VrwoKksYfZ/1eAqrZvevAmjSlig==", - "license": "MIT" - }, "node_modules/@amplitude/plugin-autocapture-browser": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-autocapture-browser/-/plugin-autocapture-browser-1.14.3.tgz", - "integrity": "sha512-awpDTXhbbfRjR3ru5Y1FbwqPjsxZCpNpb5H9hu/O+ZpGJ5CJxT1DcgDh0Qan0r8RasXCUh8D8k6/GKiNsuyMNw==", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/@amplitude/plugin-autocapture-browser/-/plugin-autocapture-browser-1.18.3.tgz", + "integrity": "sha512-njYque5t1QCEEe5V8Ls4yVVklTM6V7OXxBk6pqznN/hj/Pc4X8Wjy898pZ2VtbnvpagBKKzGb5B6Syl8OXiicw==", "license": "MIT", "dependencies": { - "@amplitude/analytics-core": "^2.26.2", + "@amplitude/analytics-core": "2.35.0", "rxjs": "^7.8.1", "tslib": "^2.4.1" } }, "node_modules/@amplitude/plugin-network-capture-browser": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-network-capture-browser/-/plugin-network-capture-browser-1.6.5.tgz", - "integrity": "sha512-8Dmikf4gdW+3aqiXNzmj08tkGmD66JsnHFz4TsEA3RcShp47OWEd3x3CW3wnHJG+ep2sXXnL8Cqjl1bio7E2GQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@amplitude/plugin-network-capture-browser/-/plugin-network-capture-browser-1.7.3.tgz", + "integrity": "sha512-zfWgAN7g6AigJAsgrGmlgVwydOHH6XvweBoxhU+qEvRydboiIVCDLSxuXczUsBG7kYVLWRdBK1DYoE5J7lqTGA==", "license": "MIT", "dependencies": { - "@amplitude/analytics-core": "^2.26.2", - "rxjs": "^7.8.1", + "@amplitude/analytics-core": "2.35.0", + "tslib": "^2.4.1" + } + }, + "node_modules/@amplitude/plugin-page-url-enrichment-browser": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@amplitude/plugin-page-url-enrichment-browser/-/plugin-page-url-enrichment-browser-0.5.9.tgz", + "integrity": "sha512-TqdELx4WrdRutCjHUFUzum/f/UjhbdTZw0UKkYFAj5gwAKDjaPEjL4waRvINOTaVLsne1A6ck4KEMfC8AKByFw==", + "license": "MIT", + "dependencies": { + "@amplitude/analytics-core": "2.35.0", "tslib": "^2.4.1" } }, "node_modules/@amplitude/plugin-page-view-tracking-browser": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-page-view-tracking-browser/-/plugin-page-view-tracking-browser-2.4.3.tgz", - "integrity": "sha512-bxZojtBudwnpj/e9+YXe2IawFcf7LsBthtq1UgKDCrYtgcpuwlm4ld2yP7QC3p1G+iptomHxfV70oLXWaBeJdw==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/@amplitude/plugin-page-view-tracking-browser/-/plugin-page-view-tracking-browser-2.6.6.tgz", + "integrity": "sha512-dBcJlrdKgPzSgS3exDRRrMLqhIaOjwlIy7o8sEMn1PpMawERlbumSSdtfII6L4L67HYUPo4PY4Kp4acqSzaLvQ==", "license": "MIT", "dependencies": { - "@amplitude/analytics-client-common": "^2.4.3", - "@amplitude/analytics-types": "^2.10.0", + "@amplitude/analytics-core": "2.35.0", "tslib": "^2.4.1" } }, "node_modules/@amplitude/plugin-web-vitals-browser": { - "version": "0.1.0-frustrationanalytics.0", - "resolved": "https://registry.npmjs.org/@amplitude/plugin-web-vitals-browser/-/plugin-web-vitals-browser-0.1.0-frustrationanalytics.0.tgz", - "integrity": "sha512-xv4sje6/D8r+SgNFTA22FJ5PhtdhN+VSydvs63Frll+qWlyQwaZ1IgDbPyqjzryEkldHRPD7GUaQual+geoIYg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@amplitude/plugin-web-vitals-browser/-/plugin-web-vitals-browser-1.1.4.tgz", + "integrity": "sha512-XQXI9OjTNSz2yi0lXw2VYMensDzzSkMCfvXNniTb1LgnHwBcQ1JWPcTqHLPFrvvNckeIdOT78vjs7yA+c1FyzA==", "license": "MIT", "dependencies": { - "@amplitude/analytics-core": "^2.14.0-frustrationanalytics.0", - "rxjs": "^7.8.1", + "@amplitude/analytics-core": "2.35.0", "tslib": "^2.4.1", - "web-vitals": "^5.0.1" + "web-vitals": "5.1.0" } }, "node_modules/@amplitude/plugin-web-vitals-browser/node_modules/web-vitals": { @@ -619,9 +597,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -664,13 +642,13 @@ "license": "MIT" }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -731,14 +709,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -901,9 +879,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -947,12 +925,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -962,14 +940,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1215,9 +1193,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "dev": true, "license": "MIT", "dependencies": { @@ -1265,9 +1243,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", "dependencies": { @@ -1276,7 +1254,7 @@ "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1303,14 +1281,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1403,9 +1381,9 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "dev": true, "license": "MIT", "dependencies": { @@ -1502,9 +1480,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "dev": true, "license": "MIT", "dependencies": { @@ -1568,16 +1546,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1669,9 +1647,9 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -1679,7 +1657,7 @@ "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1722,9 +1700,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1907,9 +1885,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { @@ -2104,17 +2082,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", @@ -2127,42 +2105,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -2217,15 +2195,15 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" @@ -2238,9 +2216,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2261,17 +2239,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -2279,13 +2257,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2416,9 +2394,9 @@ } }, "node_modules/@dotenvx/dotenvx": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.51.0.tgz", - "integrity": "sha512-CbMGzyOYSyFF7d4uaeYwO9gpSBzLTnMmSmTVpCZjvpJFV69qYbjYPpzNnCz1mb2wIvEhjWjRwQWuBzTO0jITww==", + "version": "1.51.4", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.51.4.tgz", + "integrity": "sha512-AoziS8lRQ3ew/lY5J4JSlzYSN9Fo0oiyMBY37L3Bwq4mOQJT5GSrdZYLFPt6pH1LApDI3ZJceNyx+rHRACZSeQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2621,9 +2599,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "cpu": [ "ppc64" ], @@ -2638,9 +2616,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "cpu": [ "arm" ], @@ -2655,9 +2633,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "cpu": [ "arm64" ], @@ -2672,9 +2650,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "cpu": [ "x64" ], @@ -2689,9 +2667,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "cpu": [ "arm64" ], @@ -2706,9 +2684,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "cpu": [ "x64" ], @@ -2723,9 +2701,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "cpu": [ "arm64" ], @@ -2740,9 +2718,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "cpu": [ "x64" ], @@ -2757,9 +2735,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "cpu": [ "arm" ], @@ -2774,9 +2752,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "cpu": [ "arm64" ], @@ -2791,9 +2769,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "cpu": [ "ia32" ], @@ -2808,9 +2786,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "cpu": [ "loong64" ], @@ -2825,9 +2803,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "cpu": [ "mips64el" ], @@ -2842,9 +2820,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "cpu": [ "ppc64" ], @@ -2859,9 +2837,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "cpu": [ "riscv64" ], @@ -2876,9 +2854,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "cpu": [ "s390x" ], @@ -2893,9 +2871,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ "x64" ], @@ -2910,9 +2888,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "cpu": [ "arm64" ], @@ -2927,9 +2905,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "cpu": [ "x64" ], @@ -2944,9 +2922,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "cpu": [ "arm64" ], @@ -2961,9 +2939,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "cpu": [ "x64" ], @@ -2978,9 +2956,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "cpu": [ "arm64" ], @@ -2995,9 +2973,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "cpu": [ "x64" ], @@ -3012,9 +2990,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "cpu": [ "arm64" ], @@ -3029,9 +3007,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "cpu": [ "ia32" ], @@ -3046,9 +3024,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "cpu": [ "x64" ], @@ -3105,13 +3083,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -3120,22 +3098,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", - "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0" + "@eslint/core": "^0.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3203,9 +3181,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -3216,9 +3194,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3226,13 +3204,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -3249,9 +3227,9 @@ } }, "node_modules/@firebase/analytics": { - "version": "0.10.18", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.18.tgz", - "integrity": "sha512-iN7IgLvM06iFk8BeFoWqvVpRFW3Z70f+Qe2PfCJ7vPIgLPjHXDE774DhCT5Y2/ZU/ZbXPDPD60x/XPWEoZLNdg==", + "version": "0.10.19", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.19.tgz", + "integrity": "sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.7.0", @@ -3265,9 +3243,9 @@ } }, "node_modules/@firebase/app": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.3.tgz", - "integrity": "sha512-by1leTfZkwGycPKRWpc+p5/IhpnOj8zaScVi4RRm9fMoFYS3IE87Wzx1Yf/ruVYowXOEuLqYY3VmJw5tU3+0Bg==", + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.6.tgz", + "integrity": "sha512-4uyt8BOrBsSq6i4yiOV/gG6BnnrvTeyymlNcaN/dKvyU1GoolxAafvIvaNP1RCGPlNab3OuE4MKUQuv2lH+PLQ==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.7.0", @@ -3281,9 +3259,9 @@ } }, "node_modules/@firebase/auth": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.11.0.tgz", - "integrity": "sha512-5j7+ua93X+IRcJ1oMDTClTo85l7Xe40WSkoJ+shzPrX7OISlVWLdE1mKC57PSD+/LfAbdhJmvKixINBw2ESK6w==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.0.tgz", + "integrity": "sha512-zkvLpsrxynWHk07qGrUDfCSqKf4AvfZGEqJ7mVCtYGjNNDbGE71k0Yn84rg8QEZu4hQw1BC0qDEHzpNVBcSVmA==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.7.0", @@ -3296,7 +3274,7 @@ }, "peerDependencies": { "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" + "@react-native-async-storage/async-storage": "^2.2.0" }, "peerDependenciesMeta": { "@react-native-async-storage/async-storage": { @@ -3318,9 +3296,9 @@ } }, "node_modules/@firebase/firestore": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.9.2.tgz", - "integrity": "sha512-iuA5+nVr/IV/Thm0Luoqf2mERUvK9g791FZpUJV1ZGXO6RL2/i/WFJUj5ZTVXy5pRjpWYO+ZzPcReNrlilmztA==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.9.3.tgz", + "integrity": "sha512-RVuvhcQzs1sD5Osr2naQS71H0bQMbSnib16uOWAKk3GaKb/WBPyCYSr2Ry7MqlxDP/YhwknUxECL07lw9Rq1nA==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.7.0", @@ -3523,11 +3501,130 @@ } }, "node_modules/@ioredis/commands": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", - "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.0.tgz", + "integrity": "sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow==", "license": "MIT" }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -4049,14 +4146,24 @@ "node": ">=0.10" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@playwright/test": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.0.tgz", - "integrity": "sha512-Tzh95Twig7hUwwNe381/K3PggZBZblKUe2wv25oIpzWLr6Z0m4KgV1ZVIjnR6GM9ANEqjZD7XsZEa6JL/7YEgg==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.56.0" + "playwright": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -4076,9 +4183,18 @@ } }, "node_modules/@posthog/core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.2.2.tgz", - "integrity": "sha512-f16Ozx6LIigRG+HsJdt+7kgSxZTHeX5f1JlCGKI1lXcvlZgfsCR338FuMI2QRYXGl+jg/vYFzGOTQBxl90lnBg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.9.0.tgz", + "integrity": "sha512-j7KSWxJTUtNyKynLt/p0hfip/3I46dWU2dk+pt7dKRoz2l5CYueHuHK4EO7Wlgno5yo1HO4sc4s30MXMTICHJw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6" + } + }, + "node_modules/@posthog/types": { + "version": "1.315.1", + "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.315.1.tgz", + "integrity": "sha512-m2NggfJRYby3AkAES6yHMLURvTeK+rxN+5nmkuaCbOXQPdtWacSFIG5ZwN8d3crSx+WpiFauCDdr1sc3ZFkTHg==", "license": "MIT" }, "node_modules/@protobufjs/aspromise": { @@ -4248,14 +4364,13 @@ } }, "node_modules/@rc-component/qrcode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", - "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.0.tgz", + "integrity": "sha512-ABA80Yer0c6I2+moqNY0kF3Y1NxIT6wDP/EINIqbiRbfZKP1HtHpKMh8WuTXLgVGYsoWG2g9/n0PgM8KdnJb4Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", - "classnames": "^2.3.2", - "rc-util": "^5.38.0" + "classnames": "^2.3.2" }, "engines": { "node": ">=8.x" @@ -4322,17 +4437,17 @@ } }, "node_modules/@redux-saga/core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", - "integrity": "sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.4.2.tgz", + "integrity": "sha512-nIMLGKo6jV6Wc1sqtVQs1iqbB3Kq20udB/u9XEaZQisT6YZ0NRB8+4L6WqD/E+YziYutd27NJbG8EWUPkb7c6Q==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.6.3", - "@redux-saga/deferred": "^1.2.1", - "@redux-saga/delay-p": "^1.2.1", - "@redux-saga/is": "^1.1.3", - "@redux-saga/symbols": "^1.1.3", - "@redux-saga/types": "^1.2.1", + "@babel/runtime": "^7.28.4", + "@redux-saga/deferred": "^1.3.1", + "@redux-saga/delay-p": "^1.3.1", + "@redux-saga/is": "^1.2.1", + "@redux-saga/symbols": "^1.2.1", + "@redux-saga/types": "^1.3.1", "typescript-tuple": "^2.2.1" }, "funding": { @@ -4341,51 +4456,51 @@ } }, "node_modules/@redux-saga/deferred": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz", - "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.3.1.tgz", + "integrity": "sha512-0YZ4DUivWojXBqLB/TmuRRpDDz7tyq1I0AuDV7qi01XlLhM5m51W7+xYtIckH5U2cMlv9eAuicsfRAi1XHpXIg==", "license": "MIT" }, "node_modules/@redux-saga/delay-p": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz", - "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.3.1.tgz", + "integrity": "sha512-597I7L5MXbD/1i3EmcaOOjL/5suxJD7p5tnbV1PiWnE28c2cYiIHqmSMK2s7us2/UrhOL2KTNBiD0qBg6KnImg==", "license": "MIT", "dependencies": { - "@redux-saga/symbols": "^1.1.3" + "@redux-saga/symbols": "^1.2.1" } }, "node_modules/@redux-saga/is": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz", - "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.2.1.tgz", + "integrity": "sha512-x3aWtX3GmQfEvn8dh0ovPbsXgK9JjpiR24wKztpGbZP8JZUWWvUgKrvnWZ/T/4iphOBftyVc9VrIwhAnsM+OFA==", "license": "MIT", "dependencies": { - "@redux-saga/symbols": "^1.1.3", - "@redux-saga/types": "^1.2.1" + "@redux-saga/symbols": "^1.2.1", + "@redux-saga/types": "^1.3.1" } }, "node_modules/@redux-saga/symbols": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz", - "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.2.1.tgz", + "integrity": "sha512-3dh+uDvpBXi7EUp/eO+N7eFM4xKaU4yuGBXc50KnZGzIrR/vlvkTFQsX13zsY8PB6sCFYAgROfPSRUj8331QSA==", "license": "MIT" }, "node_modules/@redux-saga/types": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", - "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.3.1.tgz", + "integrity": "sha512-YRCrJdhQLobGIQ8Cj1sta3nn6DrZDTSUnrIYhS2e5V590BmfVDleKoAquclAiKSBKWJwmuXTb+b4BL6rSHnahw==", "license": "MIT" }, "node_modules/@reduxjs/toolkit": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.9.0.tgz", - "integrity": "sha512-fSfQlSRu9Z5yBkvsNhYF2rPS8cGXn/TZVrlwN1948QyZ8xMZ0JvP50S2acZNaf+o63u6aEeMjipFyksjIcWrog==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", - "immer": "^10.0.3", + "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" @@ -4572,9 +4687,9 @@ } }, "node_modules/@rollup/plugin-node-resolve/node_modules/@rollup/pluginutils": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", - "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5043,9 +5158,9 @@ } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.3.0.tgz", - "integrity": "sha512-OuxqBprXRyhe8Pkfyz/4yHQJc5c3lm+TmYWSSx8u48g5yKewSQDOxkiLU5pAk3WnbLPy8XwU/PN+2BG0YFU9Nw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.6.1.tgz", + "integrity": "sha512-aSIk0vgBqv7PhX6/Eov+vlI4puCE0bRXzUG5HdCsHBpAfeMkI8Hva6kSOusnzKqs8bf04hU7s3Sf0XxGTj/1AA==", "license": "MIT", "engines": { "node": ">= 14" @@ -5068,17 +5183,17 @@ } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.3.0.tgz", - "integrity": "sha512-dmR4DJhJ4jqVWGWppuTL2blNFqOZZnt4aLkewbD1myFG3KVfUx8CrMQWEmGjkgPOtj5TO6xH9PyTJjXC6o5tnA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.6.1.tgz", + "integrity": "sha512-WPeRbnMXm927m4Kr69NTArPfI+p5/34FHftdCRI3LFPMyhZDzz6J3wLy4hzaVUgmMf10eLzmq2HGEMvpQmdynA==", "license": "MIT", "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "4.3.0", - "@sentry/cli": "^2.51.0", + "@sentry/babel-plugin-component-annotate": "4.6.1", + "@sentry/cli": "^2.57.0", "dotenv": "^16.3.1", "find-up": "^5.0.0", - "glob": "^9.3.2", + "glob": "^10.5.0", "magic-string": "0.30.8", "unplugin": "1.0.1" }, @@ -5099,9 +5214,9 @@ } }, "node_modules/@sentry/cli": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.56.0.tgz", - "integrity": "sha512-br6+1nTPUV5EG1oaxLzxv31kREFKr49Y1+3jutfMUz9Nl8VyVP7o9YwakB/YWl+0Vi0NXg5vq7qsd/OOuV5j8w==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.2.tgz", + "integrity": "sha512-U4u62V4vaTWF+o40Mih8aOpQKqKUbZQt9A3LorIJwaE3tO3XFLRI70eWtW2se1Qmy0RZ74zB14nYcFNFl2t4Rw==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -5118,20 +5233,20 @@ "node": ">= 10" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.56.0", - "@sentry/cli-linux-arm": "2.56.0", - "@sentry/cli-linux-arm64": "2.56.0", - "@sentry/cli-linux-i686": "2.56.0", - "@sentry/cli-linux-x64": "2.56.0", - "@sentry/cli-win32-arm64": "2.56.0", - "@sentry/cli-win32-i686": "2.56.0", - "@sentry/cli-win32-x64": "2.56.0" + "@sentry/cli-darwin": "2.58.2", + "@sentry/cli-linux-arm": "2.58.2", + "@sentry/cli-linux-arm64": "2.58.2", + "@sentry/cli-linux-i686": "2.58.2", + "@sentry/cli-linux-x64": "2.58.2", + "@sentry/cli-win32-arm64": "2.58.2", + "@sentry/cli-win32-i686": "2.58.2", + "@sentry/cli-win32-x64": "2.58.2" } }, "node_modules/@sentry/cli-darwin": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.56.0.tgz", - "integrity": "sha512-CzXFWbv3GrjU0gFlUM9jt0fvJmyo5ktty4HGxRFfS/eMC6xW58Gg/sEeMVEkdvk5osKooX/YEgfLBdo4zvuWDA==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.2.tgz", + "integrity": "sha512-MArsb3zLhA2/cbd4rTm09SmTpnEuZCoZOpuZYkrpDw1qzBVJmRFA1W1hGAQ9puzBIk/ubY3EUhhzuU3zN2uD6w==", "license": "BSD-3-Clause", "optional": true, "os": [ @@ -5142,9 +5257,9 @@ } }, "node_modules/@sentry/cli-linux-arm": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.56.0.tgz", - "integrity": "sha512-vQCCMhZLugPmr25XBoP94dpQsFa110qK5SBUVJcRpJKyzMZd+6ueeHNslq2mB0OF4BwL1qd/ZDIa4nxa1+0rjQ==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.2.tgz", + "integrity": "sha512-HU9lTCzcHqCz/7Mt5n+cv+nFuJdc1hGD2h35Uo92GgxX3/IujNvOUfF+nMX9j6BXH6hUt73R5c0Ycq9+a3Parg==", "cpu": [ "arm" ], @@ -5160,9 +5275,9 @@ } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.56.0.tgz", - "integrity": "sha512-91d5ZlC989j/t+TXor/glPyx6SnLFS/SlJ9fIrHIQohdGKyWWSFb4VKUan8Ok3GYu9SUzKTMByryIOoYEmeGVw==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.2.tgz", + "integrity": "sha512-ay3OeObnbbPrt45cjeUyQjsx5ain1laj1tRszWj37NkKu55NZSp4QCg1gGBZ0gBGhckI9nInEsmKtix00alw2g==", "cpu": [ "arm64" ], @@ -5178,9 +5293,9 @@ } }, "node_modules/@sentry/cli-linux-i686": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.56.0.tgz", - "integrity": "sha512-MZzXuq1Q/TktN81DUs6XSBU752pG3XWSJdZR+NCStIg3l8s3O/Pwh6OcDHTYqgwsYJaGBpA0fP2Afl5XeSAUNg==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.2.tgz", + "integrity": "sha512-CN9p0nfDFsAT1tTGBbzOUGkIllwS3hygOUyTK7LIm9z+UHw5uNgNVqdM/3Vg+02ymjkjISNB3/+mqEM5osGXdA==", "cpu": [ "x86", "ia32" @@ -5197,9 +5312,9 @@ } }, "node_modules/@sentry/cli-linux-x64": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.56.0.tgz", - "integrity": "sha512-INOO2OQ90Y3UzYgHRdrHdKC/0es3YSHLv0iNNgQwllL0YZihSVNYSSrZqcPq8oSDllEy9Vt9oOm/7qEnUP2Kfw==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.2.tgz", + "integrity": "sha512-oX/LLfvWaJO50oBVOn4ZvG2SDWPq0MN8SV9eg5tt2nviq+Ryltfr7Rtoo+HfV+eyOlx1/ZXhq9Wm7OT3cQuz+A==", "cpu": [ "x64" ], @@ -5215,9 +5330,9 @@ } }, "node_modules/@sentry/cli-win32-arm64": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.56.0.tgz", - "integrity": "sha512-eUvkVk9KK01q6/qyugQPh7dAxqFPbgOa62QAoSwo11WQFYc3NPgJLilFWLQo+nahHGYKh6PKuCJ5tcqnQq5Hkg==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.2.tgz", + "integrity": "sha512-+cl3x2HPVMpoSVGVM1IDWlAEREZrrVQj4xBb0TRKII7g3hUxRsAIcsrr7+tSkie++0FuH4go/b5fGAv51OEF3w==", "cpu": [ "arm64" ], @@ -5231,9 +5346,9 @@ } }, "node_modules/@sentry/cli-win32-i686": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.56.0.tgz", - "integrity": "sha512-mpCA8hKXuvT17bl1H/54KOa5i+02VBBHVlOiP3ltyBuQUqfvX/30Zl/86Spy+ikodovZWAHv5e5FpyXbY1/mPw==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.2.tgz", + "integrity": "sha512-omFVr0FhzJ8oTJSg1Kf+gjLgzpYklY0XPfLxZ5iiMiYUKwF5uo1RJRdkUOiEAv0IqpUKnmKcmVCLaDxsWclB7Q==", "cpu": [ "x86", "ia32" @@ -5248,9 +5363,9 @@ } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.56.0.tgz", - "integrity": "sha512-UV0pXNls+/ViAU/3XsHLLNEHCsRYaGEwJdY3HyGIufSlglxrX6BVApkV9ziGi4WAxcJWLjQdfcEs6V5B+wBy0A==", + "version": "2.58.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.2.tgz", + "integrity": "sha512-2NAFs9UxVbRztQbgJSP5i8TB9eJQ7xraciwj/93djrSMHSEbJ0vC47TME0iifgvhlHMs5vqETOKJtfbbpQAQFA==", "cpu": [ "x64" ], @@ -5311,12 +5426,12 @@ } }, "node_modules/@sentry/vite-plugin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-4.3.0.tgz", - "integrity": "sha512-MeTAHMmTOgBPMAjeW7/ONyXwgScZdaFFtNiALKcAODnVqC7eoHdSRIWeH5mkLr2Dvs7nqtBaDpKxRjUBgfm9LQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-4.6.1.tgz", + "integrity": "sha512-Qvys1y3o8/bfL3ikrHnJS9zxdjt0z3POshdBl3967UcflrTqBmnGNkcVk53SlmtJWIfh85fgmrLvGYwZ2YiqNg==", "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "4.3.0", + "@sentry/bundler-plugin-core": "4.6.1", "unplugin": "1.0.1" }, "engines": { @@ -5324,13 +5439,13 @@ } }, "node_modules/@sentry/webpack-plugin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-4.3.0.tgz", - "integrity": "sha512-K4nU1SheK/tvyakBws2zfd+MN6hzmpW+wPTbSbDWn1+WL9+g9hsPh8hjFFiVe47AhhUoUZ3YgiH2HyeHXjHflA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-4.6.1.tgz", + "integrity": "sha512-CJgT/t2pQWsPsMx9VJ86goU/orCQhL2HhDj5ZYBol6fPPoEGeTqKOPCnv/xsbCAfGSp1uHpyRLTA/Gx96u7VVA==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "4.3.0", + "@sentry/bundler-plugin-core": "4.6.1", "unplugin": "1.0.1", "uuid": "^9.0.0" }, @@ -5348,12 +5463,12 @@ "license": "MIT" }, "node_modules/@splitsoftware/splitio": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-11.6.0.tgz", - "integrity": "sha512-48sksG00073Nltma/BxpH6xHVZmoBjank40EU4h+XqrMGm0qM3jGngPO9R/iWAHdSduUWAoMJVJYA68AtvKgeQ==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-11.9.0.tgz", + "integrity": "sha512-1kWFgfkV1zE6Ubq8WkLVrvxsk1TF/UY2gux8A1jUdKyBwItrKJVjS10C9dspnkJxHSfRtMl2mtxJ/8vH7XjFew==", "license": "Apache-2.0", "dependencies": { - "@splitsoftware/splitio-commons": "2.6.0", + "@splitsoftware/splitio-commons": "2.9.0", "bloom-filters": "^3.0.4", "ioredis": "^4.28.0", "js-yaml": "^3.13.1", @@ -5366,9 +5481,9 @@ } }, "node_modules/@splitsoftware/splitio-commons": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-2.6.0.tgz", - "integrity": "sha512-0xODXLciIvHSuMlb8eukIB2epb3ZyGOsrwS0cMuTdxEvCqr7Nuc9pWDdJtRuN1UwL/jIjBnpDYAc8s6mpqLX2g==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-2.9.0.tgz", + "integrity": "sha512-dfGqtiuYcWeR235NM43z3BOULTFi+hdkB1FbOHePrufWJTYBOfuBeIgPnsW3wyg+kXyGkNN49JyywZHrJtVpDA==", "license": "Apache-2.0", "dependencies": { "@types/ioredis": "^4.28.0", @@ -5384,12 +5499,12 @@ } }, "node_modules/@splitsoftware/splitio-react": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-react/-/splitio-react-2.5.0.tgz", - "integrity": "sha512-qD5QaR5MXgHcivD9SwOLr6Xpuyd+G4KCe6Vb1YLbDDEqXeg50E/zPkLN4rmsgKY0gaOHSDyxTzIFU5NV3wNW4A==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-react/-/splitio-react-2.6.1.tgz", + "integrity": "sha512-9TUrvNHcN3F1VpnlT8l12OY+s/atBgpKoThixQTBP87DMlHXEtEF4/GNl+oKKdkNEymYY9lY1iR0xGatuTvi9A==", "license": "Apache-2.0", "dependencies": { - "@splitsoftware/splitio": "11.6.0", + "@splitsoftware/splitio": "11.9.0", "memoize-one": "^5.1.1", "shallowequal": "^1.1.0", "tslib": "^2.3.1" @@ -5440,12 +5555,12 @@ } }, "node_modules/@tanem/react-nprogress": { - "version": "5.0.55", - "resolved": "https://registry.npmjs.org/@tanem/react-nprogress/-/react-nprogress-5.0.55.tgz", - "integrity": "sha512-Y9Ywyr/5T7P8PB19DOoIHmTfDAFJ07lEo/KsGBAuHnWMP6XGgAnxzakfLR9j+mxPP3aFP464Hl4/WQsY0MfIgg==", + "version": "5.0.56", + "resolved": "https://registry.npmjs.org/@tanem/react-nprogress/-/react-nprogress-5.0.56.tgz", + "integrity": "sha512-OI5rXB6jxC/RLJqnIuaKNXu3qQ6Lf3+g1HqkqGz01E25iV3pZFYBihMdGsEeg/4pAm0O7xo/umcAA3jsdeibHA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.0", + "@babel/runtime": "^7.28.4", "hoist-non-react-statics": "^3.3.2" }, "peerDependencies": { @@ -5501,9 +5616,9 @@ "license": "MIT" }, "node_modules/@testing-library/react": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", - "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.1.tgz", + "integrity": "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==", "dev": true, "license": "MIT", "dependencies": { @@ -5786,9 +5901,9 @@ "license": "MIT" }, "node_modules/@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", "license": "MIT" }, "node_modules/@types/trusted-types": { @@ -6139,9 +6254,9 @@ } }, "node_modules/antd": { - "version": "5.27.4", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.27.4.tgz", - "integrity": "sha512-rhArohoAUCxhkPjGI/BXthOrrjaElL4Fb7d4vEHnIR3DpxFXfegd4rN21IgGdiF+Iz4EFuUZu8MdS8NuJHLSVQ==", + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.28.1.tgz", + "integrity": "sha512-ZfPjbv3pY/jRnBFFn3L1UIRltaW9H4QovokZzNA57EgH3hEhWxQ3wWVfWmU6a3Q1GpbOgWQBJK2vsuoPIYuc9g==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.2.1", @@ -6153,7 +6268,7 @@ "@babel/runtime": "^7.26.0", "@rc-component/color-picker": "~2.0.1", "@rc-component/mutate-observer": "^1.1.0", - "@rc-component/qrcode": "~1.0.0", + "@rc-component/qrcode": "~1.1.0", "@rc-component/tour": "~1.15.1", "@rc-component/trigger": "^2.3.0", "classnames": "^2.5.1", @@ -6165,7 +6280,7 @@ "rc-dialog": "~9.6.0", "rc-drawer": "~7.3.0", "rc-dropdown": "~4.2.1", - "rc-field-form": "~2.7.0", + "rc-field-form": "~2.7.1", "rc-image": "~7.12.0", "rc-input": "~1.8.0", "rc-input-number": "~9.5.0", @@ -6183,13 +6298,13 @@ "rc-slider": "~11.1.9", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", - "rc-table": "~7.53.0", + "rc-table": "~7.54.0", "rc-tabs": "~15.7.0", "rc-textarea": "~1.10.2", "rc-tooltip": "~6.4.0", "rc-tree": "~5.13.1", "rc-tree-select": "~5.27.0", - "rc-upload": "~4.9.2", + "rc-upload": "~4.11.0", "rc-util": "^5.44.4", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.2" @@ -6554,9 +6669,9 @@ } }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -6685,9 +6800,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", - "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", + "version": "2.9.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.12.tgz", + "integrity": "sha512-Mij6Lij93pTAIsSYy5cyBQ975Qh9uLEc5rwGTpomiZeXZL9yIS6uORJakb3ScHgfs0serMMfIbXzokPMuEiRyw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -6930,9 +7045,9 @@ } }, "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -6949,11 +7064,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -7130,9 +7245,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001748", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz", - "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "funding": [ { "type": "opencollective", @@ -7477,13 +7592,13 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", @@ -7691,9 +7806,9 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/cuint": { @@ -7898,18 +8013,18 @@ "license": "MIT" }, "node_modules/dayjs": { - "version": "1.11.18", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", - "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", "license": "MIT" }, "node_modules/dayjs-business-days2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/dayjs-business-days2/-/dayjs-business-days2-1.3.0.tgz", - "integrity": "sha512-OgDBnsNmlk9+vmRQaP4yFisXs29WDk0ItUUctIagmO6OIoxhf4vArTov5i+G4vjT9Sz8NXOLMLrOVP0X0lG/Hw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dayjs-business-days2/-/dayjs-business-days2-1.3.2.tgz", + "integrity": "sha512-UDJcMw5tM6hoIu8QgP4ASKuVPrnFqB8WMbtfmLe2WNMX/n6zmXfPKwULJS2CKpS+N/+Jdq5Vmo8dkke0sIaV1A==", "license": "MIT", "dependencies": { - "dayjs": "^1.11.13" + "dayjs": "^1.11.19" } }, "node_modules/debug": { @@ -8229,6 +8344,12 @@ "dev": true, "license": "MIT" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, "node_modules/eciesjs": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.15.tgz", @@ -8263,9 +8384,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.231", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.231.tgz", - "integrity": "sha512-cyl6vqZGkEBnz/PmvFHn/u9G/hbo+FF2CNAOXriG87QOeLsUdifCZ9UbHNscE9wGdrC8XstNMli0CbQnZQ+fkA==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "license": "ISC" }, "node_modules/elliptic": { @@ -8586,9 +8707,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8599,32 +8720,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, "node_modules/escalade": { @@ -8657,25 +8778,24 @@ } }, "node_modules/eslint": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", - "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.4.0", - "@eslint/core": "^0.16.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.37.0", - "@eslint/plugin-kit": "^0.4.0", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -9035,9 +9155,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -9222,6 +9342,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", @@ -9260,9 +9408,9 @@ "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -9407,18 +9555,20 @@ } }, "node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=16 || 14 >=14.17" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9464,9 +9614,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -9533,9 +9683,9 @@ "license": "ISC" }, "node_modules/graphql": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", - "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" @@ -9863,9 +10013,9 @@ } }, "node_modules/i18next": { - "version": "25.5.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.5.3.tgz", - "integrity": "sha512-joFqorDeQ6YpIXni944upwnuHBf5IoPMuqAchGVeQLdWC2JOjxgM9V8UGLhNIIH/Q8QleRxIi0BSRQehSrDLcg==", + "version": "25.7.4", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.7.4.tgz", + "integrity": "sha512-hRkpEblXXcXSNbw8mBNq9042OEetgyB/ahc/X17uV/khPwzV+uB8RHceHh3qavyrkPJvmXFKXME2Sy1E0KjAfw==", "funding": [ { "type": "individual", @@ -9882,7 +10032,7 @@ ], "license": "MIT", "dependencies": { - "@babel/runtime": "^7.27.6" + "@babel/runtime": "^7.28.4" }, "peerDependencies": { "typescript": "^5" @@ -9953,9 +10103,9 @@ } }, "node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.0.1.tgz", + "integrity": "sha512-naDCyggtcBWANtIrjQEajhhBEuL9b0Zg4zmlWK2CzS6xCWSE39/vvf4LqnMjUAWHBhot4m9MHCM/Z+mfWhUkiA==", "license": "MIT", "funding": { "type": "opencollective", @@ -10755,6 +10905,21 @@ "node": ">= 0.4" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.9.4", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", @@ -10785,9 +10950,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -11009,9 +11174,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.12.23", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.23.tgz", - "integrity": "sha512-RN3q3gImZ91BvRDYjWp7ICz3gRn81mW5L4SW+2afzNCC0I/nkXstBgZThQGTE3S/9q5J90FH4dP+TXx8NhdZKg==", + "version": "1.12.33", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.33.tgz", + "integrity": "sha512-r9kw4OA6oDO4dPXkOrXTkArQAafIKAU71hChInV4FxZ69dxCfbwQGDPzqR5/vea94wU705/3AZroEbSoeVWrQw==", "license": "MIT" }, "node_modules/lightningcss": { @@ -11627,9 +11792,9 @@ } }, "node_modules/memfs": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.48.1.tgz", - "integrity": "sha512-vWO+1ROkhOALF1UnT9aNOOflq5oFDlqwTXaPg6duo07fBLxSH0+bcF0TY1lbA1zTNKyGgDxgaDdKx5MaewLX5A==", + "version": "4.51.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.1.tgz", + "integrity": "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12245,12 +12410,12 @@ } }, "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { @@ -12388,9 +12553,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", - "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/node-stdlib-browser": { @@ -12449,9 +12614,9 @@ } }, "node_modules/normalize-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", - "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "license": "MIT", "engines": { "node": ">=14.16" @@ -12765,6 +12930,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -12956,15 +13127,6 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-to-regexp": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", @@ -13060,9 +13222,9 @@ "license": "MIT" }, "node_modules/phone": { - "version": "3.1.67", - "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.67.tgz", - "integrity": "sha512-7XdKmQYhKcoDXQWM8lnnPMhcLrPEIo2uQByJu4Seo2ZfvOgonr2tP9ueBjZRdxIhfm8X1VeZU0+JRrEyJSs1SQ==", + "version": "3.1.69", + "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.69.tgz", + "integrity": "sha512-Nc6lY9p4bbdYdmHewuIC5lZdLOnu5r0Vm9imL4leZCz0tUD5RFPqRtdGmYR6VMpFT5oP+8ty2nu6lxVV3Jzprw==", "license": "MIT", "engines": { "node": ">=12" @@ -13101,13 +13263,13 @@ } }, "node_modules/playwright": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.0.tgz", - "integrity": "sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.56.0" + "playwright-core": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -13120,9 +13282,9 @@ } }, "node_modules/playwright-core": { - "version": "1.56.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.0.tgz", - "integrity": "sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -13132,6 +13294,21 @@ "node": ">=18" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -13177,28 +13354,17 @@ "license": "MIT" }, "node_modules/posthog-js": { - "version": "1.271.0", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.271.0.tgz", - "integrity": "sha512-jYsWrxO+xRkSm7Sigy6SAsnd688VPG0twL3nkonbjVEy+cB80967bhA2mgu2CDTvQ14sLgYfue8ukbSR0Rtvlw==", + "version": "1.315.1", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.315.1.tgz", + "integrity": "sha512-ambT1azidu4hKhSmB95KdLY6yHfj9vvz1XNn68syh8DtkQ0uSdjpRY6tjMp96EQtPqCrDKr+8QpcusT1KQEZSA==", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@posthog/core": "1.2.2", + "@posthog/core": "1.9.0", + "@posthog/types": "1.315.1", "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" - }, - "peerDependencies": { - "@rrweb/types": "2.0.0-alpha.17", - "rrweb-snapshot": "2.0.0-alpha.17" - }, - "peerDependenciesMeta": { - "@rrweb/types": { - "optional": true - }, - "rrweb-snapshot": { - "optional": true - } } }, "node_modules/posthog-js/node_modules/core-js": { @@ -13571,9 +13737,9 @@ } }, "node_modules/rc-field-form": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz", - "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.1.tgz", + "integrity": "sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -13918,9 +14084,9 @@ } }, "node_modules/rc-table": { - "version": "7.53.1", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.53.1.tgz", - "integrity": "sha512-firAd7Z+liqIDS5TubJ1qqcoBd6YcANLKWQDZhFf3rfoOTt/UNPj4n3O+2vhl+z4QMqwPEUVAil661WHA8H8Aw==", + "version": "7.54.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.54.0.tgz", + "integrity": "sha512-/wDTkki6wBTjwylwAGjpLKYklKo9YgjZwAU77+7ME5mBoS32Q4nAwoqhA2lSge6fobLW3Tap6uc5xfwaL2p0Sw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -14031,9 +14197,9 @@ } }, "node_modules/rc-upload": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.9.2.tgz", - "integrity": "sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.11.0.tgz", + "integrity": "sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -14384,9 +14550,9 @@ } }, "node_modules/react-product-fruits": { - "version": "2.2.61", - "resolved": "https://registry.npmjs.org/react-product-fruits/-/react-product-fruits-2.2.61.tgz", - "integrity": "sha512-zqmrtgwI6TLIR1g6pk9SzAutoKgC/7L1Y0ffsleymcAjSUxhHAla5A0bS2vMLq+WkgYKKH7Dl+Z9VxUywLEdeg==", + "version": "2.2.62", + "resolved": "https://registry.npmjs.org/react-product-fruits/-/react-product-fruits-2.2.62.tgz", + "integrity": "sha512-jpIbVEbe+JpgxZ8vDRwC4ggjb9OIWKHB+pt3eX+oa1jiLkxdKzQKdmHcECaqF9XZtIxX3t+bzGDvvnaw3l7tYQ==", "license": "MIT", "dependencies": { "product-fruits": "^1.0.25" @@ -14429,16 +14595,17 @@ } }, "node_modules/react-resizable": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.5.tgz", - "integrity": "sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.1.3.tgz", + "integrity": "sha512-liJBNayhX7qA4tBJiBD321FDhJxgGTJ07uzH5zSORXoE8h7PyEZ8mLqmosST7ppf6C4zUsbd2gzDMmBCfFp9Lw==", "license": "MIT", "dependencies": { "prop-types": "15.x", - "react-draggable": "^4.0.3" + "react-draggable": "^4.5.0" }, "peerDependencies": { - "react": ">= 16.3" + "react": ">= 16.3", + "react-dom": ">= 16.3" } }, "node_modules/react-router": { @@ -14519,9 +14686,9 @@ } }, "node_modules/react-virtuoso": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.14.1.tgz", - "integrity": "sha512-NRUF1ak8lY+Tvc6WN9cce59gU+lilzVtOozP+pm9J7iHshLGGjsiAB4rB2qlBPHjFbcXOQpT+7womNHGDUql8w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.18.1.tgz", + "integrity": "sha512-KF474cDwaSb9+SJ380xruBB4P+yGWcVkcu26HtMqYNMTYlYbrNy8vqMkE+GpAApPPufJqgOLMoWMFG/3pJMXUA==", "license": "MIT", "peerDependencies": { "react": ">=16 || >=17 || >= 18 || >= 19", @@ -14683,12 +14850,12 @@ } }, "node_modules/redux-saga": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.3.0.tgz", - "integrity": "sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.4.2.tgz", + "integrity": "sha512-QLIn/q+7MX/B+MkGJ/K6R3//60eJ4QNy65eqPsJrfGezbxdh1Jx+37VRKE2K4PsJnNET5JufJtgWdT30WBa+6w==", "license": "MIT", "dependencies": { - "@redux-saga/core": "^1.3.0" + "@redux-saga/core": "^1.4.2" } }, "node_modules/redux-state-sync": { @@ -14746,9 +14913,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { @@ -14786,18 +14953,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -14811,31 +14978,18 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/rehackt": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz", @@ -15160,9 +15314,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", - "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.2.tgz", + "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -15460,13 +15614,13 @@ } }, "node_modules/socket.io-client": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", - "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", + "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" }, @@ -15474,23 +15628,6 @@ "node": ">=10.0.0" } }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -15819,6 +15956,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", @@ -15968,6 +16120,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", @@ -16053,19 +16218,19 @@ } }, "node_modules/styled-components": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", - "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.2.0.tgz", + "integrity": "sha512-ryFCkETE++8jlrBmC+BoGPUN96ld1/Yp0s7t5bcXDobrs4XoXroY1tN+JbFi09hV6a5h3MzbcVi8/BGDP0eCgQ==", "license": "MIT", "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", + "@types/stylis": "4.2.7", "css-to-react-native": "3.2.0", - "csstype": "3.1.3", + "csstype": "3.2.3", "postcss": "8.4.49", "shallowequal": "1.1.0", - "stylis": "4.3.2", + "stylis": "4.3.6", "tslib": "2.6.2" }, "engines": { @@ -16101,12 +16266,6 @@ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", "license": "MIT" }, - "node_modules/styled-components/node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" - }, "node_modules/styled-components/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -16307,14 +16466,14 @@ } }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -16784,9 +16943,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", "engines": { @@ -16794,9 +16953,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", "engines": { @@ -17016,9 +17175,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -17200,13 +17359,13 @@ } }, "node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", @@ -17384,17 +17543,17 @@ } }, "node_modules/vite-plugin-pwa": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.0.3.tgz", - "integrity": "sha512-/OpqIpUldALGxcsEnv/ekQiQ5xHkQ53wcoN5ewX4jiIDNGs3W+eNcI1WYZeyOLmzoEjg09D7aX0O89YGjen1aw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.2.0.tgz", + "integrity": "sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.3.6", "pretty-bytes": "^6.1.1", "tinyglobby": "^0.2.10", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0" + "workbox-build": "^7.4.0", + "workbox-window": "^7.4.0" }, "engines": { "node": ">=16.0.0" @@ -17405,8 +17564,8 @@ "peerDependencies": { "@vite-pwa/assets-generator": "^1.0.0", "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0" + "workbox-build": "^7.4.0", + "workbox-window": "^7.4.0" }, "peerDependenciesMeta": { "@vite-pwa/assets-generator": { @@ -17443,21 +17602,6 @@ "sourcemap-codec": "^1.4.8" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vite/node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -17816,30 +17960,30 @@ } }, "node_modules/workbox-background-sync": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", - "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.4.0.tgz", + "integrity": "sha512-8CB9OxKAgKZKyNMwfGZ1XESx89GryWTfI+V5yEj8sHjFH8MFelUwYXEyldEK6M6oKMmn807GoJFUEA1sC4XS9w==", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/workbox-broadcast-update": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", - "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.4.0.tgz", + "integrity": "sha512-+eZQwoktlvo62cI0b+QBr40v5XjighxPq3Fzo9AWMiAosmpG5gxRHgTbGGhaJv/q/MFVxwFNGh/UwHZ/8K88lA==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/workbox-build": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", - "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.4.0.tgz", + "integrity": "sha512-Ntk1pWb0caOFIvwz/hfgrov/OJ45wPEhI5PbTywQcYjyZiVhT3UrwwUPl6TRYbTm4moaFYithYnl1lvZ8UjxcA==", "dev": true, "license": "MIT", "dependencies": { @@ -17856,33 +18000,33 @@ "common-tags": "^1.8.0", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^9.0.1", - "glob": "^7.1.6", + "glob": "^11.0.1", "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", + "rollup": "^2.79.2", "source-map": "^0.8.0-beta.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "7.3.0", - "workbox-broadcast-update": "7.3.0", - "workbox-cacheable-response": "7.3.0", - "workbox-core": "7.3.0", - "workbox-expiration": "7.3.0", - "workbox-google-analytics": "7.3.0", - "workbox-navigation-preload": "7.3.0", - "workbox-precaching": "7.3.0", - "workbox-range-requests": "7.3.0", - "workbox-recipes": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0", - "workbox-streams": "7.3.0", - "workbox-sw": "7.3.0", - "workbox-window": "7.3.0" + "workbox-background-sync": "7.4.0", + "workbox-broadcast-update": "7.4.0", + "workbox-cacheable-response": "7.4.0", + "workbox-core": "7.4.0", + "workbox-expiration": "7.4.0", + "workbox-google-analytics": "7.4.0", + "workbox-navigation-preload": "7.4.0", + "workbox-precaching": "7.4.0", + "workbox-range-requests": "7.4.0", + "workbox-recipes": "7.4.0", + "workbox-routing": "7.4.0", + "workbox-strategies": "7.4.0", + "workbox-streams": "7.4.0", + "workbox-sw": "7.4.0", + "workbox-window": "7.4.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/workbox-build/node_modules/ajv": { @@ -17919,22 +18063,40 @@ } }, "node_modules/workbox-build/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/workbox-build/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -17947,6 +18109,49 @@ "dev": true, "license": "MIT" }, + "node_modules/workbox-build/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/workbox-build/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/workbox-build/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/workbox-build/node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -18020,140 +18225,140 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", - "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.4.0.tgz", + "integrity": "sha512-0Fb8795zg/x23ISFkAc7lbWes6vbw34DGFIMw31cwuHPgDEC/5EYm6m/ZkylLX0EnEbbOyOCLjKgFS/Z5g0HeQ==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/workbox-core": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", - "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.4.0.tgz", + "integrity": "sha512-6BMfd8tYEnN4baG4emG9U0hdXM4gGuDU3ectXuVHnj71vwxTFI7WOpQJC4siTOlVtGqCUtj0ZQNsrvi6kZZTAQ==", "dev": true, "license": "MIT" }, "node_modules/workbox-expiration": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", - "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.4.0.tgz", + "integrity": "sha512-V50p4BxYhtA80eOvulu8xVfPBgZbkxJ1Jr8UUn0rvqjGhLDqKNtfrDfjJKnLz2U8fO2xGQJTx/SKXNTzHOjnHw==", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/workbox-google-analytics": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", - "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.4.0.tgz", + "integrity": "sha512-MVPXQslRF6YHkzGoFw1A4GIB8GrKym/A5+jYDUSL+AeJw4ytQGrozYdiZqUW1TPQHW8isBCBtyFJergUXyNoWQ==", "dev": true, "license": "MIT", "dependencies": { - "workbox-background-sync": "7.3.0", - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" + "workbox-background-sync": "7.4.0", + "workbox-core": "7.4.0", + "workbox-routing": "7.4.0", + "workbox-strategies": "7.4.0" } }, "node_modules/workbox-navigation-preload": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", - "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.4.0.tgz", + "integrity": "sha512-etzftSgdQfjMcfPgbfaZCfM2QuR1P+4o8uCA2s4rf3chtKTq/Om7g/qvEOcZkG6v7JZOSOxVYQiOu6PbAZgU6w==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/workbox-precaching": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", - "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.4.0.tgz", + "integrity": "sha512-VQs37T6jDqf1rTxUJZXRl3yjZMf5JX/vDPhmx2CPgDDKXATzEoqyRqhYnRoxl6Kr0rqaQlp32i9rtG5zTzIlNg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" + "workbox-core": "7.4.0", + "workbox-routing": "7.4.0", + "workbox-strategies": "7.4.0" } }, "node_modules/workbox-range-requests": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", - "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.4.0.tgz", + "integrity": "sha512-3Vq854ZNuP6Y0KZOQWLaLC9FfM7ZaE+iuQl4VhADXybwzr4z/sMmnLgTeUZLq5PaDlcJBxYXQ3U91V7dwAIfvw==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/workbox-recipes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", - "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.4.0.tgz", + "integrity": "sha512-kOkWvsAn4H8GvAkwfJTbwINdv4voFoiE9hbezgB1sb/0NLyTG4rE7l6LvS8lLk5QIRIto+DjXLuAuG3Vmt3cxQ==", "dev": true, "license": "MIT", "dependencies": { - "workbox-cacheable-response": "7.3.0", - "workbox-core": "7.3.0", - "workbox-expiration": "7.3.0", - "workbox-precaching": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" + "workbox-cacheable-response": "7.4.0", + "workbox-core": "7.4.0", + "workbox-expiration": "7.4.0", + "workbox-precaching": "7.4.0", + "workbox-routing": "7.4.0", + "workbox-strategies": "7.4.0" } }, "node_modules/workbox-routing": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", - "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.4.0.tgz", + "integrity": "sha512-C/ooj5uBWYAhAqwmU8HYQJdOjjDKBp9MzTQ+otpMmd+q0eF59K+NuXUek34wbL0RFrIXe/KKT+tUWcZcBqxbHQ==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/workbox-strategies": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", - "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.4.0.tgz", + "integrity": "sha512-T4hVqIi5A4mHi92+5EppMX3cLaVywDp8nsyUgJhOZxcfSV/eQofcOA6/EMo5rnTNmNTpw0rUgjAI6LaVullPpg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/workbox-streams": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", - "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.4.0.tgz", + "integrity": "sha512-QHPBQrey7hQbnTs5GrEVoWz7RhHJXnPT+12qqWM378orDMo5VMJLCkCM1cnCk+8Eq92lccx/VgRZ7WAzZWbSLg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0" + "workbox-core": "7.4.0", + "workbox-routing": "7.4.0" } }, "node_modules/workbox-sw": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", - "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.4.0.tgz", + "integrity": "sha512-ltU+Kr3qWR6BtbdlMnCjobZKzeV1hN+S6UvDywBrwM19TTyqA03X66dzw1tEIdJvQ4lYKkBFox6IAEhoSEZ8Xw==", "dev": true, "license": "MIT" }, "node_modules/workbox-window": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", - "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.4.0.tgz", + "integrity": "sha512-/bIYdBLAVsNR3v7gYGaV4pQW3M3kEPx5E8vDxGvxo6khTrGtSSCS7QiFKv9ogzBgZiy0OXLP9zO28U/1nF1mfw==", "dev": true, "license": "MIT", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "7.3.0" + "workbox-core": "7.4.0" } }, "node_modules/wrap-ansi": { @@ -18173,6 +18378,39 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", diff --git a/client/package.json b/client/package.json index 7c1d801b4..18620bbf3 100644 --- a/client/package.json +++ b/client/package.json @@ -8,49 +8,49 @@ "private": true, "proxy": "http://localhost:4000", "dependencies": { - "@amplitude/analytics-browser": "^2.25.2", + "@amplitude/analytics-browser": "^2.33.1", "@ant-design/pro-layout": "^7.22.6", "@apollo/client": "^3.13.9", "@emotion/is-prop-valid": "^1.4.0", "@fingerprintjs/fingerprintjs": "^4.6.1", - "@firebase/analytics": "^0.10.17", - "@firebase/app": "^0.14.3", - "@firebase/auth": "^1.10.8", - "@firebase/firestore": "^4.9.2", + "@firebase/analytics": "^0.10.19", + "@firebase/app": "^0.14.6", + "@firebase/auth": "^1.12.0", + "@firebase/firestore": "^4.9.3", "@firebase/messaging": "^0.12.22", "@jsreport/browser-client": "^3.1.0", - "@reduxjs/toolkit": "^2.9.0", - "@sentry/cli": "^2.56.0", + "@reduxjs/toolkit": "^2.11.2", + "@sentry/cli": "^2.58.2", "@sentry/react": "^9.43.0", - "@sentry/vite-plugin": "^4.3.0", - "@splitsoftware/splitio-react": "^2.5.0", - "@tanem/react-nprogress": "^5.0.53", - "antd": "^5.27.4", + "@sentry/vite-plugin": "^4.6.1", + "@splitsoftware/splitio-react": "^2.6.1", + "@tanem/react-nprogress": "^5.0.56", + "antd": "^5.28.1", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^4.4.0", "autosize": "^6.0.1", - "axios": "^1.12.2", + "axios": "^1.13.2", "classnames": "^2.5.1", "css-box-model": "^1.2.1", - "dayjs": "^1.11.18", - "dayjs-business-days2": "^1.3.0", + "dayjs": "^1.11.19", + "dayjs-business-days2": "^1.3.2", "dinero.js": "^1.9.1", "dotenv": "^17.2.3", "env-cmd": "^10.1.0", "exifr": "^7.1.3", - "graphql": "^16.11.0", - "i18next": "^25.5.3", + "graphql": "^16.12.0", + "i18next": "^25.7.4", "i18next-browser-languagedetector": "^8.2.0", "immutability-helper": "^3.1.1", - "libphonenumber-js": "^1.12.23", + "libphonenumber-js": "^1.12.33", "lightningcss": "^1.30.2", "logrocket": "^9.0.2", "markerjs2": "^2.32.7", "memoize-one": "^6.0.0", - "normalize-url": "^8.1.0", + "normalize-url": "^8.1.1", "object-hash": "^3.0.0", - "phone": "^3.1.67", - "posthog-js": "^1.271.0", + "phone": "^3.1.69", + "posthog-js": "^1.315.1", "prop-types": "^15.8.1", "query-string": "^9.3.1", "raf-schd": "^4.0.3", @@ -68,22 +68,22 @@ "react-markdown": "^10.1.0", "react-number-format": "^5.4.3", "react-popopo": "^2.1.9", - "react-product-fruits": "^2.2.61", + "react-product-fruits": "^2.2.62", "react-redux": "^9.2.0", - "react-resizable": "^3.0.5", + "react-resizable": "^3.1.3", "react-router-dom": "^6.30.0", "react-sticky": "^6.0.3", - "react-virtuoso": "^4.14.1", + "react-virtuoso": "^4.18.1", "recharts": "^2.15.2", "redux": "^5.0.1", "redux-actions": "^3.0.3", "redux-persist": "^6.0.0", - "redux-saga": "^1.3.0", + "redux-saga": "^1.4.2", "redux-state-sync": "^3.1.4", "reselect": "^5.1.1", - "sass": "^1.93.2", - "socket.io-client": "^4.8.1", - "styled-components": "^6.1.19", + "sass": "^1.97.2", + "socket.io-client": "^4.8.3", + "styled-components": "^6.2.0", "subscriptions-transport-ws": "^0.11.0", "use-memo-one": "^1.1.3", "vite-plugin-ejs": "^1.7.0", @@ -135,37 +135,37 @@ "devDependencies": { "@ant-design/icons": "^6.1.0", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/preset-react": "^7.27.1", - "@dotenvx/dotenvx": "^1.51.0", + "@babel/preset-react": "^7.28.5", + "@dotenvx/dotenvx": "^1.51.4", "@emotion/babel-plugin": "^11.13.5", "@emotion/react": "^11.14.0", - "@eslint/js": "^9.37.0", - "@playwright/test": "^1.56.0", - "@sentry/webpack-plugin": "^4.3.0", + "@eslint/js": "^9.39.2", + "@playwright/test": "^1.57.0", + "@sentry/webpack-plugin": "^4.6.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.0", + "@testing-library/react": "^16.3.1", "@vitejs/plugin-react": "^4.6.0", - "browserslist": "^4.26.3", + "browserslist": "^4.28.1", "browserslist-to-esbuild": "^2.1.1", "chalk": "^5.6.2", - "eslint": "^9.37.0", + "eslint": "^9.39.2", "eslint-plugin-react": "^7.37.5", "globals": "^15.15.0", "jsdom": "^26.0.0", - "memfs": "^4.48.1", + "memfs": "^4.51.1", "os-browserify": "^0.3.0", - "playwright": "^1.56.0", + "playwright": "^1.57.0", "react-error-overlay": "^6.1.0", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", - "vite": "^7.1.9", + "vite": "^7.3.1", "vite-plugin-babel": "^1.3.2", "vite-plugin-eslint": "^1.8.1", "vite-plugin-node-polyfills": "^0.24.0", - "vite-plugin-pwa": "^1.0.3", + "vite-plugin-pwa": "^1.2.0", "vite-plugin-style-import": "^2.0.0", "vitest": "^3.2.4", - "workbox-window": "^7.3.0" + "workbox-window": "^7.4.0" } } diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss index 51dafcdfe..09745eac9 100644 --- a/client/src/App/App.styles.scss +++ b/client/src/App/App.styles.scss @@ -1,3 +1,5 @@ +@use "react-big-calendar/lib/sass/styles" as rbc; + :root { --table-stripe-bg: #f4f4f4; /* Light mode table stripe */ --menu-divider-color: #74695c; /* Light mode menu divider */ @@ -211,9 +213,6 @@ --svg-background: #FFF; /* Dark mode SVG background */ } -// Global Styles -@import "react-big-calendar/lib/sass/styles"; - .ant-menu-item-divider { border-bottom: 1px solid var(--menu-divider-color) !important; } @@ -426,6 +425,24 @@ } } +.dms-equal-height-col { + display: flex; // make the Col a flex container +} + +/* If the direct child is an AntD Card, make it fill the column */ +.dms-equal-height-col > .ant-card { + flex: 1 1 auto; + display: flex; + flex-direction: column; +} + +/* Optional: if you want the card body to fill vertically too */ +.dms-equal-height-col > .ant-card .ant-card-body { + flex: 1; + display: flex; + flex-direction: column; +} + //.rbc-time-header-gutter { // padding: 0; -//} +//} diff --git a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx index a3aacdb08..74dd0d9c8 100644 --- a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx +++ b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx @@ -180,7 +180,7 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r - {!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && ( + {!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && !bodyshop.rr_dealerid && ( <> )} - {bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && } + {bodyshop.accountingconfig?.qbo && } diff --git a/client/src/components/bill-form/bill-form.component.jsx b/client/src/components/bill-form/bill-form.component.jsx index c0f209205..a64d66582 100644 --- a/client/src/components/bill-form/bill-form.component.jsx +++ b/client/src/components/bill-form/bill-form.component.jsx @@ -1,6 +1,6 @@ import Icon, { UploadOutlined } from "@ant-design/icons"; import { useApolloClient } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Alert, Divider, Form, Input, Select, Space, Statistic, Switch, Upload } from "antd"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -22,6 +22,7 @@ import VendorSearchSelect from "../vendor-search-select/vendor-search-select.com import BillFormLines from "./bill-form.lines.component"; import { CalculateBillTotal } from "./bill-form.totals.utility"; import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop @@ -50,7 +51,7 @@ export function BillFormComponent({ const { treatments: { Extended_Bill_Posting, ClosingPeriod } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Extended_Bill_Posting", "ClosingPeriod"], splitKey: bodyshop.imexshopid @@ -354,7 +355,7 @@ export function BillFormComponent({ - {bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? ( + {bodyshopHasDmsKey(bodyshop) ? ( diff --git a/client/src/components/bill-form/bill-form.container.jsx b/client/src/components/bill-form/bill-form.container.jsx index 6ba9bd39f..b09830179 100644 --- a/client/src/components/bill-form/bill-form.container.jsx +++ b/client/src/components/bill-form/bill-form.container.jsx @@ -1,5 +1,5 @@ import { useLazyQuery, useQuery } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { QUERY_OUTSTANDING_INVENTORY } from "../../graphql/inventory.queries"; @@ -18,7 +18,7 @@ const mapStateToProps = createStructuredSelector({ export function BillFormContainer({ bodyshop, form, billEdit, disabled, disableInvNumber, disableInHouse }) { const { treatments: { Simple_Inventory } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Simple_Inventory"], splitKey: bodyshop && bodyshop.imexshopid diff --git a/client/src/components/bill-form/bill-form.lines.component.jsx b/client/src/components/bill-form/bill-form.lines.component.jsx index d1a2c12a8..c030878f0 100644 --- a/client/src/components/bill-form/bill-form.lines.component.jsx +++ b/client/src/components/bill-form/bill-form.lines.component.jsx @@ -1,5 +1,5 @@ import { DeleteFilled, DollarCircleFilled } from "@ant-design/icons"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Button, Checkbox, Form, Input, InputNumber, Select, Space, Switch, Table, Tooltip } from "antd"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; @@ -10,6 +10,7 @@ import InstanceRenderManager from "../../utils/instanceRenderMgr"; import BillLineSearchSelect from "../bill-line-search-select/bill-line-search-select.component"; import BilllineAddInventory from "../billline-add-inventory/billline-add-inventory.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; const mapStateToProps = createStructuredSelector({ //currentUser: selectCurrentUser @@ -33,7 +34,7 @@ export function BillEnterModalLinesComponent({ const { treatments: { Simple_Inventory, Enhanced_Payroll } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Simple_Inventory", "Enhanced_Payroll"], splitKey: bodyshop && bodyshop.imexshopid @@ -90,7 +91,7 @@ export function BillEnterModalLinesComponent({ actual_price: opt.cost, original_actual_price: opt.cost, cost_center: opt.part_type - ? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid + ? bodyshopHasDmsKey(bodyshop) ? opt.part_type !== "PAE" ? opt.part_type : null @@ -322,7 +323,7 @@ export function BillEnterModalLinesComponent({ }, formInput: () => ( diff --git a/client/src/components/breadcrumbs/breadcrumbs.component.jsx b/client/src/components/breadcrumbs/breadcrumbs.component.jsx index b9fa57fd4..2ca9fcde0 100644 --- a/client/src/components/breadcrumbs/breadcrumbs.component.jsx +++ b/client/src/components/breadcrumbs/breadcrumbs.component.jsx @@ -8,7 +8,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors"; import GlobalSearch from "../global-search/global-search.component"; import GlobalSearchOs from "../global-search/global-search-os.component"; import "./breadcrumbs.styles.scss"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ breadcrumbs: selectBreadcrumbs, @@ -19,7 +19,7 @@ const mapStateToProps = createStructuredSelector({ export function BreadCrumbs({ breadcrumbs, bodyshop, isPartsEntry }) { const { treatments: { OpenSearch } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["OpenSearch"], splitKey: bodyshop?.imexshopid diff --git a/client/src/components/chat-media-selector/chat-media-selector.component.jsx b/client/src/components/chat-media-selector/chat-media-selector.component.jsx index ff2336f69..676aa4fef 100644 --- a/client/src/components/chat-media-selector/chat-media-selector.component.jsx +++ b/client/src/components/chat-media-selector/chat-media-selector.component.jsx @@ -1,6 +1,6 @@ import { PictureFilled } from "@ant-design/icons"; import { useQuery } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Badge, Popover } from "antd"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -28,7 +28,7 @@ export function ChatMediaSelector({ bodyshop, selectedMedia, setSelectedMedia, c const [open, setOpen] = useState(false); const { treatments: { Imgproxy } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Imgproxy"], splitKey: bodyshop && bodyshop.imexshopid diff --git a/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx b/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx index 40d9fb3f4..b315c440a 100644 --- a/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx +++ b/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx @@ -55,7 +55,7 @@ export function DmsAllocationsSummaryAp({ socket, bodyshop, billids, title }) { }); } }, [socket, socket.connected, billids]); - console.log(allocationsSummary); + const columns = [ { title: t("general.labels.status"), @@ -122,7 +122,7 @@ export function DmsAllocationsSummaryAp({ socket, bodyshop, billids, title }) { ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) -}); +const mapDispatchToProps = () => ({}); export default connect(mapStateToProps, mapDispatchToProps)(DmsAllocationsSummary); -export function DmsAllocationsSummary({ socket, bodyshop, jobId, title }) { +/** + * DMS Allocations Summary component + * @param mode + * @param socket + * @param bodyshop + * @param jobId + * @param title + * @param onAllocationsChange + * @returns {JSX.Element} + * @constructor + */ +export function DmsAllocationsSummary({ mode, socket, bodyshop, jobId, title, onAllocationsChange }) { const { t } = useTranslation(); const [allocationsSummary, setAllocationsSummary] = useState([]); - useEffect(() => { - if (socket.connected) { - socket.emit("cdk-calculate-allocations", jobId, (ack) => { - setAllocationsSummary(ack); - socket.allocationsSummary = ack; + // Resolve event name by mode (PBS reuses the CDK event per existing behavior) + const allocationsEvent = + mode === DMS_MAP.reynolds + ? "rr-calculate-allocations" + : mode === DMS_MAP.fortellis + ? "fortellis-calculate-allocations" + : /* "cdk" | "pbs" (legacy) */ "cdk-calculate-allocations"; + + const fetchAllocations = useCallback(() => { + if (!socket || !jobId || !mode) return; + + try { + socket.emit(allocationsEvent, jobId, (ack) => { + const list = Array.isArray(ack) ? ack : []; + setAllocationsSummary(list); + // Preserve side-channel used by the post form for discrepancy checks + socket.allocationsSummary = list; + if (onAllocationsChange) onAllocationsChange(list); }); + } catch { + // Best-effort; leave table empty on error + setAllocationsSummary([]); + if (socket) { + socket.allocationsSummary = []; + } + if (onAllocationsChange) { + onAllocationsChange([]); + } } - }, [socket, socket.connected, jobId]); + }, [socket, jobId, mode, allocationsEvent]); + + // Initial + whenever mode/socket/jobId changes + useEffect(() => { + fetchAllocations(); + }, [fetchAllocations]); const columns = [ - { - title: t("jobs.fields.dms.center"), - dataIndex: "center", - key: "center" - }, + { title: t("jobs.fields.dms.center"), dataIndex: "center", key: "center" }, { title: t("jobs.fields.dms.sale"), dataIndex: "sale", key: "sale", - render: (text, record) => Dinero(record.sale).toFormat() + render: (_text, record) => Dinero(record.sale).toFormat() }, { title: t("jobs.fields.dms.cost"), dataIndex: "cost", key: "cost", - render: (text, record) => Dinero(record.cost).toFormat() + render: (_text, record) => Dinero(record.cost).toFormat() }, { title: t("jobs.fields.dms.sale_dms_acctnumber"), dataIndex: "sale_dms_acctnumber", key: "sale_dms_acctnumber", - render: (text, record) => record.profitCenter?.dms_acctnumber + render: (_text, record) => record.profitCenter?.dms_acctnumber }, { title: t("jobs.fields.dms.cost_dms_acctnumber"), dataIndex: "cost_dms_acctnumber", key: "cost_dms_acctnumber", - render: (text, record) => record.costCenter?.dms_acctnumber + render: (_text, record) => record.costCenter?.dms_acctnumber }, { title: t("jobs.fields.dms.dms_wip_acctnumber"), dataIndex: "dms_wip_acctnumber", key: "dms_wip_acctnumber", - render: (text, record) => record.costCenter?.dms_wip_acctnumber + render: (_text, record) => record.costCenter?.dms_wip_acctnumber } ]; @@ -74,11 +106,7 @@ export function DmsAllocationsSummary({ socket, bodyshop, jobId, title }) { { - socket.emit("cdk-calculate-allocations", jobId, (ack) => setAllocationsSummary(ack)); - }} - > + } @@ -86,6 +114,7 @@ export function DmsAllocationsSummary({ socket, bodyshop, jobId, title }) { {bodyshop.pbs_configuration?.disablebillwip && ( )} + { - const totals = - allocationsSummary && - allocationsSummary.reduce( - (acc, val) => { - return { - totalSale: acc.totalSale.add(Dinero(val.sale)), - totalCost: acc.totalCost.add(Dinero(val.cost)) - }; - }, - { - totalSale: Dinero(), - totalCost: Dinero() - } - ); + const totals = allocationsSummary?.reduce( + (acc, val) => ({ + totalSale: acc.totalSale.add(Dinero(val.sale)), + totalCost: acc.totalCost.add(Dinero(val.cost)) + }), + { totalSale: Dinero(), totalCost: Dinero() } + ) || { totalSale: Dinero(), totalCost: Dinero() }; + + const hasNonZeroSaleTotal = totals.totalSale.getAmount() !== 0; return ( {t("general.labels.totals")} - {totals && totals.totalSale.toFormat()} - - { - // totals.totalCost.toFormat() - } - - - + {hasNonZeroSaleTotal ? totals.totalSale.toFormat() : null} + + + ); }} diff --git a/client/src/components/dms-allocations-summary/rr-dms-allocations-summary.component.jsx b/client/src/components/dms-allocations-summary/rr-dms-allocations-summary.component.jsx new file mode 100644 index 000000000..a1cfd3f10 --- /dev/null +++ b/client/src/components/dms-allocations-summary/rr-dms-allocations-summary.component.jsx @@ -0,0 +1,342 @@ +import { Alert, Button, Card, Table, Tabs, Typography } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { useCallback, useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { resolveRROpCodeFromBodyshop } from "../../utils/dmsUtils.js"; + +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop +}); +const mapDispatchToProps = () => ({}); + +export default connect(mapStateToProps, mapDispatchToProps)(RrAllocationsSummary); + +/** + * Normalize job allocations into a flat list for display / preview building. + * @param ack + * @returns {{ + * center: *, + * sale: *, + * partsSale: *, + * partsTaxableSale: *, + * partsNonTaxableSale: *, + * laborTaxableSale: *, + * laborNonTaxableSale: *, + * extrasSale: *, + * extrasTaxableSale: *, + * extrasNonTaxableSale: *, + * cost: *, + * profitCenter: *, + * costCenter: * + * }[]|*[]} + */ +function normalizeJobAllocations(ack) { + if (!ack || !Array.isArray(ack.jobAllocations)) return []; + + return ack.jobAllocations.map((row) => ({ + center: row.center, + + // legacy "sale" (total) if we ever want to show it again + sale: row.sale || row.totalSale || null, + + // bucketed sales used to build split ROGOG/ROLABOR + partsSale: row.partsSale || null, + partsTaxableSale: row.partsTaxableSale || null, + partsNonTaxableSale: row.partsNonTaxableSale || null, + laborTaxableSale: row.laborTaxableSale || null, + laborNonTaxableSale: row.laborNonTaxableSale || null, + extrasSale: row.extrasSale || null, + extrasTaxableSale: row.extrasTaxableSale || null, + extrasNonTaxableSale: row.extrasNonTaxableSale || null, + + cost: row.cost || null, + profitCenter: row.profitCenter || null, + costCenter: row.costCenter || null + })); +} + +/** + * RR-specific DMS Allocations Summary + * Focused on what we actually send to RR: + * - ROGOG (split by taxable / non-taxable segments) + * - ROLABOR shell + * + * The heavy lifting (ROGOG/ROLABOR split, cost allocation, tax flags) + * is now done on the backend via buildRogogFromAllocations/buildRolaborFromRogog. + * This component just renders the preview from `ack.rogg` / `ack.rolabor`. + */ +export function RrAllocationsSummary({ socket, bodyshop, jobId, title, onAllocationsChange, opCode }) { + const { t } = useTranslation(); + const [roggPreview, setRoggPreview] = useState(null); + const [rolaborPreview, setRolaborPreview] = useState(null); + const [error, setError] = useState(null); + + // Prefer the user-selected OpCode (from DmsContainer), fall back to config default + const effectiveOpCode = useMemo(() => opCode || resolveRROpCodeFromBodyshop(bodyshop), [opCode, bodyshop]); + + const fetchAllocations = useCallback(() => { + if (!socket || !jobId) return; + + try { + socket.emit("rr-calculate-allocations", { jobId, opCode: effectiveOpCode }, (ack) => { + if (ack && ack.ok === false) { + setRoggPreview(null); + setRolaborPreview(null); + setError(ack.error || t("dms.labels.allocations_error")); + if (socket) { + socket.allocationsSummary = []; + socket.rrAllocationsRaw = ack; + } + if (onAllocationsChange) { + onAllocationsChange([]); + } + return; + } + + const jobAllocRows = normalizeJobAllocations(ack); + + setRoggPreview(ack?.rogg || null); + setRolaborPreview(ack?.rolabor || null); + setError(null); + + if (socket) { + socket.allocationsSummary = jobAllocRows; + socket.rrAllocationsRaw = ack; + } + if (onAllocationsChange) { + onAllocationsChange(jobAllocRows); + } + }); + } catch { + setRoggPreview(null); + setRolaborPreview(null); + setError(t("dms.labels.allocations_error")); + if (socket) { + socket.allocationsSummary = []; + } + if (onAllocationsChange) { + onAllocationsChange([]); + } + } + }, [socket, jobId, t, onAllocationsChange, effectiveOpCode]); + + useEffect(() => { + fetchAllocations(); + }, [fetchAllocations]); + + const segmentLabelMap = { + partsTaxable: "Parts Taxable", + partsNonTaxable: "Parts Non-Taxable", + extrasTaxable: "Extras Taxable", + extrasNonTaxable: "Extras Non-Taxable", + laborTaxable: "Labor Taxable", + laborNonTaxable: "Labor Non-Taxable" + }; + + const roggRows = useMemo(() => { + if (!roggPreview || !Array.isArray(roggPreview.ops)) return []; + + const rows = []; + roggPreview.ops.forEach((op) => { + const rowOpCode = opCode || op.opCode; + + (op.lines || []).forEach((line, idx) => { + const baseDesc = line.itemDesc; + const segmentKind = op.segmentKind; + const segmentCount = op.segmentCount || 0; + const segmentLabel = segmentLabelMap[segmentKind] || segmentKind; + const displayDesc = segmentCount > 1 && segmentLabel ? `${baseDesc} (${segmentLabel})` : baseDesc; + + rows.push({ + key: `${op.jobNo}-${idx}`, + opCode: rowOpCode, + jobNo: op.jobNo, + breakOut: line.breakOut, + itemType: line.itemType, + itemDesc: displayDesc, + custQty: line.custQty, + custPayTypeFlag: line.custPayTypeFlag, + custTxblNtxblFlag: line.custTxblNtxblFlag, + custPrice: line.amount?.custPrice, + dlrCost: line.amount?.dlrCost, + // segment metadata for visual styling + segmentKind, + segmentCount + }); + }); + }); + return rows; + }, [roggPreview, opCode, segmentLabelMap]); + + const rolaborRows = useMemo(() => { + if (!rolaborPreview || !Array.isArray(rolaborPreview.ops)) return []; + + return rolaborPreview.ops.map((op, idx) => { + const rowOpCode = opCode || op.opCode; + + return { + key: `${op.jobNo}-${idx}`, + opCode: rowOpCode, + jobNo: op.jobNo, + custPayTypeFlag: op.custPayTypeFlag, + custTxblNtxblFlag: op.custTxblNtxblFlag, + payType: op.bill?.payType, + amtType: op.amount?.amtType, + custPrice: op.amount?.custPrice, + totalAmt: op.amount?.totalAmt + }; + }); + }, [rolaborPreview, opCode]); + + // Totals for ROGOG (sum custPrice + dlrCost over all lines) + const roggTotals = useMemo(() => { + if (!roggPreview || !Array.isArray(roggPreview.ops)) { + return { totalCustPrice: "0.00", totalDlrCost: "0.00" }; + } + + let totalCustCents = 0; + let totalCostCents = 0; + + roggPreview.ops.forEach((op) => { + (op.lines || []).forEach((line) => { + const cp = parseFloat(line.amount?.custPrice || "0"); + if (!Number.isNaN(cp)) { + totalCustCents += Math.round(cp * 100); + } + + const dc = parseFloat(line.amount?.dlrCost || "0"); + if (!Number.isNaN(dc)) { + totalCostCents += Math.round(dc * 100); + } + }); + }); + + return { + totalCustPrice: (totalCustCents / 100).toFixed(2), + totalDlrCost: (totalCostCents / 100).toFixed(2) + }; + }, [roggPreview]); + + const roggColumns = [ + { title: "JobNo", dataIndex: "jobNo", key: "jobNo" }, + { title: "OpCode", dataIndex: "opCode", key: "opCode" }, + { title: "BreakOut", dataIndex: "breakOut", key: "breakOut" }, + { title: "ItemType", dataIndex: "itemType", key: "itemType" }, + { title: "ItemDesc", dataIndex: "itemDesc", key: "itemDesc" }, + { title: "CustQty", dataIndex: "custQty", key: "custQty" }, + { title: "CustTxblFlag", dataIndex: "custTxblNtxblFlag", key: "custTxblNtxblFlag" }, + { title: "CustPrice", dataIndex: "custPrice", key: "custPrice" }, + { title: "DlrCost", dataIndex: "dlrCost", key: "dlrCost" } + ]; + + const rolaborColumns = [ + { title: "JobNo", dataIndex: "jobNo", key: "jobNo" }, + { title: "OpCode", dataIndex: "opCode", key: "opCode" }, + { title: "CustPayType", dataIndex: "custPayTypeFlag", key: "custPayTypeFlag" }, + { title: "CustTxblFlag", dataIndex: "custTxblNtxblFlag", key: "custTxblNtxblFlag" }, + { title: "PayType", dataIndex: "payType", key: "payType" }, + { title: "AmtType", dataIndex: "amtType", key: "amtType" }, + { title: "CustPrice", dataIndex: "custPrice", key: "custPrice" }, + { title: "TotalAmt", dataIndex: "totalAmt", key: "totalAmt" } + ]; + + const tabItems = [ + { + key: "rogog", + label: "ROGOG Preview", + children: ( + <> + + OpCode: {effectiveOpCode}. Only centers with RR GOG mapping (rr_gogcode & rr_item_type) + are included. Totals below reflect exactly what will be sent in ROGOG, with parts, extras, and labor split + into taxable / non-taxable segments. + + +
{ + if ( + record.segmentCount > 1 && + (record.segmentKind === "laborTaxable" || record.segmentKind === "laborNonTaxable") + ) { + return "rr-allocations-tax-split-row"; + } + if (record.segmentCount > 1) { + return "rr-allocations-split-row"; + } + return ""; + }} + summary={() => { + const hasCustTotal = Number(roggTotals.totalCustPrice) !== 0; + const hasCostTotal = Number(roggTotals.totalDlrCost) !== 0; + + return ( + + + {t("general.labels.totals")} + + + + + + + + {hasCustTotal ? roggTotals.totalCustPrice : null} + {hasCostTotal ? roggTotals.totalDlrCost : null} + + ); + }} + /> + + ) + }, + { + key: "rolabor", + label: "ROLABOR Preview", + children: ( + <> + + This mirrors the shell that would be sent for ROLABOR when all financials are carried in GOG. + +
+ + ) + } + ]; + + return ( + + + + } + > + {bodyshop.pbs_configuration?.disablebillwip && ( + + )} + + {error && } + + + + ); +} diff --git a/client/src/components/dms-cdk-makes/dms-cdk-makes.refetch.component.jsx b/client/src/components/dms-cdk-makes/dms-cdk-makes.refetch.component.jsx index 6d2908b65..0020cbfd5 100644 --- a/client/src/components/dms-cdk-makes/dms-cdk-makes.refetch.component.jsx +++ b/client/src/components/dms-cdk-makes/dms-cdk-makes.refetch.component.jsx @@ -1,10 +1,11 @@ -import { Button } from "antd"; +import { Button, Space } from "antd"; import axios from "axios"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, @@ -18,21 +19,52 @@ export default connect(mapStateToProps, mapDispatchToProps)(DmsCdkMakesRefetch); export function DmsCdkMakesRefetch({ currentUser, bodyshop }) { const [loading, setLoading] = useState(false); const { t } = useTranslation(); + const { + treatments: { Fortellis } + } = useTreatmentsWithConfig({ + attributes: {}, + names: ["Fortellis"], + splitKey: bodyshop.imexshopid + }); if (!currentUser.email.includes("@imex.")) return null; const handleRefetch = async () => { - setLoading(true); - await axios.post("/cdk/getvehicles", { - cdk_dealerid: bodyshop.cdk_dealerid, - bodyshopid: bodyshop.id - }); + try { + setLoading(true); + await axios.post(`cdk${Fortellis.treatment === "on" ? "/fortellis" : ""}/getvehicles`, { + cdk_dealerid: bodyshop.cdk_dealerid, + bodyshopid: bodyshop.id + }); + } catch (error) { + console.error(error); + } setLoading(false); }; + + const handleGetCOA = async () => { + try { + setLoading(true); + await axios.post(`cdk/fortellis/getCOA`, { + cdk_dealerid: bodyshop.cdk_dealerid, + bodyshopid: bodyshop.id + }); + } catch (error) { + console.error(error); + } + + setLoading(false); + }; + return ( - + + + + ); } diff --git a/client/src/components/dms-customer-selector/cdk-customer-selector.jsx b/client/src/components/dms-customer-selector/cdk-customer-selector.jsx new file mode 100644 index 000000000..861620832 --- /dev/null +++ b/client/src/components/dms-customer-selector/cdk-customer-selector.jsx @@ -0,0 +1,102 @@ +import { Button, Checkbox, Col, Table } from "antd"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { alphaSort } from "../../utils/sorters"; + +export default function CDKCustomerSelector({ bodyshop, socket }) { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + const [customerList, setCustomerList] = useState([]); + const [selectedCustomer, setSelectedCustomer] = useState(null); + + useEffect(() => { + if (!socket) return; + const handleCdkSelectCustomer = (list) => { + setOpen(true); + setCustomerList(Array.isArray(list) ? list : []); + setSelectedCustomer(null); + }; + socket.on("cdk-select-customer", handleCdkSelectCustomer); + return () => { + socket.off("cdk-select-customer", handleCdkSelectCustomer); + }; + }, [socket]); + + const onUseSelected = () => { + if (!selectedCustomer) return; + setOpen(false); + socket.emit("cdk-selected-customer", selectedCustomer); + setSelectedCustomer(null); + }; + + const onUseGeneric = () => { + const generic = bodyshop.cdk_configuration?.generic_customer_number || null; + setOpen(false); + socket.emit("cdk-selected-customer", generic); + setSelectedCustomer(null); + }; + + const onCreateNew = () => { + setOpen(false); + socket.emit("cdk-selected-customer", null); + setSelectedCustomer(null); + }; + + if (!open) return null; + + const columns = [ + { title: t("jobs.fields.dms.id"), dataIndex: ["id", "value"], key: "id" }, + { + title: t("jobs.fields.dms.vinowner"), + dataIndex: "vinOwner", + key: "vinOwner", + render: (_t, r) => + }, + { + title: t("jobs.fields.dms.name1"), + dataIndex: ["name1", "fullName"], + key: "name1", + sorter: (a, b) => alphaSort(a.name1?.fullName, b.name1?.fullName) + }, + { + title: t("jobs.fields.dms.address"), + key: "address", + render: (record) => + `${record.address?.addressLine && record.address.addressLine[0]}, ${record.address?.city} ${ + record.address?.stateOrProvince + } ${record.address?.postalCode}` + } + ]; + + const rowKey = (r) => r.id?.value || r.customerId; + + return ( + +
( +
+ + + +
+ )} + pagination={{ position: "top" }} + columns={columns} + rowKey={rowKey} + dataSource={customerList} + rowSelection={{ + onSelect: (r) => { + const key = r.id?.value || r.customerId; + setSelectedCustomer(key ? String(key) : null); + }, + type: "radio", + selectedRowKeys: selectedCustomer ? [selectedCustomer] : [] + }} + /> + + ); +} diff --git a/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx b/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx index 12a9cfd80..205ceb414 100644 --- a/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx +++ b/client/src/components/dms-customer-selector/dms-customer-selector.component.jsx @@ -1,134 +1,54 @@ -import { Button, Checkbox, Col, Table } from "antd"; -import { useState } from "react"; -import { useTranslation } from "react-i18next"; +import { useMemo } from "react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { socket } from "../../pages/dms/dms.container"; + import { selectBodyshop } from "../../redux/user/user.selectors"; -import { alphaSort } from "../../utils/sorters"; + +import RRCustomerSelector from "./rr-customer-selector"; +import FortellisCustomerSelector from "./fortellis-customer-selector"; +import CDKCustomerSelector from "./cdk-customer-selector"; +import PBSCustomerSelector from "./pbs-customer-selector"; +import { DMS_MAP } from "../../utils/dmsUtils"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); -const mapDispatchToProps = () => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) -}); +const mapDispatchToProps = () => ({}); export default connect(mapStateToProps, mapDispatchToProps)(DmsCustomerSelector); -export function DmsCustomerSelector({ bodyshop }) { - const { t } = useTranslation(); - const [customerList, setcustomerList] = useState([]); - const [open, setOpen] = useState(false); - const [selectedCustomer, setSelectedCustomer] = useState(null); - const [dmsType, setDmsType] = useState("cdk"); +/** + * DMS Customer Selector component that renders the appropriate customer selector + * @param props + * @returns {JSX.Element|null} + * @constructor + */ +export function DmsCustomerSelector(props) { + const { bodyshop, jobid, socket, rrOptions = {} } = props; - socket.on("cdk-select-customer", (customerList) => { - setOpen(true); - setDmsType("cdk"); - setcustomerList(customerList); - }); - socket.on("pbs-select-customer", (customerList) => { - setOpen(true); - setDmsType("pbs"); - setcustomerList(customerList); - }); + // Centralized "mode" (provider + transport) + const mode = props.mode; - const onUseSelected = () => { - setOpen(false); - socket.emit(`${dmsType}-selected-customer`, selectedCustomer); - setSelectedCustomer(null); - }; + // Stable base props for children + const base = useMemo(() => ({ bodyshop, jobid, socket }), [bodyshop, jobid, socket]); - const onUseGeneric = () => { - setOpen(false); - socket.emit(`${dmsType}-selected-customer`, bodyshop.cdk_configuration.generic_customer_number); - setSelectedCustomer(null); - }; - - const onCreateNew = () => { - setOpen(false); - socket.emit(`${dmsType}-selected-customer`, null); - setSelectedCustomer(null); - }; - - const cdkColumns = [ - { - title: t("jobs.fields.dms.id"), - dataIndex: ["id", "value"], - key: "id" - }, - { - title: t("jobs.fields.dms.vinowner"), - dataIndex: "vinOwner", - key: "vinOwner", - render: (text, record) => - }, - { - title: t("jobs.fields.dms.name1"), - dataIndex: ["name1", "fullName"], - key: "name1", - sorter: (a, b) => alphaSort(a.name1?.fullName, b.name1?.fullName) - }, - - { - title: t("jobs.fields.dms.address"), - //dataIndex: ["name2", "fullName"], - key: "address", - render: (record) => - `${record.address?.addressLine && record.address.addressLine[0]}, ${record.address?.city} ${ - record.address?.stateOrProvince - } ${record.address?.postalCode}` + switch (mode) { + case DMS_MAP.reynolds: { + // Map rrOptions to current RR prop shape (you can also just pass rrOptions through and unpack in RR) + const rrProps = { + rrOpenRoLimit: rrOptions.openRoLimit, + onRrOpenRoFinished: rrOptions.onOpenRoFinished, + rrValidationPending: rrOptions.validationPending, + onValidationFinished: rrOptions.onValidationFinished + }; + return ; } - ]; - - const pbsColumns = [ - { - title: t("jobs.fields.dms.id"), - dataIndex: "ContactId", - key: "ContactId" - }, - { - title: t("jobs.fields.dms.name1"), - key: "name1", - sorter: (a, b) => alphaSort(a.LastName, b.LastName), - render: (text, record) => `${record.FirstName || ""} ${record.LastName || ""}` - }, - - { - title: t("jobs.fields.dms.address"), - key: "address", - render: (record) => `${record.Address}, ${record.City} ${record.State} ${record.ZipCode}` - } - ]; - - if (!open) return null; - return ( - -
( -
- - - -
- )} - pagination={{ position: "top" }} - columns={dmsType === "cdk" ? cdkColumns : pbsColumns} - rowKey={(record) => (dmsType === "cdk" ? record.id.value : record.ContactId)} - dataSource={customerList} - //onChange={handleTableChange} - rowSelection={{ - onSelect: (record) => { - setSelectedCustomer(dmsType === "cdk" ? record.id.value : record.ContactId); - }, - type: "radio", - selectedRowKeys: [selectedCustomer] - }} - /> - - ); + case DMS_MAP.fortellis: + return ; + case DMS_MAP.cdk: + return ; + case DMS_MAP.pbs: + return ; + default: + return null; + } } diff --git a/client/src/components/dms-customer-selector/fortellis-customer-selector.jsx b/client/src/components/dms-customer-selector/fortellis-customer-selector.jsx new file mode 100644 index 000000000..6d9c05074 --- /dev/null +++ b/client/src/components/dms-customer-selector/fortellis-customer-selector.jsx @@ -0,0 +1,105 @@ +import { Button, Checkbox, Col, Table } from "antd"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { alphaSort } from "../../utils/sorters"; + +export default function FortellisCustomerSelector({ bodyshop, jobid, socket }) { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + const [customerList, setCustomerList] = useState([]); + const [selectedCustomer, setSelectedCustomer] = useState(null); + + useEffect(() => { + if (!socket) return; + const handleFortellisSelectCustomer = (list) => { + setOpen(true); + setCustomerList(Array.isArray(list) ? list : []); + setSelectedCustomer(null); + }; + socket.on("fortellis-select-customer", handleFortellisSelectCustomer); + return () => { + socket.off("fortellis-select-customer", handleFortellisSelectCustomer); + }; + }, [socket]); + + const onUseSelected = () => { + if (!selectedCustomer) return; + setOpen(false); + socket.emit("fortellis-selected-customer", { selectedCustomerId: selectedCustomer, jobid }); + setSelectedCustomer(null); + }; + + const onUseGeneric = () => { + const generic = bodyshop.cdk_configuration?.generic_customer_number || null; + setOpen(false); + socket.emit("fortellis-selected-customer", { selectedCustomerId: generic, jobid }); + setSelectedCustomer(null); + }; + + const onCreateNew = () => { + setOpen(false); + socket.emit("fortellis-selected-customer", { selectedCustomerId: null, jobid }); + setSelectedCustomer(null); + }; + + if (!open) return null; + + const columns = [ + { title: t("jobs.fields.dms.id"), dataIndex: "customerId", key: "id" }, + { + title: t("jobs.fields.dms.vinowner"), + dataIndex: "vinOwner", + key: "vinOwner", + render: (_t, r) => + }, + { + title: t("jobs.fields.dms.name1"), + dataIndex: ["customerName", "firstName"], + key: "firstName", + sorter: (a, b) => alphaSort(a.customerName?.firstName, b.customerName?.firstName) + }, + { + title: t("jobs.fields.dms.name1"), + dataIndex: ["customerName", "lastName"], + key: "lastName", + sorter: (a, b) => alphaSort(a.customerName?.lastName, b.customerName?.lastName) + }, + { + title: t("jobs.fields.dms.address"), + key: "address", + render: (record) => + `${record.postalAddress?.addressLine1 || ""}${ + record.postalAddress?.addressLine2 ? `, ${record.postalAddress.addressLine2}` : "" + }, ${record.postalAddress?.city || ""} ${record.postalAddress?.state || ""} ${ + record.postalAddress?.postalCode || "" + } ${record.postalAddress?.country || ""}` + } + ]; + + return ( + +
( +
+ + + +
+ )} + pagination={{ position: "top" }} + columns={columns} + rowKey={(r) => r.customerId} + dataSource={customerList} + rowSelection={{ + onSelect: (r) => setSelectedCustomer(r?.customerId ? String(r.customerId) : null), + type: "radio", + selectedRowKeys: selectedCustomer ? [selectedCustomer] : [] + }} + /> + + ); +} diff --git a/client/src/components/dms-customer-selector/pbs-customer-selector.jsx b/client/src/components/dms-customer-selector/pbs-customer-selector.jsx new file mode 100644 index 000000000..e2717327c --- /dev/null +++ b/client/src/components/dms-customer-selector/pbs-customer-selector.jsx @@ -0,0 +1,93 @@ +import { Button, Col, Table } from "antd"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { alphaSort } from "../../utils/sorters"; + +export default function PBSCustomerSelector({ bodyshop, socket }) { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + const [customerList, setCustomerList] = useState([]); + const [selectedCustomer, setSelectedCustomer] = useState(null); + + useEffect(() => { + if (!socket) return; + const handlePbsSelectCustomer = (list) => { + setOpen(true); + setCustomerList(Array.isArray(list) ? list : []); + setSelectedCustomer(null); + }; + socket.on("pbs-select-customer", handlePbsSelectCustomer); + return () => { + socket.off("pbs-select-customer", handlePbsSelectCustomer); + }; + }, [socket]); + + const onUseSelected = () => { + if (!selectedCustomer) return; + setOpen(false); + socket.emit("pbs-selected-customer", selectedCustomer); + setSelectedCustomer(null); + }; + + // Restores old behavior: reuse the CDK-named generic number for PBS too, + // matching the previous single-component implementation. + const onUseGeneric = () => { + const generic = bodyshop?.cdk_configuration?.generic_customer_number || null; + if (!generic) return; + setOpen(false); + socket.emit("pbs-selected-customer", generic); + setSelectedCustomer(null); + }; + + const onCreateNew = () => { + setOpen(false); + socket.emit("pbs-selected-customer", null); + setSelectedCustomer(null); + }; + + if (!open) return null; + + const columns = [ + { title: t("jobs.fields.dms.id"), dataIndex: "ContactId", key: "ContactId" }, + { + title: t("jobs.fields.dms.name1"), + key: "name1", + sorter: (a, b) => alphaSort(a.LastName, b.LastName), + render: (_t, r) => `${r.FirstName || ""} ${r.LastName || ""}` + }, + { + title: t("jobs.fields.dms.address"), + key: "address", + render: (r) => `${r.Address}, ${r.City} ${r.State} ${r.ZipCode}` + } + ]; + + const hasGeneric = !!bodyshop?.cdk_configuration?.generic_customer_number; + + return ( + +
( +
+ + + +
+ )} + pagination={{ position: "top" }} + columns={columns} + rowKey={(r) => r.ContactId} + dataSource={customerList} + rowSelection={{ + onSelect: (r) => setSelectedCustomer(r?.ContactId ? String(r.ContactId) : null), + type: "radio", + selectedRowKeys: selectedCustomer ? [selectedCustomer] : [] + }} + /> + + ); +} diff --git a/client/src/components/dms-customer-selector/rr-customer-selector.jsx b/client/src/components/dms-customer-selector/rr-customer-selector.jsx new file mode 100644 index 000000000..13d30f4c1 --- /dev/null +++ b/client/src/components/dms-customer-selector/rr-customer-selector.jsx @@ -0,0 +1,267 @@ +import { Alert, Button, Checkbox, Col, message, Space, Table } from "antd"; +import { useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { alphaSort } from "../../utils/sorters"; + +const normalizeRrList = (list) => { + if (!Array.isArray(list)) return []; + return list + .map((row) => { + const custNo = row.custNo || row.CustomerId || row.customerId || null; + const name = + row.name || + [row.CustomerName?.FirstName, row.CustomerName?.LastName].filter(Boolean).join(" ").trim() || + (custNo ? String(custNo) : ""); + if (!custNo) return null; + const vinOwner = !!(row.vinOwner ?? row.isVehicleOwner); + + const address = + row.address && typeof row.address === "object" + ? { + line1: row.address.line1 ?? row.address.addr1 ?? row.address.Address1 ?? undefined, + line2: row.address.line2 ?? row.address.addr2 ?? row.address.Address2 ?? undefined, + city: row.address.city ?? undefined, + state: row.address.state ?? row.address.stateOrProvince ?? undefined, + postalCode: row.address.postalCode ?? row.address.zip ?? undefined, + country: row.address.country ?? row.address.countryCode ?? undefined + } + : undefined; + + return { custNo: String(custNo), name, vinOwner, address }; + }) + .filter(Boolean); +}; + +const rrAddressToString = (addr) => { + if (!addr) return ""; + const parts = [ + addr.line1, + addr.line2, + [addr.city, addr.state].filter(Boolean).join(" "), + addr.postalCode, + addr.country + ].filter(Boolean); + return parts.join(", "); +}; + +export default function RRCustomerSelector({ + jobid, + socket, + rrOpenRoLimit = false, + onRrOpenRoFinished, + rrValidationPending = false, + onValidationFinished +}) { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + const [customerList, setCustomerList] = useState([]); + const [selectedCustomer, setSelectedCustomer] = useState(null); + const [refreshing, setRefreshing] = useState(false); + + // Show dialog automatically when validation is pending + useEffect(() => { + if (rrValidationPending) setOpen(true); + }, [rrValidationPending]); + + // Listen for RR customer selection list + useEffect(() => { + if (!socket) return; + const handleRrSelectCustomer = (list) => { + const normalized = normalizeRrList(list); + setOpen(true); + setCustomerList(normalized); + const firstOwner = normalized.find((r) => r.vinOwner)?.custNo; + setSelectedCustomer(firstOwner ? String(firstOwner) : null); + setRefreshing(false); + }; + socket.on("rr-select-customer", handleRrSelectCustomer); + return () => { + socket.off("rr-select-customer", handleRrSelectCustomer); + }; + }, [socket]); + + // VIN owner set + const rrOwnerSet = useMemo(() => { + return new Set(customerList.filter((c) => c?.vinOwner || c?.isVehicleOwner).map((c) => String(c.custNo))); + }, [customerList]); + const rrHasVinOwner = rrOwnerSet.size > 0; + + // Enforce VIN owner stays selected if present + useEffect(() => { + if (!rrHasVinOwner) return; + const firstOwner = (customerList.find((c) => c.vinOwner) || {}).custNo; + if (firstOwner && String(selectedCustomer) !== String(firstOwner)) { + setSelectedCustomer(String(firstOwner)); + } + }, [rrHasVinOwner, customerList, selectedCustomer]); + + const onUseSelected = () => { + if (!selectedCustomer) { + message.warning(t("general.actions.select")); + return; + } + if (rrHasVinOwner && !rrOwnerSet.has(String(selectedCustomer))) { + message.warning( + "This VIN is already assigned in Reynolds. Only the VIN owner can be selected. To choose a different customer, change ownership in Reynolds first." + ); + return; + } + socket.emit("rr-selected-customer", { jobId: jobid, custNo: String(selectedCustomer) }, (ack) => { + if (ack?.ok) { + message.success(t("dms.messages.customerSelected")); + } else if (ack?.error) { + message.error(ack.error); + } + }); + }; + + const onCreateNew = () => { + if (rrHasVinOwner) return; + socket.emit("rr-selected-customer", { jobId: jobid, create: true }, (ack) => { + if (ack?.ok) { + if (ack.custNo) setSelectedCustomer(String(ack.custNo)); + message.success(t("dms.messages.customerCreated")); + } else if (ack?.error) { + message.error(ack.error); + } + }); + }; + + const refreshRrSearch = () => { + setRefreshing(true); + const to = setTimeout(() => setRefreshing(false), 12000); + const stop = () => { + clearTimeout(to); + setRefreshing(false); + socket.off("export-failed", stop); + socket.off("rr-select-customer", stop); + }; + socket.once("rr-select-customer", stop); + socket.once("export-failed", stop); + socket.emit("rr-export-job", { jobId: jobid }); + }; + + if (!open) return null; + + const columns = [ + { title: t("jobs.fields.dms.id"), dataIndex: "custNo", key: "custNo" }, + { + title: t("jobs.fields.dms.vinowner"), + dataIndex: "vinOwner", + key: "vinOwner", + render: (_t, r) => + }, + { + title: t("jobs.fields.dms.name1"), + dataIndex: "name", + key: "name", + sorter: (a, b) => alphaSort(a?.name, b?.name) + }, + { + title: t("jobs.fields.dms.address"), + key: "address", + render: (record) => rrAddressToString(record.address) + } + ]; + + const rrDisableRow = (record) => { + if (!rrHasVinOwner) return false; + return !rrOwnerSet.has(String(record.custNo)); + }; + + return ( + +
( +
+ {/* Open RO limit banner */} + {rrOpenRoLimit && ( + +
+ Reynolds has reached the maximum number of open Repair Orders for this Customer. Close or finalize + an RO in Reynolds, then click Finished to continue. +
+
+ +
+
+ } + /> + )} + + {/* Validation step banner */} + {rrValidationPending && ( + +
+ We created the Repair Order. Please validate the totals and taxes in the DMS system. When done, + click Finished to finalize and mark this export as complete. +
+
+ + + +
+ + } + /> + )} + +
+ + {/* No generic in RR */} + +
+ + {rrHasVinOwner && ( + +
+ This VIN is already assigned in Reynolds. Only the VIN owner is selectable here. To use a + different customer, please change the vehicle ownership in Reynolds first, then return to complete + the export. +
+ + + } + /> + )} + + )} + pagination={{ position: "top" }} + columns={columns} + rowKey={(r) => r.custNo} + dataSource={customerList} + rowSelection={{ + onSelect: (record) => setSelectedCustomer(record?.custNo ? String(record.custNo) : null), + type: "radio", + selectedRowKeys: selectedCustomer ? [selectedCustomer] : [], + getCheckboxProps: (record) => ({ disabled: rrDisableRow(record) }) + }} + /> + + ); +} diff --git a/client/src/components/dms-log-events/dms-log-events.component.jsx b/client/src/components/dms-log-events/dms-log-events.component.jsx index 5219ddd88..d71f3633f 100644 --- a/client/src/components/dms-log-events/dms-log-events.component.jsx +++ b/client/src/components/dms-log-events/dms-log-events.component.jsx @@ -1,50 +1,234 @@ import { Divider, Space, Tag, Timeline } from "antd"; +import { useEffect, useMemo, useState } from "react"; import dayjs from "../../utils/day"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions"; +import { selectDarkMode } from "../../redux/application/application.selectors.js"; -const mapStateToProps = createStructuredSelector({}); - -const mapDispatchToProps = (dispatch) => ({ - setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), - setSelectedHeader: (key) => dispatch(setSelectedHeader(key)) +const mapStateToProps = createStructuredSelector({ + isDarkMode: selectDarkMode }); +const mapDispatchToProps = () => ({}); + export default connect(mapStateToProps, mapDispatchToProps)(DmsLogEvents); -export function DmsLogEvents({ logs }) { - return ( - ({ - key: idx, - color: LogLevelHierarchy(log.level), - children: ( - - {log.level} - {dayjs(log.timestamp).format("MM/DD/YYYY HH:mm:ss")} - - {log.message} - - ) - }))} - /> +export function DmsLogEvents({ + logs, + detailsOpen, + detailsNonce, + isDarkMode, + colorizeJson = false, + showDetails = true +}) { + const [openSet, setOpenSet] = useState(() => new Set()); + + // Inject JSON highlight styles once (only when colorize is enabled) + useEffect(() => { + if (!colorizeJson) return; + if (typeof document === "undefined") return; + if (document.getElementById("json-highlight-styles")) return; + const style = document.createElement("style"); + style.id = "json-highlight-styles"; + style.textContent = ` + .json-key { color: #fa8c16; } + .json-string { color: #52c41a; } + .json-number { color: #722ed1; } + .json-boolean { color: #1890ff; } + .json-null { color: #faad14; } + `; + document.head.appendChild(style); + }, [colorizeJson]); + + // Trim openSet if logs shrink + useEffect(() => { + const len = (logs || []).length; + setOpenSet((prev) => { + const next = new Set(); + for (let i = 0; i < len; i++) if (prev.has(i)) next.add(i); + return next; + }); + }, [logs?.length]); + + // Respond to global toggle button + useEffect(() => { + if (detailsNonce == null) return; + const len = (logs || []).length; + setOpenSet(detailsOpen ? new Set(Array.from({ length: len }, (_, i) => i)) : new Set()); + }, [detailsNonce, detailsOpen, logs?.length]); + + const items = useMemo( + () => + (logs || []).map((raw, idx) => { + const { level, message, timestamp, meta } = normalizeLog(raw); + + // Only treat meta as "present" when we are allowed to show details + const hasMeta = !isEmpty(meta) && showDetails; + const isOpen = hasMeta && openSet.has(idx); + + return { + key: idx, + color: logLevelColor(level), + children: ( + + {/* Row 1: summary + inline "Details" toggle */} + + {level} + + {dayjs(timestamp).format("MM/DD/YYYY HH:mm:ss")} + + {message} + {hasMeta && ( + <> + + + setOpenSet((prev) => { + const next = new Set(prev); + if (isOpen) next.delete(idx); + else next.add(idx); + return next; + }) + } + style={{ cursor: "pointer", userSelect: "none" }} + > + {isOpen ? "Hide details" : "Details"} + + + )} + + + {/* Row 2: details body (only when open) */} + {hasMeta && isOpen && ( +
+ +
+ )} +
+ ) + }; + }), + [logs, openSet, colorizeJson, isDarkMode, showDetails] ); + + return ; } -function LogLevelHierarchy(level) { - switch (level) { +/** + * Normalize various log input formats into a standard structure. + * @param input + * @returns {{level: string, message: *|string, timestamp: Date, meta: *}} + */ +const normalizeLog = (input) => { + const n = input?.normalized || input || {}; + const level = (n.level || input?.level || "INFO").toString().toUpperCase(); + const message = n.message ?? input?.message ?? ""; + const meta = input?.meta != null ? input.meta : n.meta != null ? n.meta : undefined; + const tsRaw = input?.timestamp ?? n.timestamp ?? input?.ts ?? Date.now(); + const timestamp = typeof tsRaw === "number" ? new Date(tsRaw) : new Date(tsRaw); + return { level, message, timestamp, meta }; +}; + +/** + * Map log level to tag color. + * @param level + * @returns {string} + */ +const logLevelColor = (level) => { + switch ((level || "").toUpperCase()) { + case "SILLY": + return "purple"; case "DEBUG": return "orange"; case "INFO": return "blue"; case "WARN": + case "WARNING": return "yellow"; case "ERROR": return "red"; default: - return 0; + return "default"; } -} +}; + +/** + * Check if a value is "empty" (null/undefined, empty array, or empty object). + * @param v + */ +const isEmpty = (v) => { + if (v == null) return true; + if (Array.isArray(v)) return v.length === 0; + if (typeof v === "object") return Object.keys(v).length === 0; + return false; +}; + +/** + * Safely stringify an object to JSON, falling back to String() on failure. + * @param obj + * @param spaces + * @returns {string} + */ +const safeStringify = (obj, spaces = 2) => { + try { + return JSON.stringify(obj, null, spaces); + } catch { + return String(obj); + } +}; + +/** + * JSON display block with optional syntax highlighting. + * @param data + * @param colorize + * @param isDarkMode + * @returns {JSX.Element} + * @constructor + */ +const JsonBlock = ({ data, colorize, isDarkMode }) => { + const jsonText = safeStringify(data, 2); + const preStyle = { + margin: "6px 0 0", + maxWidth: 720, + overflowX: "auto", + fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace', + fontSize: 12, + lineHeight: 1.45, + padding: 8, + borderRadius: 6, + background: isDarkMode ? "rgba(255,255,255,0.1)" : "rgba(0,0,0,0.04)", + border: isDarkMode ? "1px solid rgba(255,255,255,0.12)" : "1px solid rgba(0,0,0,0.08)", + color: isDarkMode ? "var(--card-text-fallback)" : "#141414" + }; + + if (colorize) { + const html = syntaxHighlight(jsonText); + return
;
+  }
+  return 
{jsonText}
; +}; + +/** + * Syntax highlight JSON text for HTML display. + * @param jsonText + * @returns {*} + */ +const syntaxHighlight = (jsonText) => { + const esc = jsonText.replace(/&/g, "&").replace(//g, ">"); + return esc.replace( + /("(?:\\u[\da-fA-F]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(?:true|false|null)\b|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)/g, + (match) => { + let cls = "json-number"; + if (match.startsWith('"')) { + cls = match.endsWith(":") ? "json-key" : "json-string"; + } else if (match === "true" || match === "false") { + cls = "json-boolean"; + } else if (match === "null") { + cls = "json-null"; + } + return `${match}`; + } + ); +}; diff --git a/client/src/components/dms-post-form/cdklike-dms-post-form.jsx b/client/src/components/dms-post-form/cdklike-dms-post-form.jsx new file mode 100644 index 000000000..0132eaf9a --- /dev/null +++ b/client/src/components/dms-post-form/cdklike-dms-post-form.jsx @@ -0,0 +1,420 @@ +import { DeleteFilled, DownOutlined } from "@ant-design/icons"; +import { + Button, + Card, + Col, + Divider, + Dropdown, + Form, + Input, + InputNumber, + Row, + Select, + Space, + Statistic, + Switch, + Tooltip, + Typography +} from "antd"; +import Dinero from "dinero.js"; +import { useTranslation } from "react-i18next"; +import { useMemo, useState } from "react"; +import i18n from "../../translations/i18n"; +import dayjs from "../../utils/day"; +import DmsCdkMakes from "../dms-cdk-makes/dms-cdk-makes.component"; +import DmsCdkMakesRefetch from "../dms-cdk-makes/dms-cdk-makes.refetch.component"; +import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import { DMS_MAP } from "../../utils/dmsUtils"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; + +/** + * CDK-like DMS post form: + * - CDK / Fortellis / PBS + * - CDK vehicle details + make/model selection + * - Payer list with discrepancy gating + * - Submit: "{mode}-export-job" + * @param bodyshop + * @param socket + * @param job + * @param logsRef + * @param mode + * @param allocationsSummary + * @returns {JSX.Element} + * @constructor + */ +export default function CdkLikePostForm({ bodyshop, socket, job, logsRef, mode, allocationsSummary }) { + const [form] = Form.useForm(); + const { t } = useTranslation(); + const [, /*unused*/ setTick] = useState(0); // handy if you need a forceUpdate later + + const { + treatments: { Fortellis } + } = useTreatmentsWithConfig({ + attributes: {}, + names: ["Fortellis"], + splitKey: bodyshop.imexshopid + }); + + const initialValues = useMemo( + () => ({ + story: `${t("jobs.labels.dms.defaultstory", { + ro_number: job.ro_number, + ownr_nm: `${job.ownr_fn || ""} ${job.ownr_ln || ""} ${job.ownr_co_nm || ""}`.trim(), + ins_co_nm: job.ins_co_nm || "N/A", + clm_po: `${job.clm_no ? `${job.clm_no} ` : ""}${job.po_number || ""}` + }).trim()}.${ + job.area_of_damage?.impact1 + ? " " + + t("jobs.labels.dms.damageto", { + area_of_damage: (job.area_of_damage && job.area_of_damage.impact1.padStart(2, "0")) || "UNKNOWN" + }) + : "" + }`.slice(0, 239), + inservicedate: dayjs( + `${ + (job.v_model_yr && + (job.v_model_yr < 100 + ? job.v_model_yr >= (dayjs().year() + 1) % 100 + ? 1900 + parseInt(job.v_model_yr, 10) + : 2000 + parseInt(job.v_model_yr, 10) + : job.v_model_yr)) || + 2019 + }-01-01` + ), + journal: bodyshop.cdk_configuration?.default_journal + }), + [job, bodyshop, t] + ); + + // Payers helpers + const handlePayerSelect = (value, index) => { + form.setFieldsValue({ + payers: (form.getFieldValue("payers") || []).map((payer, mapIndex) => { + if (index !== mapIndex) return payer; + const cdkPayer = + bodyshop.cdk_configuration.payers && bodyshop.cdk_configuration.payers.find((i) => i.name === value); + if (!cdkPayer) return payer; + return { + ...cdkPayer, + dms_acctnumber: cdkPayer.dms_acctnumber, + controlnumber: job?.[cdkPayer.control_type] + }; + }) + }); + setTick((n) => n + 1); + }; + + const handleFinish = (values) => { + if (!socket) return; + + if (mode === DMS_MAP.fortellis) { + socket.emit("fortellis-export-job", { + jobid: job.id, + txEnvelope: { ...values, SubscriptionID: bodyshop.cdk_dealerid } + }); + } else { + socket.emit(`${mode}-export-job`, { jobid: job.id, txEnvelope: values }); + } + + logsRef?.current?.scrollIntoView({ behavior: "smooth" }); + }; + + // Totals & discrepancy + const totals = useMemo(() => { + if (!allocationsSummary || allocationsSummary.length === 0) { + return { totalSale: Dinero(), totalCost: Dinero() }; + } + + return allocationsSummary.reduce( + (acc, val) => ({ + totalSale: acc.totalSale.add(Dinero(val.sale)), + totalCost: acc.totalCost.add(Dinero(val.cost)) + }), + { totalSale: Dinero(), totalCost: Dinero() } + ); + }, [allocationsSummary]); + + return ( + +
+ {/* TOP ROW */} + +
+ + + + + + + + + + + + + + + + + + + {/* CDK vehicle details (kept for CDK/Fortellis paths when dealer id exists) */} + {bodyshop.cdk_dealerid && ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )} + + + + + + + + + + + + {/* Totals */} + + + + + + + {/* Payers list */} + + + {(fields, { add, remove }) => ( +
+ {fields.map((field, index) => ( + +
+ + + + + + + + + + + + + + + + + + + + {t("jobs.fields.dms.payer.controlnumber")}{" "} + ({ + key: idx, + label: key.name, + onClick: () => { + form.setFieldsValue({ + payers: (form.getFieldValue("payers") || []).map((row, mapIndex) => { + if (index !== mapIndex) return row; + return { ...row, controlnumber: key.controlnumber }; + }) + }); + } + })) ?? [] + }} + > + e.preventDefault()}> + + + + + } + name={[field.name, "controlnumber"]} + rules={[{ required: true }]} + > + + + + + + + {() => { + const payers = form.getFieldValue("payers"); + const row = payers?.[index]; + const cdkPayer = + bodyshop.cdk_configuration.payers && + bodyshop.cdk_configuration.payers.find((i) => i && row && i.name === row.name); + if (i18n.exists(`jobs.fields.${cdkPayer?.control_type}`)) + return
{cdkPayer && t(`jobs.fields.${cdkPayer?.control_type}`)}
; + else if (i18n.exists(`jobs.fields.dms.control_type.${cdkPayer?.control_type}`)) { + return
{cdkPayer && t(`jobs.fields.dms.control_type.${cdkPayer?.control_type}`)}
; + } else { + return null; + } + }} +
+ + + + ))} + + + + + )} + + + {/* Validation gates & summary */} + + {() => { + let totalAllocated = Dinero(); + const payers = form.getFieldValue("payers") || []; + payers.forEach((payer) => { + totalAllocated = totalAllocated.add(Dinero({ amount: Math.round((payer?.amount || 0) * 100) })); + }); + + const discrep = totals ? totals.totalSale.subtract(totalAllocated) : Dinero(); + + // gate: must have payers filled + zero discrepancy when we have a summary + const payersOk = + payers.length > 0 && + payers.every((p) => p?.name && p.dms_acctnumber && (p.amount ?? "") !== "" && p.controlnumber); + + const hasAllocations = allocationsSummary && allocationsSummary.length > 0; + const nonRrDiscrepancyGate = hasAllocations ? discrep.getAmount() !== 0 : true; + + const disablePost = !payersOk || nonRrDiscrepancyGate; + + return ( + + + - + + = + + + + ); + }} + + + + ); +} diff --git a/client/src/components/dms-post-form/dms-post-form.component.jsx b/client/src/components/dms-post-form/dms-post-form.component.jsx index 1097cec54..f8f678383 100644 --- a/client/src/components/dms-post-form/dms-post-form.component.jsx +++ b/client/src/components/dms-post-form/dms-post-form.component.jsx @@ -1,396 +1,75 @@ -import { DeleteFilled, DownOutlined } from "@ant-design/icons"; -import { - Button, - Card, - Divider, - Dropdown, - Form, - Input, - InputNumber, - Select, - Space, - Statistic, - Switch, - Typography -} from "antd"; -import Dinero from "dinero.js"; -import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { determineDmsType } from "../../pages/dms/dms.container"; import { selectBodyshop } from "../../redux/user/user.selectors"; -import i18n from "../../translations/i18n"; -import dayjs from "../../utils/day"; -import DmsCdkMakes from "../dms-cdk-makes/dms-cdk-makes.component"; -import DmsCdkMakesRefetch from "../dms-cdk-makes/dms-cdk-makes.refetch.component"; -import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx"; -import CurrencyInput from "../form-items-formatted/currency-form-item.component"; -import LayoutFormRow from "../layout-form-row/layout-form-row.component"; +import { DMS_MAP } from "../../utils/dmsUtils"; +import RRPostForm from "./rr-dms-post-form"; +import CdkLikePostForm from "./cdklike-dms-post-form"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); -const mapDispatchToProps = () => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) -}); +const mapDispatchToProps = () => ({}); + export default connect(mapStateToProps, mapDispatchToProps)(DmsPostForm); -export function DmsPostForm({ bodyshop, socket, job, logsRef }) { - const [form] = Form.useForm(); - const { t } = useTranslation(); +/** + * DMS Post Form component that renders the appropriate post form + * @param mode + * @param bodyshop + * @param socket + * @param job + * @param logsRef + * @param key + * @param allocationsSummary + * @param rrOpCodeParts + * @param onChangeRrOpCodeParts + * @returns {JSX.Element|null} + * @constructor + */ +export function DmsPostForm({ + mode, + bodyshop, + socket, + job, + logsRef, + key, + allocationsSummary, + rrOpCodeParts, + onChangeRrOpCodeParts +}) { + switch (mode) { + case DMS_MAP.reynolds: + return ( + + ); - const handlePayerSelect = (value, index) => { - form.setFieldsValue({ - payers: form.getFieldValue("payers").map((payer, mapIndex) => { - if (index !== mapIndex) return payer; - const cdkPayer = - bodyshop.cdk_configuration.payers && bodyshop.cdk_configuration.payers.find((i) => i.name === value); + // CDK (legacy /ws), Fortellis (CDK-over-WSS), and PBS share the same UI; + // we pass mode down so the child can choose the correct event name. + case DMS_MAP.fortellis: + case DMS_MAP.cdk: + case DMS_MAP.pbs: + return ( + + ); - if (!cdkPayer) return payer; - - return { - ...cdkPayer, - dms_acctnumber: cdkPayer.dms_acctnumber, - controlnumber: job && job[cdkPayer.control_type] - }; - }) - }); - }; - - const handleFinish = (values) => { - socket.emit(`${determineDmsType(bodyshop)}-export-job`, { - jobid: job.id, - txEnvelope: values - }); - console.log(logsRef); - if (logsRef) { - console.log("executing", logsRef); - logsRef.curent && - logsRef.current.scrollIntoView({ - behavior: "smooth" - }); - } - }; - - return ( - -
= (dayjs().year() + 1) % 100 ? 1900 + parseInt(job.v_model_yr) : 2000 + parseInt(job.v_model_yr)) : job.v_model_yr)) || 2019}-01-01` - ) - }} - > - - - - - - - - - - - - - {bodyshop.cdk_dealerid && ( -
- - - - - - - - - - - - - - - - - - - - - -
- )} - - - - - - - - - - - - {(fields, { add, remove }) => { - return ( -
- {fields.map((field, index) => ( - - - - - - - - - - - - - - - - {t("jobs.fields.dms.payer.controlnumber")}{" "} - ({ - key: idx, - label: key.name, - onClick: () => { - form.setFieldsValue({ - payers: form.getFieldValue("payers").map((row, mapIndex) => { - if (index !== mapIndex) return row; - return { - ...row, - controlnumber: key.controlnumber - }; - }) - }); - } - })) - }} - > - e.preventDefault()}> - - - -
- } - key={`${index}controlnumber`} - name={[field.name, "controlnumber"]} - rules={[ - { - required: true - } - ]} - > - - - - - {() => { - const payers = form.getFieldValue("payers"); - - const row = payers && payers[index]; - - const cdkPayer = - bodyshop.cdk_configuration.payers && - bodyshop.cdk_configuration.payers.find((i) => i && row && i.name === row.name); - if (i18n.exists(`jobs.fields.${cdkPayer?.control_type}`)) - return
{cdkPayer && t(`jobs.fields.${cdkPayer?.control_type}`)}
; - else if (i18n.exists(`jobs.fields.dms.control_type.${cdkPayer?.control_type}`)) { - return
{cdkPayer && t(`jobs.fields.dms.control_type.${cdkPayer?.control_type}`)}
; - } else { - return null; - } - }} -
- - { - remove(field.name); - }} - /> - - - ))} - - - - - ); - }} -
- - {() => { - //Perform Calculation to determine discrepancy. - let totalAllocated = Dinero(); - - const payers = form.getFieldValue("payers"); - payers && - payers.forEach((payer) => { - totalAllocated = totalAllocated.add(Dinero({ amount: Math.round((payer?.amount || 0) * 100) })); - }); - - const totals = - socket.allocationsSummary && - socket.allocationsSummary.reduce( - (acc, val) => { - return { - totalSale: acc.totalSale.add(Dinero(val.sale)), - totalCost: acc.totalCost.add(Dinero(val.cost)) - }; - }, - { - totalSale: Dinero(), - totalCost: Dinero() - } - ); - const discrep = totals ? totals.totalSale.subtract(totalAllocated) : Dinero(); - return ( - - - - - - = - - - - ); - }} - - -
- ); + default: + return null; + } } diff --git a/client/src/components/dms-post-form/rr-dms-post-form.jsx b/client/src/components/dms-post-form/rr-dms-post-form.jsx new file mode 100644 index 000000000..6cdea243e --- /dev/null +++ b/client/src/components/dms-post-form/rr-dms-post-form.jsx @@ -0,0 +1,373 @@ +import { ReloadOutlined, RollbackOutlined } from "@ant-design/icons"; +import { + Button, + Card, + Col, + Divider, + Form, + Input, + InputNumber, + Row, + Select, + Space, + Statistic, + Tooltip, + Typography +} from "antd"; +import Dinero from "dinero.js"; +import { useTranslation } from "react-i18next"; +import { useEffect, useMemo, useState } from "react"; +import dayjs from "../../utils/day"; + +/** + * RR DMS Post Form component + * Submit: "rr-export-job" + * @param bodyshop + * @param socket + * @param job + * @param logsRef + * @param allocationsSummary + * @param opCodeParts // { prefix, base, suffix } from container + * @param onChangeOpCodeParts // (partsWithFlags) => void + * @returns {JSX.Element} + * @constructor + */ +export default function RRPostForm({ + bodyshop, + socket, + job, + logsRef, + allocationsSummary, + opCodeParts, + onChangeOpCodeParts +}) { + const [form] = Form.useForm(); + const { t } = useTranslation(); + + // Capture the baseline/default OpCode parts ONCE per mount (tied to resetKey in container) + const [baselineOpCodeParts] = useState(() => ({ + prefix: opCodeParts?.prefix ?? "", + base: opCodeParts?.base ?? "", + suffix: opCodeParts?.suffix ?? "" + })); + + // Advisors + const [advisors, setAdvisors] = useState([]); + const [advLoading, setAdvLoading] = useState(false); + + const getAdvisorNumber = (a) => a?.advisorId; + const getAdvisorLabel = (a) => `${a?.firstName || ""} ${a?.lastName || ""}`.trim(); + + const fetchRrAdvisors = (refresh = false) => { + if (!socket) return; + setAdvLoading(true); + + const onResult = (payload) => { + try { + const list = payload?.result ?? payload ?? []; + setAdvisors(Array.isArray(list) ? list : []); + } finally { + setAdvLoading(false); + socket.off("rr-get-advisors:result", onResult); + } + }; + + socket.once("rr-get-advisors:result", onResult); + socket.emit("rr-get-advisors", { departmentType: "B", refresh }, (ack) => { + if (ack?.ok) { + const list = ack.result ?? []; + setAdvisors(Array.isArray(list) ? list : []); + } else if (ack) { + console.error("Something went wrong fetching DMS Advisors"); + } + setAdvLoading(false); + socket.off("rr-get-advisors:result", onResult); + }); + }; + + useEffect(() => { + fetchRrAdvisors(false); + }, [bodyshop?.id, socket]); + + const initialValues = useMemo( + () => ({ + story: `${t("jobs.labels.dms.defaultstory", { + ro_number: job.ro_number, + ownr_nm: `${job.ownr_fn || ""} ${job.ownr_ln || ""} ${job.ownr_co_nm || ""}`.trim(), + ins_co_nm: job.ins_co_nm || "N/A", + clm_po: `${job.clm_no ? `${job.clm_no} ` : ""}${job.po_number || ""}` + }).trim()}.${ + job.area_of_damage?.impact1 + ? " " + + t("jobs.labels.dms.damageto", { + area_of_damage: (job.area_of_damage && job.area_of_damage.impact1.padStart(2, "0")) || "UNKNOWN" + }) + : "" + }`.slice(0, 239), + inservicedate: dayjs( + `${ + (job.v_model_yr && + (job.v_model_yr < 100 + ? job.v_model_yr >= (dayjs().year() + 1) % 100 + ? 1900 + parseInt(job.v_model_yr, 10) + : 2000 + parseInt(job.v_model_yr, 10) + : job.v_model_yr)) || + 2019 + }-01-01` + ), + opPrefix: opCodeParts?.prefix ?? "", + opBase: opCodeParts?.base ?? "", + opSuffix: opCodeParts?.suffix ?? "" + }), + [job, t, opCodeParts] + ); + + // Keep the RR OpCode parts in sync with DmsContainer state + const opPrefixWatch = Form.useWatch("opPrefix", form); + const opBaseWatch = Form.useWatch("opBase", form); + const opSuffixWatch = Form.useWatch("opSuffix", form); + + // Detect if current form values differ from baseline defaults + const isCustomOpCode = useMemo(() => { + const current = { + prefix: opPrefixWatch !== undefined ? opPrefixWatch : (baselineOpCodeParts.prefix ?? ""), + base: opBaseWatch !== undefined ? opBaseWatch : (baselineOpCodeParts.base ?? ""), + suffix: opSuffixWatch !== undefined ? opSuffixWatch : (baselineOpCodeParts.suffix ?? "") + }; + + return ( + current.prefix !== (baselineOpCodeParts.prefix ?? "") || + current.base !== (baselineOpCodeParts.base ?? "") || + current.suffix !== (baselineOpCodeParts.suffix ?? "") + ); + }, [opPrefixWatch, opBaseWatch, opSuffixWatch, baselineOpCodeParts]); + + // Push changes up to container with some metadata + useEffect(() => { + if (!onChangeOpCodeParts) return; + + const parts = { + prefix: opPrefixWatch || "", + base: opBaseWatch || "", + suffix: opSuffixWatch || "", + isCustom: isCustomOpCode + }; + + onChangeOpCodeParts(parts); + }, [opPrefixWatch, opBaseWatch, opSuffixWatch, isCustomOpCode, onChangeOpCodeParts]); + + const handleFinish = (values) => { + if (!socket) return; + + const { opPrefix, opBase, opSuffix, ...rest } = values; + + const combinedOpCode = `${opPrefix || ""}${opBase || ""}${opSuffix || ""}`.trim(); + + const txEnvelope = { + ...rest, + opPrefix, + opBase, + opSuffix + }; + + if (combinedOpCode) { + txEnvelope.opCode = combinedOpCode; + } + + socket.emit("rr-export-job", { + bodyshopId: bodyshop?.id, + jobId: job.id, + job, + txEnvelope + }); + + logsRef?.current?.scrollIntoView({ behavior: "smooth" }); + }; + + // Discrepancy is ignored for RR; we still show totals for operator context. + // Use the lifted allocationsSummary from the container instead of reading from the socket. + const totals = useMemo(() => { + if (!allocationsSummary || allocationsSummary.length === 0) { + return { totalSale: Dinero(), totalCost: Dinero() }; + } + + return allocationsSummary.reduce( + (acc, val) => ({ + totalSale: acc.totalSale.add(Dinero(val.sale)), + totalCost: acc.totalCost.add(Dinero(val.cost)) + }), + { totalSale: Dinero(), totalCost: Dinero() } + ); + }, [allocationsSummary]); + + const handleResetOpCode = () => { + form.setFieldsValue({ + opPrefix: baselineOpCodeParts.prefix, + opBase: baselineOpCodeParts.base, + opSuffix: baselineOpCodeParts.suffix + }); + }; + + return ( + +
+ + {/* Advisor + inline Refresh */} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Validation */} + + {() => { + const advisorOk = !!form.getFieldValue("advisorNo"); + return ( + + + = + + + ); + }} + + + + ); +} diff --git a/client/src/components/email-documents/email-documents.component.jsx b/client/src/components/email-documents/email-documents.component.jsx index 1a1dc5e11..8ce2427fc 100644 --- a/client/src/components/email-documents/email-documents.component.jsx +++ b/client/src/components/email-documents/email-documents.component.jsx @@ -9,7 +9,7 @@ import AlertComponent from "../alert/alert.component"; import JobDocumentsGalleryExternal from "../jobs-documents-gallery/jobs-documents-gallery.external.component"; import JobsDocumentsLocalGalleryExternalComponent from "../jobs-documents-local-gallery/jobs-documents-local-gallery.external.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import JobsDocumentImgproxyGalleryExternal from "../jobs-documents-imgproxy-gallery/jobs-documents-imgproxy-gallery.external.component"; const mapStateToProps = createStructuredSelector({ @@ -26,7 +26,7 @@ export function EmailDocumentsComponent({ emailConfig, form, selectedMediaState, const { t } = useTranslation(); const { treatments: { Imgproxy } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Imgproxy"], splitKey: bodyshop?.imexshopid diff --git a/client/src/components/header/buildAccountingChildren.jsx b/client/src/components/header/buildAccountingChildren.jsx index 574dbf603..9047ab9ac 100644 --- a/client/src/components/header/buildAccountingChildren.jsx +++ b/client/src/components/header/buildAccountingChildren.jsx @@ -141,7 +141,7 @@ const buildAccountingChildren = ({ ) }, - ...(!((bodyshop && bodyshop.cdk_dealerid) || (bodyshop && bodyshop.pbs_serialnumber)) || DmsAp.treatment === "on" + ...(!(bodyshop?.cdk_dealerid || bodyshop?.pbs_serialnumber || bodyshop?.rr_dealerid) || DmsAp.treatment === "on" ? [ { key: "payables", @@ -156,7 +156,7 @@ const buildAccountingChildren = ({ } ] : []), - ...(!((bodyshop && bodyshop.cdk_dealerid) || (bodyshop && bodyshop.pbs_serialnumber)) + ...(!(bodyshop?.cdk_dealerid || bodyshop?.pbs_serialnumber || bodyshop?.rr_dealerid) || DmsAp.treatment === "on" ? [ { key: "payments", diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index c3fcd1342..cf19f585f 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -2,7 +2,7 @@ import { BellFilled } from "@ant-design/icons"; import { useQuery } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Badge, Layout, Menu, Spin, Tooltip } from "antd"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -106,7 +106,7 @@ function Header({ // Feature flags const { treatments: { ImEXPay, DmsAp, Simple_Inventory } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["ImEXPay", "DmsAp", "Simple_Inventory"], splitKey: bodyshop && bodyshop.imexshopid diff --git a/client/src/components/job-close-ro-guard/job-close-ro-gaurd.labor.jsx b/client/src/components/job-close-ro-guard/job-close-ro-gaurd.labor.jsx index 974a99faa..54adbbf2d 100644 --- a/client/src/components/job-close-ro-guard/job-close-ro-gaurd.labor.jsx +++ b/client/src/components/job-close-ro-guard/job-close-ro-gaurd.labor.jsx @@ -1,5 +1,5 @@ import { useQuery } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { GET_LINE_TICKET_BY_PK } from "../../graphql/jobs-lines.queries"; @@ -23,7 +23,7 @@ export function JobCloseRoGuardLabor({ job, bodyshop, warningCallback }) { }); const { treatments: { Enhanced_Payroll } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Enhanced_Payroll"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/job-create-iou/job-create-iou.component.jsx b/client/src/components/job-create-iou/job-create-iou.component.jsx index 2aa027218..60e0eed3b 100644 --- a/client/src/components/job-create-iou/job-create-iou.component.jsx +++ b/client/src/components/job-create-iou/job-create-iou.component.jsx @@ -1,5 +1,5 @@ import { useApolloClient } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Button, Popconfirm } from "antd"; import { useState } from "react"; import { useTranslation } from "react-i18next"; @@ -32,7 +32,7 @@ export function JobCreateIOU({ bodyshop, currentUser, job, selectedJobLines, tec const { treatments: { IOU_Tracking } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["IOU_Tracking"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx index f0d2d54ef..f4c8ceb1a 100644 --- a/client/src/components/job-detail-lines/job-lines.component.jsx +++ b/client/src/components/job-detail-lines/job-lines.component.jsx @@ -29,7 +29,7 @@ import JobLinesBillRefernece from "../job-lines-bill-reference/job-lines-bill-re // import AllocationsAssignmentContainer from "../allocations-assignment/allocations-assignment.container"; // import AllocationsBulkAssignmentContainer from "../allocations-bulk-assignment/allocations-bulk-assignment.container"; // import AllocationsEmployeeLabelContainer from "../allocations-employee-label/allocations-employee-label.container"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import _ from "lodash"; import { FaTasks } from "react-icons/fa"; import { selectBodyshop } from "../../redux/user/user.selectors"; @@ -101,7 +101,7 @@ export function JobLinesComponent({ const { treatments: { Enhanced_Payroll } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Enhanced_Payroll"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx index c1ceac539..05362b55e 100644 --- a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx +++ b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx @@ -1,4 +1,4 @@ -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Form, Input, InputNumber, Modal, Select, Switch } from "antd"; import { useEffect } from "react"; import { useTranslation } from "react-i18next"; @@ -28,7 +28,7 @@ export function JobLinesUpsertModalComponent({ bodyshop, open, jobLine, handleCa const { treatments: { Allow_Negative_Jobline_Price, Autohouse_Detail_line } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Allow_Negative_Jobline_Price", "Autohouse_Detail_line"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx index 95ab7f461..cf9b88269 100644 --- a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx +++ b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx @@ -1,5 +1,5 @@ import { useMutation } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import Axios from "axios"; import Dinero from "dinero.js"; import { useState } from "react"; @@ -26,7 +26,7 @@ const mapDispatchToProps = (dispatch) => ({ function JobLinesUpsertModalContainer({ jobLineEditModal, toggleModalVisible, bodyshop }) { const { treatments: { CriticalPartsScanning } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["CriticalPartsScanning"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/job-payments/job-payments.component.jsx b/client/src/components/job-payments/job-payments.component.jsx index 8ae8c56a4..9536761bd 100644 --- a/client/src/components/job-payments/job-payments.component.jsx +++ b/client/src/components/job-payments/job-payments.component.jsx @@ -15,7 +15,7 @@ import DataLabel from "../data-label/data-label.component"; import PaymentExpandedRowComponent from "../payment-expanded-row/payment-expanded-row.component"; import PaymentsGenerateLink from "../payments-generate-link/payments-generate-link.component"; import PrintWrapperComponent from "../print-wrapper/print-wrapper.component"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop @@ -35,7 +35,7 @@ const mapDispatchToProps = (dispatch) => ({ export function JobPayments({ job, bodyshop, setPaymentContext, setCardPaymentContext, refetch }) { const { treatments: { ImEXPay } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["ImEXPay"], splitKey: bodyshop?.imexshopid diff --git a/client/src/components/job-watcher-toggle/job-watcher-toggle.container.jsx b/client/src/components/job-watcher-toggle/job-watcher-toggle.container.jsx index c47360455..5d366bacf 100644 --- a/client/src/components/job-watcher-toggle/job-watcher-toggle.container.jsx +++ b/client/src/components/job-watcher-toggle/job-watcher-toggle.container.jsx @@ -4,7 +4,7 @@ import { ADD_JOB_WATCHER, GET_JOB_WATCHERS, REMOVE_JOB_WATCHER } from "../../gra import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors.js"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import JobWatcherToggleComponent from "./job-watcher-toggle.component.jsx"; import { useIsEmployee } from "../../utils/useIsEmployee.js"; @@ -16,7 +16,7 @@ const mapStateToProps = createStructuredSelector({ function JobWatcherToggleContainer({ job, currentUser, bodyshop }) { const { treatments: { Enhanced_Payroll } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Enhanced_Payroll"], splitKey: bodyshop && bodyshop.imexshopid diff --git a/client/src/components/jobs-available-table/jobs-available-table.container.jsx b/client/src/components/jobs-available-table/jobs-available-table.container.jsx index 35a53aefd..d7142cd4a 100644 --- a/client/src/components/jobs-available-table/jobs-available-table.container.jsx +++ b/client/src/components/jobs-available-table/jobs-available-table.container.jsx @@ -1,5 +1,5 @@ import { gql, useApolloClient, useLazyQuery, useMutation, useQuery } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Col, Row } from "antd"; import Axios from "axios"; import _ from "lodash"; @@ -46,7 +46,7 @@ const mapDispatchToProps = (dispatch) => ({ export function JobsAvailableContainer({ bodyshop, currentUser, insertAuditTrail }) { const { treatments: { CriticalPartsScanning } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["CriticalPartsScanning"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx b/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx index 40fe27c6d..7ed28f90e 100644 --- a/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx +++ b/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx @@ -6,6 +6,7 @@ import { createStructuredSelector } from "reselect"; import { logImEXEvent } from "../../firebase/firebase.utils"; import { selectBodyshop } from "../../redux/user/user.selectors"; import InstanceRenderManager from "../../utils/instanceRenderMgr"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop @@ -14,6 +15,8 @@ const mapStateToProps = createStructuredSelector({ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) { const { t } = useTranslation(); + const hasDmsKey = bodyshopHasDmsKey(bodyshop); + const handleAllocate = (defaults) => { form.setFieldsValue({ joblines: joblines.map((jl) => { @@ -64,21 +67,20 @@ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) { handleAllocate(bodyshop.md_responsibility_centers.dms_defaults.find((x) => x.name === key)); }; - const menu = - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber - ? { - items: bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => ({ - key: mapping.name, - label: mapping.name, - disabled: disabled - })), - onClick: handleMenuClick - } - : { - items: [] - }; + const menu = hasDmsKey + ? { + items: bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => ({ + key: mapping.name, + label: mapping.name, + disabled: disabled + })), + onClick: handleMenuClick + } + : { + items: [] + }; - return bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? ( + return hasDmsKey ? ( diff --git a/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx b/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx index d8eb72d09..e811a9544 100644 --- a/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx +++ b/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx @@ -10,6 +10,7 @@ import { auth, logImEXEvent } from "../../firebase/firebase.utils"; import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; import { UPDATE_JOB } from "../../graphql/jobs.queries"; import { insertAuditTrail } from "../../redux/application/application.actions"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import client from "../../utils/GraphQLClient"; @@ -45,7 +46,7 @@ export function JobsCloseExportButton({ bodyshop, currentUser, jobId, disabled, const handleQbxml = async () => { //Check if it's a CDK setup. - if (bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) { + if (bodyshopHasDmsKey(bodyshop)) { history(`/manage/dms?jobId=${jobId}`); return; } diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx index 42aa416fa..c035000bd 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx @@ -1,6 +1,6 @@ import { DownCircleFilled } from "@ant-design/icons"; import { useApolloClient, useMutation } from "@apollo/client"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Button, Card, Dropdown, Form, Input, Modal, Popconfirm, Popover, Select, Space } from "antd"; import axios from "axios"; import parsePhoneNumber from "libphonenumber-js"; @@ -145,7 +145,7 @@ export function JobsDetailHeaderActions({ const { treatments: { ImEXPay } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["ImEXPay"], splitKey: bodyshop && bodyshop.imexshopid diff --git a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx index 80962c912..e728b4377 100644 --- a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx +++ b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx @@ -29,6 +29,7 @@ import ProductionListColumnProductionNote from "../production-list-columns/produ import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component"; import "./jobs-detail-header.styles.scss"; import getPartsBasePath from "../../utils/getPartsBasePath.js"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; const mapStateToProps = createStructuredSelector({ jobRO: selectJobReadOnly, @@ -309,7 +310,7 @@ export function JobsDetailHeader({ job, bodyshop, disabled, insertAuditTrail, is {`${job.v_vin || t("general.labels.na")}`} - {bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? ( + {bodyshopHasDmsKey(bodyshop) ? ( job.v_vin?.length !== 17 ? ( ) : null diff --git a/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx b/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx index 93608d2aa..092d7972d 100644 --- a/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx +++ b/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx @@ -6,7 +6,7 @@ import LaborAllocationsTableComponent from "../labor-allocations-table/labor-all import TimeTicketList from "../time-ticket-list/time-ticket-list.component"; import PayrollLaborAllocationsTable from "../labor-allocations-table/labor-allocations-table.payroll.component"; import { selectBodyshop } from "../../redux/user/user.selectors"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ jobRO: selectJobReadOnly, @@ -64,7 +64,7 @@ export function JobsDetailLaborContainer({ }) { const { treatments: { Enhanced_Payroll } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Enhanced_Payroll"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx b/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx index 5f4583dd6..ae7fa6d34 100644 --- a/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx @@ -6,7 +6,7 @@ import { logImEXEvent } from "../../firebase/firebase.utils"; import cleanAxios from "../../utils/CleanAxios"; import formatBytes from "../../utils/formatbytes"; //import yauzl from "yauzl"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -33,7 +33,7 @@ export function JobsDocumentsDownloadButton({ bodyshop, galleryImages, identifie const { treatments: { Direct_Media_Download } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Direct_Media_Download"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx index 22dde88ed..5281e50ae 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx @@ -7,7 +7,7 @@ import JobDocuments from "./jobs-documents-gallery.component"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop @@ -34,7 +34,7 @@ export function JobsDocumentsContainer({ }) { const { treatments: { Imgproxy } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Imgproxy"], splitKey: bodyshop?.imexshopid diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.utility.js b/client/src/components/labor-allocations-table/labor-allocations-table.utility.js index 8491ee063..1246bad2f 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.utility.js +++ b/client/src/components/labor-allocations-table/labor-allocations-table.utility.js @@ -1,4 +1,5 @@ import i18next from "i18next"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; export const CalculateAllocationsTotals = (bodyshop, joblines, timetickets, adjustments = []) => { const responsibilitycenters = bodyshop.md_responsibility_centers; @@ -14,10 +15,9 @@ export const CalculateAllocationsTotals = (bodyshop, joblines, timetickets, adju const r = allCodes.reduce((acc, value) => { const r = { opcode: value, - cost_center: - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber - ? i18next.t(`joblines.fields.lbr_types.${value && value.toUpperCase()}`) - : responsibilitycenters.defaults.costs[value], + cost_center: bodyshopHasDmsKey(bodyshop) + ? i18next.t(`joblines.fields.lbr_types.${value && value.toUpperCase()}`) + : responsibilitycenters.defaults.costs[value], mod_lbr_ty: value, total: joblines.reduce((acc2, val2) => { return val2.mod_lbr_ty === value ? acc2 + val2.mod_lb_hrs : acc2; diff --git a/client/src/components/partner-ping/partner-ping.component.jsx b/client/src/components/partner-ping/partner-ping.component.jsx index 0c80bc55c..8394e1bd7 100644 --- a/client/src/components/partner-ping/partner-ping.component.jsx +++ b/client/src/components/partner-ping/partner-ping.component.jsx @@ -44,6 +44,7 @@ export async function checkPartnerStatus(bodyshop) { // bodyshop && // (bodyshop.cdk_dealerid || // bodyshop.pbs_serialnumber || + // bodyshop.rr_dealerid || // bodyshop.accountingconfig.qbo) // ) // ) { diff --git a/client/src/components/parts-order-list-table/parts-order-list-table-drawer.component.jsx b/client/src/components/parts-order-list-table/parts-order-list-table-drawer.component.jsx index 7e07f8384..f52025d0e 100644 --- a/client/src/components/parts-order-list-table/parts-order-list-table-drawer.component.jsx +++ b/client/src/components/parts-order-list-table/parts-order-list-table-drawer.component.jsx @@ -28,6 +28,7 @@ import PartsOrderDeleteLine from "../parts-order-delete-line/parts-order-delete- import PartsOrderLineBackorderButton from "../parts-order-line-backorder-button/parts-order-line-backorder-button.component"; import PartsReceiveModalContainer from "../parts-receive-modal/parts-receive-modal.container"; import PrintWrapper from "../print-wrapper/print-wrapper.component"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; const mapStateToProps = createStructuredSelector({ jobRO: selectJobReadOnly, @@ -196,7 +197,7 @@ export function PartsOrderListTableDrawerComponent({ quantity: pol.quantity, actual_price: pol.act_price, cost_center: pol.jobline?.part_type - ? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid + ? bodyshopHasDmsKey(bodyshop) ? pol.jobline.part_type !== "PAE" ? pol.jobline.part_type : null diff --git a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx index c26b1e3dc..e9fdef8c7 100644 --- a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx +++ b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx @@ -20,6 +20,7 @@ import PartsReceiveModalContainer from "../parts-receive-modal/parts-receive-mod import PrintWrapper from "../print-wrapper/print-wrapper.component"; import PartsOrderDrawer from "./parts-order-list-table-drawer.component"; import ShareToTeamsButton from "../share-to-teams/share-to-teams.component.jsx"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; const mapStateToProps = createStructuredSelector({ jobRO: selectJobReadOnly, @@ -69,6 +70,7 @@ export function PartsOrderListTableComponent({ const parts_orders = billsQuery.data ? billsQuery.data.parts_orders : []; const { refetch } = billsQuery; + const recordActions = (record, showView = false) => ( - {bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on" + {bodyshop.cdk_dealerid || + bodyshop.pbs_serialnumber || + bodyshop.rr_dealerid || + Enhanced_Payroll.treatment === "on" ? CiecaSelect(false, true) : bodyshop.md_responsibility_centers.costs.map((c) => ( diff --git a/client/src/components/shop-info/shop-info.component.jsx b/client/src/components/shop-info/shop-info.component.jsx index 55bbeaa95..8dd04843e 100644 --- a/client/src/components/shop-info/shop-info.component.jsx +++ b/client/src/components/shop-info/shop-info.component.jsx @@ -1,4 +1,4 @@ -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Button, Card, Tabs } from "antd"; import queryString from "query-string"; import { useTranslation } from "react-i18next"; @@ -36,7 +36,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoComponent); export function ShopInfoComponent({ bodyshop, form, saveLoading }) { const { treatments: { CriticalPartsScanning, Enhanced_Payroll } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["CriticalPartsScanning", "Enhanced_Payroll"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/shop-info/shop-info.orderstatus.component.jsx b/client/src/components/shop-info/shop-info.orderstatus.component.jsx index b1925a756..e6b9c3cd4 100644 --- a/client/src/components/shop-info/shop-info.orderstatus.component.jsx +++ b/client/src/components/shop-info/shop-info.orderstatus.component.jsx @@ -4,7 +4,7 @@ import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop @@ -19,7 +19,7 @@ export function ShopInfoOrderStatusComponent({ bodyshop }) { const { treatments: { OEConnection } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["OEConnection"], splitKey: bodyshop.imexshopid diff --git a/client/src/components/shop-info/shop-info.rbac.component.jsx b/client/src/components/shop-info/shop-info.rbac.component.jsx index dd840dddf..9ea247662 100644 --- a/client/src/components/shop-info/shop-info.rbac.component.jsx +++ b/client/src/components/shop-info/shop-info.rbac.component.jsx @@ -1,4 +1,4 @@ -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Form, InputNumber } from "antd"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; @@ -20,7 +20,7 @@ export function ShopInfoRbacComponent({ bodyshop }) { const { t } = useTranslation(); const { treatments: { Simple_Inventory } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Simple_Inventory"], splitKey: bodyshop && bodyshop.imexshopid diff --git a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx index 38437a9aa..70f78223b 100644 --- a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx +++ b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx @@ -1,5 +1,5 @@ import { DeleteFilled } from "@ant-design/icons"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { Button, DatePicker, Form, Input, InputNumber, Radio, Select, Space, Switch } from "antd"; import { useState } from "react"; import { useTranslation } from "react-i18next"; @@ -14,6 +14,7 @@ import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.c import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; import ShopInfoResponsibilitycentersTaxesComponent from "./shop-info.responsibilitycenters.taxes.component"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; import DatePickerRanges from "../../utils/DatePickerRanges"; const SelectorDiv = styled.div` @@ -23,20 +24,20 @@ const SelectorDiv = styled.div` `; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser bodyshop: selectBodyshop }); -const mapDispatchToProps = () => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) -}); +const mapDispatchToProps = () => ({}); + export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoResponsibilityCenterComponent); export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { const { t } = useTranslation(); + const hasDMSKey = bodyshopHasDmsKey(bodyshop); + const { treatments: { ClosingPeriod, ADPPayroll, Qb_Multi_Ar, DmsAp } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["ClosingPeriod", "ADPPayroll", "Qb_Multi_Ar", "DmsAp"], splitKey: bodyshop?.imexshopid @@ -54,9 +55,14 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { []) ]); + const getCenterNames = (path) => { + const centers = form.getFieldValue(path) || []; + return centers.map((i) => i && i.name).filter(Boolean); + }; + const handleBlur = () => { - setCostOptions([...(form.getFieldValue(["md_responsibility_centers", "costs"]).map((i) => i && i.name) || [])]); - setProfitOptions([...(form.getFieldValue(["md_responsibility_centers", "profits"]).map((i) => i && i.name) || [])]); + setCostOptions(getCenterNames(["md_responsibility_centers", "costs"])); + setProfitOptions(getCenterNames(["md_responsibility_centers", "profits"])); }; const ReceivableCustomFieldSelect = ( @@ -70,37 +76,310 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { return (
- {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + + {[ + ...(HasFeatureAccess({ featureName: "export", bodyshop }) + ? !hasDMSKey + ? [ + + + , + InstanceRenderManager({ + imex: ( + + {() => ( + + + + )} + + ) + }), + + + , + + + 2 + 3 + + , + + {() => { + return ( + + + {t("bodyshop.labels.2tiername")} + {t("bodyshop.labels.2tiersource")} + + + ); + }} + , + + + , + + + , + + {ReceivableCustomFieldSelect} + , + + {ReceivableCustomFieldSelect} + , + + {ReceivableCustomFieldSelect} + , + { + return { + required: getFieldValue("enforce_class"), + //message: t("general.validation.required"), + type: "array" + }; + } + ]} + > + + , + + + , + InstanceRenderManager({ + imex: ( + + + + ) + }), + + + , + ...(HasFeatureAccess({ featureName: "bills", bodyshop }) + ? [ + InstanceRenderManager({ + imex: ( + + + + ) + }), + + + , + + + + ] + : []), + + + + ] + : []), + ...(ADPPayroll.treatment === "on" + ? [ + + + + ] + : []) + ] + : []) + ]} + + {hasDMSKey && ( <> - {bodyshop.cdk_dealerid && ( - {form.getFieldValue("cdk_dealerid")} - )} - {bodyshop.pbs_serialnumber && ( - - {form.getFieldValue("pbs_serialnumber")} - - )} + + {bodyshop.rr_dealerid && ( + {form.getFieldValue("rr_dealerid")} + )} + {bodyshop.cdk_dealerid && ( + + {form.getFieldValue("cdk_dealerid")} + + )} + {bodyshop.pbs_serialnumber && ( + + {form.getFieldValue("pbs_serialnumber")} + + )} + @@ -113,12 +392,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { @@ -180,429 +454,126 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { )} - - - {(fields, { add, remove, move }) => { - return ( -
- {fields.map((field, index) => ( - - - - - - - - - - - - - { - remove(field.name); - }} - /> - - - - - ))} - - - -
- ); - }} -
-
- - - {(fields, { add, remove }) => { - return ( -
- {fields.map((field, index) => ( - - - - - - - - - { - remove(field.name); - }} - /> - - - ))} - - - -
- ); - }} -
-
- - )} - {bodyshop.pbs_serialnumber && ( - <> - - {form.getFieldValue("pbs_serialnumber")} - - - )} - - {[ - ...(HasFeatureAccess({ featureName: "export", bodyshop }) - ? [ - - - , - InstanceRenderManager({ - imex: ( - - {() => ( - - - - )} - - ) - }), - - - , - - - 2 - 3 - - , - - {() => { + + {!bodyshop.rr_dealerid && ( + <> + + + {(fields, { add, remove, move }) => { return ( - - - {t("bodyshop.labels.2tiername")} - {t("bodyshop.labels.2tiersource")} - - +
+ {fields.map((field, index) => ( + + + + + + + + + + + + + { + remove(field.name); + }} + /> + + + + + ))} + + + +
); }} -
, - - - , - - - - ] - : []), - - - , - - - , - InstanceRenderManager({ - imex: ( - - - - ) - }), - - - , - ...(HasFeatureAccess({ featureName: "bills", bodyshop }) - ? [ - InstanceRenderManager({ - imex: ( - - - - ) - }), - - - , - - - - ] - : []), - - - , - - - , - ...(ClosingPeriod.treatment === "on" - ? [ - - - - ] - : []), - ...(ADPPayroll.treatment === "on" - ? [ - - - - ] - : []), - ...(ADPPayroll.treatment === "on" - ? [ - - - - ] - : []) - ] - : []), - - - - ]} -
+ + + + + {(fields, { add, remove }) => { + return ( +
+ {fields.map((field, index) => ( + + + + + + + + + { + remove(field.name); + }} + /> + + + ))} + + + +
+ ); + }} +
+
+ + )} + + )} {HasFeatureAccess({ featureName: "export", bodyshop }) && ( <> @@ -617,12 +588,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { label={t("bodyshop.fields.responsibilitycenter")} key={`${index}name`} name={[field.name, "name"]} - rules={[ - { - required: true - //message: t("general.validation.required"), - } - ]} + rules={[{ required: true }]} > @@ -630,86 +596,44 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { label={t("bodyshop.fields.responsibilitycenter_accountname")} key={`${index}accountname`} name={[field.name, "accountname"]} - rules={[ - { - required: true - //message: t("general.validation.required"), - } - ]} + rules={[{ required: true }]} > - {/* - - */} - {/* - - */} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - - )} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - + + {hasDMSKey && !bodyshop.rr_dealerid && ( + <> + + + + + + + )} + {bodyshop.cdk_dealerid && ( )} + { @@ -758,84 +683,37 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { label={t("bodyshop.fields.responsibilitycenter")} key={`${index}name`} name={[field.name, "name"]} - rules={[ - { - required: true - //message: t("general.validation.required"), - } - ]} + rules={[{ required: true }]} > - {/* - - - - - */} - - - - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - - - + {hasDMSKey && !bodyshop.rr_dealerid && ( + <> + + + + + + + )} {bodyshop.cdk_dealerid && ( )} + {bodyshop.rr_dealerid && ( + <> + + + + + + + + + + + + + )} { @@ -874,1642 +799,1458 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( - <> - - - {(fields, { add, remove }) => { - return ( -
- {fields.map((field, index) => ( - -
- 0 ? false : true}> - + + {(fields, { add, remove }) => { + return ( +
+ {fields.map((field, index) => ( + +
+ 0 ? false : true}> + + + + + + + { + remove(field.name); + }} + /> + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); + } + return Promise.reject(t("bodyshop.validation.centermustexist")); } - ]} - > - - - - - - { - remove(field.name); - }} - /> - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + }) + ]} + key={`${index}costs-ats`} + name={[field.name, "costs", "ATS"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-ats`} - name={[field.name, "costs", "ATS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAA`} + name={[field.name, "costs", "LAA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAA`} - name={[field.name, "costs", "LAA"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAB`} + name={[field.name, "costs", "LAB"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAB`} - name={[field.name, "costs", "LAB"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAD`} + name={[field.name, "costs", "LAD"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAD`} - name={[field.name, "costs", "LAD"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAE`} + name={[field.name, "costs", "LAE"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAE`} - name={[field.name, "costs", "LAE"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAF`} + name={[field.name, "costs", "LAF"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAF`} - name={[field.name, "costs", "LAF"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAG`} + name={[field.name, "costs", "LAG"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAG`} - name={[field.name, "costs", "LAG"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAM`} + name={[field.name, "costs", "LAM"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAM`} - name={[field.name, "costs", "LAM"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAR`} + name={[field.name, "costs", "LAR"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAR`} - name={[field.name, "costs", "LAR"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAS`} + name={[field.name, "costs", "LAS"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAS`} - name={[field.name, "costs", "LAS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LAU`} + name={[field.name, "costs", "LAU"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LAU`} - name={[field.name, "costs", "LAU"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LA1`} + name={[field.name, "costs", "LA1"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LA1`} - name={[field.name, "costs", "LA1"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LA2`} + name={[field.name, "costs", "LA2"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LA2`} - name={[field.name, "costs", "LA2"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LA3`} + name={[field.name, "costs", "LA3"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LA3`} - name={[field.name, "costs", "LA3"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-LA4`} + name={[field.name, "costs", "LA4"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-LA4`} - name={[field.name, "costs", "LA4"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAA`} + name={[field.name, "costs", "PAA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAA`} - name={[field.name, "costs", "PAA"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAC`} + name={[field.name, "costs", "PAC"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAC`} - name={[field.name, "costs", "PAC"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAG`} + name={[field.name, "costs", "PAG"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAG`} - name={[field.name, "costs", "PAG"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAL`} + name={[field.name, "costs", "PAL"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAL`} - name={[field.name, "costs", "PAL"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAM`} + name={[field.name, "costs", "PAM"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAM`} - name={[field.name, "costs", "PAM"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAN`} + name={[field.name, "costs", "PAN"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAN`} - name={[field.name, "costs", "PAN"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAO`} + name={[field.name, "costs", "PAO"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAO`} - name={[field.name, "costs", "PAO"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAP`} + name={[field.name, "costs", "PAP"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAP`} - name={[field.name, "costs", "PAP"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAR`} + name={[field.name, "costs", "PAR"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAR`} - name={[field.name, "costs", "PAR"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PAS`} + name={[field.name, "costs", "PAS"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PAS`} - name={[field.name, "costs", "PAS"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-PASL`} + name={[field.name, "costs", "PASL"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-PASL`} - name={[field.name, "costs", "PASL"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-TOW`} + name={[field.name, "costs", "TOW"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-TOW`} - name={[field.name, "costs", "TOW"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-MAPA`} + name={[field.name, "costs", "MAPA"]} + > + + + ({ + validator(rule, value) { + if (costOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-MAPA`} - name={[field.name, "costs", "MAPA"]} - > - - - ({ - validator(rule, value) { - if (costOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}costs-MASH`} + name={[field.name, "costs", "MASH"]} + > + + + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}costs-MASH`} - name={[field.name, "costs", "MASH"]} - > - - - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-ATS`} + name={[field.name, "profits", "ATS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-ATS`} - name={[field.name, "profits", "ATS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAA`} + name={[field.name, "profits", "LAA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAA`} - name={[field.name, "profits", "LAA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAB`} + name={[field.name, "profits", "LAB"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAB`} - name={[field.name, "profits", "LAB"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAD`} + name={[field.name, "profits", "LAD"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAD`} - name={[field.name, "profits", "LAD"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAE`} + name={[field.name, "profits", "LAE"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAE`} - name={[field.name, "profits", "LAE"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAF`} + name={[field.name, "profits", "LAF"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAF`} - name={[field.name, "profits", "LAF"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAG`} + name={[field.name, "profits", "LAG"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAG`} - name={[field.name, "profits", "LAG"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAM`} + name={[field.name, "profits", "LAM"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAM`} - name={[field.name, "profits", "LAM"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAR`} + name={[field.name, "profits", "LAR"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAR`} - name={[field.name, "profits", "LAR"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAS`} + name={[field.name, "profits", "LAS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAS`} - name={[field.name, "profits", "LAS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LAU`} + name={[field.name, "profits", "LAU"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LAU`} - name={[field.name, "profits", "LAU"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LA1`} + name={[field.name, "profits", "LA1"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LA1`} - name={[field.name, "profits", "LA1"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LA2`} + name={[field.name, "profits", "LA2"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LA2`} - name={[field.name, "profits", "LA2"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LA3`} + name={[field.name, "profits", "LA3"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LA3`} - name={[field.name, "profits", "LA3"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-LA4`} + name={[field.name, "profits", "LA4"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-LA4`} - name={[field.name, "profits", "LA4"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAA`} + name={[field.name, "profits", "PAA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAA`} - name={[field.name, "profits", "PAA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAC`} + name={[field.name, "profits", "PAC"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAC`} - name={[field.name, "profits", "PAC"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAG`} + name={[field.name, "profits", "PAG"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAG`} - name={[field.name, "profits", "PAG"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAL`} + name={[field.name, "profits", "PAL"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAL`} - name={[field.name, "profits", "PAL"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAM`} + name={[field.name, "profits", "PAM"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAM`} - name={[field.name, "profits", "PAM"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAN`} + name={[field.name, "profits", "PAN"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAN`} - name={[field.name, "profits", "PAN"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAO`} + name={[field.name, "profits", "PAO"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAO`} - name={[field.name, "profits", "PAO"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAP`} + name={[field.name, "profits", "PAP"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAP`} - name={[field.name, "profits", "PAP"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAR`} + name={[field.name, "profits", "PAR"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAR`} - name={[field.name, "profits", "PAR"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PAS`} + name={[field.name, "profits", "PAS"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PAS`} - name={[field.name, "profits", "PAS"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-PASL`} + name={[field.name, "profits", "PASL"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-PASL`} - name={[field.name, "profits", "PASL"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-TOW`} + name={[field.name, "profits", "TOW"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-TOW`} - name={[field.name, "profits", "TOW"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-MAPA`} + name={[field.name, "profits", "MAPA"]} + > + + + ({ + validator(rule, value) { + if (profitOptions.includes(value)) { + return Promise.resolve(); } - }) - ]} - key={`${index}profits-MAPA`} - name={[field.name, "profits", "MAPA"]} - > - - - ({ - validator(rule, value) { - if (profitOptions.includes(value)) { - return Promise.resolve(); - } - return Promise.reject(t("bodyshop.validation.centermustexist")); - } - }) - ]} - key={`${index}profits-MASH`} - name={[field.name, "profits", "MASH"]} - > - - - -
-
- ))} - - + return Promise.reject(t("bodyshop.validation.centermustexist")); + } + }) + ]} + key={`${index}profits-MASH`} + name={[field.name, "profits", "MASH"]} + > + + + +
-
- ); - }} - - - + ))} + + + +
+ ); + }} +
+
)} ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2532,10 +2273,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2558,10 +2296,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2584,10 +2319,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2610,10 +2342,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2636,10 +2365,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2662,10 +2388,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2688,10 +2411,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2714,10 +2434,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2740,10 +2457,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2766,10 +2480,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2792,10 +2503,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2818,10 +2526,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2844,10 +2549,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2870,10 +2572,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2896,10 +2595,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2922,10 +2618,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2948,10 +2641,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -2974,10 +2664,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3000,10 +2687,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3026,10 +2710,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3052,10 +2733,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3078,10 +2756,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3104,10 +2779,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3130,10 +2802,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3156,10 +2825,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3182,10 +2848,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3208,10 +2871,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3234,10 +2894,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (costOptions.includes(value)) { @@ -3262,10 +2919,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3288,10 +2942,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3314,10 +2965,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3340,10 +2988,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3366,10 +3011,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3392,10 +3034,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3418,10 +3057,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3444,10 +3080,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3470,10 +3103,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3496,10 +3126,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3522,10 +3149,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3548,10 +3172,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3574,10 +3195,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3600,10 +3218,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3626,10 +3241,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3652,10 +3264,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3678,10 +3287,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3704,10 +3310,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3730,10 +3333,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3756,10 +3356,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3782,10 +3379,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3808,10 +3402,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3834,10 +3425,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3860,10 +3448,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3886,10 +3471,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3912,10 +3494,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3938,10 +3517,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3964,10 +3540,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -3990,10 +3563,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ({ validator(rule, value) { if (profitOptions.includes(value)) { @@ -4017,86 +3587,33 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
)} + - {/* - - */} - {/* - - */} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + {hasDMSKey && ( @@ -4104,98 +3621,40 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { )} + {DmsAp.treatment === "on" && ( - {/* - - */} - {/* - - */} - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + {hasDMSKey && ( @@ -4203,12 +3662,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { )} @@ -4220,78 +3674,30 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { - {/* - - - - - */} + - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + {hasDMSKey && ( @@ -4299,12 +3705,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { )} @@ -4320,24 +3721,14 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { <> @@ -4345,224 +3736,34 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { ) })} - {/**/} - {/* */} - {/* */} - {/* */} - {/* /!* */} - {/* */} - {/* */} - {/* */} - {/* */} - {/* *!/*/} - {/* */} - {/* */} - {/* */} - {/* */} - {/* */} - {/* */} - {/* {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (*/} - {/* */} - {/* */} - {/* */} - {/* )}*/} - {/* */} - {/* */} - {/* */} - {/**/} AR
} id="AR"> - {/* - - - - - */} - {/* - - - - - */} {DmsAp.treatment === "on" && ( - {/* - - */} - {/* - - */} @@ -4570,62 +3771,9 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { )} Refund} id="refund"> - {/* - - */} - {/* - - */} - {/* - - - - - */} @@ -4634,28 +3782,18 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { {InstanceRenderManager({ rome: ( Adjustments} id="refund"> - {bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? ( + {hasDMSKey ? ( <> @@ -4665,24 +3803,14 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { <> @@ -4696,12 +3824,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { Multiple Payers Item} id="accountitem"> @@ -4720,12 +3843,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { label={t("bodyshop.fields.responsibilitycenters.sales_tax_codes.description")} key={`${index}description`} name={[field.name, "description"]} - rules={[ - { - required: true - //message: t("general.validation.required"), - } - ]} + rules={[{ required: true }]} > @@ -4733,12 +3851,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) { label={t("bodyshop.fields.responsibilitycenters.sales_tax_codes.code")} key={`${index}code`} name={[field.name, "code"]} - rules={[ - { - required: true - //message: t("general.validation.required"), - } - ]} + rules={[{ required: true }]} > diff --git a/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx b/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx index 260de44bd..6adb3de4e 100644 --- a/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx +++ b/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx @@ -5,6 +5,7 @@ import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import InstanceRenderManager from "../../utils/instanceRenderMgr"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; const mapStateToProps = createStructuredSelector({ //currentUser: selectCurrentUser @@ -2126,7 +2127,7 @@ function TaxFormItems({ typeNum, typeNumIterator, rootElements, bodyshop }) { > - {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && ( + {bodyshopHasDmsKey(bodyshop) && ( {item.cost_center === "timetickets.labels.shift" ? t(item.cost_center) - : bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on" + : bodyshop.cdk_dealerid || + bodyshop.pbs_serialnumber || + bodyshop.rr_dealerid || + Enhanced_Payroll.treatment === "on" ? t(`joblines.fields.lbr_types.${item.cost_center.toUpperCase()}`) : item.cost_center}
diff --git a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx index f1915c6bd..b8ef08531 100644 --- a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx +++ b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx @@ -12,7 +12,7 @@ import { selectTechnician } from "../../redux/tech/tech.selectors"; import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; import TechJobPrintTickets from "../tech-job-print-tickets/tech-job-print-tickets.component"; import TechClockInComponent from "./tech-job-clock-in-form.component"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; const mapStateToProps = createStructuredSelector({ @@ -27,7 +27,7 @@ const mapDispatchToProps = (dispatch) => ({ export function TechClockInContainer({ setTimeTicketContext, technician, bodyshop, currentUser }) { const { treatments: { Enhanced_Payroll } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Enhanced_Payroll"], splitKey: bodyshop.imexshopid @@ -75,7 +75,10 @@ export function TechClockInContainer({ setTimeTicketContext, technician, bodysho jobid: values.jobid, cost_center: values.cost_center, ciecacode: - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on" + bodyshop.cdk_dealerid || + bodyshop.pbs_serialnumber || + bodyshop.rr_dealerid || + Enhanced_Payroll.treatment === "on" ? values.cost_center : Object.keys(bodyshop.md_responsibility_centers.defaults.costs).find((key) => { return bodyshop.md_responsibility_centers.defaults.costs[key] === values.cost_center; diff --git a/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx b/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx index 5ef1b46c5..19580b98c 100644 --- a/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx +++ b/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx @@ -14,8 +14,9 @@ import { selectBodyshop } from "../../redux/user/user.selectors"; import { CalculateAllocationsTotals } from "../labor-allocations-table/labor-allocations-table.utility"; import TechJobClockoutDelete from "../tech-job-clock-out-delete/tech-job-clock-out-delete.component"; import { LaborAllocationContainer } from "../time-ticket-modal/time-ticket-modal.component"; -import { useSplitTreatments } from "@splitsoftware/splitio-react"; +import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; +import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -38,7 +39,7 @@ export function TechClockOffButton({ const [form] = Form.useForm(); const { treatments: { Enhanced_Payroll } - } = useSplitTreatments({ + } = useTreatmentsWithConfig({ attributes: {}, names: ["Enhanced_Payroll"], splitKey: bodyshop.imexshopid @@ -53,7 +54,9 @@ export function TechClockOffButton({ nextFetchPolicy: "network-only" }); const { t } = useTranslation(); - const emps = bodyshop.employees.filter((e) => e.id === (technician && technician.id))[0]; + + const emps = bodyshop.employees.filter((e) => e.id === technician?.id)[0]; + const hasDmsKey = bodyshopHasDmsKey(bodyshop); const handleFinish = async (values) => { logImEXEvent("tech_clock_out_job"); @@ -69,7 +72,10 @@ export function TechClockOffButton({ rate: emps && emps.rates.filter((r) => r.cost_center === values.cost_center)[0]?.rate, flat_rate: emps && emps.flat_rate, ciecacode: - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on" + bodyshop.cdk_dealerid || + bodyshop.pbs_serialnumber || + bodyshop.rr_dealerid || + Enhanced_Payroll.treatment === "on" ? values.cost_center : Object.keys(bodyshop.md_responsibility_centers.defaults.costs).find((key) => { return bodyshop.md_responsibility_centers.defaults.costs[key] === values.cost_center; @@ -154,6 +160,7 @@ export function TechClockOffButton({ } if (!value || getFieldValue("cost_center") === null || !lineTicketData) return Promise.resolve(); + //Check the cost center, const totals = CalculateAllocationsTotals( bodyshop, @@ -161,13 +168,15 @@ export function TechClockOffButton({ lineTicketData.timetickets, lineTicketData.jobs_by_pk.lbr_adjustments ); - const fieldTypeToCheck = - bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? "mod_lbr_ty" : "cost_center"; + + const fieldTypeToCheck = hasDmsKey ? "mod_lbr_ty" : "cost_center"; + const costCenterDiff = Math.round( totals.find((total) => total[fieldTypeToCheck] === getFieldValue("cost_center")) ?.difference * 10 ) / 10; + if (value > costCenterDiff) return Promise.reject(t("timetickets.validation.hoursenteredmorethanavailable")); else { @@ -200,7 +209,7 @@ export function TechClockOffButton({ {item.cost_center === "timetickets.labels.shift" ? t(item.cost_center) - : bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber + : hasDmsKey ? t(`joblines.fields.lbr_types.${item.cost_center.toUpperCase()}`) : item.cost_center} @@ -208,6 +217,7 @@ export function TechClockOffButton({ )} + {isShiftTicket ? (
) : ( @@ -243,10 +253,10 @@ export function TechClockOffButton({ ); return ( - {overlay}} + {overlay}} trigger="click" - getPopupContainer={() => document.querySelector('#time-ticket-modal')} + getPopupContainer={() => document.querySelector("#time-ticket-modal")} >
- - {`${ - data && data.jobs_by_pk && data.jobs_by_pk.ro_number - }`} - {` | ${OwnerNameDisplayFunction(data.jobs_by_pk)} | ${ - data.jobs_by_pk.v_model_yr || "" - } ${data.jobs_by_pk.v_make_desc || ""} ${data.jobs_by_pk.v_model_desc || ""}`} - - } - socket={socket} - jobId={jobId} - /> - - - + + {!isRrMode ? ( + + {`${data?.jobs_by_pk && data.jobs_by_pk.ro_number}`} + {` | ${OwnerNameDisplayFunction(data.jobs_by_pk)} | ${data.jobs_by_pk.v_model_yr || ""} ${ + data.jobs_by_pk.v_make_desc || "" + } ${data.jobs_by_pk.v_model_desc || ""}`} + + } + socket={activeSocket} + jobId={jobId} + mode={mode} + /> + ) : ( + + + {data?.jobs_by_pk && data.jobs_by_pk.ro_number} + + {` | ${OwnerNameDisplayFunction(data.jobs_by_pk)} | ${ + data.jobs_by_pk.v_model_yr || "" + } ${data.jobs_by_pk.v_make_desc || ""} ${data.jobs_by_pk.v_model_desc || ""}`} + + } + socket={activeSocket} + jobId={jobId} + opCode={rrOpCodeCombined} + /> + )} - + + + + +
@@ -165,14 +503,27 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, inse title={t("jobs.labels.dms.logs")} extra={ + {isRrMode && ( + <> + + + + )} +