Compare commits

..

17 Commits

Author SHA1 Message Date
Dave Richer
02a1d39ca4 - Bump packages (minus major)
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-09-04 12:50:50 -04:00
Dave Richer
d50efe9890 Merge branch 'master-AIO' into feature/IO-2825-Node-20-Update 2024-09-04 12:45:28 -04:00
Dave Richer
789af9fb30 - Merge master-aio, bump packages.
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-08-19 12:35:07 -04:00
Dave Richer
18da11f593 - Merge master-aio, bump packages.
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-08-19 12:27:30 -04:00
Dave Richer
0ca1937140 - Bump deps
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-08-07 11:26:46 -04:00
Dave Richer
7898d5a595 - merge master fix conflicts
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-08-07 11:17:43 -04:00
Dave Richer
e8aa4f2dac - Merge Master, update packages.
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-07-22 14:53:56 -04:00
Dave Richer
271d15d969 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-2825-Node-20-Update 2024-07-22 14:49:13 -04:00
Dave Richer
136d52ec0b - Merge Master, update packages.
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-07-22 14:47:44 -04:00
Dave Richer
90b9ab906a - Merge master-aio
- Package updates

Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-07-16 09:09:13 -04:00
Dave Richer
02fd5e1701 - Update packages (continued)
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-07-09 13:07:18 -04:00
Dave Richer
2dcd05c593 - Update packages / Merge master
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-07-09 13:01:16 -04:00
Dave Richer
0e9414cbc8 Merge remote-tracking branch 'origin/master-AIO' into feature/IO-2825-Node-20-Update 2024-07-09 12:59:56 -04:00
Dave Richer
ddc235637a - Refresh packages
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-06-27 15:13:22 -04:00
Dave Richer
60549597cb - Merge Master-AIO
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-06-27 15:09:29 -04:00
Dave Richer
9fe94481e7 Merged in master-AIO (pull request #1503)
Master AIO
2024-06-26 00:54:55 +00:00
Dave Richer
b78d0253de - Node 20 / Package Updates (including new packages for updated production board that are not yet used) / ESLint error fix / react-grid-layout added to optimized deps.
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-06-20 14:57:45 -04:00
29 changed files with 11847 additions and 14145 deletions

View File

@@ -5,7 +5,6 @@ orbs:
aws-s3: circleci/aws-s3@4.0.0 aws-s3: circleci/aws-s3@4.0.0
aws-cli: circleci/aws-cli@4.0 aws-cli: circleci/aws-cli@4.0
eb: circleci/aws-elastic-beanstalk@2.0.1 eb: circleci/aws-elastic-beanstalk@2.0.1
jira: circleci/jira@2.1.0
jobs: jobs:
imex-api-deploy: imex-api-deploy:
docker: docker:
@@ -19,12 +18,6 @@ jobs:
eb status --verbose eb status --verbose
eb deploy eb deploy
eb status eb status
- jira/notify:
environment: Production (ImEX) - API
environment_type: production
job_type: deployment
pipeline_id: << pipeline.id >>
pipeline_number: << pipeline.number >>
imex-hasura-migrate: imex-hasura-migrate:
docker: docker:
@@ -40,16 +33,11 @@ jobs:
- run: - run:
name: Execute migration name: Execute migration
command: | command: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash npm install hasura-cli -g
hasura migrate apply --endpoint https://db.imex.online/ --admin-secret << parameters.secret >> hasura migrate apply --endpoint https://db.imex.online/ --admin-secret << parameters.secret >>
hasura metadata apply --endpoint https://db.imex.online/ --admin-secret << parameters.secret >> hasura metadata apply --endpoint https://db.imex.online/ --admin-secret << parameters.secret >>
hasura metadata reload --endpoint https://db.imex.online/ --admin-secret << parameters.secret >> hasura metadata reload --endpoint https://db.imex.online/ --admin-secret << parameters.secret >>
- jira/notify:
environment: Production (ImEX) - Hasura
environment_type: production
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
imex-app-build: imex-app-build:
docker: docker:
- image: cimg/node:18.18.2 - image: cimg/node:18.18.2
@@ -74,7 +62,6 @@ jobs:
to: "s3://imex-online-production/" to: "s3://imex-online-production/"
arguments: "--exclude '*.map'" arguments: "--exclude '*.map'"
imex-app-beta-build: imex-app-beta-build:
docker: docker:
- image: cimg/node:18.18.2 - image: cimg/node:18.18.2
@@ -99,12 +86,6 @@ jobs:
from: dist from: dist
to: "s3://imex-online-beta/" to: "s3://imex-online-beta/"
arguments: "--exclude '*.map'" arguments: "--exclude '*.map'"
- jira/notify:
environment: Production (ImEX) - Front End
environment_type: production
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
rome-api-deploy: rome-api-deploy:
docker: docker:
@@ -118,12 +99,7 @@ jobs:
eb status --verbose eb status --verbose
eb deploy eb deploy
eb status eb status
- jira/notify:
environment: Production (Rome) - API
environment_type: production
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
rome-hasura-migrate: rome-hasura-migrate:
docker: docker:
- image: cimg/node:18.18.2 - image: cimg/node:18.18.2
@@ -138,16 +114,11 @@ jobs:
- run: - run:
name: Execute migration name: Execute migration
command: | command: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash npm install hasura-cli -g
hasura migrate apply --endpoint https://db.romeonline.io/ --admin-secret << parameters.secret >> hasura migrate apply --endpoint https://db.romeonline.io/ --admin-secret << parameters.secret >>
hasura metadata apply --endpoint https://db.romeonline.io/ --admin-secret << parameters.secret >> hasura metadata apply --endpoint https://db.romeonline.io/ --admin-secret << parameters.secret >>
hasura metadata reload --endpoint https://db.romeonline.io/ --admin-secret << parameters.secret >> hasura metadata reload --endpoint https://db.romeonline.io/ --admin-secret << parameters.secret >>
- jira/notify:
environment: Production (Rome) - Hasura
environment_type: production
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
rome-app-build: rome-app-build:
docker: docker:
- image: cimg/node:18.18.2 - image: cimg/node:18.18.2
@@ -172,12 +143,6 @@ jobs:
from: dist from: dist
to: "s3://rome-online-production/" to: "s3://rome-online-production/"
arguments: "--exclude '*.map'" arguments: "--exclude '*.map'"
- jira/notify:
environment: Production (Rome) - Front End
environment_type: production
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
promanager-app-build: promanager-app-build:
docker: docker:
@@ -203,12 +168,6 @@ jobs:
from: dist from: dist
to: "s3://promanager-production/" to: "s3://promanager-production/"
arguments: "--exclude '*.map'" arguments: "--exclude '*.map'"
- jira/notify:
environment: Production (ProManager) - Front End
environment_type: production
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
test-rome-hasura-migrate: test-rome-hasura-migrate:
docker: docker:
@@ -224,18 +183,10 @@ jobs:
- run: - run:
name: Execute migration name: Execute migration
command: | command: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash npm install hasura-cli -g
hasura migrate apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >> hasura migrate apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
sleep 5
hasura metadata apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >> hasura metadata apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
sleep 10
hasura metadata reload --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >> hasura metadata reload --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
- jira/notify:
environment: Test (Rome) - Hasura
environment_type: testing
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
test-rome-app-build: test-rome-app-build:
docker: docker:
@@ -261,12 +212,6 @@ jobs:
from: dist from: dist
to: "s3://rome-online-test/" to: "s3://rome-online-test/"
arguments: "--exclude '*.map'" arguments: "--exclude '*.map'"
- jira/notify:
environment: Test (Rome) - Front End
environment_type: testing
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
test-promanager-app-build: test-promanager-app-build:
docker: docker:
@@ -292,12 +237,6 @@ jobs:
from: dist from: dist
to: "s3://promanager-testing/" to: "s3://promanager-testing/"
arguments: "--exclude '*.map'" arguments: "--exclude '*.map'"
- jira/notify:
environment: Test (ProManager) - Front End
environment_type: testing
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
test-hasura-migrate: test-hasura-migrate:
docker: docker:
@@ -313,18 +252,10 @@ jobs:
- run: - run:
name: Execute migration name: Execute migration
command: | command: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash npm install hasura-cli -g
hasura migrate apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >> hasura migrate apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
sleep 15
hasura metadata apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >> hasura metadata apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
sleep 30
hasura metadata reload --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >> hasura metadata reload --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
- jira/notify:
environment: Test (ImEX) - Hasura
environment_type: testing
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
imex-test-app-build: imex-test-app-build:
docker: docker:
@@ -371,12 +302,7 @@ jobs:
from: dist from: dist
to: "s3://imex-online-test-beta/" to: "s3://imex-online-test-beta/"
arguments: "--exclude '*.map'" arguments: "--exclude '*.map'"
- jira/notify:
environment: Test (ImEX) - Front End
environment_type: testing
pipeline_id: << pipeline.id >>
job_type: deployment
pipeline_number: << pipeline.number >>
admin-app-build: admin-app-build:
docker: docker:
@@ -427,7 +353,7 @@ workflows:
secret: ${HASURA_PROD_SECRET} secret: ${HASURA_PROD_SECRET}
filters: filters:
branches: branches:
only: master-AIO only: master
- rome-api-deploy: - rome-api-deploy:
filters: filters:
branches: branches:
@@ -437,7 +363,7 @@ workflows:
branches: branches:
only: master-AIO only: master-AIO
- rome-hasura-migrate: - rome-hasura-migrate:
secret: ${HASURA_ROME_PROD_SECRET} secret: ${HASURA_PROD_SECRET}
filters: filters:
branches: branches:
only: master-AIO only: master-AIO

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
VITE_APP_GRAPHQL_ENDPOINT=https://db.dev.imex.online/v1/graphql VITE_APP_GRAPHQL_ENDPOINT=https://db.dev.bodyshop.app/v1/graphql
VITE_APP_GRAPHQL_ENDPOINT_WS=wss://db.dev.imex.online/v1/graphql VITE_APP_GRAPHQL_ENDPOINT_WS=wss://db.dev.bodyshop.app/v1/graphql
VITE_APP_GA_CODE=231099835 VITE_APP_GA_CODE=231099835
VITE_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"} VITE_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"}
VITE_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/io-test VITE_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/io-test

View File

@@ -1,5 +1,5 @@
VITE_APP_GRAPHQL_ENDPOINT=https://db.dev.imex.online/v1/graphql VITE_APP_GRAPHQL_ENDPOINT=https://db.dev.bodyshop.app/v1/graphql
VITE_APP_GRAPHQL_ENDPOINT_WS=wss://db.dev.imex.online/v1/graphql VITE_APP_GRAPHQL_ENDPOINT_WS=wss://db.dev.bodyshop.app/v1/graphql
VITE_APP_GA_CODE=231099835 VITE_APP_GA_CODE=231099835
VITE_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"} VITE_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"}
VITE_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/io-test VITE_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/io-test

View File

