diff --git a/_reference/productionBoardNotes.md b/_reference/productionBoardNotes.md index 31bf2b4dc..96ea0d46f 100644 --- a/_reference/productionBoardNotes.md +++ b/_reference/productionBoardNotes.md @@ -31,3 +31,11 @@ These allow users to turn fields on or off, turning them all off will show the card in the most minimal form + +### Statistics + +- The statistics section allows users to see accumulations of both jobs on the board, and jobs in production. +- you can click a statistic to turn it on and off, and drag and drop the statistics to rearrange them + +### Filters +- Allows you to set, and persist filters for estimators and insurance companies diff --git a/client/index.html b/client/index.html index d5561433e..7e4aa27db 100644 --- a/client/index.html +++ b/client/index.html @@ -1,174 +1,177 @@ - - - <% if (env.VITE_APP_INSTANCE === 'IMEX') { %> - - <% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %> - - <% } %> <% if (env.VITE_APP_INSTANCE === 'PROMANAGER') { %> - - <% } %> + + + <% if (env.VITE_APP_INSTANCE === 'IMEX') { %> + + <% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %> + + <% } %> <% if (env.VITE_APP_INSTANCE === 'PROMANAGER') { %> + + <% } %> - - - - - - - - + + + + + - <% if (env.VITE_APP_INSTANCE === 'IMEX') { %> - - ImEX Online - - <% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %> - - Rome Online + Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will + work correctly both with client-side routing and a non-root public URL. + Learn how to configure a non-root public URL by running `npm run build`. + --> + <% if (env.VITE_APP_INSTANCE === 'IMEX') { %> + + ImEX Online + + <% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %> + + Rome Online - + - + - - - - - + + + + + + <% } %> <% if (env.VITE_APP_INSTANCE === 'PROMANAGER') { %> + ProManager + - <% } %> <% if (env.VITE_APP_INSTANCE === 'PROMANAGER') { %> - ProManager - + <% } %> + - - - -
- - + !(function () { + for (var o = 0; o < e.length; o++) { + var r = e[o]; + n[r] = t(r); + } + })(), + (function () { + var e = document.createElement('script'); + (e.async = !0), (e.src = 'https://sdk.noticeable.io/l.js'); + var n = document.head; + n.insertBefore(e, n.firstChild); + })(); + } + })(); + + + + +
+ + + diff --git a/client/package-lock.json b/client/package-lock.json index c0081a7f3..6650cb557 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,9 +8,8 @@ "name": "bodyshop", "version": "0.2.1", "dependencies": { - "@ant-design/icons": "^5.4.0", "@ant-design/pro-layout": "^7.19.12", - "@apollo/client": "^3.11.3", + "@apollo/client": "^3.11.4", "@emotion/is-prop-valid": "^1.3.0", "@fingerprintjs/fingerprintjs": "^4.4.3", "@jsreport/browser-client": "^3.1.0", @@ -20,11 +19,11 @@ "@splitsoftware/splitio-react": "^1.12.1", "@tanem/react-nprogress": "^5.0.51", "@vitejs/plugin-react": "^4.3.1", - "antd": "^5.20.0", + "antd": "^5.20.2", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^3.3.0", "autosize": "^6.0.1", - "axios": "^1.7.3", + "axios": "^1.7.4", "classnames": "^2.5.1", "css-box-model": "^1.2.1", "dayjs": "^1.11.12", @@ -33,12 +32,12 @@ "dotenv": "^16.4.5", "env-cmd": "^10.1.0", "exifr": "^7.1.3", - "firebase": "^10.12.5", + "firebase": "^10.13.0", "graphql": "^16.9.0", - "i18next": "^23.12.2", + "i18next": "^23.14.0", "i18next-browser-languagedetector": "^8.0.0", "immutability-helper": "^3.1.1", - "libphonenumber-js": "^1.11.5", + "libphonenumber-js": "^1.11.7", "logrocket": "^8.1.2", "markerjs2": "^2.32.1", "memoize-one": "^6.0.0", @@ -48,7 +47,7 @@ "query-string": "^9.1.0", "raf-schd": "^4.0.3", "react": "^18.3.1", - "react-big-calendar": "^1.13.2", + "react-big-calendar": "^1.13.3", "react-color": "^2.19.3", "react-cookie": "^7.2.0", "react-dom": "^18.3.1", @@ -56,19 +55,18 @@ "react-grid-gallery": "^1.0.1", "react-grid-layout": "1.3.4", "react-i18next": "^14.1.3", - "react-icons": "^5.2.1", + "react-icons": "^5.3.0", "react-image-lightbox": "^5.1.4", - "react-joyride": "^2.8.2", "react-markdown": "^9.0.1", "react-number-format": "^5.4.0", "react-popopo": "^2.1.9", - "react-product-fruits": "^2.2.6", + "react-product-fruits": "^2.2.61", "react-redux": "^9.1.2", "react-resizable": "^3.0.5", - "react-router-dom": "^6.26.0", + "react-router-dom": "^6.26.1", "react-sticky": "^6.0.3", "react-virtualized": "^9.22.5", - "react-virtuoso": "^4.9.0", + "react-virtuoso": "^4.10.1", "recharts": "^2.12.7", "redux": "^5.0.1", "redux-actions": "^3.0.3", @@ -81,22 +79,22 @@ "styled-components": "^6.1.12", "subscriptions-transport-ws": "^0.11.0", "use-memo-one": "^1.1.3", - "userpilot": "^1.3.2", + "userpilot": "^1.3.5", "vite-plugin-ejs": "^1.7.0", "web-vitals": "^3.5.2" }, "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/preset-react": "^7.24.7", - "@dotenvx/dotenvx": "^1.6.4", + "@dotenvx/dotenvx": "^1.7.0", "@emotion/babel-plugin": "^11.12.0", "@emotion/react": "^11.13.0", - "@sentry/webpack-plugin": "^2.22.0", + "@sentry/webpack-plugin": "^2.22.2", "@testing-library/cypress": "^10.0.2", "browserslist": "^4.23.3", "browserslist-to-esbuild": "^2.1.1", "cross-env": "^7.0.3", - "cypress": "^13.13.2", + "cypress": "^13.13.3", "eslint": "^8.57.0", "eslint-config-react-app": "^7.0.1", "eslint-plugin-cypress": "^2.15.1", @@ -105,7 +103,7 @@ "react-error-overlay": "6.0.11", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", - "vite": "^5.3.5", + "vite": "^5.4.1", "vite-plugin-babel": "^1.2.0", "vite-plugin-eslint": "^1.8.1", "vite-plugin-legacy": "^2.1.0", @@ -114,7 +112,7 @@ "vite-plugin-style-import": "^2.0.0" }, "engines": { - "node": ">=20.15.0" + "node": ">=18.18.2" }, "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "4.6.1" @@ -189,6 +187,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.4.0.tgz", "integrity": "sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==", + "license": "MIT", "dependencies": { "@ant-design/colors": "^7.0.0", "@ant-design/icons-svg": "^4.4.0", @@ -314,9 +313,9 @@ } }, "node_modules/@apollo/client": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.11.3.tgz", - "integrity": "sha512-bocd9vQc9PSq4MG6129HKF8ujUirVod98he9OEWpyOs5CXnUC81zNRaUshA4wPSflR6mnx0yRuRankp1V8A+og==", + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.11.4.tgz", + "integrity": "sha512-bmgYKkULpym8wt8aXlAZ1heaYo0skLJ5ru0qJ+JCRoo03Pe+yIDbBCnqlDw6Mjj76hFkDw3HwFMgZC2Hxp30Mg==", "license": "MIT", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", @@ -2713,14 +2712,14 @@ } }, "node_modules/@dotenvx/dotenvx": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.6.4.tgz", - "integrity": "sha512-2jbcxpqbJDafeZo9i2ha38qGyB0KISgCht6KDTyvR4LlWK922pflm9t8M1jY97uYgW3PNZZjCmQjzQ+IB/V4rQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.7.0.tgz", + "integrity": "sha512-WPkSNS060+GwNoWHHBRjJxBR9KhsWyoNyevD8I2x8LffWPdbVvRJqJI72fF1H+KYpDWGBQ4xdX++xO2GS37XUQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "chalk": "^4.1.2", "commander": "^11.1.0", - "conf": "^10.2.0", "diff": "^5.2.0", "dotenv": "^16.4.5", "eciesjs": "^0.4.6", @@ -2824,10 +2823,11 @@ "dev": true }, "node_modules/@emotion/cache": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.0.tgz", - "integrity": "sha512-hPV345J/tH0Cwk2wnU/3PBzORQ9HeX+kQSbwI+jslzpRCHE6fSGTohswksA/Ensr8znPzwfzKZCmAM9Lmlhp7g==", + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", "dev": true, + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", @@ -2840,13 +2840,15 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/cache/node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/hash": { "version": "0.8.0", @@ -2876,6 +2878,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.12.0", @@ -2900,6 +2903,7 @@ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", "dev": true, + "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", @@ -2930,7 +2934,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", @@ -2942,6 +2947,7 @@ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", "dev": true, + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } @@ -2950,13 +2956,15 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", @@ -3490,9 +3498,9 @@ "license": "Apache-2.0" }, "node_modules/@firebase/app": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.8.tgz", - "integrity": "sha512-xSLmW0/RShcnUEXH7l+wC0AFWaUtty4tUFF2loIgbtXTRmra0UH/SqYDf/IcfreUninRrCsusNmvoTidGkXJPw==", + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.9.tgz", + "integrity": "sha512-AmGlPg/4SoDhwCdvVDeZsN5Yn+czYD/m/NAEOOCOhwn3Cz1xmEFKAKcyZKKahLrh5QPmge5Adyw+sk3cBTubBg==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.8", @@ -3546,12 +3554,12 @@ "license": "Apache-2.0" }, "node_modules/@firebase/app-compat": { - "version": "0.2.38", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.38.tgz", - "integrity": "sha512-36ZrSvkYLW7QR01Sii2X+IY18ErMpRg6e2B2f/DVTtJBolthwXOnNBps+wvaVBvegdvdVPspgDXZUV0ppqh45w==", + "version": "0.2.39", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.39.tgz", + "integrity": "sha512-NnTFywe+M/jxZn751NIEhidgDePiDvlcfabvGxBy4YbU1E+b0TpEuJUnm3L6YDZtaZLVEz8ieoq9wbJkgGZ2rg==", "license": "Apache-2.0", "dependencies": { - "@firebase/app": "0.10.8", + "@firebase/app": "0.10.9", "@firebase/component": "0.6.8", "@firebase/logger": "0.4.2", "@firebase/util": "1.9.7", @@ -3565,9 +3573,9 @@ "license": "Apache-2.0" }, "node_modules/@firebase/auth": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.6.tgz", - "integrity": "sha512-T+lA5xoug9CByGYkD5WkfTh2ujEYq/frGZPbk0H+fNU6fNl7nqg88KcsmzsC6Fsqbjm3LLEb/i6wJvF6NSNEig==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.7.tgz", + "integrity": "sha512-gMB0uRRNiIvYorEDLtIq1mc7x5D080EsoghTIph9xnbLqcQS3qRBREEC2o21nMEhviAeiGJMelRkKhAkkggjmA==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.8", @@ -3587,12 +3595,12 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.11.tgz", - "integrity": "sha512-7rE3MkQDoWwI2qd8qsra4/QZCO2GzQSbCL6AVQpult9+Nbimg+5A+YeHxpLTcYAxUV6HDg2CqTDQreFLhcm1CQ==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.12.tgz", + "integrity": "sha512-K47inLqjTREez85D7pP0TmRv5aQcap22cJW67poLwJoJ6BVVH0I2NOfIoMqENetCrgGS+7vXSIZaLjvHFHwS+g==", "license": "Apache-2.0", "dependencies": { - "@firebase/auth": "1.7.6", + "@firebase/auth": "1.7.7", "@firebase/auth-types": "0.12.2", "@firebase/component": "0.6.8", "@firebase/util": "1.9.7", @@ -3667,9 +3675,9 @@ } }, "node_modules/@firebase/firestore": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.6.5.tgz", - "integrity": "sha512-0+Ascaht4qUzj4pCopMPWmoAujk8HKjwCpaNYOOjbYMZ65RVfZPsfZwwbWi/zWMXj6xvPsai5oBiErUUkrLwNw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.0.tgz", + "integrity": "sha512-wGOp84P1qa1pfpdct6lckfyowTuvIlUDHoiRcN8dFDT4WnZDh0tZW1X77SMiBUVejK8xIRLBCK3yDTejlRVrUA==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.8", @@ -3689,13 +3697,13 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.34", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.34.tgz", - "integrity": "sha512-OBP2F/Ccydl2U2j8XIfpKBxf0EnQHEhbZ4LTwbSS2QlG9+8TwhvKFkKk/ZljWYqaype+qFKPuXZ5flCqYEETeA==", + "version": "0.3.35", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.35.tgz", + "integrity": "sha512-VdYQtMIrPjsgZpuBwvry6LgcS0vbUhHzpebaKm5oc9oTTvP4K7oxvR/ZJdDjIE5rBugn1SdY++uGMatcIvBkZg==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.8", - "@firebase/firestore": "4.6.5", + "@firebase/firestore": "4.7.0", "@firebase/firestore-types": "3.0.2", "@firebase/util": "1.9.7", "tslib": "^2.1.0" @@ -3904,9 +3912,10 @@ "integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==" }, "node_modules/@firebase/storage": { - "version": "0.12.6", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.6.tgz", - "integrity": "sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.0.tgz", + "integrity": "sha512-3RQaYpkR4TwPnPR1XlmDUAXiYt5QVQRGRGY1+/yNyS9ohHOCNNgbcs6a+QYvaDInbYTywrdddKYMFFXKKb1pRg==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.8", "@firebase/util": "1.9.7", @@ -3918,12 +3927,13 @@ } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.9.tgz", - "integrity": "sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.10.tgz", + "integrity": "sha512-KcikeV5dK1H1cXi0zEb7gJ3IZ4dKKCjpyucVK8r/Qv5eNAqeQAzPgKKhsSv67wT1N6DTxmqsNEXwMo0dcrKOEg==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.8", - "@firebase/storage": "0.12.6", + "@firebase/storage": "0.13.0", "@firebase/storage-types": "0.8.2", "@firebase/util": "1.9.7", "tslib": "^2.1.0" @@ -3936,6 +3946,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz", "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -3974,11 +3985,6 @@ "integrity": "sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==", "license": "Apache-2.0" }, - "node_modules/@gilbarbara/deep-equal": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.3.1.tgz", - "integrity": "sha512-I7xWjLs2YSVMc5gGx1Z3ZG1lgFpITPndpi8Ku55GeEIKpACCPQNS/OTqQbxgTCfq0Ncvcc+CrFov96itVh6Qvw==" - }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", @@ -4396,6 +4402,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" }, @@ -4515,9 +4522,10 @@ } }, "node_modules/@rc-component/trigger": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.0.tgz", - "integrity": "sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.1.tgz", + "integrity": "sha512-fuU11J8pOt6+U/tU6/CAv8wjCwGaNeRk9f5k8HQth7JBbJ6MMH62WhGycVW75VnXfBZgL/7kO+wbiO2Xc9U9sQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", "@rc-component/portal": "^1.1.0", @@ -4609,9 +4617,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", - "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", + "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -5213,9 +5221,9 @@ } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.0.tgz", - "integrity": "sha512-UzH+NNhgnOo6UFku3C4TEz+pO/yDcIA5FKTJvLbJ7lQwAjsqLs3DZWm4cCA08skICb8mULArF6S/dn5/butVCA==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.2.tgz", + "integrity": "sha512-6kFAHGcs0npIC4HTt4ULs8uOfEucvMI7VW4hoyk17jhRaW8CbxzxfWCfIeRbDkE8pYwnARaq83tu025Hrk2zgA==", "dev": true, "license": "MIT", "engines": { @@ -5241,14 +5249,14 @@ } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.0.tgz", - "integrity": "sha512-/xXN8o7565WMsewBnQFfjm0E5wqhYsegg++HJ5RjrY/cTM4qcd/ven44GEMxqGFJitZizvkk3NHszaHylzcRUw==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.2.tgz", + "integrity": "sha512-TwEEW4FeEJ5Mamp4fGnktfVjzN77KAW0xFQsEPuxZtOAPG17zX/PGvdyRX/TE1jkZWhTzqUDIdgzqlNLjyEnUw==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "2.22.0", + "@sentry/babel-plugin-component-annotate": "2.22.2", "@sentry/cli": "^2.33.1", "dotenv": "^16.3.1", "find-up": "^5.0.0", @@ -5482,13 +5490,13 @@ } }, "node_modules/@sentry/webpack-plugin": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-2.22.0.tgz", - "integrity": "sha512-u2brctki0AMCoZksdAConQSYE6PokRVeZ4YYsbnJYkAi0KuaQnczsRwS9e2L0bK2CmZ7QdyYcrjaXHNlXaFDbQ==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-2.22.2.tgz", + "integrity": "sha512-zVPs3BLClHM8jIjr2FChux16GMLel8OjXBjd4V8/r1Kf2fGiQDXo72GxsrW8AdVlIHgQApLzubuQ2kpcFVK4Sw==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "2.22.0", + "@sentry/bundler-plugin-core": "2.22.2", "unplugin": "1.0.1", "uuid": "^9.0.0" }, @@ -6281,45 +6289,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz", - "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -6367,9 +6336,9 @@ } }, "node_modules/antd": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.0.tgz", - "integrity": "sha512-wWCFzbry3hov7k8gqhPR+FzD6EkWlhBbGD9mYOSIDoYRGMRqueTh2+2jfU1voHucmwcxDwzU7iwZDU2+PCXZdA==", + "version": "5.20.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.20.2.tgz", + "integrity": "sha512-9d6Bs5ZKIV+JhB0eD7KxYnIfnhUh86kNtTGIuNiIxHFUhbuyT1DXN2SuMksDmtSfuRYZ82/C4hq+OJjWNNbmHg==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.1.0", @@ -6379,11 +6348,11 @@ "@ant-design/react-slick": "~1.1.2", "@babel/runtime": "^7.24.8", "@ctrl/tinycolor": "^3.6.1", - "@rc-component/color-picker": "~2.0.0", + "@rc-component/color-picker": "~2.0.1", "@rc-component/mutate-observer": "^1.1.0", "@rc-component/qrcode": "~1.0.0", "@rc-component/tour": "~1.15.0", - "@rc-component/trigger": "^2.2.0", + "@rc-component/trigger": "^2.2.1", "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.11", @@ -6393,22 +6362,22 @@ "rc-dialog": "~9.5.2", "rc-drawer": "~7.2.0", "rc-dropdown": "~4.2.0", - "rc-field-form": "~2.2.1", + "rc-field-form": "~2.4.0", "rc-image": "~7.9.0", - "rc-input": "~1.6.2", + "rc-input": "~1.6.3", "rc-input-number": "~9.2.0", "rc-mentions": "~2.15.0", "rc-menu": "~9.14.1", "rc-motion": "^2.9.2", "rc-notification": "~5.6.0", "rc-pagination": "~4.2.0", - "rc-picker": "~4.6.11", + "rc-picker": "~4.6.13", "rc-progress": "~4.0.0", "rc-rate": "~2.13.0", "rc-resize-observer": "^1.4.0", "rc-segmented": "~2.3.0", "rc-select": "~14.15.1", - "rc-slider": "~11.1.3", + "rc-slider": "~11.1.5", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", "rc-table": "~7.45.7", @@ -6417,7 +6386,7 @@ "rc-tooltip": "~6.2.0", "rc-tree": "~5.8.8", "rc-tree-select": "~5.22.1", - "rc-upload": "~4.6.0", + "rc-upload": "~4.7.0", "rc-util": "^5.43.0", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.2" @@ -6774,15 +6743,6 @@ "node": ">= 4.0.0" } }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "dev": true, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/autosize": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/autosize/-/autosize-6.0.1.tgz", @@ -6828,9 +6788,9 @@ } }, "node_modules/axios": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", - "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -7486,9 +7446,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001650", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001650.tgz", - "integrity": "sha512-fgEc7hP/LB7iicdXHUI9VsBsMZmUmlVJeQP2qqQW+3lkqVhbmjEU8zp+h5stWeilX+G7uXuIUIIlWlDw9jdt8g==", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "funding": [ { "type": "opencollective", @@ -7911,52 +7871,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "dev": true, - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/ajv": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz", - "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/conf/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -8196,9 +8110,9 @@ "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" }, "node_modules/cypress": { - "version": "13.13.2", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.2.tgz", - "integrity": "sha512-PvJQU33933NvS1StfzEb8/mu2kMy4dABwCF+yd5Bi7Qly1HOVf+Bufrygee/tlmty/6j5lX+KIi8j9Q3JUMbhA==", + "version": "13.13.3", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.3.tgz", + "integrity": "sha512-hUxPrdbJXhUOTzuML+y9Av7CKoYznbD83pt8g3klgpioEha0emfx4WNIuVRx0C76r0xV2MIwAW9WYiXfVJYFQw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8554,21 +8468,6 @@ "dayjs": "^1.11.10" } }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -8621,11 +8520,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/deep-diff": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", - "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==" - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -8891,9 +8785,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.7.tgz", + "integrity": "sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw==", "license": "ISC" }, "node_modules/elliptic": { @@ -8993,15 +8887,6 @@ "node": ">= 6" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -10267,24 +10152,24 @@ } }, "node_modules/firebase": { - "version": "10.12.5", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.12.5.tgz", - "integrity": "sha512-J0yL3yh12CfFprTkSOQ9HqBugERyqvWwOuOoo1j1QHmYe9cYLKnBmtNCvGIYInDcsVUnJoRXCM+hxbGf48oVhg==", + "version": "10.13.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.13.0.tgz", + "integrity": "sha512-a8gm8c9CYO98QuXJn7m5W5Gj7kHV8fme81/mQ9dBs+VMz9uI5HdavnMVPXCILputpZFMFpiKK+u7VVsn5lQg+w==", "license": "Apache-2.0", "dependencies": { "@firebase/analytics": "0.10.7", "@firebase/analytics-compat": "0.2.13", - "@firebase/app": "0.10.8", + "@firebase/app": "0.10.9", "@firebase/app-check": "0.8.7", "@firebase/app-check-compat": "0.3.14", - "@firebase/app-compat": "0.2.38", + "@firebase/app-compat": "0.2.39", "@firebase/app-types": "0.9.2", - "@firebase/auth": "1.7.6", - "@firebase/auth-compat": "0.5.11", + "@firebase/auth": "1.7.7", + "@firebase/auth-compat": "0.5.12", "@firebase/database": "1.0.7", "@firebase/database-compat": "1.0.7", - "@firebase/firestore": "4.6.5", - "@firebase/firestore-compat": "0.3.34", + "@firebase/firestore": "4.7.0", + "@firebase/firestore-compat": "0.3.35", "@firebase/functions": "0.11.6", "@firebase/functions-compat": "0.3.12", "@firebase/installations": "0.6.8", @@ -10295,8 +10180,8 @@ "@firebase/performance-compat": "0.2.8", "@firebase/remote-config": "0.4.8", "@firebase/remote-config-compat": "0.2.8", - "@firebase/storage": "0.12.6", - "@firebase/storage-compat": "0.3.9", + "@firebase/storage": "0.13.0", + "@firebase/storage-compat": "0.3.10", "@firebase/util": "1.9.7", "@firebase/vertexai-preview": "0.0.3" } @@ -10980,9 +10865,9 @@ } }, "node_modules/i18next": { - "version": "23.12.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", - "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==", + "version": "23.14.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.14.0.tgz", + "integrity": "sha512-Y5GL4OdA8IU2geRrt2+Uc1iIhsjICdHZzT9tNwQ3TVqdNzgxHToGCKf/TPRP80vTCAP6svg2WbbJL+Gx5MFQVA==", "funding": [ { "type": "individual", @@ -10997,6 +10882,7 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } @@ -11514,11 +11400,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-lite": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-1.2.1.tgz", - "integrity": "sha512-pgF+L5bxC+10hLBgf6R2P4ZZUBOQIIacbdo8YvuCP8/JvsWxG7aZ9p10DYuLtifFci4l3VITphhMlMV4Y+urPw==" - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -11958,12 +11839,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", - "dev": true - }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -12076,9 +11951,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.5.tgz", - "integrity": "sha512-TwHR5BZxGRODtAfz03szucAkjT5OArXr+94SMtAM2pYXIlQNVMrxvb6uSCbnaJJV6QXEyICk7+l6QPgn72WHhg==", + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.7.tgz", + "integrity": "sha512-x2xON4/Qg2bRIS11KIN9yCNYUjhtiEjNyptjX0mX+pyKHecxuJVLIpfX1lq9ZD6CrC/rB+y4GBi18c6CEcUR+A==", "license": "MIT" }, "node_modules/lie": { @@ -13094,15 +12969,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -13371,7 +13237,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -13657,15 +13522,6 @@ "node": ">=6" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -13931,89 +13787,6 @@ "node": ">=0.10.0" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -14224,6 +13997,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.0.tgz", "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", + "license": "MIT", "dependencies": { "decode-uri-component": "^0.4.1", "filter-obj": "^5.1.0", @@ -14397,9 +14171,10 @@ } }, "node_modules/rc-field-form": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.2.1.tgz", - "integrity": "sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.4.0.tgz", + "integrity": "sha512-XZ/lF9iqf9HXApIHQHqzJK5v2w4mkUMsVqAzOyWVzoiwwXEavY6Tpuw7HavgzIoD+huVff4JghSGcgEfX6eycg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", "@rc-component/async-validator": "^5.0.3", @@ -14560,9 +14335,9 @@ } }, "node_modules/rc-picker": { - "version": "4.6.11", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.11.tgz", - "integrity": "sha512-PEVH5MMTUrdvTTxCmPndsXiJL7TFLSu8q0cDdZrhdcjn8en3NbuhOFacWqKTvdnfG53RPPhiBssXCUHYyc3R/Q==", + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.6.13.tgz", + "integrity": "sha512-yi4JWPGjm420Q8rHjZ6YNy2c5IfV+9EAzx2pewVRPOjJqfg7uifO/Z0uqxdl/h6AhBocuvRvtlyz6ehrAvTq7A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -14837,9 +14612,10 @@ } }, "node_modules/rc-upload": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.6.0.tgz", - "integrity": "sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.7.0.tgz", + "integrity": "sha512-eUwxYNHlsYe5vYhKFAUGrQG95JrnPzY+BmPi1Daq39fWNl/eOc7v4UODuWrVp2LFkQBuV3cMCG/I68iub6oBrg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.5", @@ -14898,9 +14674,9 @@ } }, "node_modules/react-big-calendar": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.13.2.tgz", - "integrity": "sha512-yzeVRM1I+JloeJXytrZx2lJWKUfLAi5bsgGuBjh3aFSHZrdFcGnfA7LE6pBacdyOG+NGP+332m2MziszkmQWcw==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.13.3.tgz", + "integrity": "sha512-PaZEQMhZCPiInxkKeP9S1TgI1e0Gd4aPpueYXS97rMa89AfX2ZGEmoMjDyeOkIz+mA1utuYF/yQYaxGPNXS0Sg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", @@ -14946,6 +14722,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.0.tgz", "integrity": "sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==", + "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "^3.3.5", "hoist-non-react-statics": "^3.3.2", @@ -14995,41 +14772,6 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "dev": true }, - "node_modules/react-floater": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/react-floater/-/react-floater-0.7.9.tgz", - "integrity": "sha512-NXqyp9o8FAXOATOEo0ZpyaQ2KPb4cmPMXGWkx377QtJkIXHlHRAGer7ai0r0C1kG5gf+KJ6Gy+gdNIiosvSicg==", - "dependencies": { - "deepmerge": "^4.3.1", - "is-lite": "^0.8.2", - "popper.js": "^1.16.0", - "prop-types": "^15.8.1", - "tree-changes": "^0.9.1" - }, - "peerDependencies": { - "react": "15 - 18", - "react-dom": "15 - 18" - } - }, - "node_modules/react-floater/node_modules/@gilbarbara/deep-equal": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@gilbarbara/deep-equal/-/deep-equal-0.1.2.tgz", - "integrity": "sha512-jk+qzItoEb0D0xSSmrKDDzf9sheQj/BAPxlgNxgmOaA3mxpUa6ndJLYGZKsJnIVEQSD8zcTbyILz7I0HcnBCRA==" - }, - "node_modules/react-floater/node_modules/is-lite": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/is-lite/-/is-lite-0.8.2.tgz", - "integrity": "sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==" - }, - "node_modules/react-floater/node_modules/tree-changes": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.9.3.tgz", - "integrity": "sha512-vvvS+O6kEeGRzMglTKbc19ltLWNtmNt1cpBoSYLj/iEcPVvpJasemKOlxBrmZaCtDJoF+4bwv3m01UKYi8mukQ==", - "dependencies": { - "@gilbarbara/deep-equal": "^0.1.1", - "is-lite": "^0.8.2" - } - }, "node_modules/react-grid-gallery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/react-grid-gallery/-/react-grid-gallery-1.0.1.tgz", @@ -15076,9 +14818,10 @@ } }, "node_modules/react-icons": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", - "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", + "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "license": "MIT", "peerDependencies": { "react": "*" } @@ -15097,53 +14840,11 @@ "react-dom": "16.x || 17.x" } }, - "node_modules/react-innertext": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/react-innertext/-/react-innertext-1.1.5.tgz", - "integrity": "sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==", - "peerDependencies": { - "@types/react": ">=0.0.0 <=99", - "react": ">=0.0.0 <=99" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/react-joyride": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/react-joyride/-/react-joyride-2.8.2.tgz", - "integrity": "sha512-2QY8HB1G0I2OT0PKMUz7gg2HAjdkG2Bqi13r0Bb1V16PAwfb9khn4wWBTOJsGsjulbAWiQ3/0YrgNUHGFmuifw==", - "dependencies": { - "@gilbarbara/deep-equal": "^0.3.1", - "deep-diff": "^1.0.2", - "deepmerge": "^4.3.1", - "is-lite": "^1.2.1", - "react-floater": "^0.7.9", - "react-innertext": "^1.1.5", - "react-is": "^16.13.1", - "scroll": "^3.0.1", - "scrollparent": "^2.1.0", - "tree-changes": "^0.11.2", - "type-fest": "^4.18.2" - }, - "peerDependencies": { - "react": "15 - 18", - "react-dom": "15 - 18" - } - }, - "node_modules/react-joyride/node_modules/type-fest": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.3.tgz", - "integrity": "sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", @@ -15242,9 +14943,10 @@ } }, "node_modules/react-product-fruits": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/react-product-fruits/-/react-product-fruits-2.2.6.tgz", - "integrity": "sha512-f57m1rCD+Cu8QfFQSpkHJjLaWauPbD01GNrbh4icQaOHA/6bHJGpcoSSEQfAtk3g2PyQBpsDdRvL9jC+hyxhhQ==", + "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==", + "license": "MIT", "dependencies": { "product-fruits": "^1.0.25" }, @@ -15295,12 +14997,12 @@ } }, "node_modules/react-router": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", - "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", + "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.0" + "@remix-run/router": "1.19.1" }, "engines": { "node": ">=14.0.0" @@ -15310,13 +15012,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz", - "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", + "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.0", - "react-router": "6.26.0" + "@remix-run/router": "1.19.1", + "react-router": "6.26.1" }, "engines": { "node": ">=14.0.0" @@ -15386,9 +15088,9 @@ } }, "node_modules/react-virtuoso": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.9.0.tgz", - "integrity": "sha512-MiiSGKqvYPfAK3FUe852n2L3M5IXMKP0pUgYQ/UTk90A/l2UNQOvaEUvAZp+0ytL0kOCNk8i8/J8FMKvIq7kqg==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.10.1.tgz", + "integrity": "sha512-vDBt9AarmCjPNshw3VxPXW355ZQKSO0p9vrAJ0pi04TB6aXk+qHWTu8NuaQ3ppcd/Ub1r5ryRA4fJ2QGuH0H0g==", "license": "MIT", "engines": { "node": ">=10" @@ -15510,6 +15212,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-3.0.3.tgz", "integrity": "sha512-ca+ySXmXWrxDqtauRA6lQtjmRO8Z9Ruog3wbb8wDq4RVW9Y677Nl/AXoJPlxJqH0mpY9QGkg03NkAJwTcyN2pQ==", + "license": "MIT", "dependencies": { "just-curry-it": "5.3.0", "reduce-reducers": "1.0.4" @@ -16061,11 +15764,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/scroll": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scroll/-/scroll-3.0.1.tgz", - "integrity": "sha512-pz7y517OVls1maEzlirKO5nPYle9AXsFzTMNJrRGmT951mzpIBy7sNHOg5o/0MQd/NqliCiWnAi0kZneMPFLcg==" - }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", @@ -16074,11 +15772,6 @@ "compute-scroll-into-view": "^3.0.2" } }, - "node_modules/scrollparent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.1.0.tgz", - "integrity": "sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==" - }, "node_modules/seedrandom": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", @@ -17153,15 +16846,6 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/tree-changes": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/tree-changes/-/tree-changes-0.11.2.tgz", - "integrity": "sha512-4gXlUthrl+RabZw6lLvcCDl6KfJOCmrC16BC5CRdut1EAH509Omgg0BfKLY+ViRlzrvYOTWR0FMS2SQTwzumrw==", - "dependencies": { - "@gilbarbara/deep-equal": "^0.3.1", - "is-lite": "^1.2.0" - } - }, "node_modules/tree-dump": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz", @@ -17778,9 +17462,10 @@ } }, "node_modules/userpilot": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/userpilot/-/userpilot-1.3.2.tgz", - "integrity": "sha512-J+PZGWZbINDrnSlFMNRoAuUA9Lxp4V+wy4tQs0fINnLwlDYcfW86gL3NnF2fYK7eOzWFmBPl4xmUf9XPNRlUMw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/userpilot/-/userpilot-1.3.5.tgz", + "integrity": "sha512-YW0Yiexm/P+eDZG9PJZ0nw1gS80uqJ+UlPeD4/Y0BAR/N7Ib9xQW5TGmUYeSM8Ltw2wUAWkRkAwsheWd2NwCjA==", + "license": "MIT", "dependencies": { "@ndhoule/includes": "^2.0.1", "@ndhoule/pick": "^2.0.0", @@ -17871,14 +17556,14 @@ } }, "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", + "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", + "postcss": "^8.4.41", "rollup": "^4.13.0" }, "bin": { @@ -17898,6 +17583,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -17915,6 +17601,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -18152,9 +17841,9 @@ } }, "node_modules/vite/node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "dev": true, "funding": [ { @@ -18170,6 +17859,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", diff --git a/client/package.json b/client/package.json index 1faf84bd5..8764aa230 100644 --- a/client/package.json +++ b/client/package.json @@ -2,15 +2,14 @@ "name": "bodyshop", "version": "0.2.1", "engines": { - "node": ">=20.15.0" + "node": ">=18.18.2" }, "type": "module", "private": true, "proxy": "http://localhost:4000", "dependencies": { - "@ant-design/icons": "^5.4.0", "@ant-design/pro-layout": "^7.19.12", - "@apollo/client": "^3.11.3", + "@apollo/client": "^3.11.4", "@emotion/is-prop-valid": "^1.3.0", "@fingerprintjs/fingerprintjs": "^4.4.3", "@jsreport/browser-client": "^3.1.0", @@ -20,11 +19,11 @@ "@splitsoftware/splitio-react": "^1.12.1", "@tanem/react-nprogress": "^5.0.51", "@vitejs/plugin-react": "^4.3.1", - "antd": "^5.20.0", + "antd": "^5.20.2", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^3.3.0", "autosize": "^6.0.1", - "axios": "^1.7.3", + "axios": "^1.7.4", "classnames": "^2.5.1", "css-box-model": "^1.2.1", "dayjs": "^1.11.12", @@ -33,12 +32,12 @@ "dotenv": "^16.4.5", "env-cmd": "^10.1.0", "exifr": "^7.1.3", - "firebase": "^10.12.5", + "firebase": "^10.13.0", "graphql": "^16.9.0", - "i18next": "^23.12.2", + "i18next": "^23.14.0", "i18next-browser-languagedetector": "^8.0.0", "immutability-helper": "^3.1.1", - "libphonenumber-js": "^1.11.5", + "libphonenumber-js": "^1.11.7", "logrocket": "^8.1.2", "markerjs2": "^2.32.1", "memoize-one": "^6.0.0", @@ -48,7 +47,7 @@ "query-string": "^9.1.0", "raf-schd": "^4.0.3", "react": "^18.3.1", - "react-big-calendar": "^1.13.2", + "react-big-calendar": "^1.13.3", "react-color": "^2.19.3", "react-cookie": "^7.2.0", "react-dom": "^18.3.1", @@ -56,19 +55,18 @@ "react-grid-gallery": "^1.0.1", "react-grid-layout": "1.3.4", "react-i18next": "^14.1.3", - "react-icons": "^5.2.1", + "react-icons": "^5.3.0", "react-image-lightbox": "^5.1.4", - "react-joyride": "^2.8.2", "react-markdown": "^9.0.1", "react-number-format": "^5.4.0", "react-popopo": "^2.1.9", - "react-product-fruits": "^2.2.6", + "react-product-fruits": "^2.2.61", "react-redux": "^9.1.2", "react-resizable": "^3.0.5", - "react-router-dom": "^6.26.0", + "react-router-dom": "^6.26.1", "react-sticky": "^6.0.3", "react-virtualized": "^9.22.5", - "react-virtuoso": "^4.9.0", + "react-virtuoso": "^4.10.1", "recharts": "^2.12.7", "redux": "^5.0.1", "redux-actions": "^3.0.3", @@ -81,7 +79,7 @@ "styled-components": "^6.1.12", "subscriptions-transport-ws": "^0.11.0", "use-memo-one": "^1.1.3", - "userpilot": "^1.3.2", + "userpilot": "^1.3.5", "vite-plugin-ejs": "^1.7.0", "web-vitals": "^3.5.2" }, @@ -132,15 +130,15 @@ "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/preset-react": "^7.24.7", - "@dotenvx/dotenvx": "^1.6.4", + "@dotenvx/dotenvx": "^1.7.0", "@emotion/babel-plugin": "^11.12.0", "@emotion/react": "^11.13.0", - "@sentry/webpack-plugin": "^2.22.0", + "@sentry/webpack-plugin": "^2.22.2", "@testing-library/cypress": "^10.0.2", "browserslist": "^4.23.3", "browserslist-to-esbuild": "^2.1.1", "cross-env": "^7.0.3", - "cypress": "^13.13.2", + "cypress": "^13.13.3", "eslint": "^8.57.0", "eslint-config-react-app": "^7.0.1", "eslint-plugin-cypress": "^2.15.1", @@ -149,7 +147,7 @@ "react-error-overlay": "6.0.11", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", - "vite": "^5.3.5", + "vite": "^5.4.1", "vite-plugin-babel": "^1.2.0", "vite-plugin-eslint": "^1.8.1", "vite-plugin-legacy": "^2.1.0", diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx index 441359097..6fe558910 100644 --- a/client/src/App/App.jsx +++ b/client/src/App/App.jsx @@ -18,7 +18,7 @@ import { checkUserSession } from "../redux/user/user.actions"; import { selectBodyshop, selectCurrentEula, selectCurrentUser } from "../redux/user/user.selectors"; import PrivateRoute from "../components/PrivateRoute"; import "./App.styles.scss"; -import handleBeta from "../utils/betaHandler"; +import handleBeta from "../utils/handleBeta"; import Eula from "../components/eula/eula.component"; import InstanceRenderMgr from "../utils/instanceRenderMgr"; import ProductFruitsWrapper from "./ProductFruitsWrapper.jsx"; diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss index dd79912c1..827d0dfc7 100644 --- a/client/src/App/App.styles.scss +++ b/client/src/App/App.styles.scss @@ -161,3 +161,15 @@ .rowWithColor > td { background-color: var(--bgColor) !important; } + +.muted-button { + color: lightgray; + border: none; + background: none; + cursor: pointer; + font-size: 16px; /* Adjust as needed */ +} + +.muted-button:hover { + color: darkgrey; +} 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 83b139827..fb2681623 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 @@ -13,6 +13,7 @@ import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { DateFormatter } from "../../utils/DateFormatter"; import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component"; +import JobMarkSelectedExported from "../jobs-mark-selected-exported/jobs-mark-selected-exported"; import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component"; @@ -170,13 +171,22 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r extra={ {!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && ( - + <> + + + )} {bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && } ; //
{t("bills.labels.noneselected")}
; const exported = data && data.bills_by_pk && data.bills_by_pk.exported; + const isinhouse = data && data.bills_by_pk && data.bills_by_pk.isinhouse; return ( <> @@ -188,7 +189,7 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail } />
- + {t("general.labels.media")} {bodyshop.uselocalmediaserver ? ( - + { + rome: () => { if (line.mod_lbr_ty === "LAET" || line.mod_lbr_ty === "LAUT") { // line.notes += ` | ET/UT Update (prev = ${line.mod_lbr_ty})`; line.mod_lbr_ty = "LAR"; } - } + }, + promanager: "USE_ROME" }); }); diff --git a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx index 59e7dbd80..fe3799c49 100644 --- a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx +++ b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx @@ -11,6 +11,7 @@ import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { pageLimit } from "../../utils/config"; +import { alphaSort, statusSort } from "../../utils/sorters"; import useLocalStorage from "../../utils/useLocalStorage"; import StartChatButton from "../chat-open-button/chat-open-button.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; @@ -37,7 +38,10 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { title: t("jobs.fields.ro_number"), dataIndex: "ro_number", key: "ro_number", - sorter: true, //(a, b) => alphaSort(a.ro_number, b.ro_number), + sorter: search?.search + ? (a, b) => + parseInt((a.ro_number || "0").replace(/\D/g, "")) - parseInt((b.ro_number || "0").replace(/\D/g, "")) + : true, sortOrder: sortcolumn === "ro_number" && sortorder, render: (text, record) => ( {record.ro_number || t("general.labels.na")} @@ -49,7 +53,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { key: "ownr_ln", ellipsis: true, //sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - //sortOrder: sortcolumn === "ownr_ln" && sortorder, render: (text, record) => { return record.ownerid ? ( @@ -67,7 +70,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { title: t("jobs.fields.ownr_ph1"), dataIndex: "ownr_ph1", key: "ownr_ph1", - ellipsis: true, render: (text, record) => }, @@ -75,7 +77,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { title: t("jobs.fields.ownr_ph2"), dataIndex: "ownr_ph2", key: "ownr_ph2", - ellipsis: true, render: (text, record) => }, @@ -85,7 +86,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { key: "status", ellipsis: true, - sorter: true, // (a, b) => alphaSort(a.status, b.status), + sorter: search?.search ? (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.active_statuses) : true, sortOrder: sortcolumn === "status" && sortorder, render: (text, record) => { return record.status || t("general.labels.na"); @@ -100,7 +101,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { title: t("jobs.fields.vehicle"), dataIndex: "vehicle", key: "vehicle", - ellipsis: true, render: (text, record) => { return record.vehicleid ? ( @@ -117,7 +117,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { dataIndex: "plate_no", key: "plate_no", ellipsis: true, - sorter: true, //(a, b) => alphaSort(a.plate_no, b.plate_no), + sorter: search?.search ? (a, b) => alphaSort(a.plate_no, b.plate_no) : true, sortOrder: sortcolumn === "plate_no" && sortorder, render: (text, record) => { return record.plate_no ? record.plate_no : ""; @@ -128,7 +128,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { dataIndex: "clm_no", key: "clm_no", ellipsis: true, - sorter: true, //(a, b) => alphaSort(a.clm_no, b.clm_no), + sorter: search?.search ? (a, b) => alphaSort(a.clm_no, b.clm_no) : true, sortOrder: sortcolumn === "clm_no" && sortorder, render: (text, record) => `${record.clm_no || ""}${record.po_number ? ` (PO: ${record.po_number})` : ""}` }, @@ -142,8 +142,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { title: t("jobs.fields.clm_total"), dataIndex: "clm_total", key: "clm_total", - - sorter: true, //(a, b) => a.clm_total - b.clm_total, + sorter: search?.search ? (a, b) => a.clm_total - b.clm_total : true, sortOrder: sortcolumn === "clm_total" && sortorder, render: (text, record) => { return record.clm_total ? ( @@ -157,7 +156,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { title: t("jobs.fields.owner_owing"), dataIndex: "owner_owing", key: "owner_owing", - render: (text, record) => {record.owner_owing} }, { diff --git a/client/src/components/jobs-list/jobs-list.component.jsx b/client/src/components/jobs-list/jobs-list.component.jsx index 6082055d7..004addbad 100644 --- a/client/src/components/jobs-list/jobs-list.component.jsx +++ b/client/src/components/jobs-list/jobs-list.component.jsx @@ -16,18 +16,15 @@ import useLocalStorage from "../../utils/useLocalStorage"; import AlertComponent from "../alert/alert.component"; import ChatOpenButton from "../chat-open-button/chat-open-button.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; -import { setJoyRideSteps } from "../../redux/application/application.actions"; import { OwnerNameDisplayFunction } from "./../owner-name-display/owner-name-display.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); -const mapDispatchToProps = (dispatch) => ({ - setJoyRideSteps: (steps) => dispatch(setJoyRideSteps(steps)) -}); +const mapDispatchToProps = (dispatch) => ({}); -export function JobsList({ bodyshop, setJoyRideSteps }) { +export function JobsList({ bodyshop }) { const searchParams = queryString.parse(useLocation().search); const { selected } = searchParams; const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) diff --git a/client/src/components/jobs-mark-selected-exported/jobs-mark-selected-exported.jsx b/client/src/components/jobs-mark-selected-exported/jobs-mark-selected-exported.jsx new file mode 100644 index 000000000..acedd194f --- /dev/null +++ b/client/src/components/jobs-mark-selected-exported/jobs-mark-selected-exported.jsx @@ -0,0 +1,105 @@ +import { useMutation } from "@apollo/client"; +import { Button, notification, Popconfirm } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries"; +import { UPDATE_JOBS } from "../../graphql/jobs.queries"; +import { insertAuditTrail } from "../../redux/application/application.actions"; +import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; +import AuditTrailMapping from "../../utils/AuditTrailMappings"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, + currentUser: selectCurrentUser +}); + +const mapDispatchToProps = (dispatch) => ({ + insertAuditTrail: ({ jobid, operation, type }) => dispatch(insertAuditTrail({ jobid, operation, type })) +}); + +export default connect(mapStateToProps, mapDispatchToProps)(JobMarkSelectedExported); + +export function JobMarkSelectedExported({ + bodyshop, + currentUser, + jobIds, + disabled, + loadingCallback, + completedCallback, + refetch, + insertAuditTrail +}) { + const { t } = useTranslation(); + const [loading, setLoading] = useState(false); + const [open, setOpen] = useState(false); + const [insertExportLog] = useMutation(INSERT_EXPORT_LOG); + + const [updateJob] = useMutation(UPDATE_JOBS); + const handleUpdate = async () => { + setLoading(true); + loadingCallback(true); + const result = await updateJob({ + variables: { + jobIds: jobIds, + fields: { + status: bodyshop.md_ro_statuses.default_exported || "Exported*", + date_exported: new Date() + } + }, + update(cache) {} + }); + + await insertExportLog({ + variables: { + logs: jobIds.map((id) => { + return { + bodyshopid: bodyshop.id, + jobid: id, + successful: true, + message: JSON.stringify([t("general.labels.markedexported")]), + useremail: currentUser.email + }; + }) + } + }); + + if (!result.errors) { + notification["success"]({ message: t("jobs.successes.save") }); + result.data.update_jobs.returning.forEach((job) => { + console.log("results job", job.id, "audit: ", AuditTrailMapping.admin_jobmarkexported()); + insertAuditTrail({ + jobid: job.id, + operation: AuditTrailMapping.admin_jobmarkexported(), + type: "admin_jobmarkexported" + }); + }); + } else { + notification["error"]({ + message: t("jobs.errors.saving", { + error: JSON.stringify(result.errors) + }) + }); + } + loadingCallback(false); + completedCallback && completedCallback([]); + setLoading(false); + refetch && refetch(); + setOpen(false); + }; + + return ( + setOpen(false)} + onConfirm={handleUpdate} + disabled={disabled} + > + + + ); +} diff --git a/client/src/components/payable-mark-selected-exported/payable-mark-selected-exported.component.jsx b/client/src/components/payable-mark-selected-exported/payable-mark-selected-exported.component.jsx index 08cd00b43..ccd480547 100644 --- a/client/src/components/payable-mark-selected-exported/payable-mark-selected-exported.component.jsx +++ b/client/src/components/payable-mark-selected-exported/payable-mark-selected-exported.component.jsx @@ -90,7 +90,7 @@ export function BillMarkSelectedExported({ onConfirm={handleUpdate} disabled={disabled} > - diff --git a/client/src/components/payment-mark-selected-exported/payment-mark-selected-exported.component.jsx b/client/src/components/payment-mark-selected-exported/payment-mark-selected-exported.component.jsx index 3727e23eb..8dbd2ae45 100644 --- a/client/src/components/payment-mark-selected-exported/payment-mark-selected-exported.component.jsx +++ b/client/src/components/payment-mark-selected-exported/payment-mark-selected-exported.component.jsx @@ -90,7 +90,7 @@ export function PaymentMarkSelectedExported({ onConfirm={handleUpdate} disabled={disabled} > - diff --git a/client/src/components/production-board-filters/production-board-filters.component.jsx b/client/src/components/production-board-filters/production-board-filters.component.jsx index 421759534..eea1fc3d9 100644 --- a/client/src/components/production-board-filters/production-board-filters.component.jsx +++ b/client/src/components/production-board-filters/production-board-filters.component.jsx @@ -1,22 +1,32 @@ -import { Input, Space, Spin } from "antd"; -import React from "react"; +import { Button, Input, Space, Spin } from "antd"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; +import { ExclamationCircleFilled, ExclamationCircleOutlined } from "@ant-design/icons"; import { selectBodyshop } from "../../redux/user/user.selectors"; import EmployeeSearchSelectComponent from "../employee-search-select/employee-search-select.component"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser bodyshop: selectBodyshop }); + const mapDispatchToProps = (dispatch) => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) }); + export default connect(mapStateToProps, mapDispatchToProps)(ProductionBoardFilters); export function ProductionBoardFilters({ bodyshop, filter, setFilter, loading }) { const { t } = useTranslation(); + const [alertFilter, setAlertFilter] = useState(false); + + const toggleAlertFilter = () => { + const newAlertFilter = !alertFilter; + setAlertFilter(newAlertFilter); + setFilter({ ...filter, alert: newAlertFilter }); + }; + return ( {loading && } @@ -35,6 +45,13 @@ export function ProductionBoardFilters({ bodyshop, filter, setFilter, loading }) onChange={(emp) => setFilter({ ...filter, employeeId: emp })} allowClear /> + ); } diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx b/client/src/components/production-board-kanban/production-board-kanban-card-color-legend.component.jsx similarity index 100% rename from client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx rename to client/src/components/production-board-kanban/production-board-kanban-card-color-legend.component.jsx diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx b/client/src/components/production-board-kanban/production-board-kanban-card.component.jsx similarity index 95% rename from client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx rename to client/src/components/production-board-kanban/production-board-kanban-card.component.jsx index 4febb86c0..798f7f7ec 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban-card.component.jsx @@ -290,6 +290,22 @@ const PartsStatusComponent = ({ metadata, cardSettings }) => ); +const TasksToolTip = ({ metadata, cardSettings, t }) => + cardSettings?.tasks && ( + + + {metadata.tasks_aggregate?.aggregate?.count ? ( + `T: ${metadata.tasks_aggregate.aggregate.count}` + ) : ( + T: 0 + )} + + + ); + export default function ProductionBoardCard({ technician, card, bodyshop, cardSettings, clone }) { const { t } = useTranslation(); const { metadata } = card; @@ -336,21 +352,15 @@ export default function ProductionBoardCard({ technician, card, bodyshop, cardSe cardSettings?.production_note || cardSettings?.partsstatus || cardSettings?.estimator || - cardSettings?.subtotal + cardSettings?.subtotal || + cardSettings?.tasks ); }, [cardSettings]); const headerContent = (
- + {metadata?.suspended && } {metadata?.iouparent && ( + diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx index afd0e94e1..0c515132b 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -15,13 +15,13 @@ import AuditTrailMapping from "../../utils/AuditTrailMappings"; import IndefiniteLoading from "../indefinite-loading/indefinite-loading.component"; import ProductionBoardFilters from "../production-board-filters/production-board-filters.component"; import ProductionListDetailComponent from "../production-list-detail/production-list-detail.component"; -import CardColorLegend from "../production-board-kanban-card/production-board-kanban-card-color-legend.component"; +import CardColorLegend from "./production-board-kanban-card-color-legend.component.jsx"; import "./production-board-kanban.styles.scss"; import { createBoardData } from "./production-board-kanban.utils.js"; import ProductionBoardKanbanSettings from "./settings/production-board-kanban.settings.component.jsx"; import cloneDeep from "lodash/cloneDeep"; import isEqual from "lodash/isEqual"; -import { defaultKanbanSettings } from "./settings/defaultKanbanSettings.js"; +import { defaultFilters, mergeWithDefaults } from "./settings/defaultKanbanSettings.js"; import NoteUpsertModal from "../../components/note-upsert-modal/note-upsert-modal.container"; const mapStateToProps = createStructuredSelector({ @@ -41,7 +41,7 @@ const mapDispatchToProps = (dispatch) => ({ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTrail, associationSettings, statuses }) { const [boardLanes, setBoardLanes] = useState({ lanes: [] }); - const [filter, setFilter] = useState({ search: "", employeeId: null }); + const [filter, setFilter] = useState(defaultFilters); const [loading, setLoading] = useState(true); const [isMoving, setIsMoving] = useState(false); const [orientation, setOrientation] = useState("vertical"); @@ -182,19 +182,14 @@ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTr [boardLanes, client, getCardByID, isMoving, t, insertAuditTrail] ); - const cardSettings = useMemo( - () => - associationSettings?.kanban_settings && Object.keys(associationSettings.kanban_settings).length > 0 - ? associationSettings.kanban_settings - : defaultKanbanSettings, - [associationSettings] - ); + const cardSettings = useMemo(() => { + const kanbanSettings = associationSettings?.kanban_settings; + return mergeWithDefaults(kanbanSettings); + }, [associationSettings]); - const handleSettingsChange = useCallback((newSettings) => { - setLoading(true); - setOrientation(newSettings.orientation ? "vertical" : "horizontal"); - setLoading(false); - }, []); + const handleSettingsChange = () => { + setFilter(defaultFilters); + }; if (loading) { return ; diff --git a/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx b/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx index 482ddb726..1af5ec59c 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx @@ -2,11 +2,13 @@ import React, { useMemo } from "react"; import { Card, Statistic } from "antd"; import { useTranslation } from "react-i18next"; import PropTypes from "prop-types"; -import { statisticsItems, defaultKanbanSettings } from "./settings/defaultKanbanSettings.js"; +import { defaultKanbanSettings, statisticsItems } from "./settings/defaultKanbanSettings.js"; + export const StatisticType = { HOURS: "hours", AMOUNT: "amount", - JOBS: "jobs" + JOBS: "jobs", + TASKS: "tasks" }; const mergeStatistics = (items, values) => { @@ -122,6 +124,20 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { return parseFloat(total.toFixed(2)); }, [reducerData, cardSettings.totalAmountOnBoard]); + const tasksInProduction = useMemo(() => { + if (!data || !cardSettings.tasksInProduction) return null; + return data.reduce((acc, item) => acc + (item.tasks_aggregate?.aggregate?.count || 0), 0); + }, [data, cardSettings.tasksInProduction]); + + const tasksOnBoard = useMemo(() => { + if (!reducerData || !cardSettings.tasksOnBoard) return null; + return reducerData.lanes.reduce((acc, lane) => { + return ( + acc + lane.cards.reduce((laneAcc, card) => laneAcc + (card.metadata.tasks_aggregate?.aggregate?.count || 0), 0) + ); + }, 0); + }, [reducerData, cardSettings.tasksOnBoard]); + const statistics = useMemo( () => mergeStatistics(statisticsItems, [ @@ -134,7 +150,9 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { { id: 6, value: totalAmountOnBoard, type: StatisticType.AMOUNT }, { id: 7, value: totalLABOnBoard, type: StatisticType.HOURS }, { id: 8, value: totalLAROnBoard, type: StatisticType.HOURS }, - { id: 9, value: jobsOnBoard, type: StatisticType.JOBS } + { id: 9, value: jobsOnBoard, type: StatisticType.JOBS }, + { id: 10, value: tasksOnBoard, type: StatisticType.TASKS }, + { id: 11, value: tasksInProduction, type: StatisticType.TASKS } ]), [ totalHrs, @@ -146,7 +164,9 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { totalAmountOnBoard, totalLABOnBoard, totalLAROnBoard, - jobsOnBoard + jobsOnBoard, + tasksOnBoard, + tasksInProduction ] ); @@ -187,37 +207,9 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { }; ProductionStatistics.propTypes = { - data: PropTypes.arrayOf( - PropTypes.shape({ - labhrs: PropTypes.object, - larhrs: PropTypes.object, - job_totals: PropTypes.object - }) - ).isRequired, - cardSettings: PropTypes.shape({ - totalHrs: PropTypes.bool, - totalLAB: PropTypes.bool, - totalLAR: PropTypes.bool, - jobsInProduction: PropTypes.bool, - totalAmountInProduction: PropTypes.bool, - totalHrsOnBoard: PropTypes.bool, - totalLABOnBoard: PropTypes.bool, - totalLAROnBoard: PropTypes.bool, - jobsOnBoard: PropTypes.bool, - totalAmountOnBoard: PropTypes.bool, - statisticsOrder: PropTypes.arrayOf(PropTypes.number) - }).isRequired, - reducerData: PropTypes.shape({ - lanes: PropTypes.arrayOf( - PropTypes.shape({ - cards: PropTypes.arrayOf( - PropTypes.shape({ - metadata: PropTypes.object - }) - ).isRequired - }) - ).isRequired - }) + data: PropTypes.array.isRequired, + cardSettings: PropTypes.object.isRequired, + reducerData: PropTypes.object }; export default ProductionStatistics; diff --git a/client/src/components/production-board-kanban/production-board-kanban.utils.js b/client/src/components/production-board-kanban/production-board-kanban.utils.js index fed3d12db..ba3974c1a 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.utils.js +++ b/client/src/components/production-board-kanban/production-board-kanban.utils.js @@ -29,7 +29,7 @@ const sortByParentId = (arr) => { // Function to create board data based on statuses and jobs, with optional filtering export const createBoardData = ({ statuses, data, filter, cardSettings }) => { - const { search, employeeId } = filter; + const { search, employeeId, alert } = filter; const lanes = statuses.map((status) => ({ id: status, @@ -52,6 +52,11 @@ export const createBoardData = ({ statuses, data, filter, cardSettings }) => { ); } + // Filter jobs by alert if alert filter is true + if (alert) { + filteredJobs = filteredJobs.filter((job) => job.production_vars?.alert); + } + const DataGroupedByStatus = groupBy(filteredJobs, "status"); Object.keys(DataGroupedByStatus).forEach((statusGroupKey) => { diff --git a/client/src/components/production-board-kanban/settings/InformationSettings.jsx b/client/src/components/production-board-kanban/settings/InformationSettings.jsx index c50f61697..3725d1ab8 100644 --- a/client/src/components/production-board-kanban/settings/InformationSettings.jsx +++ b/client/src/components/production-board-kanban/settings/InformationSettings.jsx @@ -18,7 +18,8 @@ const InformationSettings = ({ t }) => ( "sublets", "partsstatus", "estimator", - "subtotal" + "subtotal", + "tasks" ].map((item) => ( diff --git a/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js b/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js index ce0760637..87b364ea2 100644 --- a/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js +++ b/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js @@ -8,7 +8,9 @@ const statisticsItems = [ { id: 6, name: "totalAmountOnBoard", label: "total_amount_on_board" }, { id: 7, name: "totalLABOnBoard", label: "total_lab_on_board" }, { id: 8, name: "totalLAROnBoard", label: "total_lar_on_board" }, - { id: 9, name: "jobsOnBoard", label: "total_jobs_on_board" } + { id: 9, name: "jobsOnBoard", label: "total_jobs_on_board" }, + { id: 10, name: "tasksOnBoard", label: "tasks_on_board" }, + { id: 11, name: "tasksInProduction", label: "tasks_in_production" } ]; const defaultKanbanSettings = { @@ -23,6 +25,7 @@ const defaultKanbanSettings = { scheduled_completion: true, cardcolor: false, orientation: false, + tasks: false, cardSize: "small", model_info: true, kiosk: false, @@ -35,6 +38,8 @@ const defaultKanbanSettings = { totalLABOnBoard: false, totalLAROnBoard: false, jobsOnBoard: false, + tasksOnBoard: false, + tasksInProduction: false, totalAmountOnBoard: true, estimator: false, subtotal: false, @@ -43,4 +48,22 @@ const defaultKanbanSettings = { selectedEstimators: [] }; -export { defaultKanbanSettings, statisticsItems }; +const defaultFilters = { search: "", employeeId: null, alert: false }; + +const mergeWithDefaults = (settings) => { + // Create a new object that starts with the default settings + const mergedSettings = { ...defaultKanbanSettings }; + + // Override with the provided settings, if any + if (settings) { + for (const key in settings) { + if (settings.hasOwnProperty(key)) { + mergedSettings[key] = settings[key]; + } + } + } + + return mergedSettings; +}; + +export { defaultKanbanSettings, statisticsItems, mergeWithDefaults, defaultFilters }; diff --git a/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx b/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx index 38b0c9350..0d78416f8 100644 --- a/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx +++ b/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx @@ -3,13 +3,15 @@ import { Button, Card, Col, Form, notification, Popover, Row, Tabs } from "antd" import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { UPDATE_KANBAN_SETTINGS } from "../../../graphql/user.queries.js"; -import { defaultKanbanSettings } from "./defaultKanbanSettings.js"; +import { defaultKanbanSettings, mergeWithDefaults } from "./defaultKanbanSettings.js"; import LayoutSettings from "./LayoutSettings.jsx"; import InformationSettings from "./InformationSettings.jsx"; import StatisticsSettings from "./StatisticsSettings.jsx"; import FilterSettings from "./FilterSettings.jsx"; +import PropTypes from "prop-types"; +import { isFunction } from "lodash"; -export default function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bodyshop, data }) { +function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bodyshop, data, onSettingsChange }) { const [form] = Form.useForm(); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); @@ -23,16 +25,11 @@ export default function ProductionBoardKanbanSettings({ associationSettings, par useEffect(() => { if (associationSettings?.kanban_settings) { - form.setFieldsValue(associationSettings.kanban_settings); - if (associationSettings.kanban_settings.statisticsOrder) { - setStatisticsOrder(associationSettings.kanban_settings.statisticsOrder); - } - if (associationSettings.kanban_settings.selectedMdInsCos) { - setSelectedMdInsCos(associationSettings.kanban_settings.selectedMdInsCos); - } - if (associationSettings.kanban_settings.selectedEstimators) { - setSelectedEstimators(associationSettings.kanban_settings.selectedEstimators); - } + const finalSettings = mergeWithDefaults(associationSettings.kanban_settings); + form.setFieldsValue(finalSettings); + setStatisticsOrder(finalSettings.statisticsOrder); + setSelectedMdInsCos(finalSettings.selectedMdInsCos); + setSelectedEstimators(finalSettings.selectedEstimators); } }, [form, associationSettings]); @@ -65,6 +62,11 @@ export default function ProductionBoardKanbanSettings({ associationSettings, par setOpen(false); setLoading(false); parentLoading(false); + + if (onSettingsChange && isFunction(onSettingsChange)) { + onSettingsChange(values); + } + setHasChanges(false); }; @@ -155,3 +157,13 @@ export default function ProductionBoardKanbanSettings({ associationSettings, par ); } + +ProductionBoardKanbanSettings.propTypes = { + associationSettings: PropTypes.object, + parentLoading: PropTypes.func.isRequired, + bodyshop: PropTypes.object.isRequired, + onSettingsChange: PropTypes.func, + data: PropTypes.array +}; + +export default ProductionBoardKanbanSettings; diff --git a/client/src/components/production-board-kanban/trello-board/controllers/Lane.jsx b/client/src/components/production-board-kanban/trello-board/controllers/Lane.jsx index 493812840..cd30952fb 100644 --- a/client/src/components/production-board-kanban/trello-board/controllers/Lane.jsx +++ b/client/src/components/production-board-kanban/trello-board/controllers/Lane.jsx @@ -12,7 +12,7 @@ import { EyeInvisibleOutlined, EyeOutlined } from "@ant-design/icons"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../../../redux/user/user.selectors.js"; import { selectTechnician } from "../../../../redux/tech/tech.selectors.js"; -import ProductionBoardCard from "../../../production-board-kanban-card/production-board-kanban-card.component.jsx"; +import ProductionBoardCard from "../../production-board-kanban-card.component.jsx"; import HeightMemoryWrapper from "../components/HeightMemoryWrapper.jsx"; import SizeMemoryWrapper from "../components/SizeMemoryWrapper.jsx"; import ListComponent from "../components/ListComponent.jsx"; diff --git a/client/src/components/production-list-columns/production-list-columns.add.component.jsx b/client/src/components/production-list-columns/production-list-columns.add.component.jsx index 1d1ea8867..24cca5537 100644 --- a/client/src/components/production-list-columns/production-list-columns.add.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.add.component.jsx @@ -2,7 +2,6 @@ import React from "react"; import { Button, Dropdown } from "antd"; import dataSource from "./production-list-columns.data"; import { useTranslation } from "react-i18next"; - import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectTechnician } from "../../redux/tech/tech.selectors"; @@ -10,16 +9,23 @@ import { selectBodyshop } from "../../redux/user/user.selectors"; import { useSplitTreatments } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser technician: selectTechnician, bodyshop: selectBodyshop }); -const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) -}); -export default connect(mapStateToProps, mapDispatchToProps)(ProductionColumnsComponent); -export function ProductionColumnsComponent({ columnState, technician, bodyshop, data, tableState, refetch }) { +const mapDispatchToProps = (dispatch) => ({ + // Add any necessary dispatch actions here +}); + +export function ProductionColumnsComponent({ + columnState, + technician, + bodyshop, + data, + tableState, + refetch, + onColumnAdd +}) { const [columns, setColumns] = columnState; const { t } = useTranslation(); const { @@ -29,18 +35,26 @@ export function ProductionColumnsComponent({ columnState, technician, bodyshop, names: ["Enhanced_Payroll"], splitKey: bodyshop.imexshopid }); + const handleAdd = (e) => { - setColumns([ - ...columns, - ...dataSource({ - bodyshop, - technician, - state: tableState, - data, - activeStatuses: bodyshop.md_ro_statuses.active_statuses, - treatments: { Enhanced_Payroll } - }).filter((i) => i.key === e.key) - ]); + const newColumn = dataSource({ + bodyshop, + technician, + state: tableState, + data, + activeStatuses: bodyshop.md_ro_statuses.active_statuses, + treatments: { Enhanced_Payroll } + }).find((i) => i.key === e.key); + + if (newColumn) { + const updatedColumns = [...columns, newColumn]; + setColumns(updatedColumns); + + // Call the onColumnAdd function passed as a prop + if (onColumnAdd) { + onColumnAdd(newColumn); + } + } }; const columnKeys = columns.map((i) => i.key); @@ -76,12 +90,4 @@ export function ProductionColumnsComponent({ columnState, technician, bodyshop, ); } -// c.key)} -// render={(item) => item.title} -// onChange={(nextTargetKeys, direction, moveKeys) => { -// setColumns(dataSource.filter((i) => nextTargetKeys.includes(i.key))); -// }} -// /> +export default connect(mapStateToProps, mapDispatchToProps)(ProductionColumnsComponent); diff --git a/client/src/components/production-list-columns/production-list-columns.alert.component.jsx b/client/src/components/production-list-columns/production-list-columns.alert.component.jsx index e9a4e2d62..db219745b 100644 --- a/client/src/components/production-list-columns/production-list-columns.alert.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.alert.component.jsx @@ -1,6 +1,6 @@ -import { ExclamationCircleFilled } from "@ant-design/icons"; +import { ExclamationCircleFilled, PlusCircleFilled } from "@ant-design/icons"; import { useMutation } from "@apollo/client"; -import { Button } from "antd"; +import { Button, Popconfirm } from "antd"; import React, { useCallback } from "react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -8,6 +8,7 @@ import { logImEXEvent } from "../../firebase/firebase.utils"; import { UPDATE_JOB } from "../../graphql/jobs.queries"; import { insertAuditTrail } from "../../redux/application/application.actions"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; +import { useTranslation } from "react-i18next"; const mapStateToProps = createStructuredSelector({}); @@ -22,22 +23,24 @@ const mapDispatchToProps = (dispatch) => ({ ) }); -const ProductionListColumnAlert = ({ record, insertAuditTrail }) => { +const ProductionListColumnAlert = ({ id, productionVars, refetch, insertAuditTrail }) => { const [updateAlert] = useMutation(UPDATE_JOB); + const { t } = useTranslation(); const handleAlertToggle = useCallback(() => { logImEXEvent("production_toggle_alert"); - const newAlertState = !!record.production_vars?.alert ? !record.production_vars.alert : true; + const newAlertState = !!productionVars?.alert ? !productionVars?.alert : true; + const finalProductionVars = { + ...productionVars, + alert: newAlertState + }; updateAlert({ variables: { - jobId: record.id, + jobId: id, job: { - production_vars: { - ...record.production_vars, - alert: newAlertState - } + production_vars: finalProductionVars } } }).catch((err) => { @@ -45,17 +48,26 @@ const ProductionListColumnAlert = ({ record, insertAuditTrail }) => { }); insertAuditTrail({ - jobid: record.id, + jobid: id, operation: AuditTrailMapping.alertToggle(newAlertState), type: "alertToggle" }); - if (record.refetch) record.refetch(); - }, [updateAlert, insertAuditTrail, record]); + if (refetch) refetch(); + }, [updateAlert, insertAuditTrail, id, productionVars, refetch]); - if (!record.production_vars?.alert) return null; - - return - - - + + { + setHasUnsavedChanges(false); + }} + /> { + initialStateRef.current = state; + setHasUnsavedChanges(false); + }} refetch={refetch} data={data} /> - setSearchText(e.target.value)} placeholder={t("general.labels.search")} diff --git a/client/src/components/update-alert/update-alert.component.jsx b/client/src/components/update-alert/update-alert.component.jsx index 909512c23..70159adda 100644 --- a/client/src/components/update-alert/update-alert.component.jsx +++ b/client/src/components/update-alert/update-alert.component.jsx @@ -1,7 +1,7 @@ import { AlertOutlined } from "@ant-design/icons"; import { Alert, Button, Col, Row, Space } from "antd"; import i18n from "i18next"; -import React from "react"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -12,39 +12,42 @@ import InstanceRenderManager from "../../utils/instanceRenderMgr"; const mapStateToProps = createStructuredSelector({ updateAvailable: selectUpdateAvailable }); + const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + // setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export default connect(mapStateToProps, mapDispatchToProps)(UpdateAlert); -const intervalMS = 10 * 60 * 1000; + export function UpdateAlert({ updateAvailable }) { const { t } = useTranslation(); - const { - offlineReady: [ - offlineReady //setOfflineReady - ], - needRefresh: [ - needRefresh //setNeedRefresh - ], + offlineReady: [offlineReady], + needRefresh: [needRefresh], updateServiceWorker } = useRegisterSW({ onRegistered(r) { - // eslint-disable-next-line prefer-template - console.log("SW Registered: " + r); - r && - setInterval(() => { - r.update(); - }, intervalMS); + console.log("SW Registered:", r); + if (r) { + setInterval( + () => { + r.update(); + }, + 10 * 60 * 1000 + ); + } }, onRegisterError(error) { - console.log("SW registration error", error); + console.error("SW registration error", error); } }); - if (import.meta.env.DEV) console.log(`SW Status => Refresh? ${needRefresh} - offlineReady? ${offlineReady}`); + useEffect(() => { + if (import.meta.env.DEV) { + console.log(`SW Status => Refresh? ${needRefresh} - offlineReady? ${offlineReady}`); + } + }, [needRefresh, offlineReady]); if (!needRefresh) return null; + return ( - - @@ -93,3 +87,5 @@ export function UpdateAlert({ updateAvailable }) { /> ); } + +export default connect(mapStateToProps, mapDispatchToProps)(UpdateAlert); diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index 51ff6927c..90169eccc 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -1,7 +1,7 @@ import { gql } from "@apollo/client"; export const QUERY_ALL_ACTIVE_JOBS_PAGINATED = gql` - query QUERY_ALL_JOBS_PAGINATED_STATUS_FILTERED( + query QUERY_ALL_ACTIVE_JOBS_PAGINATED( $offset: Int $limit: Int $order: [jobs_order_by!] @@ -2465,6 +2465,11 @@ export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql` export const QUERY_JOBS_IN_PRODUCTION = gql` query QUERY_JOBS_IN_PRODUCTION { jobs(where: { inproduction: { _eq: true } }) { + tasks_aggregate(where: { completed: { _eq: false }, deleted: { _eq: false } }) { + aggregate { + count + } + } id updated_at comment diff --git a/client/src/pages/manage/manage.page.component.jsx b/client/src/pages/manage/manage.page.component.jsx index 1fe0a053b..db7146e15 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -12,7 +12,6 @@ import ErrorBoundary from "../../components/error-boundary/error-boundary.compon //import FooterComponent from "../../components/footer/footer.component"; //Component Imports import * as Sentry from "@sentry/react"; -import Joyride from "react-joyride"; import TestComponent from "../../components/_test/test.page"; import HeaderContainer from "../../components/header/header.container"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; @@ -23,8 +22,6 @@ import { requestForToken } from "../../firebase/firebase.utils"; import { selectBodyshop, selectInstanceConflict } from "../../redux/user/user.selectors"; import UpdateAlert from "../../components/update-alert/update-alert.component"; -import { setJoyRideFinished } from "../../redux/application/application.actions.js"; -import { selectEnableJoyRide, selectJoyRideSteps } from "../../redux/application/application.selectors.js"; import InstanceRenderManager from "../../utils/instanceRenderMgr.js"; import "./manage.page.styles.scss"; @@ -105,16 +102,12 @@ const { Content, Footer } = Layout; const mapStateToProps = createStructuredSelector({ conflict: selectInstanceConflict, - bodyshop: selectBodyshop, - enableJoyRide: selectEnableJoyRide, - joyRideSteps: selectJoyRideSteps + bodyshop: selectBodyshop }); -const mapDispatchToProps = (dispatch) => ({ - setJoyRideFinished: (steps) => dispatch(setJoyRideFinished(steps)) -}); +const mapDispatchToProps = (dispatch) => ({}); -export function Manage({ conflict, bodyshop, enableJoyRide, joyRideSteps, setJoyRideFinished }) { +export function Manage({ conflict, bodyshop }) { const { t } = useTranslation(); const [chatVisible] = useState(false); @@ -583,21 +576,6 @@ export function Manage({ conflict, bodyshop, enableJoyRide, joyRideSteps, setJoy - { - if (props.action === "reset") { - setJoyRideFinished(); - } - }} - /> } showDialog> {PageContent} diff --git a/client/src/redux/application/application.actions.js b/client/src/redux/application/application.actions.js index 89826ea30..7c5485ac5 100644 --- a/client/src/redux/application/application.actions.js +++ b/client/src/redux/application/application.actions.js @@ -67,11 +67,3 @@ export const setUpdateAvailable = (isUpdateAvailable) => ({ type: ApplicationActionTypes.SET_UPDATE_AVAILABLE, payload: isUpdateAvailable }); -export const setJoyRideSteps = (steps) => ({ - type: ApplicationActionTypes.SET_JOYRIDE_STEPS, - payload: steps -}); -export const setJoyRideFinished = () => ({ - type: ApplicationActionTypes.SET_JOYRIDE_FINISHED - //payload: isUpdateAvailable, -}); diff --git a/client/src/redux/application/application.reducer.js b/client/src/redux/application/application.reducer.js index 62090cc1f..421403f19 100644 --- a/client/src/redux/application/application.reducer.js +++ b/client/src/redux/application/application.reducer.js @@ -14,9 +14,7 @@ const INITIAL_STATE = { error: null }, jobReadOnly: false, - partnerVersion: null, - enableJoyRide: false, - joyRideSteps: [] + partnerVersion: null }; const applicationReducer = (state = INITIAL_STATE, action) => { @@ -89,12 +87,6 @@ const applicationReducer = (state = INITIAL_STATE, action) => { case ApplicationActionTypes.SET_PROBLEM_JOBS: { return { ...state, problemJobs: action.payload }; } - case ApplicationActionTypes.SET_JOYRIDE_STEPS: { - return { ...state, enableJoyRide: true, joyRideSteps: action.payload }; - } - case ApplicationActionTypes.SET_JOYRIDE_FINISHED: { - return { ...state, enableJoyRide: false, joyRideSteps: [] }; - } default: return state; } diff --git a/client/src/redux/application/application.selectors.js b/client/src/redux/application/application.selectors.js index f5c1e0770..d81699522 100644 --- a/client/src/redux/application/application.selectors.js +++ b/client/src/redux/application/application.selectors.js @@ -22,5 +22,3 @@ export const selectJobReadOnly = createSelector([selectApplication], (applicatio export const selectOnline = createSelector([selectApplication], (application) => application.online); export const selectProblemJobs = createSelector([selectApplication], (application) => application.problemJobs); export const selectUpdateAvailable = createSelector([selectApplication], (application) => application.updateAvailable); -export const selectEnableJoyRide = createSelector([selectApplication], (application) => application.enableJoyRide); -export const selectJoyRideSteps = createSelector([selectApplication], (application) => application.joyRideSteps); diff --git a/client/src/redux/application/application.types.js b/client/src/redux/application/application.types.js index 3d8e0763b..9b95dd6ee 100644 --- a/client/src/redux/application/application.types.js +++ b/client/src/redux/application/application.types.js @@ -12,8 +12,6 @@ const ApplicationActionTypes = { SET_ONLINE_STATUS: "SET_ONLINE_STATUS", INSERT_AUDIT_TRAIL: "INSERT_AUDIT_TRAIL", SET_PROBLEM_JOBS: "SET_PROBLEM_JOBS", - SET_UPDATE_AVAILABLE: "SET_UPDATE_AVAILABLE", - SET_JOYRIDE_STEPS: "SET_JOYRIDE_STEPS", - SET_JOYRIDE_FINISHED: "SET_JOYRIDE_FINISHED" + SET_UPDATE_AVAILABLE: "SET_UPDATE_AVAILABLE" }; export default ApplicationActionTypes; diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index f3a95722e..c2d776fbf 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -1160,7 +1160,8 @@ "submit": "Submit", "tryagain": "Try Again", "view": "View", - "viewreleasenotes": "See What's Changed" + "viewreleasenotes": "See What's Changed", + "remove_alert": "Are you sure you want to dismiss the alert?" }, "errors": { "fcm": "You must allow notification permissions to have real time messaging. Click to try again.", @@ -2757,7 +2758,9 @@ "total_lab_on_board": "Body Hours on Board", "total_lar_on_board": "Refinish Hours on Board", "total_amount_on_board": "Dollars on Board", - "total_jobs_on_board": "Jobs on Board" + "total_jobs_on_board": "Jobs on Board", + "tasks_in_production": "Tasks in Production", + "tasks_on_board": "Tasks on Board" } }, "actions": { @@ -2792,6 +2795,7 @@ "model_info": "Vehicle Info", "actual_in": "Actual In", "alert": "Alert", + "tasks": "Tasks", "alertoff": "Remove alert from Job", "alerton": "Add alert to Job", "ats": "Alternative Transportation", @@ -2829,7 +2833,8 @@ "sublets": "Sublets", "totalhours": "Total Hrs ", "touchtime": "T/T", - "viewname": "View Name" + "viewname": "View Name", + "alerts": "Alerts" }, "successes": { "removed": "Job removed from production." @@ -2845,6 +2850,9 @@ "total_lar_on_board": "Refinish Hours on Board", "total_amount_on_board": "Dollars on Board", "total_jobs_on_board": "Jobs on Board", + "tasks_in_production": "Tasks in Production", + "tasks_on_board": "Tasks on Board", + "tasks": "Tasks", "hours": "Hours", "currency_symbol": "$", "jobs": "Jobs" diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 30cac520b..c2da8510a 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -1160,7 +1160,8 @@ "submit": "", "tryagain": "", "view": "", - "viewreleasenotes": "" + "viewreleasenotes": "", + "remove_alert": "" }, "errors": { "fcm": "", @@ -2757,7 +2758,9 @@ "total_lab_on_board": "", "total_lar_on_board": "", "total_amount_on_board": "", - "total_jobs_on_board": "" + "total_jobs_on_board": "", + "tasks_in_production": "", + "tasks_on_board": "" } }, "actions": { @@ -2792,6 +2795,7 @@ "model_info": "", "actual_in": "", "alert": "", + "tasks": "", "alertoff": "", "alerton": "", "ats": "", @@ -2829,7 +2833,8 @@ "sublets": "", "totalhours": "", "touchtime": "", - "viewname": "" + "viewname": "", + "alerts": "" }, "successes": { "removed": "" @@ -2845,6 +2850,9 @@ "total_lar_on_board": "", "total_amount_on_board": "", "total_jobs_on_board": "", + "tasks_in_production": "", + "tasks_on_board": "", + "tasks": "", "hours": "", "currency_symbol": "", "jobs": "" diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 967aa9003..005accb1c 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -1160,7 +1160,8 @@ "submit": "", "tryagain": "", "view": "", - "viewreleasenotes": "" + "viewreleasenotes": "", + "remove_alert": "" }, "errors": { "fcm": "", @@ -2757,7 +2758,9 @@ "total_lab_on_board": "", "total_lar_on_board": "", "total_amount_on_board": "", - "total_jobs_on_board": "" + "total_jobs_on_board": "", + "tasks_in_production": "", + "tasks_on_board": "" } }, "actions": { @@ -2792,6 +2795,7 @@ "model_info": "", "actual_in": "", "alert": "", + "tasks": "", "alertoff": "", "alerton": "", "ats": "", @@ -2829,7 +2833,8 @@ "sublets": "", "totalhours": "", "touchtime": "", - "viewname": "" + "viewname": "", + "alerts": "" }, "successes": { "removed": "" @@ -2845,6 +2850,9 @@ "total_lar_on_board": "", "total_amount_on_board": "", "total_jobs_on_board": "", + "tasks_in_production": "", + "tasks_on_board": "", + "tasks": "", "hours": "", "currency_symbol": "", "jobs": "" diff --git a/client/src/utils/betaHandler.js b/client/src/utils/betaHandler.js deleted file mode 100644 index 804b38b7d..000000000 --- a/client/src/utils/betaHandler.js +++ /dev/null @@ -1,36 +0,0 @@ -export const BETA_KEY = "betaSwitchImex"; - -export const checkBeta = () => { - const cookie = document.cookie.split("; ").find((row) => row.startsWith(BETA_KEY)); - return cookie ? cookie.split("=")[1] === "true" : false; -}; - -export const setBeta = (value) => { - const domain = window.location.hostname.split(".").slice(-2).join("."); - document.cookie = `${BETA_KEY}=${value}; path=/; domain=.${domain}`; -}; - -export const handleBeta = () => { - // If the current host name does not start with beta or test, then we don't need to do anything. - if (window.location.hostname.startsWith("localhost")) { - console.log("Not on beta or test, so no need to handle beta."); - return; - } - - const isBeta = checkBeta(); - - const currentHostName = window.location.hostname; - - // Beta is enabled, but the current host name does start with beta. - if (isBeta && !currentHostName.startsWith("beta")) { - const href = `${window.location.protocol}//beta.${currentHostName}${window.location.pathname}${window.location.search}${window.location.hash}`; - window.location.replace(href); - } - - // Beta is not enabled, but the current host name does start with beta. - else if (!isBeta && currentHostName.startsWith("beta")) { - const href = `${window.location.protocol}//${currentHostName.replace("beta.", "")}${window.location.pathname}${window.location.search}${window.location.hash}`; - window.location.replace(href); - } -}; -export default handleBeta; diff --git a/client/src/utils/handleBeta.js b/client/src/utils/handleBeta.js index 804b38b7d..dcb0d18d1 100644 --- a/client/src/utils/handleBeta.js +++ b/client/src/utils/handleBeta.js @@ -11,26 +11,37 @@ export const setBeta = (value) => { }; export const handleBeta = () => { - // If the current host name does not start with beta or test, then we don't need to do anything. if (window.location.hostname.startsWith("localhost")) { console.log("Not on beta or test, so no need to handle beta."); return; } const isBeta = checkBeta(); - const currentHostName = window.location.hostname; - // Beta is enabled, but the current host name does start with beta. - if (isBeta && !currentHostName.startsWith("beta")) { - const href = `${window.location.protocol}//beta.${currentHostName}${window.location.pathname}${window.location.search}${window.location.hash}`; - window.location.replace(href); - } + // Determine if the host name starts with "beta" or "www.beta" + const isBetaHost = currentHostName.startsWith("beta."); + const isBetaHostWithWWW = currentHostName.startsWith("www.beta."); - // Beta is not enabled, but the current host name does start with beta. - else if (!isBeta && currentHostName.startsWith("beta")) { - const href = `${window.location.protocol}//${currentHostName.replace("beta.", "")}${window.location.pathname}${window.location.search}${window.location.hash}`; - window.location.replace(href); + if (isBeta) { + // If beta is on and we are not on a beta domain, redirect to the beta version + if (!isBetaHost && !isBetaHostWithWWW) { + const newHostName = currentHostName.startsWith("www.") + ? `www.beta.${currentHostName.replace(/^www\./, "")}` + : `beta.${currentHostName}`; + const href = `${window.location.protocol}//${newHostName}${window.location.pathname}${window.location.search}${window.location.hash}`; + window.location.replace(href); + } + // Otherwise, if beta is on and we're already on a beta domain, stay there + } else { + // If beta is off and we are on a beta domain, redirect to the non-beta version + if (isBetaHost || isBetaHostWithWWW) { + const newHostName = currentHostName.replace(/^www\.beta\./, "www.").replace(/^beta\./, ""); + const href = `${window.location.protocol}//${newHostName}${window.location.pathname}${window.location.search}${window.location.hash}`; + window.location.replace(href); + } + // Otherwise, if beta is off and we're not on a beta domain, stay there } }; + export default handleBeta; diff --git a/client/vite.config.js b/client/vite.config.js index 0d663686d..3187e0bdf 100644 --- a/client/vite.config.js +++ b/client/vite.config.js @@ -6,8 +6,6 @@ import * as url from "url"; import { defineConfig } from "vite"; import { ViteEjsPlugin } from "vite-plugin-ejs"; import eslint from "vite-plugin-eslint"; - -//import CompressionPlugin from 'vite-plugin-compression'; import { VitePWA } from "vite-plugin-pwa"; import InstanceRenderManager from "./src/utils/instanceRenderMgr"; @@ -16,7 +14,8 @@ process.env.VITE_APP_GIT_SHA_DATE = new Date().toLocaleString("en-US", { }); const WRONG_CODE = `import { bpfrpt_proptype_WindowScroller } from "../WindowScroller.js";`; -function reactVirtualized() { + +function reactVirtualizedFix() { return { name: "flat:react-virtualized", configResolved: async () => { @@ -37,10 +36,7 @@ function reactVirtualized() { export default defineConfig({ base: "/", plugins: [ - ViteEjsPlugin((viteConfig) => { - // viteConfig is the current Vite resolved config - return { env: viteConfig.env }; - }), + ViteEjsPlugin((viteConfig) => ({ env: viteConfig.env })), VitePWA({ injectRegister: "auto", registerType: "prompt", @@ -60,7 +56,6 @@ export default defineConfig({ description: "The ultimate bodyshop management system.", icons: [ { - //TODO:AIO Ensure that these are correct for Rome and IO. src: InstanceRenderManager({ instance: process.env.VITE_APP_INSTANCE, imex: "favicon.png", @@ -101,7 +96,7 @@ export default defineConfig({ gcm_sender_id: "103953800507" } }), - reactVirtualized(), + reactVirtualizedFix(), react(), eslint() // CompressionPlugin(), //Cloudfront already compresses assets, so not needed. diff --git a/hasura/migrations/1722990947416_add_op20_to_masterdata/down.sql b/hasura/migrations/1722990947416_add_op20_to_masterdata/down.sql new file mode 100644 index 000000000..c9f184e41 --- /dev/null +++ b/hasura/migrations/1722990947416_add_op20_to_masterdata/down.sql @@ -0,0 +1,9 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- UPDATE "public"."masterdata" +-- SET value = jsonb_set( +-- value::jsonb, +-- '{OP20}', +-- '{"desc": "REMOVE AND REINSTALL", "opcode": "OP20", "partcode": "PAE"}'::jsonb, +-- true +-- ); diff --git a/hasura/migrations/1722990947416_add_op20_to_masterdata/up.sql b/hasura/migrations/1722990947416_add_op20_to_masterdata/up.sql new file mode 100644 index 000000000..583e21e05 --- /dev/null +++ b/hasura/migrations/1722990947416_add_op20_to_masterdata/up.sql @@ -0,0 +1,7 @@ +UPDATE "public"."masterdata" +SET value = jsonb_set( + value::jsonb, + '{OP20}', + '{"desc": "REMOVE AND REINSTALL", "opcode": "OP20", "partcode": "PAE"}'::jsonb, + true +); diff --git a/package-lock.json b/package-lock.json index f13315d20..4bcd97b21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,12 @@ "version": "0.2.0", "license": "UNLICENSED", "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.624.0", - "@aws-sdk/client-ses": "^3.624.0", - "@aws-sdk/credential-provider-node": "^3.624.0", + "@aws-sdk/client-secrets-manager": "^3.632.0", + "@aws-sdk/client-ses": "^3.632.0", + "@aws-sdk/credential-provider-node": "^3.632.0", "@opensearch-project/opensearch": "^2.11.0", "aws4": "^1.13.1", - "axios": "^1.7.3", + "axios": "^1.7.4", "better-queue": "^3.8.12", "bluebird": "^3.7.2", "body-parser": "^1.20.2", @@ -28,7 +28,7 @@ "dinero.js": "^1.9.1", "dotenv": "^16.4.5", "express": "^4.19.2", - "firebase-admin": "^12.3.0", + "firebase-admin": "^12.3.1", "graphql": "^16.9.0", "graphql-request": "^6.1.0", "graylog2": "^0.2.1", @@ -42,12 +42,12 @@ "node-mailjet": "^6.0.5", "node-persist": "^4.0.3", "nodemailer": "^6.9.14", - "phone": "^3.1.49", + "phone": "^3.1.50", "recursive-diff": "^1.0.9", "rimraf": "^6.0.1", "soap": "^1.1.1", "socket.io": "^4.7.5", - "ssh2-sftp-client": "^11.0.0", + "ssh2-sftp-client": "^10.0.3", "twilio": "^4.23.0", "uuid": "^10.0.0", "xml2js": "^0.6.2", @@ -60,8 +60,8 @@ "source-map-explorer": "^2.5.2" }, "engines": { - "node": ">=20.15.0", - "npm": ">=10.7.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" } }, "node_modules/@aws-crypto/sha256-browser": { @@ -180,24 +180,24 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.624.0.tgz", - "integrity": "sha512-sW4eT+OVhfMTTB9Ke5tAz8/1gZmJ4G40z9Pvm4fJYRopIMIkHSeSQKTo5urX0APYZ3fdKs2Hxo22MKIZAO4kmw==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.632.0.tgz", + "integrity": "sha512-WsQhPHHK1yPfALcP1B7nBSGDzky6vFTUEXnUdfzb5Xy2cT+JTBTS6ChtQGqqOuGHDP/3t/9soqZ+L6rUCYBb/Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/client-sso-oidc": "3.632.0", + "@aws-sdk/client-sts": "3.632.0", + "@aws-sdk/core": "3.629.0", + "@aws-sdk/credential-provider-node": "3.632.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.632.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.632.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -245,24 +245,24 @@ } }, "node_modules/@aws-sdk/client-ses": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.624.0.tgz", - "integrity": "sha512-CIi5tbQQ3wI4MBYUNZDti0xkj5SonZ+l/Bc4eBxqJK61tQB45T68SSigdMBr9fICTQ067WMYvvOtTvq9PqV4jA==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.632.0.tgz", + "integrity": "sha512-hi01MPJF55LEK7NB1LZrqUV7b5GyjH08EToYuekFvQf9aNoR5mqWuMEDQ/dFAowYhUa2KqCdn67HnPn0ySQxHg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/client-sso-oidc": "3.632.0", + "@aws-sdk/client-sts": "3.632.0", + "@aws-sdk/core": "3.629.0", + "@aws-sdk/credential-provider-node": "3.632.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.632.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.632.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -298,21 +298,21 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.624.0.tgz", - "integrity": "sha512-EX6EF+rJzMPC5dcdsu40xSi2To7GSvdGQNIpe97pD9WvZwM9tRNQnNM4T6HA4gjV1L6Jwk8rBlG/CnveXtLEMw==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.632.0.tgz", + "integrity": "sha512-iYWHiKBz44m3chCFvtvHnvCpL2rALzyr1e6tOZV3dLlOKtQtDUlPy6OtnXDu4y+wyJCniy8ivG3+LAe4klzn1Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", + "@aws-sdk/core": "3.629.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.632.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.632.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -347,22 +347,22 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.624.0.tgz", - "integrity": "sha512-Ki2uKYJKKtfHxxZsiMTOvJoVRP6b2pZ1u3rcUb2m/nVgBPUfLdl8ZkGpqE29I+t5/QaS/sEdbn6cgMUZwl+3Dg==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.632.0.tgz", + "integrity": "sha512-Oh1fIWaoZluihOCb/zDEpRTi+6an82fgJz7fyRBugyLhEtDjmvpCQ3oKjzaOhoN+4EvXAm1ZS/ZgpvXBlIRTgw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/core": "3.629.0", + "@aws-sdk/credential-provider-node": "3.632.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.632.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.632.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -396,27 +396,27 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" + "@aws-sdk/client-sts": "^3.632.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.624.0.tgz", - "integrity": "sha512-k36fLZCb2nfoV/DKK3jbRgO/Yf7/R80pgYfMiotkGjnZwDmRvNN08z4l06L9C+CieazzkgRxNUzyppsYcYsQaw==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.632.0.tgz", + "integrity": "sha512-Ss5cBH09icpTvT+jtGGuQlRdwtO7RyE9BF4ZV/CEPATdd9whtJt4Qxdya8BUnkWR7h5HHTrQHqai3YVYjku41A==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/client-sso-oidc": "3.632.0", + "@aws-sdk/core": "3.629.0", + "@aws-sdk/credential-provider-node": "3.632.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.632.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.632.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -451,13 +451,14 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.624.0.tgz", - "integrity": "sha512-WyFmPbhRIvtWi7hBp8uSFy+iPpj8ccNV/eX86hwF4irMjfc/FtsGVIAeBXxXM/vGCjkdfEzOnl+tJ2XACD4OXg==", + "version": "3.629.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.629.0.tgz", + "integrity": "sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==", "license": "Apache-2.0", "dependencies": { "@smithy/core": "^2.3.2", "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", "@smithy/protocol-http": "^4.1.0", "@smithy/signature-v4": "^4.1.0", "@smithy/smithy-client": "^3.1.12", @@ -506,15 +507,15 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.624.0.tgz", - "integrity": "sha512-mMoNIy7MO2WTBbdqMyLpbt6SZpthE6e0GkRYpsd0yozPt0RZopcBhEh+HG1U9Y1PVODo+jcMk353vAi61CfnhQ==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.632.0.tgz", + "integrity": "sha512-m6epoW41xa1ajU5OiHcmQHoGVtrbXBaRBOUhlCLZmcaqMLYsboM4iD/WZP8aatKEON5tTnVXh/4StV8D/+wemw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.622.0", "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-sso": "3.632.0", "@aws-sdk/credential-provider-web-identity": "3.621.0", "@aws-sdk/types": "3.609.0", "@smithy/credential-provider-imds": "^3.2.0", @@ -527,20 +528,20 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" + "@aws-sdk/client-sts": "^3.632.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.632.0.tgz", + "integrity": "sha512-cL8fuJWm/xQBO4XJPkeuZzl3XinIn9EExWgzpG48NRMKR5us1RI/ucv7xFbBBaG+r/sDR2HpYBIA3lVIpm1H3Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-ini": "3.632.0", "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-sso": "3.632.0", "@aws-sdk/credential-provider-web-identity": "3.621.0", "@aws-sdk/types": "3.609.0", "@smithy/credential-provider-imds": "^3.2.0", @@ -570,12 +571,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.624.0.tgz", - "integrity": "sha512-A02bayIjU9APEPKr3HudrFHEx0WfghoSPsPopckDkW7VBqO4wizzcxr75Q9A3vNX+cwg0wCN6UitTNe6pVlRaQ==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.632.0.tgz", + "integrity": "sha512-P/4wB6j7ym5QCPTL2xlMfvf2NcXSh+z0jmsZP4WW/tVwab4hvgabPPbLeEZDSWZ0BpgtxKGvRq0GSHuGeirQbA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/client-sso": "3.632.0", "@aws-sdk/token-providers": "3.614.0", "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -649,13 +650,13 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", - "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.632.0.tgz", + "integrity": "sha512-yY/sFsHKwG9yzSf/DTclqWJaGPI2gPBJDCGBujSqTG1zlS7Ot4fqi91DZ6088BFWzbOorDzJFcAhAEFzc6LuQg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.632.0", "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -712,9 +713,10 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", - "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "version": "3.632.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.632.0.tgz", + "integrity": "sha512-LlYMU8pAbcEQphOpE6xaNLJ8kPGhklZZTVzZVpVW477NaaGgoGTMYNXTABYHcxeF5E2lLrxql9OmVpvr8GWN8Q==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -2425,11 +2427,12 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/node": { - "version": "20.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz", - "integrity": "sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==", + "version": "22.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.3.0.tgz", + "integrity": "sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.18.2" } }, "node_modules/@types/qs": { @@ -2693,9 +2696,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", - "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -4105,15 +4108,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/firebase-admin": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.3.0.tgz", - "integrity": "sha512-AKJcFbOZ7W8Fwcqh6Ba7FThXVoXwPdsf+E9vyjk5Z1vN1Z9mnTw88EQWfIsR91YglQ0KvWu1rvMhW65bcB4sog==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.3.1.tgz", + "integrity": "sha512-vEr3s3esl8nPIA9r/feDT4nzIXCfov1CyyCSpMQWp6x63Q104qke0MEGZlrHUZVROtl8FLus6niP/M9I1s4VBA==", "license": "Apache-2.0", "dependencies": { "@fastify/busboy": "^3.0.0", "@firebase/database-compat": "^1.0.2", "@firebase/database-types": "^1.0.0", - "@types/node": "^20.10.3", + "@types/node": "^22.0.1", "farmhash-modern": "^1.1.0", "jsonwebtoken": "^9.0.0", "jwks-rsa": "^3.1.0", @@ -5795,9 +5798,10 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/phone": { - "version": "3.1.49", - "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.49.tgz", - "integrity": "sha512-S+rHWXSQrllK5eQwz0sDbwfxQ2PzennWPgsP/jdpEPH3k7P5IBJZYjvYfU8e/RF5AwKCgOtzbTGTGJcBSLJVVw==", + "version": "3.1.50", + "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.50.tgz", + "integrity": "sha512-TRmb2bX3sX+rrOrc8FRd8hmy4exoH2Lu3vjBP/dLgwwci1lv7DbjJ2iHMe7X4Hm8Pa0rJcfqTbq/O1vjU4NgxQ==", + "license": "MIT", "engines": { "node": ">=12" } @@ -6627,17 +6631,16 @@ } }, "node_modules/ssh2-sftp-client": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/ssh2-sftp-client/-/ssh2-sftp-client-11.0.0.tgz", - "integrity": "sha512-lOjgNYtioYquhtgyHwPryFNhllkuENjvCKkUXo18w/Q4UpEffCnEUBfiOTlwFdKIhG1rhrOGnA6DeKPSF2CP6w==", - "license": "Apache-2.0", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/ssh2-sftp-client/-/ssh2-sftp-client-10.0.3.tgz", + "integrity": "sha512-Wlhasz/OCgrlqC8IlBZhF19Uw/X/dHI8ug4sFQybPE+0sDztvgvDf7Om6o7LbRLe68E7XkFZf3qMnqAvqn1vkQ==", "dependencies": { "concat-stream": "^2.0.0", "promise-retry": "^2.0.1", "ssh2": "^1.15.0" }, "engines": { - "node": ">=18.20.4" + "node": ">=16.20.2" }, "funding": { "type": "individual", @@ -7160,9 +7163,10 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.18.2.tgz", + "integrity": "sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==", + "license": "MIT" }, "node_modules/universalify": { "version": "0.1.2", diff --git a/package.json b/package.json index 2938403bb..b9817b242 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "0.2.0", "license": "UNLICENSED", "engines": { - "node": ">=20.15.0", - "npm": ">=10.7.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, "scripts": { "setup": "rm -rf node_modules && npm i && cd client && rm -rf node_modules && npm i", @@ -19,12 +19,12 @@ "makeitpretty": "prettier --write \"**/*.{css,js,json,jsx,scss}\"" }, "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.624.0", - "@aws-sdk/client-ses": "^3.624.0", - "@aws-sdk/credential-provider-node": "^3.624.0", + "@aws-sdk/client-secrets-manager": "^3.632.0", + "@aws-sdk/client-ses": "^3.632.0", + "@aws-sdk/credential-provider-node": "^3.632.0", "@opensearch-project/opensearch": "^2.11.0", "aws4": "^1.13.1", - "axios": "^1.7.3", + "axios": "^1.7.4", "better-queue": "^3.8.12", "bluebird": "^3.7.2", "body-parser": "^1.20.2", @@ -38,7 +38,7 @@ "dinero.js": "^1.9.1", "dotenv": "^16.4.5", "express": "^4.19.2", - "firebase-admin": "^12.3.0", + "firebase-admin": "^12.3.1", "graphql": "^16.9.0", "graphql-request": "^6.1.0", "graylog2": "^0.2.1", @@ -52,12 +52,12 @@ "node-mailjet": "^6.0.5", "node-persist": "^4.0.3", "nodemailer": "^6.9.14", - "phone": "^3.1.49", + "phone": "^3.1.50", "recursive-diff": "^1.0.9", "rimraf": "^6.0.1", "soap": "^1.1.1", "socket.io": "^4.7.5", - "ssh2-sftp-client": "^11.0.0", + "ssh2-sftp-client": "^10.0.3", "twilio": "^4.23.0", "uuid": "^10.0.0", "xml2js": "^0.6.2", diff --git a/server/accounting/qb-receivables-lines.js b/server/accounting/qb-receivables-lines.js index 5300cc822..0dedb4472 100644 --- a/server/accounting/qb-receivables-lines.js +++ b/server/accounting/qb-receivables-lines.js @@ -30,8 +30,14 @@ exports.default = function ({ bodyshop, jobs_by_pk, qbo = false, items, taxCodes if (jobline.db_ref === "936007") { hasMashLine = true; } + + //Check if the line is a Towing Line and flag as such. + let isTowingLine = false; + if (jobline.db_ref === "936001" && jobline.line_desc.includes("Towing")) { + isTowingLine = true; + } //Parts Lines Mappings. - if (jobline.profitcenter_part) { + if (!isTowingLine && jobline.profitcenter_part) { //TODO:AIO This appears to be a net 0 change exept for default quantity as 0 instead of 1 for imex. Need to verify. const discountAmount = ((jobline.prt_dsmk_m && jobline.prt_dsmk_m !== 0) || (jobline.prt_dsmk_p && jobline.prt_dsmk_p !== 0)) && diff --git a/server/accounting/qbo/qbo-payables.js b/server/accounting/qbo/qbo-payables.js index 2be6e4c12..27523c78e 100644 --- a/server/accounting/qbo/qbo-payables.js +++ b/server/accounting/qbo/qbo-payables.js @@ -273,7 +273,7 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor, bodyshop) return result && result.json && result.json.Bill; } catch (error) { logger.log("qbo-payables-error", "DEBUG", req.user.email, bill.id, { - error: (error && error.authResponse && error.authResponse.body) || (error && error.message), + error: error, //(error && error.authResponse && error.authResponse.body) || (error && error.message), method: "InsertBill" }); throw error; diff --git a/server/data/kaizen.js b/server/data/kaizen.js index 60e307956..1dccef61c 100644 --- a/server/data/kaizen.js +++ b/server/data/kaizen.js @@ -33,7 +33,7 @@ const ftpSetup = { exports.default = async (req, res) => { //Query for the List of Bodyshop Clients. logger.log("kaizen-start", "DEBUG", "api", null, null); - const kaizenShopsIDs = ["SUMMIT", "STRATHMORE", "SUNRIDGE"]; + const kaizenShopsIDs = ["SUMMIT", "STRATHMORE", "SUNRIDGE", "SHAW"]; const { bodyshops } = await client.request(queries.GET_KAIZEN_SHOPS, { imexshopid: kaizenShopsIDs