@@ -1,8 +1,7 @@
VITE_APP_GRAPHQL_ENDPOINT=https://db.dev.imex.online/v1/graphql VITE_APP_GRAPHQL_ENDPOINT=https://db.dev.bodyshop.app/v1/graphql
VITE_APP_GRAPHQL_ENDPOINT_WS=wss://db.dev.imex.online/v1/graphql VITE_APP_GRAPHQL_ENDPOINT_WS=wss://db.dev.bodyshop.app/v1/graphql
VITE_APP_GA_CODE=231099835 VITE_APP_GA_CODE=231099835
# VITE_APP_FIREBASE_CONFIG={ "apiKey": "AIzaSyAuLQR9SV5LsVxjU8wh9hvFLdhcAHU6cxE", "authDomain": "rome-prod-1.firebaseapp.com", "projectId": "rome-prod-1", "storageBucket": "rome-prod-1.appspot.com", "messagingSenderId": "147786367145", "appId": "1:147786367145:web:9d4cba68071c3f29a8a9b8", "measurementId": "G-G8Z9DRHTZS"} VITE_APP_FIREBASE_CONFIG={ "apiKey": "AIzaSyAuLQR9SV5LsVxjU8wh9hvFLdhcAHU6cxE", "authDomain": "rome-prod-1.firebaseapp.com", "projectId": "rome-prod-1", "storageBucket": "rome-prod-1.appspot.com", "messagingSenderId": "147786367145", "appId": "1:147786367145:web:9d4cba68071c3f29a8a9b8", "measurementId": "G-G8Z9DRHTZS"}
VITE_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"}
VITE_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/io-test VITE_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/io-test
VITE_APP_CLOUDINARY_ENDPOINT=https://res.cloudinary.com/io-test VITE_APP_CLOUDINARY_ENDPOINT=https://res.cloudinary.com/io-test
VITE_APP_CLOUDINARY_API_KEY=957865933348715 VITE_APP_CLOUDINARY_API_KEY=957865933348715

View File

@@ -2,9 +2,6 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<% if (env.VITE_APP_INSTANCE === 'IMEX') { %> <% if (env.VITE_APP_INSTANCE === 'IMEX') { %>
<link rel="icon" href="/favicon.png"/> <link rel="icon" href="/favicon.png"/>
<% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %> <% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %>

894
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,35 +9,35 @@
"proxy": "http://localhost:4000", "proxy": "http://localhost:4000",
"dependencies": { "dependencies": {
"@ant-design/pro-layout": "^7.19.12", "@ant-design/pro-layout": "^7.19.12",
"@apollo/client": "^3.11.4", "@apollo/client": "^3.11.6",
"@emotion/is-prop-valid": "^1.3.0", "@emotion/is-prop-valid": "^1.3.0",
"@fingerprintjs/fingerprintjs": "^4.4.3", "@fingerprintjs/fingerprintjs": "^4.4.3",
"@jsreport/browser-client": "^3.1.0", "@jsreport/browser-client": "^3.1.0",
"@reduxjs/toolkit": "^2.2.7", "@reduxjs/toolkit": "^2.2.7",
"@sentry/cli": "^2.33.1", "@sentry/cli": "^2.34.1",
"@sentry/react": "^7.114.0", "@sentry/react": "^7.114.0",
"@splitsoftware/splitio-react": "^1.12.1", "@splitsoftware/splitio-react": "^1.12.1",
"@tanem/react-nprogress": "^5.0.51", "@tanem/react-nprogress": "^5.0.51",
"@vitejs/plugin-react": "^4.3.1", "@vitejs/plugin-react": "^4.3.1",
"antd": "^5.20.1", "antd": "^5.20.5",
"apollo-link-logger": "^2.0.1", "apollo-link-logger": "^2.0.1",
"apollo-link-sentry": "^3.3.0", "apollo-link-sentry": "^3.3.0",
"autosize": "^6.0.1", "autosize": "^6.0.1",
"axios": "^1.7.4", "axios": "^1.7.7",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"css-box-model": "^1.2.1", "css-box-model": "^1.2.1",
"dayjs": "^1.11.12", "dayjs": "^1.11.13",
"dayjs-business-days2": "^1.2.2", "dayjs-business-days2": "^1.2.2",
"dinero.js": "^1.9.1", "dinero.js": "^1.9.1",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"env-cmd": "^10.1.0", "env-cmd": "^10.1.0",
"exifr": "^7.1.3", "exifr": "^7.1.3",
"firebase": "^10.12.5", "firebase": "^10.13.1",
"graphql": "^16.9.0", "graphql": "^16.9.0",
"i18next": "^23.12.3", "i18next": "^23.14.0",
"i18next-browser-languagedetector": "^8.0.0", "i18next-browser-languagedetector": "^8.0.0",
"immutability-helper": "^3.1.1", "immutability-helper": "^3.1.1",
"libphonenumber-js": "^1.11.5", "libphonenumber-js": "^1.11.7",
"logrocket": "^8.1.2", "logrocket": "^8.1.2",
"markerjs2": "^2.32.1", "markerjs2": "^2.32.1",
"memoize-one": "^6.0.0", "memoize-one": "^6.0.0",
@@ -47,7 +47,7 @@
"query-string": "^9.1.0", "query-string": "^9.1.0",
"raf-schd": "^4.0.3", "raf-schd": "^4.0.3",
"react": "^18.3.1", "react": "^18.3.1",
"react-big-calendar": "^1.13.2", "react-big-calendar": "^1.13.4",
"react-color": "^2.19.3", "react-color": "^2.19.3",
"react-cookie": "^7.2.0", "react-cookie": "^7.2.0",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
@@ -58,15 +58,15 @@
"react-icons": "^5.3.0", "react-icons": "^5.3.0",
"react-image-lightbox": "^5.1.4", "react-image-lightbox": "^5.1.4",
"react-markdown": "^9.0.1", "react-markdown": "^9.0.1",
"react-number-format": "^5.4.0", "react-number-format": "^5.4.1",
"react-popopo": "^2.1.9", "react-popopo": "^2.1.9",
"react-product-fruits": "^2.2.6", "react-product-fruits": "^2.2.61",
"react-redux": "^9.1.2", "react-redux": "^9.1.2",
"react-resizable": "^3.0.5", "react-resizable": "^3.0.5",
"react-router-dom": "^6.26.0", "react-router-dom": "^6.26.1",
"react-sticky": "^6.0.3", "react-sticky": "^6.0.3",
"react-virtualized": "^9.22.5", "react-virtualized": "^9.22.5",
"react-virtuoso": "^4.10.1", "react-virtuoso": "^4.10.2",
"recharts": "^2.12.7", "recharts": "^2.12.7",
"redux": "^5.0.1", "redux": "^5.0.1",
"redux-actions": "^3.0.3", "redux-actions": "^3.0.3",
@@ -74,9 +74,9 @@
"redux-saga": "^1.3.0", "redux-saga": "^1.3.0",
"redux-state-sync": "^3.1.4", "redux-state-sync": "^3.1.4",
"reselect": "^5.1.1", "reselect": "^5.1.1",
"sass": "^1.77.8", "sass": "^1.78.0",
"socket.io-client": "^4.7.5", "socket.io-client": "^4.7.5",
"styled-components": "^6.1.12", "styled-components": "^6.1.13",
"subscriptions-transport-ws": "^0.11.0", "subscriptions-transport-ws": "^0.11.0",
"use-memo-one": "^1.1.3", "use-memo-one": "^1.1.3",
"userpilot": "^1.3.5", "userpilot": "^1.3.5",
@@ -130,15 +130,15 @@
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-react": "^7.24.7", "@babel/preset-react": "^7.24.7",
"@dotenvx/dotenvx": "^1.7.0", "@dotenvx/dotenvx": "^1.13.3",
"@emotion/babel-plugin": "^11.12.0", "@emotion/babel-plugin": "^11.12.0",
"@emotion/react": "^11.13.0", "@emotion/react": "^11.13.3",
"@sentry/webpack-plugin": "^2.22.2", "@sentry/webpack-plugin": "^2.22.4",
"@testing-library/cypress": "^10.0.2", "@testing-library/cypress": "^10.0.2",
"browserslist": "^4.23.3", "browserslist": "^4.23.3",
"browserslist-to-esbuild": "^2.1.1", "browserslist-to-esbuild": "^2.1.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"cypress": "^13.13.3", "cypress": "^13.14.1",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-config-react-app": "^7.0.1", "eslint-config-react-app": "^7.0.1",
"eslint-plugin-cypress": "^2.15.1", "eslint-plugin-cypress": "^2.15.1",
@@ -147,13 +147,12 @@
"react-error-overlay": "6.0.11", "react-error-overlay": "6.0.11",
"redux-logger": "^3.0.6", "redux-logger": "^3.0.6",
"source-map-explorer": "^2.5.3", "source-map-explorer": "^2.5.3",
"vite": "^5.4.0", "vite": "^5.4.3",
"vite-plugin-babel": "^1.2.0", "vite-plugin-babel": "^1.2.0",
"vite-plugin-eslint": "^1.8.1", "vite-plugin-eslint": "^1.8.1",
"vite-plugin-legacy": "^2.1.0", "vite-plugin-legacy": "^2.1.0",
"vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-node-polyfills": "^0.22.0",
"vite-plugin-pwa": "^0.20.1", "vite-plugin-pwa": "^0.20.4",
"vite-plugin-style-import": "^2.0.0", "vite-plugin-style-import": "^2.0.0"
"workbox-window": "^7.1.0"
} }
} }

View File

@@ -18,6 +18,7 @@ import { checkUserSession } from "../redux/user/user.actions";
import { selectBodyshop, selectCurrentEula, selectCurrentUser } from "../redux/user/user.selectors"; import { selectBodyshop, selectCurrentEula, selectCurrentUser } from "../redux/user/user.selectors";
import PrivateRoute from "../components/PrivateRoute"; import PrivateRoute from "../components/PrivateRoute";
import "./App.styles.scss"; import "./App.styles.scss";
import handleBeta from "../utils/handleBeta";
import Eula from "../components/eula/eula.component"; import Eula from "../components/eula/eula.component";
import InstanceRenderMgr from "../utils/instanceRenderMgr"; import InstanceRenderMgr from "../utils/instanceRenderMgr";
import ProductFruitsWrapper from "./ProductFruitsWrapper.jsx"; import ProductFruitsWrapper from "./ProductFruitsWrapper.jsx";
@@ -107,6 +108,8 @@ export function App({ bodyshop, checkUserSession, currentUser, online, setOnline
return <LoadingSpinner message={t("general.labels.loggingin")} />; return <LoadingSpinner message={t("general.labels.loggingin")} />;
} }
handleBeta();
if (!online) { if (!online) {
return ( return (
<Result <Result

View File

@@ -13,6 +13,7 @@ import Icon, {
FileFilled, FileFilled,
HomeFilled, HomeFilled,
ImportOutlined, ImportOutlined,
InfoCircleOutlined,
LineChartOutlined, LineChartOutlined,
PaperClipOutlined, PaperClipOutlined,
PhoneOutlined, PhoneOutlined,
@@ -26,8 +27,8 @@ import Icon, {
UserOutlined UserOutlined
} from "@ant-design/icons"; } from "@ant-design/icons";
import { useSplitTreatments } from "@splitsoftware/splitio-react"; import { useSplitTreatments } from "@splitsoftware/splitio-react";
import { Layout, Menu } from "antd"; import { Layout, Menu, Switch, Tooltip } from "antd";
import React from "react"; import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { BsKanban } from "react-icons/bs"; import { BsKanban } from "react-icons/bs";
import { FaCalendarAlt, FaCarCrash, FaCreditCard, FaFileInvoiceDollar, FaTasks } from "react-icons/fa"; import { FaCalendarAlt, FaCarCrash, FaCreditCard, FaFileInvoiceDollar, FaTasks } from "react-icons/fa";
@@ -42,6 +43,7 @@ import { selectRecentItems, selectSelectedHeader } from "../../redux/application
import { setModalContext } from "../../redux/modals/modals.actions"; import { setModalContext } from "../../redux/modals/modals.actions";
import { signOutStart } from "../../redux/user/user.actions"; import { signOutStart } from "../../redux/user/user.actions";
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors";
import { checkBeta, handleBeta, setBeta } from "../../utils/handleBeta";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
@@ -113,21 +115,19 @@ function Header({
names: ["ImEXPay", "DmsAp", "Simple_Inventory"], names: ["ImEXPay", "DmsAp", "Simple_Inventory"],
splitKey: bodyshop && bodyshop.imexshopid splitKey: bodyshop && bodyshop.imexshopid
}); });
const [betaSwitch, setBetaSwitch] = useState(false);
const { t } = useTranslation(); const { t } = useTranslation();
const deleteBetaCookie = () => { useEffect(() => {
const cookieExists = document.cookie.split("; ").some((row) => row.startsWith(`betaSwitchImex=`)); const isBeta = checkBeta();
if (cookieExists) { setBetaSwitch(isBeta);
const domain = window.location.hostname.split(".").slice(-2).join("."); }, []);
document.cookie = `betaSwitchImex=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=.${domain}`;
console.log(`betaSwitchImex cookie deleted`);
} else {
console.log(`betaSwitchImex cookie does not exist`);
}
};
deleteBetaCookie(); const betaSwitchChange = (checked) => {
setBeta(checked);
setBetaSwitch(checked);
handleBeta();
};
const accountingChildren = []; const accountingChildren = [];
@@ -695,6 +695,31 @@ function Header({
} }
]; ];
InstanceRenderManager({
executeFunction: true,
args: [],
imex: () => {
menuItems.push({
key: "beta-switch",
id: "header-beta-switch",
style: { marginLeft: "auto" },
label: (
<Tooltip
title={`A more modern ${InstanceRenderManager({
imex: t("titles.imexonline"),
rome: t("titles.romeonline"),
promanager: t("titles.promanager")
})} is ready for you to try! You can switch back at any time.`}
>
<InfoCircleOutlined />
<span style={{ marginRight: 8 }}>Try the new app</span>
<Switch checked={betaSwitch} onChange={betaSwitchChange} />
</Tooltip>
)
});
}
});
return ( return (
<Layout.Header> <Layout.Header>
<Menu <Menu

View File

@@ -6,11 +6,11 @@ import {
PauseCircleOutlined PauseCircleOutlined
} from "@ant-design/icons"; } from "@ant-design/icons";
import { Card, Col, Row, Space, Tooltip } from "antd"; import { Card, Col, Row, Space, Tooltip } from "antd";
import Dinero from "dinero.js";
import React, { useMemo } from "react"; import React, { useMemo } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { DateTimeFormatter } from "../../utils/DateFormatter"; import { DateTimeFormatter } from "../../utils/DateFormatter";
import Dinero from "dinero.js";
import ProductionAlert from "../production-list-columns/production-list-columns.alert.component"; import ProductionAlert from "../production-list-columns/production-list-columns.alert.component";
import ProductionListColumnProductionNote from "../production-list-columns/production-list-columns.productionnote.component"; import ProductionListColumnProductionNote from "../production-list-columns/production-list-columns.productionnote.component";
@@ -18,8 +18,8 @@ import ProductionSubletsManageComponent from "../production-sublets-manage/produ
import dayjs from "../../utils/day"; import dayjs from "../../utils/day";
import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component";
const cardColor = (ssbuckets, totalHrs) => { const cardColor = (ssbuckets, totalHrs) => {
const bucket = ssbuckets.find((bucket) => bucket.gte <= totalHrs && (!bucket.lt || bucket.lt > totalHrs)); const bucket = ssbuckets.find((bucket) => bucket.gte <= totalHrs && (!bucket.lt || bucket.lt > totalHrs));
@@ -213,13 +213,21 @@ const EstimatorToolTip = ({ metadata, cardSettings }) => {
}; };
const SubtotalTooltip = ({ metadata, cardSettings, t }) => { const SubtotalTooltip = ({ metadata, cardSettings, t }) => {
const dineroAmount = Dinero(metadata?.job_totals?.totals?.subtotal ?? Dinero()).toFormat(); const amount = metadata?.job_totals?.totals?.subtotal?.amount;
const dineroAmount = amount ? Dinero({ amount: parseInt(amount * 100) }).toFormat("0,0.00") : null;
return ( return (
cardSettings?.subtotal && ( cardSettings?.subtotal && (
<Col span={cardSettings.compact ? 24 : 12}> <Col span={cardSettings.compact ? 24 : 12}>
<EllipsesToolTip title={`${dineroAmount}`} kiosk={cardSettings.kiosk}> <EllipsesToolTip
{dineroAmount} title={!!amount ? `${t("production.statistics.currency_symbol")}${dineroAmount}` : null}
kiosk={cardSettings.kiosk}
>
{!!amount ? (
<span>{`${t("production.statistics.currency_symbol")}${dineroAmount}`}</span>
) : (
<span>&nbsp;</span>
)}
</EllipsesToolTip> </EllipsesToolTip>
</Col> </Col>
) )

View File

@@ -3,7 +3,6 @@ import { Card, Statistic } from "antd";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { defaultKanbanSettings, statisticsItems } from "./settings/defaultKanbanSettings.js"; import { defaultKanbanSettings, statisticsItems } from "./settings/defaultKanbanSettings.js";
import Dinero from "dinero.js";
export const StatisticType = { export const StatisticType = {
HOURS: "hours", HOURS: "hours",
@@ -33,21 +32,7 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => {
}; };
const calculateTotalAmount = (items, key) => { const calculateTotalAmount = (items, key) => {
return items.reduce((acc, item) => acc.add(Dinero(item[key]?.totals?.subtotal ?? Dinero())), Dinero({ amount: 0 })); return items.reduce((acc, item) => acc + (item[key]?.totals?.subtotal?.amount || 0), 0);
};
const calculateReducerTotalAmount = (lanes, key) => {
return lanes.reduce(
(acc, lane) => {
return acc.add(
lane.cards.reduce(
(laneAcc, card) => laneAcc.add(Dinero(card.metadata[key]?.totals?.subtotal ?? Dinero())),
Dinero({ amount: 0 })
)
);
},
Dinero({ amount: 0 })
);
}; };
const calculateReducerTotal = (lanes, key, subKey) => { const calculateReducerTotal = (lanes, key, subKey) => {
@@ -58,6 +43,14 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => {
}, 0); }, 0);
}; };
const calculateReducerTotalAmount = (lanes, key) => {
return lanes.reduce((acc, lane) => {
return (
acc + lane.cards.reduce((laneAcc, card) => laneAcc + (card.metadata[key]?.totals?.subtotal?.amount || 0), 0)
);
}, 0);
};
const formatValue = (value, type) => { const formatValue = (value, type) => {
if (type === StatisticType.JOBS) { if (type === StatisticType.JOBS) {
return value.toFixed(0); return value.toFixed(0);
@@ -94,15 +87,9 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => {
const totalAmountInProduction = useMemo(() => { const totalAmountInProduction = useMemo(() => {
if (!cardSettings.totalAmountInProduction) return null; if (!cardSettings.totalAmountInProduction) return null;
const total = calculateTotalAmount(data, "job_totals"); const total = calculateTotalAmount(data, "job_totals");
return total.toFormat("$0,0.00"); return parseFloat(total.toFixed(2));
}, [data, cardSettings.totalAmountInProduction]); }, [data, cardSettings.totalAmountInProduction]);
const totalAmountOnBoard = useMemo(() => {
if (!reducerData || !cardSettings.totalAmountOnBoard) return null;
const total = calculateReducerTotalAmount(reducerData.lanes, "job_totals");
return total.toFormat("$0,0.00");
}, [reducerData, cardSettings.totalAmountOnBoard]);
const totalHrsOnBoard = useMemo(() => { const totalHrsOnBoard = useMemo(() => {
if (!reducerData || !cardSettings.totalHrsOnBoard) return null; if (!reducerData || !cardSettings.totalHrsOnBoard) return null;
const total = const total =
@@ -131,6 +118,12 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => {
[reducerData, cardSettings.jobsOnBoard] [reducerData, cardSettings.jobsOnBoard]
); );
const totalAmountOnBoard = useMemo(() => {
if (!reducerData || !cardSettings.totalAmountOnBoard) return null;
const total = calculateReducerTotalAmount(reducerData.lanes, "job_totals");
return parseFloat(total.toFixed(2));
}, [reducerData, cardSettings.totalAmountOnBoard]);
const tasksInProduction = useMemo(() => { const tasksInProduction = useMemo(() => {
if (!data || !cardSettings.tasksInProduction) return null; if (!data || !cardSettings.tasksInProduction) return null;
return data.reduce((acc, item) => acc + (item.tasks_aggregate?.aggregate?.count || 0), 0); return data.reduce((acc, item) => acc + (item.tasks_aggregate?.aggregate?.count || 0), 0);
@@ -198,6 +191,7 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => {
<Statistic <Statistic
title={t(`production.statistics.${stat.label}`)} title={t(`production.statistics.${stat.label}`)}
value={formatValue(stat.value, stat.type)} value={formatValue(stat.value, stat.type)}
prefix={stat.type === StatisticType.AMOUNT ? t("production.statistics.currency_symbol") : undefined}
suffix={ suffix={
stat.type === StatisticType.HOURS stat.type === StatisticType.HOURS
? t("production.statistics.hours") ? t("production.statistics.hours")

View File

@@ -30,226 +30,219 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
return ( return (
<RbacWrapper action="shop:rbac"> <RbacWrapper action="shop:rbac">
<LayoutFormRow> <LayoutFormRow>
{...HasFeatureAccess({ featureName: "export", bodyshop }) {...HasFeatureAccess({ featureName: "export", bodyshop }) ? [
? [ <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.accounting.exportlog")}
label={t("bodyshop.fields.rbac.accounting.exportlog")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "accounting:exportlog"]}
name={["md_rbac", "accounting:exportlog"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.accounting.payables")}
label={t("bodyshop.fields.rbac.accounting.payables")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "accounting:payables"]}
name={["md_rbac", "accounting:payables"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.accounting.payments")}
label={t("bodyshop.fields.rbac.accounting.payments")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "accounting:payments"]}
name={["md_rbac", "accounting:payments"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.accounting.receivables")}
label={t("bodyshop.fields.rbac.accounting.receivables")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "accounting:receivables"]}
name={["md_rbac", "accounting:receivables"]} >
> <InputNumber />
<InputNumber /> </Form.Item>
</Form.Item> ]:[]}
] {...HasFeatureAccess({ featureName: "bills", bodyshop }) ? [
: []} <Form.Item
{...HasFeatureAccess({ featureName: "bills", bodyshop }) label={t("bodyshop.fields.rbac.bills.delete")}
? [ rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.delete")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:delete"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:delete"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.bills.enter")}
</Form.Item>, rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.enter")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:enter"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:enter"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.bills.list")}
</Form.Item>, rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.list")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:list"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:list"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.bills.reexport")}
</Form.Item>, rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.reexport")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:reexport"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:reexport"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.bills.view")}
</Form.Item>, rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.view")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:view"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:view"]} </Form.Item>
> ]:[]}
<InputNumber />
</Form.Item> {...HasFeatureAccess({ featureName: "courtesycars", bodyshop }) ? [
] <Form.Item
: []} label={t("bodyshop.fields.rbac.contracts.create")}
{...HasFeatureAccess({ featureName: "courtesycars", bodyshop }) rules={[
? [ {
<Form.Item required: true
label={t("bodyshop.fields.rbac.contracts.create")} //message: t("general.validation.required"),
rules={[ }
{ ]}
required: true name={["md_rbac", "contracts:create"]}
//message: t("general.validation.required"), >
} <InputNumber />
]} </Form.Item>,
name={["md_rbac", "contracts:create"]} <Form.Item
> label={t("bodyshop.fields.rbac.contracts.detail")}
<InputNumber /> rules={[
</Form.Item>, {
<Form.Item required: true
label={t("bodyshop.fields.rbac.contracts.detail")} //message: t("general.validation.required"),
rules={[ }
{ ]}
required: true name={["md_rbac", "contracts:detail"]}
//message: t("general.validation.required"), >
} <InputNumber />
]} </Form.Item>,
name={["md_rbac", "contracts:detail"]} <Form.Item
> label={t("bodyshop.fields.rbac.contracts.list")}
<InputNumber /> rules={[
</Form.Item>, {
<Form.Item required: true
label={t("bodyshop.fields.rbac.contracts.list")} //message: t("general.validation.required"),
rules={[ }
{ ]}
required: true name={["md_rbac", "contracts:list"]}
//message: t("general.validation.required"), >
} <InputNumber />
]} </Form.Item>,
name={["md_rbac", "contracts:list"]} <Form.Item
> label={t("bodyshop.fields.rbac.courtesycar.create")}
<InputNumber /> rules={[
</Form.Item>, {
<Form.Item required: true
label={t("bodyshop.fields.rbac.courtesycar.create")} //message: t("general.validation.required"),
rules={[ }
{ ]}
required: true name={["md_rbac", "courtesycar:create"]}
//message: t("general.validation.required"), >
} <InputNumber />
]} </Form.Item>,
name={["md_rbac", "courtesycar:create"]} <Form.Item
> label={t("bodyshop.fields.rbac.courtesycar.detail")}
<InputNumber /> rules={[
</Form.Item>, {
<Form.Item required: true
label={t("bodyshop.fields.rbac.courtesycar.detail")} //message: t("general.validation.required"),
rules={[ }
{ ]}
required: true name={["md_rbac", "courtesycar:detail"]}
//message: t("general.validation.required"), >
} <InputNumber />
]} </Form.Item>,
name={["md_rbac", "courtesycar:detail"]} <Form.Item
> label={t("bodyshop.fields.rbac.courtesycar.list")}
<InputNumber /> rules={[
</Form.Item>, {
<Form.Item required: true
label={t("bodyshop.fields.rbac.courtesycar.list")} //message: t("general.validation.required"),
rules={[ }
{ ]}
required: true name={["md_rbac", "courtesycar:list"]}
//message: t("general.validation.required"), >
} <InputNumber />
]} </Form.Item>
name={["md_rbac", "courtesycar:list"]} ]:[]}
> {...HasFeatureAccess({ featureName: "csi", bodyshop }) ? [
<InputNumber /> <Form.Item
</Form.Item> label={t("bodyshop.fields.rbac.csi.export")}
] rules={[
: []} {
{...HasFeatureAccess({ featureName: "csi", bodyshop }) required: true
? [ //message: t("general.validation.required"),
<Form.Item }
label={t("bodyshop.fields.rbac.csi.export")} ]}
rules={[ name={["md_rbac", "csi:export"]}
{ >
required: true <InputNumber />
//message: t("general.validation.required"), </Form.Item>,
} <Form.Item
]} label={t("bodyshop.fields.rbac.csi.page")}
name={["md_rbac", "csi:export"]} rules={[
> {
<InputNumber /> required: true
</Form.Item>, //message: t("general.validation.required"),
<Form.Item }
label={t("bodyshop.fields.rbac.csi.page")} ]}
rules={[ name={["md_rbac", "csi:page"]}
{ >
required: true <InputNumber />
//message: t("general.validation.required"), </Form.Item>
} ]:[]}
]}
name={["md_rbac", "csi:page"]}
>
<InputNumber />
</Form.Item>
]
: []}
<Form.Item <Form.Item
label={t("bodyshop.fields.rbac.employees.page")} label={t("bodyshop.fields.rbac.employees.page")}
rules={[ rules={[
@@ -262,18 +255,6 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
> >
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.employee_teams.page")}
rules={[
{
required: true
//message: t("general.validation.required"),
}
]}
name={["md_rbac", "employee_teams:page"]}
>
<InputNumber />
</Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.rbac.jobs.admin")} label={t("bodyshop.fields.rbac.jobs.admin")}
rules={[ rules={[
@@ -454,6 +435,31 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
> >
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.employees.page")}
rules={[
{
required: true
//message: t("general.validation.required"),
}
]}
name={["md_rbac", "employees:page"]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.employee_teams.page")}
rules={[
{
required: true
//message: t("general.validation.required"),
}
]}
name={["md_rbac", "employee_teams:page"]}
>
<InputNumber />
</Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.rbac.payments.enter")} label={t("bodyshop.fields.rbac.payments.enter")}
rules={[ rules={[
@@ -516,6 +522,7 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
)} )}
<Form.Item <Form.Item
label={t("bodyshop.fields.rbac.production.list")} label={t("bodyshop.fields.rbac.production.list")}
rules={[ rules={[
@@ -554,118 +561,128 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
)} )}
{...HasFeatureAccess({ featureName: "timetickets", bodyshop }) {...HasFeatureAccess({ featureName: "timetickets", bodyshop }) ? [
? [ <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.shiftclock.view")}
label={t("bodyshop.fields.rbac.shiftclock.view")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "shiftclock:view"]}
name={["md_rbac", "shiftclock:view"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.shop.config")}
label={t("bodyshop.fields.rbac.shop.config")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "shop:config"]}
name={["md_rbac", "shop:config"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.edit")}
label={t("bodyshop.fields.rbac.timetickets.edit")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:edit"]}
name={["md_rbac", "timetickets:edit"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.shiftedit")}
label={t("bodyshop.fields.rbac.timetickets.shiftedit")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:shiftedit"]}
name={["md_rbac", "timetickets:shiftedit"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.editcommitted")}
label={t("bodyshop.fields.rbac.timetickets.editcommitted")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:editcommitted"]}
name={["md_rbac", "timetickets:editcommitted"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.ttapprovals.view")}
label={t("bodyshop.fields.rbac.ttapprovals.view")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "ttapprovals:view"]}
name={["md_rbac", "ttapprovals:view"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.ttapprovals.approve")}
label={t("bodyshop.fields.rbac.ttapprovals.approve")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "ttapprovals:approve"]}
name={["md_rbac", "ttapprovals:approve"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.enter")}
label={t("bodyshop.fields.rbac.timetickets.enter")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:enter"]}
name={["md_rbac", "timetickets:enter"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item>, <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.list")}
label={t("bodyshop.fields.rbac.timetickets.list")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:list"]}
name={["md_rbac", "timetickets:list"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
] label={t("bodyshop.fields.rbac.timetickets.shiftedit")}
: []} rules={[
{
required: true
//message: t("general.validation.required"),
}
]}
name={["md_rbac", "timetickets:shiftedit"]}
>
<InputNumber />
</Form.Item>
]:[]}
<Form.Item <Form.Item
label={t("bodyshop.fields.rbac.shop.vendors")} label={t("bodyshop.fields.rbac.shop.vendors")}
rules={[ rules={[
@@ -740,6 +757,7 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
)} )}
<Form.Item <Form.Item
label={t("bodyshop.fields.rbac.users.editaccess")} label={t("bodyshop.fields.rbac.users.editaccess")}
rules={[ rules={[

View File

@@ -12,7 +12,7 @@ import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter";
import { onlyUnique } from "../../utils/arrayHelper"; import { onlyUnique } from "../../utils/arrayHelper";
import dayjs from "../../utils/day"; import dayjs from "../../utils/day";
import { alphaSort, dateSort } from "../../utils/sorters"; import { alphaSort, dateSort } from "../../utils/sorters";
import { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component"; import RbacWrapper, { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component";
import TimeTicketEnterButton from "../time-ticket-enter-button/time-ticket-enter-button.component"; import TimeTicketEnterButton from "../time-ticket-enter-button/time-ticket-enter-button.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -52,10 +52,6 @@ export function TimeTicketList({
splitKey: bodyshop.imexshopid splitKey: bodyshop.imexshopid
}); });
const canEditCommittedTimeTickets = HasRbacAccess({ bodyshop, authLevel, action: "timetickets:editcommitted" });
const canEditTimeTickets = HasRbacAccess({ bodyshop, authLevel, action: "timetickets:edit" });
const canEditShiftTickets = HasRbacAccess({ bodyshop, authLevel, action: "timetickets:shiftedit" });
const totals = useMemo(() => { const totals = useMemo(() => {
if (timetickets) if (timetickets)
return timetickets.reduce( return timetickets.reduce(
@@ -69,18 +65,6 @@ export function TimeTicketList({
return { productivehrs: 0, actualhrs: 0 }; return { productivehrs: 0, actualhrs: 0 };
}, [timetickets]); }, [timetickets]);
const isDisabled = (record) => {
if (disabled === true || !record.id) return true;
const isShiftTicket = !record.ciecacode;
const isCommitted = record.committed_at;
if (isShiftTicket) {
return !(canEditShiftTickets && (!isCommitted || canEditCommittedTimeTickets));
}
return !(canEditTimeTickets && (!isCommitted || canEditCommittedTimeTickets));
};
const columns = [ const columns = [
...(Enhanced_Payroll.treatment === "on" ...(Enhanced_Payroll.treatment === "on"
? [ ? [
@@ -257,16 +241,59 @@ export function TimeTicketList({
</TimeTicketEnterButton> </TimeTicketEnterButton>
)} )}
{!techConsole && ( {!techConsole && (
<TimeTicketEnterButton <RbacWrapper
actions={{ refetch }} action="timetickets:edit"
context={{ noauth={() => {
id: record.id, return <div />;
timeticket: record
}} }}
disabled={isDisabled(record)}
> >
<EditFilled /> <TimeTicketEnterButton
</TimeTicketEnterButton> actions={{ refetch }}
context={{
id: record.id,
timeticket: record
}}
disabled={
record.ciecacode
? record.committed_at
? HasRbacAccess({
bodyshop,
authLevel: authLevel,
action: "timetickets:editcommitted"
}) &&
HasRbacAccess({
bodyshop,
authLevel: authLevel,
action: "timetickets:edit"
})
: HasRbacAccess({
bodyshop,
authLevel: authLevel,
action: "timetickets:edit"
})
: record.committed_at
? HasRbacAccess({
bodyshop,
authLevel: authLevel,
action: "timetickets:editcommitted"
}) &&
HasRbacAccess({
bodyshop,
authLevel: authLevel,
action: "timetickets:shiftedit"
})
: HasRbacAccess({
bodyshop,
authLevel: authLevel,
action: "timetickets:shiftedit"
})
? disabled
: !record.jobid
}
>
<EditFilled />
</TimeTicketEnterButton>
</RbacWrapper>
)} )}
</Space> </Space>
) )

View File

@@ -329,9 +329,7 @@ export function LaborAllocationContainer({ jobid, loading, lineTicketData, hideT
timetickets={lineTicketData.timetickets} timetickets={lineTicketData.timetickets}
adjustments={lineTicketData.jobs_by_pk.lbr_adjustments} adjustments={lineTicketData.jobs_by_pk.lbr_adjustments}
/> />
{!hideTimeTickets && ( {!hideTimeTickets && <TimeTicketList loading={loading} timetickets={lineTicketData.timetickets} techConsole />}
<TimeTicketList loading={loading} timetickets={jobid ? lineTicketData.timetickets : []} techConsole />
)}
</div> </div>
); );
} }

View File

@@ -1,14 +1,13 @@
import { AlertOutlined } from "@ant-design/icons"; import { AlertOutlined } from "@ant-design/icons";
import { Alert, Button, Col, notification, Row, Space } from "antd"; import { Alert, Button, Col, Row, Space } from "antd";
import i18n from "i18next"; import i18n from "i18next";
import React, { useCallback, useEffect, useState } from "react"; import React, { useEffect } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectUpdateAvailable } from "../../redux/application/application.selectors"; import { selectUpdateAvailable } from "../../redux/application/application.selectors";
import { useRegisterSW } from "virtual:pwa-register/react"; import { useRegisterSW } from "virtual:pwa-register/react";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import useCountDown from "../../utils/countdownHook";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
updateAvailable: selectUpdateAvailable updateAvailable: selectUpdateAvailable
@@ -20,15 +19,6 @@ const mapDispatchToProps = (dispatch) => ({
export function UpdateAlert({ updateAvailable }) { export function UpdateAlert({ updateAvailable }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [timerStarted, setTimerStarted] = useState(false);
const [loading, setLoading] = useState(false);
const [
timeLeft,
{
start //pause, resume, reset
}
] = useCountDown(180000, 1000);
const { const {
offlineReady: [offlineReady], offlineReady: [offlineReady],
needRefresh: [needRefresh], needRefresh: [needRefresh],
@@ -41,7 +31,7 @@ export function UpdateAlert({ updateAvailable }) {
() => { () => {
r.update(); r.update();
}, },
30 * 60 * 1000 10 * 60 * 1000
); );
} }
}, },
@@ -50,43 +40,11 @@ export function UpdateAlert({ updateAvailable }) {
} }
}); });
const ReloadNewVersion = useCallback(() => {
setLoading(true);
updateServiceWorker(true);
setTimeout(() => {
window.location.reload(true);
}, 5000);
}, [updateServiceWorker]);
useEffect(() => { useEffect(() => {
if (needRefresh) { if (import.meta.env.DEV) {
start(); console.log(`SW Status => Refresh? ${needRefresh} - offlineReady? ${offlineReady}`);
setTimerStarted(true);
} }
}, [start, needRefresh, offlineReady]); }, [needRefresh, offlineReady]);
useEffect(() => {
if (needRefresh && timerStarted && timeLeft < 60000) {
notification.open({
type: "warning",
closable: false,
duration: 65000,
key: "autoupdate",
message: t("general.actions.autoupdate", {
time: (timeLeft / 1000).toFixed(0),
app: InstanceRenderManager({
imex: "$t(titles.imexonline)",
rome: "$t(titles.romeonline)",
promanager: "$t(titles.promanager)"
})
}),
placement: "bottomRight"
});
}
if (needRefresh && timerStarted && timeLeft <= 0) {
ReloadNewVersion();
}
}, [timeLeft, t, needRefresh, ReloadNewVersion, timerStarted]);
if (!needRefresh) return null; if (!needRefresh) return null;
@@ -117,10 +75,9 @@ export function UpdateAlert({ updateAvailable }) {
<Button onClick={() => window.open("https://imex-online.noticeable.news/", "_blank")}> <Button onClick={() => window.open("https://imex-online.noticeable.news/", "_blank")}>
{i18n.t("general.actions.viewreleasenotes")} {i18n.t("general.actions.viewreleasenotes")}
</Button> </Button>
<Button loading={loading} type="primary" onClick={() => ReloadNewVersion()}> <Button type="primary" onClick={() => updateServiceWorker(true)}>
{i18n.t("general.actions.refresh")} {`(${(timeLeft / 1000).toFixed(0)} s)`} {i18n.t("general.actions.refresh")}
</Button> </Button>
<Button onClick={() => start(300000)}>{i18n.t("general.actions.delay")}</Button>
</Space> </Space>
</Col> </Col>
</Row> </Row>

View File

@@ -5,6 +5,7 @@ import { getFirestore } from "firebase/firestore";
import { getMessaging, getToken, onMessage } from "firebase/messaging"; import { getMessaging, getToken, onMessage } from "firebase/messaging";
import { store } from "../redux/store"; import { store } from "../redux/store";
import axios from "axios"; import axios from "axios";
import { checkBeta } from "../utils/handleBeta";
const config = JSON.parse(import.meta.env.VITE_APP_FIREBASE_CONFIG); const config = JSON.parse(import.meta.env.VITE_APP_FIREBASE_CONFIG);
initializeApp(config); initializeApp(config);
@@ -87,7 +88,7 @@ export const logImEXEvent = (eventName, additionalParams, stateProp = null) => {
operationName: eventName, operationName: eventName,
variables: additionalParams, variables: additionalParams,
dbevent: false, dbevent: false,
env: "master" env: checkBeta() ? "beta" : "master"
}); });
// console.log( // console.log(
// "%c[Analytics]", // "%c[Analytics]",

View File

@@ -3,7 +3,6 @@ import { useTranslation } from "react-i18next";
import RbacWrapperComponent from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapperComponent from "../../components/rbac-wrapper/rbac-wrapper.component";
import TechLookupJobsList from "../../components/tech-lookup-jobs-list/tech-lookup-jobs-list.component"; import TechLookupJobsList from "../../components/tech-lookup-jobs-list/tech-lookup-jobs-list.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import TechLookupJobsDrawer from "../../components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component";
export default function TechLookupContainer() { export default function TechLookupContainer() {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -21,7 +20,6 @@ export default function TechLookupContainer() {
return ( return (
<div> <div>
<RbacWrapperComponent action="jobs:list-active"> <RbacWrapperComponent action="jobs:list-active">
<TechLookupJobsDrawer />
<TechLookupJobsList /> <TechLookupJobsList />
</RbacWrapperComponent> </RbacWrapperComponent>
</div> </div>

View File

@@ -9,6 +9,7 @@ import ErrorBoundary from "../../components/error-boundary/error-boundary.compon
import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import TechHeader from "../../components/tech-header/tech-header.component"; import TechHeader from "../../components/tech-header/tech-header.component";
import TechLookupJobsDrawer from "../../components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component";
import TechSider from "../../components/tech-sider/tech-sider.component"; import TechSider from "../../components/tech-sider/tech-sider.component";
import UpdateAlert from "../../components/update-alert/update-alert.component"; import UpdateAlert from "../../components/update-alert/update-alert.component";
import { selectTechnician } from "../../redux/tech/tech.selectors"; import { selectTechnician } from "../../redux/tech/tech.selectors";
@@ -67,7 +68,7 @@ export function TechPage({ technician }) {
<Layout> <Layout>
<UpdateAlert /> <UpdateAlert />
<TechHeader /> <TechHeader />
<TechLookupJobsDrawer />
<TaskUpsertModalContainer /> <TaskUpsertModalContainer />
<Content className="tech-content-container"> <Content className="tech-content-container">
<ErrorBoundary> <ErrorBoundary>

View File

@@ -10,7 +10,7 @@ import {
signInWithEmailAndPassword, signInWithEmailAndPassword,
signOut signOut
} from "firebase/auth"; } from "firebase/auth";
import { arrayUnion, doc, getDoc, setDoc, updateDoc } from "firebase/firestore"; import { doc, getDoc, setDoc } from "firebase/firestore";
import { getToken } from "firebase/messaging"; import { getToken } from "firebase/messaging";
import i18next from "i18next"; import i18next from "i18next";
import LogRocket from "logrocket"; import LogRocket from "logrocket";
@@ -48,7 +48,6 @@ import {
validatePasswordResetSuccess validatePasswordResetSuccess
} from "./user.actions"; } from "./user.actions";
import UserActionTypes from "./user.types"; import UserActionTypes from "./user.types";
import cleanAxios from "../../utils/CleanAxios";
const fpPromise = FingerprintJS.load(); const fpPromise = FingerprintJS.load();
@@ -178,24 +177,10 @@ export function* setInstanceIdSaga({ payload: uid }) {
// Get the visitor identifier when you need it. // Get the visitor identifier when you need it.
const fp = yield fpPromise; const fp = yield fpPromise;
const result = yield fp.get(); const result = yield fp.get();
const res = yield cleanAxios.get("https://api.ipify.org/?format=json"); yield setDoc(userInstanceRef, {
const udoc = yield getDoc(userInstanceRef); timestamp: new Date(),
fingerprint: result.visitorId
if (!udoc.data()) { });
yield setDoc(userInstanceRef, {
timestamp: new Date(),
fingerprint: result.visitorId,
//totalFingerprint: result,
ip: [res.data.ip]
});
} else {
yield updateDoc(userInstanceRef, {
timestamp: new Date(),
fingerprint: result.visitorId,
//totalFingerprint: result,
ip: arrayUnion(res.data.ip)
});
}
yield put(setLocalFingerprint(result.visitorId)); yield put(setLocalFingerprint(result.visitorId));
yield delay(5 * 60 * 1000); yield delay(5 * 60 * 1000);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,84 +0,0 @@
import React from "react";
const useCountDown = (timeToCount = 60 * 1000, interval = 1000) => {
const [timeLeft, setTimeLeft] = React.useState(0);
const timer = React.useRef({});
const run = (ts) => {
if (!timer.current.started) {
timer.current.started = ts;
timer.current.lastInterval = ts;
}
const localInterval = Math.min(interval, timer.current.timeLeft || Infinity);
if (ts - timer.current.lastInterval >= localInterval) {
timer.current.lastInterval += localInterval;
setTimeLeft((timeLeft) => {
timer.current.timeLeft = timeLeft - localInterval;
return timer.current.timeLeft;
});
}
if (ts - timer.current.started < timer.current.timeToCount) {
timer.current.requestId = window.requestAnimationFrame(run);
} else {
timer.current = {};
setTimeLeft(0);
}
};
const start = React.useCallback(
(ttc) => {
window.cancelAnimationFrame(timer.current.requestId);
const newTimeToCount = ttc !== undefined ? ttc : timeToCount;
timer.current.started = null;
timer.current.lastInterval = null;
timer.current.timeToCount = newTimeToCount;
timer.current.requestId = window.requestAnimationFrame(run);
setTimeLeft(newTimeToCount);
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
const pause = React.useCallback(() => {
window.cancelAnimationFrame(timer.current.requestId);
timer.current.started = null;
timer.current.lastInterval = null;
timer.current.timeToCount = timer.current.timeLeft;
}, []);
const resume = React.useCallback(
() => {
if (!timer.current.started && timer.current.timeLeft > 0) {
window.cancelAnimationFrame(timer.current.requestId);
timer.current.requestId = window.requestAnimationFrame(run);
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
const reset = React.useCallback(() => {
if (timer.current.timeLeft) {
window.cancelAnimationFrame(timer.current.requestId);
timer.current = {};
setTimeLeft(0);
}
}, []);
const actions = React.useMemo(
() => ({ start, pause, resume, reset }), // eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
React.useEffect(() => {
return () => window.cancelAnimationFrame(timer.current.requestId);
}, []);
return [timeLeft, actions];
};
export default useCountDown;

View File

@@ -0,0 +1,47 @@
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 (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;
// Determine if the host name starts with "beta" or "www.beta"
const isBetaHost = currentHostName.startsWith("beta.");
const isBetaHostWithWWW = currentHostName.startsWith("www.beta.");
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;

View File

@@ -121,7 +121,7 @@ export default defineConfig({
} }
}, },
optimizeDeps: { optimizeDeps: {
include: ["react", "react-dom", "antd", "@apollo/client", "@reduxjs/toolkit", "axios"], include: ["react", "react-dom", "antd", "@apollo/client", "@reduxjs/toolkit", "axios", "react-grid-layout"],
esbuildOptions: { esbuildOptions: {
loader: { loader: {
".js": "jsx" ".js": "jsx"

View File

@@ -1,5 +1,5 @@
version: 2 version: 2
endpoint: https://db.dev.imex.online endpoint: https://db.dev.bodyshop.app
admin_secret: Dev-BodyShopApp! admin_secret: Dev-BodyShopApp!
metadata_directory: metadata metadata_directory: metadata
actions: actions:

341
package-lock.json generated
View File

@@ -9,17 +9,17 @@
"version": "0.2.0", "version": "0.2.0",
"license": "UNLICENSED", "license": "UNLICENSED",
"dependencies": { "dependencies": {
"@aws-sdk/client-secrets-manager": "^3.629.0", "@aws-sdk/client-secrets-manager": "^3.637.0",
"@aws-sdk/client-ses": "^3.629.0", "@aws-sdk/client-ses": "^3.637.0",
"@aws-sdk/credential-provider-node": "^3.629.0", "@aws-sdk/credential-provider-node": "^3.637.0",
"@opensearch-project/opensearch": "^2.11.0", "@opensearch-project/opensearch": "^2.12.0",
"aws4": "^1.13.1", "aws4": "^1.13.2",
"axios": "^1.7.4", "axios": "^1.7.7",
"better-queue": "^3.8.12", "better-queue": "^3.8.12",
"bluebird": "^3.7.2", "bluebird": "^3.7.2",
"body-parser": "^1.20.2", "body-parser": "^1.20.2",
"canvas": "^2.11.2", "canvas": "^2.11.2",
"chart.js": "^4.4.3", "chart.js": "^4.4.4",
"cloudinary": "^2.4.0", "cloudinary": "^2.4.0",
"compression": "^1.7.4", "compression": "^1.7.4",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
@@ -28,7 +28,7 @@
"dinero.js": "^1.9.1", "dinero.js": "^1.9.1",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"express": "^4.19.2", "express": "^4.19.2",
"firebase-admin": "^12.3.1", "firebase-admin": "^12.4.0",
"graphql": "^16.9.0", "graphql": "^16.9.0",
"graphql-request": "^6.1.0", "graphql-request": "^6.1.0",
"graylog2": "^0.2.1", "graylog2": "^0.2.1",
@@ -39,13 +39,13 @@
"moment": "^2.30.1", "moment": "^2.30.1",
"moment-timezone": "^0.5.45", "moment-timezone": "^0.5.45",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"node-mailjet": "^6.0.5", "node-mailjet": "^6.0.6",
"node-persist": "^4.0.3", "node-persist": "^4.0.3",
"nodemailer": "^6.9.14", "nodemailer": "^6.9.15",
"phone": "^3.1.49", "phone": "^3.1.50",
"recursive-diff": "^1.0.9", "recursive-diff": "^1.0.9",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"soap": "^1.1.1", "soap": "^1.1.3",
"socket.io": "^4.7.5", "socket.io": "^4.7.5",
"ssh2-sftp-client": "^10.0.3", "ssh2-sftp-client": "^10.0.3",
"twilio": "^4.23.0", "twilio": "^4.23.0",
@@ -180,47 +180,47 @@
} }
}, },
"node_modules/@aws-sdk/client-secrets-manager": { "node_modules/@aws-sdk/client-secrets-manager": {
"version": "3.629.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.637.0.tgz",
"integrity": "sha512-ZZKI9uTQ3WIdbCZK6sveccalLTWgyOZeebi+Gnwl5ztKMk4OfwZKxyhry1DXB8gMrlISniREDb3ZxUZdFNwqfQ==", "integrity": "sha512-4AEV+4yhaFYlnD90MbtOouqTyrPVmD8OeGotsjtWxgnVHk55Vd0/dIWVGjic0YCxH3SNdWqJJ9G8Vd93fWymVA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0", "@aws-crypto/sha256-js": "5.2.0",
"@aws-sdk/client-sso-oidc": "3.629.0", "@aws-sdk/client-sso-oidc": "3.637.0",
"@aws-sdk/client-sts": "3.629.0", "@aws-sdk/client-sts": "3.637.0",
"@aws-sdk/core": "3.629.0", "@aws-sdk/core": "3.635.0",
"@aws-sdk/credential-provider-node": "3.629.0", "@aws-sdk/credential-provider-node": "3.637.0",
"@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-host-header": "3.620.0",
"@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.620.0", "@aws-sdk/middleware-recursion-detection": "3.620.0",
"@aws-sdk/middleware-user-agent": "3.620.0", "@aws-sdk/middleware-user-agent": "3.637.0",
"@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@aws-sdk/util-endpoints": "3.614.0", "@aws-sdk/util-endpoints": "3.637.0",
"@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-browser": "3.609.0",
"@aws-sdk/util-user-agent-node": "3.614.0", "@aws-sdk/util-user-agent-node": "3.614.0",
"@smithy/config-resolver": "^3.0.5", "@smithy/config-resolver": "^3.0.5",
"@smithy/core": "^2.3.2", "@smithy/core": "^2.4.0",
"@smithy/fetch-http-handler": "^3.2.4", "@smithy/fetch-http-handler": "^3.2.4",
"@smithy/hash-node": "^3.0.3", "@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-content-length": "^3.0.5",
"@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-endpoint": "^3.1.0",
"@smithy/middleware-retry": "^3.0.14", "@smithy/middleware-retry": "^3.0.15",
"@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3", "@smithy/middleware-stack": "^3.0.3",
"@smithy/node-config-provider": "^3.1.4", "@smithy/node-config-provider": "^3.1.4",
"@smithy/node-http-handler": "^3.1.4", "@smithy/node-http-handler": "^3.1.4",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3", "@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0", "@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0",
"@smithy/util-defaults-mode-browser": "^3.0.14", "@smithy/util-defaults-mode-browser": "^3.0.15",
"@smithy/util-defaults-mode-node": "^3.0.14", "@smithy/util-defaults-mode-node": "^3.0.15",
"@smithy/util-endpoints": "^2.0.5", "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3", "@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3", "@smithy/util-retry": "^3.0.3",
@@ -245,47 +245,47 @@
} }
}, },
"node_modules/@aws-sdk/client-ses": { "node_modules/@aws-sdk/client-ses": {
"version": "3.629.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.637.0.tgz",
"integrity": "sha512-KreCdUAO/gIzWCgnPV1/dGUvLDDTdXI3fZzjjHUWFa1bE4wENjenNnWGw0qZgc8xB8pgiMdgPn7N+JvxJ7c/ZQ==", "integrity": "sha512-pHkI8iMxbdtNeaa0a+c0T29bRZMFu8HQtGtwPlSwvD1elDVFrlWXw74MrlaW0aRPGryF4sHxVHk3YkxhxAS5iw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0", "@aws-crypto/sha256-js": "5.2.0",
"@aws-sdk/client-sso-oidc": "3.629.0", "@aws-sdk/client-sso-oidc": "3.637.0",
"@aws-sdk/client-sts": "3.629.0", "@aws-sdk/client-sts": "3.637.0",
"@aws-sdk/core": "3.629.0", "@aws-sdk/core": "3.635.0",
"@aws-sdk/credential-provider-node": "3.629.0", "@aws-sdk/credential-provider-node": "3.637.0",
"@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-host-header": "3.620.0",
"@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.620.0", "@aws-sdk/middleware-recursion-detection": "3.620.0",
"@aws-sdk/middleware-user-agent": "3.620.0", "@aws-sdk/middleware-user-agent": "3.637.0",
"@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@aws-sdk/util-endpoints": "3.614.0", "@aws-sdk/util-endpoints": "3.637.0",
"@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-browser": "3.609.0",
"@aws-sdk/util-user-agent-node": "3.614.0", "@aws-sdk/util-user-agent-node": "3.614.0",
"@smithy/config-resolver": "^3.0.5", "@smithy/config-resolver": "^3.0.5",
"@smithy/core": "^2.3.2", "@smithy/core": "^2.4.0",
"@smithy/fetch-http-handler": "^3.2.4", "@smithy/fetch-http-handler": "^3.2.4",
"@smithy/hash-node": "^3.0.3", "@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-content-length": "^3.0.5",
"@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-endpoint": "^3.1.0",
"@smithy/middleware-retry": "^3.0.14", "@smithy/middleware-retry": "^3.0.15",
"@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3", "@smithy/middleware-stack": "^3.0.3",
"@smithy/node-config-provider": "^3.1.4", "@smithy/node-config-provider": "^3.1.4",
"@smithy/node-http-handler": "^3.1.4", "@smithy/node-http-handler": "^3.1.4",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3", "@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0", "@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0",
"@smithy/util-defaults-mode-browser": "^3.0.14", "@smithy/util-defaults-mode-browser": "^3.0.15",
"@smithy/util-defaults-mode-node": "^3.0.14", "@smithy/util-defaults-mode-node": "^3.0.15",
"@smithy/util-endpoints": "^2.0.5", "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3", "@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3", "@smithy/util-retry": "^3.0.3",
@@ -298,44 +298,44 @@
} }
}, },
"node_modules/@aws-sdk/client-sso": { "node_modules/@aws-sdk/client-sso": {
"version": "3.629.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz",
"integrity": "sha512-2w8xU4O0Grca5HmT2dXZ5fF0g39RxODtmoqHJDsK5DSt750LqDG4w3ktmBvQs3+SrpkkJOjlX5v/hb2PCxVbww==", "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0", "@aws-crypto/sha256-js": "5.2.0",
"@aws-sdk/core": "3.629.0", "@aws-sdk/core": "3.635.0",
"@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-host-header": "3.620.0",
"@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.620.0", "@aws-sdk/middleware-recursion-detection": "3.620.0",
"@aws-sdk/middleware-user-agent": "3.620.0", "@aws-sdk/middleware-user-agent": "3.637.0",
"@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@aws-sdk/util-endpoints": "3.614.0", "@aws-sdk/util-endpoints": "3.637.0",
"@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-browser": "3.609.0",
"@aws-sdk/util-user-agent-node": "3.614.0", "@aws-sdk/util-user-agent-node": "3.614.0",
"@smithy/config-resolver": "^3.0.5", "@smithy/config-resolver": "^3.0.5",
"@smithy/core": "^2.3.2", "@smithy/core": "^2.4.0",
"@smithy/fetch-http-handler": "^3.2.4", "@smithy/fetch-http-handler": "^3.2.4",
"@smithy/hash-node": "^3.0.3", "@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-content-length": "^3.0.5",
"@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-endpoint": "^3.1.0",
"@smithy/middleware-retry": "^3.0.14", "@smithy/middleware-retry": "^3.0.15",
"@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3", "@smithy/middleware-stack": "^3.0.3",
"@smithy/node-config-provider": "^3.1.4", "@smithy/node-config-provider": "^3.1.4",
"@smithy/node-http-handler": "^3.1.4", "@smithy/node-http-handler": "^3.1.4",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3", "@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0", "@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0",
"@smithy/util-defaults-mode-browser": "^3.0.14", "@smithy/util-defaults-mode-browser": "^3.0.15",
"@smithy/util-defaults-mode-node": "^3.0.14", "@smithy/util-defaults-mode-node": "^3.0.15",
"@smithy/util-endpoints": "^2.0.5", "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3", "@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3", "@smithy/util-retry": "^3.0.3",
@@ -347,45 +347,45 @@
} }
}, },
"node_modules/@aws-sdk/client-sso-oidc": { "node_modules/@aws-sdk/client-sso-oidc": {
"version": "3.629.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz",
"integrity": "sha512-3if0LauNJPqubGYf8vnlkp+B3yAeKRuRNxfNbHlE6l510xWGcKK/ZsEmiFmfePzKKSRrDh/cxMFMScgOrXptNg==", "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0", "@aws-crypto/sha256-js": "5.2.0",
"@aws-sdk/core": "3.629.0", "@aws-sdk/core": "3.635.0",
"@aws-sdk/credential-provider-node": "3.629.0", "@aws-sdk/credential-provider-node": "3.637.0",
"@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-host-header": "3.620.0",
"@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.620.0", "@aws-sdk/middleware-recursion-detection": "3.620.0",
"@aws-sdk/middleware-user-agent": "3.620.0", "@aws-sdk/middleware-user-agent": "3.637.0",
"@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@aws-sdk/util-endpoints": "3.614.0", "@aws-sdk/util-endpoints": "3.637.0",
"@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-browser": "3.609.0",
"@aws-sdk/util-user-agent-node": "3.614.0", "@aws-sdk/util-user-agent-node": "3.614.0",
"@smithy/config-resolver": "^3.0.5", "@smithy/config-resolver": "^3.0.5",
"@smithy/core": "^2.3.2", "@smithy/core": "^2.4.0",
"@smithy/fetch-http-handler": "^3.2.4", "@smithy/fetch-http-handler": "^3.2.4",
"@smithy/hash-node": "^3.0.3", "@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-content-length": "^3.0.5",
"@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-endpoint": "^3.1.0",
"@smithy/middleware-retry": "^3.0.14", "@smithy/middleware-retry": "^3.0.15",
"@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3", "@smithy/middleware-stack": "^3.0.3",
"@smithy/node-config-provider": "^3.1.4", "@smithy/node-config-provider": "^3.1.4",
"@smithy/node-http-handler": "^3.1.4", "@smithy/node-http-handler": "^3.1.4",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3", "@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0", "@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0",
"@smithy/util-defaults-mode-browser": "^3.0.14", "@smithy/util-defaults-mode-browser": "^3.0.15",
"@smithy/util-defaults-mode-node": "^3.0.14", "@smithy/util-defaults-mode-node": "^3.0.15",
"@smithy/util-endpoints": "^2.0.5", "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3", "@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3", "@smithy/util-retry": "^3.0.3",
@@ -396,50 +396,50 @@
"node": ">=16.0.0" "node": ">=16.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@aws-sdk/client-sts": "^3.629.0" "@aws-sdk/client-sts": "^3.637.0"
} }
}, },
"node_modules/@aws-sdk/client-sts": { "node_modules/@aws-sdk/client-sts": {
"version": "3.629.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz",
"integrity": "sha512-RjOs371YwnSVGxhPjuluJKaxl4gcPYTAky0nPjwBime0i9/iS9nI8R8l5j7k7ec9tpFWjBPvNnThCU07pvjdzw==", "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0", "@aws-crypto/sha256-js": "5.2.0",
"@aws-sdk/client-sso-oidc": "3.629.0", "@aws-sdk/client-sso-oidc": "3.637.0",
"@aws-sdk/core": "3.629.0", "@aws-sdk/core": "3.635.0",
"@aws-sdk/credential-provider-node": "3.629.0", "@aws-sdk/credential-provider-node": "3.637.0",
"@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-host-header": "3.620.0",
"@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-logger": "3.609.0",
"@aws-sdk/middleware-recursion-detection": "3.620.0", "@aws-sdk/middleware-recursion-detection": "3.620.0",
"@aws-sdk/middleware-user-agent": "3.620.0", "@aws-sdk/middleware-user-agent": "3.637.0",
"@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/region-config-resolver": "3.614.0",
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@aws-sdk/util-endpoints": "3.614.0", "@aws-sdk/util-endpoints": "3.637.0",
"@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-browser": "3.609.0",
"@aws-sdk/util-user-agent-node": "3.614.0", "@aws-sdk/util-user-agent-node": "3.614.0",
"@smithy/config-resolver": "^3.0.5", "@smithy/config-resolver": "^3.0.5",
"@smithy/core": "^2.3.2", "@smithy/core": "^2.4.0",
"@smithy/fetch-http-handler": "^3.2.4", "@smithy/fetch-http-handler": "^3.2.4",
"@smithy/hash-node": "^3.0.3", "@smithy/hash-node": "^3.0.3",
"@smithy/invalid-dependency": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3",
"@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-content-length": "^3.0.5",
"@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-endpoint": "^3.1.0",
"@smithy/middleware-retry": "^3.0.14", "@smithy/middleware-retry": "^3.0.15",
"@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-serde": "^3.0.3",
"@smithy/middleware-stack": "^3.0.3", "@smithy/middleware-stack": "^3.0.3",
"@smithy/node-config-provider": "^3.1.4", "@smithy/node-config-provider": "^3.1.4",
"@smithy/node-http-handler": "^3.1.4", "@smithy/node-http-handler": "^3.1.4",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/url-parser": "^3.0.3", "@smithy/url-parser": "^3.0.3",
"@smithy/util-base64": "^3.0.0", "@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0",
"@smithy/util-defaults-mode-browser": "^3.0.14", "@smithy/util-defaults-mode-browser": "^3.0.15",
"@smithy/util-defaults-mode-node": "^3.0.14", "@smithy/util-defaults-mode-node": "^3.0.15",
"@smithy/util-endpoints": "^2.0.5", "@smithy/util-endpoints": "^2.0.5",
"@smithy/util-middleware": "^3.0.3", "@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3", "@smithy/util-retry": "^3.0.3",
@@ -451,17 +451,17 @@
} }
}, },
"node_modules/@aws-sdk/core": { "node_modules/@aws-sdk/core": {
"version": "3.629.0", "version": "3.635.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz",
"integrity": "sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==", "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/core": "^2.3.2", "@smithy/core": "^2.4.0",
"@smithy/node-config-provider": "^3.1.4", "@smithy/node-config-provider": "^3.1.4",
"@smithy/property-provider": "^3.1.3", "@smithy/property-provider": "^3.1.3",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/signature-v4": "^4.1.0", "@smithy/signature-v4": "^4.1.0",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/util-middleware": "^3.0.3", "@smithy/util-middleware": "^3.0.3",
"fast-xml-parser": "4.4.1", "fast-xml-parser": "4.4.1",
@@ -487,9 +487,9 @@
} }
}, },
"node_modules/@aws-sdk/credential-provider-http": { "node_modules/@aws-sdk/credential-provider-http": {
"version": "3.622.0", "version": "3.635.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz",
"integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
@@ -497,7 +497,7 @@
"@smithy/node-http-handler": "^3.1.4", "@smithy/node-http-handler": "^3.1.4",
"@smithy/property-provider": "^3.1.3", "@smithy/property-provider": "^3.1.3",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/util-stream": "^3.1.3", "@smithy/util-stream": "^3.1.3",
"tslib": "^2.6.2" "tslib": "^2.6.2"
@@ -507,15 +507,15 @@
} }
}, },
"node_modules/@aws-sdk/credential-provider-ini": { "node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.629.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz",
"integrity": "sha512-r9fI7BABARvVDp77DBUImQzYdvarAIdhbvpCEZib0rlpvfWu3zxE9KZcapCAAi0MPjxeDfb7RMehFQIkAP7mYw==", "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-env": "3.620.1",
"@aws-sdk/credential-provider-http": "3.622.0", "@aws-sdk/credential-provider-http": "3.635.0",
"@aws-sdk/credential-provider-process": "3.620.1", "@aws-sdk/credential-provider-process": "3.620.1",
"@aws-sdk/credential-provider-sso": "3.629.0", "@aws-sdk/credential-provider-sso": "3.637.0",
"@aws-sdk/credential-provider-web-identity": "3.621.0", "@aws-sdk/credential-provider-web-identity": "3.621.0",
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@smithy/credential-provider-imds": "^3.2.0", "@smithy/credential-provider-imds": "^3.2.0",
@@ -528,20 +528,20 @@
"node": ">=16.0.0" "node": ">=16.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"@aws-sdk/client-sts": "^3.629.0" "@aws-sdk/client-sts": "^3.637.0"
} }
}, },
"node_modules/@aws-sdk/credential-provider-node": { "node_modules/@aws-sdk/credential-provider-node": {
"version": "3.629.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz",
"integrity": "sha512-868hnVOLlXOBHk91Rl0jZIRgr/M4WJCa0nOrW9A9yidsQxuZp9P0vshDmm4hMvNZadmPIfo0Rra2MpA4RELoCw==", "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-env": "3.620.1",
"@aws-sdk/credential-provider-http": "3.622.0", "@aws-sdk/credential-provider-http": "3.635.0",
"@aws-sdk/credential-provider-ini": "3.629.0", "@aws-sdk/credential-provider-ini": "3.637.0",
"@aws-sdk/credential-provider-process": "3.620.1", "@aws-sdk/credential-provider-process": "3.620.1",
"@aws-sdk/credential-provider-sso": "3.629.0", "@aws-sdk/credential-provider-sso": "3.637.0",
"@aws-sdk/credential-provider-web-identity": "3.621.0", "@aws-sdk/credential-provider-web-identity": "3.621.0",
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@smithy/credential-provider-imds": "^3.2.0", "@smithy/credential-provider-imds": "^3.2.0",
@@ -571,12 +571,12 @@
} }
}, },
"node_modules/@aws-sdk/credential-provider-sso": { "node_modules/@aws-sdk/credential-provider-sso": {
"version": "3.629.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.629.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz",
"integrity": "sha512-Lf4XOuj6jamxgGZGrVojERh5S+NS2t2S4CUOnAu6tJ5U0GPlpjhINUKlcVxJBpsIXudMGW1nkumAd3+kazCPig==", "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-sdk/client-sso": "3.629.0", "@aws-sdk/client-sso": "3.637.0",
"@aws-sdk/token-providers": "3.614.0", "@aws-sdk/token-providers": "3.614.0",
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@smithy/property-provider": "^3.1.3", "@smithy/property-provider": "^3.1.3",
@@ -650,13 +650,13 @@
} }
}, },
"node_modules/@aws-sdk/middleware-user-agent": { "node_modules/@aws-sdk/middleware-user-agent": {
"version": "3.620.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz",
"integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@aws-sdk/util-endpoints": "3.614.0", "@aws-sdk/util-endpoints": "3.637.0",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"tslib": "^2.6.2" "tslib": "^2.6.2"
@@ -713,9 +713,10 @@
} }
}, },
"node_modules/@aws-sdk/util-endpoints": { "node_modules/@aws-sdk/util-endpoints": {
"version": "3.614.0", "version": "3.637.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz",
"integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==",
"license": "Apache-2.0",
"dependencies": { "dependencies": {
"@aws-sdk/types": "3.609.0", "@aws-sdk/types": "3.609.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
@@ -1663,9 +1664,9 @@
} }
}, },
"node_modules/@opensearch-project/opensearch": { "node_modules/@opensearch-project/opensearch": {
"version": "2.11.0", "version": "2.12.0",
"resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.11.0.tgz", "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.12.0.tgz",
"integrity": "sha512-G+SZwtWRDv90IrtTSNnCt0MQjHVyqrcIXcpwN68vjHnfbun2+RHn+ux4K7dnG+s/KwWzVKIpPFoRjg2gfFX0Mw==", "integrity": "sha512-FNGWbWjvpWIZHVvAbv0FkSgvc1PnWnYEHnOTeIY08vMDp9QpXumGNDjNc1tZthJ3OEeoooqH0miGFORjWnRYsQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"aws4": "^1.11.0", "aws4": "^1.11.0",
@@ -1781,18 +1782,20 @@
} }
}, },
"node_modules/@smithy/core": { "node_modules/@smithy/core": {
"version": "2.3.2", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.0.tgz",
"integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", "integrity": "sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-endpoint": "^3.1.0",
"@smithy/middleware-retry": "^3.0.14", "@smithy/middleware-retry": "^3.0.15",
"@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-serde": "^3.0.3",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-middleware": "^3.0.3", "@smithy/util-middleware": "^3.0.3",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2" "tslib": "^2.6.2"
}, },
"engines": { "engines": {
@@ -1895,15 +1898,15 @@
} }
}, },
"node_modules/@smithy/middleware-retry": { "node_modules/@smithy/middleware-retry": {
"version": "3.0.14", "version": "3.0.15",
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.15.tgz",
"integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", "integrity": "sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/node-config-provider": "^3.1.4", "@smithy/node-config-provider": "^3.1.4",
"@smithy/protocol-http": "^4.1.0", "@smithy/protocol-http": "^4.1.0",
"@smithy/service-error-classification": "^3.0.3", "@smithy/service-error-classification": "^3.0.3",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"@smithy/util-middleware": "^3.0.3", "@smithy/util-middleware": "^3.0.3",
"@smithy/util-retry": "^3.0.3", "@smithy/util-retry": "^3.0.3",
@@ -2075,9 +2078,9 @@
} }
}, },
"node_modules/@smithy/smithy-client": { "node_modules/@smithy/smithy-client": {
"version": "3.1.12", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.2.0.tgz",
"integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", "integrity": "sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-endpoint": "^3.1.0",
@@ -2168,13 +2171,13 @@
} }
}, },
"node_modules/@smithy/util-defaults-mode-browser": { "node_modules/@smithy/util-defaults-mode-browser": {
"version": "3.0.14", "version": "3.0.15",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.15.tgz",
"integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", "integrity": "sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/property-provider": "^3.1.3", "@smithy/property-provider": "^3.1.3",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"bowser": "^2.11.0", "bowser": "^2.11.0",
"tslib": "^2.6.2" "tslib": "^2.6.2"
@@ -2184,16 +2187,16 @@
} }
}, },
"node_modules/@smithy/util-defaults-mode-node": { "node_modules/@smithy/util-defaults-mode-node": {
"version": "3.0.14", "version": "3.0.15",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.15.tgz",
"integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", "integrity": "sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/config-resolver": "^3.0.5", "@smithy/config-resolver": "^3.0.5",
"@smithy/credential-provider-imds": "^3.2.0", "@smithy/credential-provider-imds": "^3.2.0",
"@smithy/node-config-provider": "^3.1.4", "@smithy/node-config-provider": "^3.1.4",
"@smithy/property-provider": "^3.1.3", "@smithy/property-provider": "^3.1.3",
"@smithy/smithy-client": "^3.1.12", "@smithy/smithy-client": "^3.2.0",
"@smithy/types": "^3.3.0", "@smithy/types": "^3.3.0",
"tslib": "^2.6.2" "tslib": "^2.6.2"
}, },
@@ -2689,15 +2692,15 @@
} }
}, },
"node_modules/aws4": { "node_modules/aws4": {
"version": "1.13.1", "version": "1.13.2",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
"integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==", "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.7.4", "version": "1.7.7",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
"integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.6", "follow-redirects": "^1.15.6",
@@ -2962,9 +2965,10 @@
} }
}, },
"node_modules/chart.js": { "node_modules/chart.js": {
"version": "4.4.3", "version": "4.4.4",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz",
"integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==",
"license": "MIT",
"dependencies": { "dependencies": {
"@kurkle/color": "^0.3.0" "@kurkle/color": "^0.3.0"
}, },
@@ -3456,9 +3460,10 @@
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
}, },
"node_modules/debug": { "node_modules/debug": {
"version": "4.3.5", "version": "4.3.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
"license": "MIT",
"dependencies": { "dependencies": {
"ms": "2.1.2" "ms": "2.1.2"
}, },
@@ -4107,9 +4112,9 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}, },
"node_modules/firebase-admin": { "node_modules/firebase-admin": {
"version": "12.3.1", "version": "12.4.0",
"resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.3.1.tgz", "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.4.0.tgz",
"integrity": "sha512-vEr3s3esl8nPIA9r/feDT4nzIXCfov1CyyCSpMQWp6x63Q104qke0MEGZlrHUZVROtl8FLus6niP/M9I1s4VBA==", "integrity": "sha512-3HOHqJxNmFv0JgK3voyMQgmcibhJN4LQfZfhnZGb6pcONnZxejki4nQ1twsoJlGaIvgQWBtO7rc5mh/cqlOJNA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@fastify/busboy": "^3.0.0", "@fastify/busboy": "^3.0.0",
@@ -5500,11 +5505,12 @@
} }
}, },
"node_modules/node-mailjet": { "node_modules/node-mailjet": {
"version": "6.0.5", "version": "6.0.6",
"resolved": "https://registry.npmjs.org/node-mailjet/-/node-mailjet-6.0.5.tgz", "resolved": "https://registry.npmjs.org/node-mailjet/-/node-mailjet-6.0.6.tgz",
"integrity": "sha512-upufsTkMyrDF7Z6OiJ4M4Yw4L6MkB0vOQB27W1V9q0CxxSA6e2xOJif3koPwwwgDELpbJNG7asZjKFdghtxUCw==", "integrity": "sha512-cr8ciqtHuxyFd3+3bpDy+oKuNzctZfRQZtwRjurVAzE+DZLTfyxjgD+GTqQ1kr0ClAjDjSh3ERlZvd5MV0fKHg==",
"license": "MIT",
"dependencies": { "dependencies": {
"axios": "1.6.2", "axios": "1.7.4",
"json-bigint": "^1.0.0", "json-bigint": "^1.0.0",
"url-join": "^4.0.0" "url-join": "^4.0.0"
}, },
@@ -5514,11 +5520,12 @@
} }
}, },
"node_modules/node-mailjet/node_modules/axios": { "node_modules/node-mailjet/node_modules/axios": {
"version": "1.6.2", "version": "1.7.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
"integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
"license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.0", "follow-redirects": "^1.15.6",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"proxy-from-env": "^1.1.0" "proxy-from-env": "^1.1.0"
} }
@@ -5533,9 +5540,10 @@
} }
}, },
"node_modules/nodemailer": { "node_modules/nodemailer": {
"version": "6.9.14", "version": "6.9.15",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.14.tgz", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.15.tgz",
"integrity": "sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==", "integrity": "sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==",
"license": "MIT-0",
"engines": { "engines": {
"node": ">=6.0.0" "node": ">=6.0.0"
} }
@@ -5797,9 +5805,10 @@
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
}, },
"node_modules/phone": { "node_modules/phone": {
"version": "3.1.49", "version": "3.1.50",
"resolved": "https://registry.npmjs.org/phone/-/phone-3.1.49.tgz", "resolved": "https://registry.npmjs.org/phone/-/phone-3.1.50.tgz",
"integrity": "sha512-S+rHWXSQrllK5eQwz0sDbwfxQ2PzennWPgsP/jdpEPH3k7P5IBJZYjvYfU8e/RF5AwKCgOtzbTGTGJcBSLJVVw==", "integrity": "sha512-TRmb2bX3sX+rrOrc8FRd8hmy4exoH2Lu3vjBP/dLgwwci1lv7DbjJ2iHMe7X4Hm8Pa0rJcfqTbq/O1vjU4NgxQ==",
"license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
@@ -6371,14 +6380,14 @@
} }
}, },
"node_modules/soap": { "node_modules/soap": {
"version": "1.1.1", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/soap/-/soap-1.1.1.tgz", "resolved": "https://registry.npmjs.org/soap/-/soap-1.1.3.tgz",
"integrity": "sha512-Mxj/nQ9oO+zYiVZqk9AiXgeHkX/xj8EAnbri9BkxGoMrWw3fKtQulaquSbIO+kgoZfm7g08xddtmpOG2H+Z0zQ==", "integrity": "sha512-yaVQ/a3uAJZesW4CFuU7reF3ip3xQDaGMm2VnMfZoVPOEws4jbg/CQJ3+kZ7WOICMH6vt4Mu+Ra04dZjJEXxww==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"axios": "^1.7.2", "axios": "^1.7.7",
"axios-ntlm": "^1.4.2", "axios-ntlm": "^1.4.2",
"debug": "^4.3.5", "debug": "^4.3.6",
"formidable": "^3.5.1", "formidable": "^3.5.1",
"get-stream": "^6.0.1", "get-stream": "^6.0.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",

View File

@@ -19,17 +19,17 @@
"makeitpretty": "prettier --write \"**/*.{css,js,json,jsx,scss}\"" "makeitpretty": "prettier --write \"**/*.{css,js,json,jsx,scss}\""
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-secrets-manager": "^3.629.0", "@aws-sdk/client-secrets-manager": "^3.637.0",
"@aws-sdk/client-ses": "^3.629.0", "@aws-sdk/client-ses": "^3.637.0",
"@aws-sdk/credential-provider-node": "^3.629.0", "@aws-sdk/credential-provider-node": "^3.637.0",
"@opensearch-project/opensearch": "^2.11.0", "@opensearch-project/opensearch": "^2.12.0",
"aws4": "^1.13.1", "aws4": "^1.13.2",
"axios": "^1.7.4", "axios": "^1.7.7",
"better-queue": "^3.8.12", "better-queue": "^3.8.12",
"bluebird": "^3.7.2", "bluebird": "^3.7.2",
"body-parser": "^1.20.2", "body-parser": "^1.20.2",
"canvas": "^2.11.2", "canvas": "^2.11.2",
"chart.js": "^4.4.3", "chart.js": "^4.4.4",
"cloudinary": "^2.4.0", "cloudinary": "^2.4.0",
"compression": "^1.7.4", "compression": "^1.7.4",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
@@ -38,7 +38,7 @@
"dinero.js": "^1.9.1", "dinero.js": "^1.9.1",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"express": "^4.19.2", "express": "^4.19.2",
"firebase-admin": "^12.3.1", "firebase-admin": "^12.4.0",
"graphql": "^16.9.0", "graphql": "^16.9.0",
"graphql-request": "^6.1.0", "graphql-request": "^6.1.0",
"graylog2": "^0.2.1", "graylog2": "^0.2.1",
@@ -49,13 +49,13 @@
"moment": "^2.30.1", "moment": "^2.30.1",
"moment-timezone": "^0.5.45", "moment-timezone": "^0.5.45",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"node-mailjet": "^6.0.5", "node-mailjet": "^6.0.6",
"node-persist": "^4.0.3", "node-persist": "^4.0.3",
"nodemailer": "^6.9.14", "nodemailer": "^6.9.15",
"phone": "^3.1.49", "phone": "^3.1.50",
"recursive-diff": "^1.0.9", "recursive-diff": "^1.0.9",
"rimraf": "^6.0.1", "rimraf": "^6.0.1",
"soap": "^1.1.1", "soap": "^1.1.3",
"socket.io": "^4.7.5", "socket.io": "^4.7.5",
"ssh2-sftp-client": "^10.0.3", "ssh2-sftp-client": "^10.0.3",
"twilio": "^4.23.0", "twilio": "^4.23.0",